blob: 99809b6f1890d923ad07c7aa786d17e9d7341ede [file] [log] [blame]
Matteo Scandoloeb0d11c2017-08-08 13:05:26 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
Srikanth Vavilapallif6eda8f2016-09-09 13:43:51 -040017# (C) Copyright Broadcom Corporation 2016
18#
19# Licensed under the Apache License, Version 2.0 (the "License");
20# you may not use this file except in compliance with the License.
21#
22# You may obtain a copy of the License at
23# http://www.apache.org/licenses/LICENSE-2.0
24#
25# Unless required by applicable law or agreed to in writing, software
26# distributed under the License is distributed on an "AS IS" BASIS,
27# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28# See the License for the specific language governing permissions and
29# limitations under the License.
30
31from broadviewserializerbase import BroadViewSerializerBase
32from broadview_lib.pt.pt_parser import PTParser, ReportTypes
33import json
Srikanth Vavilapallif6eda8f2016-09-09 13:43:51 -040034import unittest
35import datetime
36import time
Srikanth Vavilapallib8614202016-09-19 19:07:38 -040037import six
38import uuid
Srikanth Vavilapallif6eda8f2016-09-09 13:43:51 -040039
40
41class PTToCeilometer(BroadViewSerializerBase):
42 '''
43 Class that converts Packet Trace object model to OpenStack Ceilometer metrics.
44 See broadview-collector/doc/pt_to_monasca_serializer.md for documentation
45 '''
46
47 def __init__(self):
48 pass
49
50 def __serializeToJSON(self, host, data):
51 ret = []
52 #try:
53 # timestamp = time.mktime(data.getTimestamp()) * 1000
54 #except:
55 # timestamp = int(time.mktime(datetime.datetime.utcnow().timetuple())) \
56 # * 1000 * 1000
Srikanth Vavilapallib8614202016-09-19 19:07:38 -040057 #timestamp=time.strftime('%Y-%m-%dT%H:%M:%SZ',data.getTimestamp())
58 timestamp=datetime.datetime.now().isoformat()
Srikanth Vavilapallif6eda8f2016-09-09 13:43:51 -040059 asic = data.getASICId()
60
61 '''
62 Note that monasca requires a value field. Where required, but not
63 obvious value is present in the data, we use 0 and notate that the
64 value is to be ignored in the metadata
65 '''
66
67 d = data.getPacketTraceProfile()
68 for x in d:
69 for y in x:
70 m = {}
71 m["event_type"] = "broadview.pt." + repr(x)
72 m["timestamp"] = timestamp
73 m['message_id'] = six.text_type(uuid.uuid4())
74 m['priority'] = 'INFO'
75 m["payload"] = {}
76 m["payload"]["value"] = 0
77 m["payload"]["asic-id"] = asic
78 m["payload"]["bv-agent"] = host
79 m["payload"]["realm"] = y.getRealm()
80 m["payload"]["port"] = y.getPort()
81 r = y.getLAGLinkResolution()
82 if r:
83 m["payload"]["lag-id"] = r.getLAGID()
84 m["payload"]["dst-lag-member"] = r.getDstLAGMember()
85 m["payload"]["lag-members"] = r.getLAGMembers()
86 m["payload"]["fabric-trunk-members"] = r.getFabricTrunkMembers()
87 m["payload"]["fabric-trunk-id"] = r.getFabricTrunkID()
88 m["payload"]["ignore-value"] = 1
89 ret.append(m)
90 else:
91 r = y.getECMPLinkResolution()
92 for l in r:
93 m = {}
94 m["event_type"] = "broadview.pt." + repr(x)
95 m["timestamp"] = timestamp
96 m['message_id'] = six.text_type(uuid.uuid4())
97 m['priority'] = 'INFO'
98 m["payload"] = {}
99 m["payload"]["value"] = 0
100 m["payload"]["ignore-value"] = 1
101 m["payload"]["asic-id"] = asic
102 m["payload"]["bv-agent"] = host
103 m["payload"]["realm"] = y.getRealm()
104 m["payload"]["port"] = y.getPort()
105 m["payload"]["ecmp-group-id"] = l.getECMPGroupID()
106 m["payload"]["ecmp-dst-member"] = l.getECMPDstMember()
107 m["payload"]["ecmp-dst-port"] = l.getECMPDstPort()
108 m["payload"]["ecmp-next-hop-ip"] = l.getECMPNextHopIP()
109 m["payload"]["ecmp-members"] = []
110 for mem in l.getECMPMembers():
111 member = {}
112 member["id"] = mem.getId()
113 member["ip"] = mem.getIP()
114 member["port"] = mem.getPort()
115 m["payload"]["ecmp-members"].append(member)
116 ret.append(m)
117
118 d = data.getPacketTraceECMPResolution()
119 for x in d:
120 r = x.getECMPLinkResolution()
121 for l in r:
122 m = {}
123 m["event_type"] = "broadview.pt." + repr(x)
124 m["timestamp"] = timestamp
125 m['message_id'] = six.text_type(uuid.uuid4())
126 m['priority'] = 'INFO'
127 m["payload"] = {}
128 m["payload"]["value"] = 0
129 m["payload"]["ignore-value"] = 1
130 m["payload"]["asic-id"] = asic
131 m["payload"]["bv-agent"] = host
132 m["payload"]["port"] = x.getPort()
133 m["payload"]["ecmp-group-id"] = l.getECMPGroupID()
134 m["payload"]["ecmp-dst-member"] = l.getECMPDstMember()
135 m["payload"]["ecmp-dst-port"] = l.getECMPDstPort()
136 m["payload"]["ecmp-next-hop-ip"] = l.getECMPNextHopIP()
137 m["payload"]["ecmp-members"] = []
138 for mem in l.getECMPMembers():
139 member = {}
140 member["id"] = mem.getId()
141 member["ip"] = mem.getIP()
142 member["port"] = mem.getPort()
143 m["payload"]["ecmp-members"].append(member)
144 ret.append(m)
145
146 d = data.getPacketTraceLAGResolution()
147 for x in d:
148 ll = x.getLAGLinkResolution()
149 m = {}
150 m["event_type"] = "broadview.pt." + repr(x)
151 m["timestamp"] = timestamp
152 m['message_id'] = six.text_type(uuid.uuid4())
153 m['priority'] = 'INFO'
154 m["payload"] = {}
155 m["payload"]["asic-id"] = asic
156 m["payload"]["bv-agent"] = host
157 m["payload"]["port"] = x.getPort()
158 m["payload"]["lag-id"] = ll.getLAGID()
159 m["payload"]["dst-lag-member"] = ll.getDstLAGMember()
160 m["payload"]["lag-members"] = ll.getLAGMembers()
161 m["payload"]["fabric-trunk-members"] = ll.getFabricTrunkMembers()
162 m["payload"]["fabric-trunk-id"] = ll.getFabricTrunkID()
163 m["payload"]["ignore-value"] = 1
164 m["payload"]["value"] = 0
165 ret.append(m)
166
167 d = data.getPacketTraceDropReason()
168 for x in d:
169 m = {}
170 m["event_type"] = "broadview.pt." + repr(x)
171 m["timestamp"] = timestamp
172 m['message_id'] = six.text_type(uuid.uuid4())
173 m['priority'] = 'INFO'
174 m["payload"] = {}
175 m["payload"]["asic-id"] = asic
176 m["payload"]["bv-agent"] = host
177 m["payload"]["reason"] = x.getReason()
178 m["payload"]["port-list"] = x.getPortList()
179 m["payload"]["send-dropped-packet"] = x.getSendDroppedPacket()
180 m["payload"]["trace-profile"] = x.getTraceProfile()
181 m["payload"]["packet-threshold"] = x.getPacketThreshold()
182 m["payload"]["ignore-value"] = 0
183 m["payload"]["value"] = x.getPacketCount()
184 ret.append(m)
185
186 d = data.getPacketTraceDropCounterReport()
187 for x in d:
188 for y in x:
189 m = {}
190 m["event_type"] = "broadview.pt." + repr(x)
191 m["timestamp"] = timestamp
192 m['message_id'] = six.text_type(uuid.uuid4())
193 m['priority'] = 'INFO'
194 m["payload"] = {}
195 m["payload"]["asic-id"] = asic
196 m["payload"]["bv-agent"] = host
197 m["payload"]["realm"] = y.getRealm()
198 m["payload"]["port"] = y.getPort()
199 m["payload"]["value"] = y.getCount()
200 m["payload"]["ignore-value"] = 0
201 ret.append(m)
202
203 d = data.getPacketTraceSupportedDropReasons()
204 if d:
205 m = {}
206 m["event_type"] = "broadview.pt." + repr(x)
207 m["timestamp"] = timestamp
208 m['message_id'] = six.text_type(uuid.uuid4())
209 m['priority'] = 'INFO'
210 m["payload"] = {}
211 m["payload"]["asic-id"] = asic
212 m["payload"]["bv-agent"] = host
213 m["payload"]["reasons"] = d.getReasons()
214 m["payload"]["ignore-value"] = 1
215 m["payload"]["value"] = 0
216 ret.append(m)
217
218 return json.dumps(ret)
219
220 def serialize(self, host, data):
221 # serialize a parsed BST report to Monasca metrics
222 ret = (False, None)
223
224 s = self.__serializeToJSON(host, data)
225
226 if s:
227 ret = (True, s)
228
229 return ret
230
231 def __repr__(self):
232 return "Packet Trace To Monasca Serializer"
233
234class TestSerializer(unittest.TestCase):
235
236 def setUp(self):
237 self._host = "127.0.0.1"
238 self.packet_trace_profile_1 = {
239 "jsonrpc": "2.0",
240 "method": "get-packet-trace-profile",
241 "asic-id": "1",
242 "version": "1",
243 "time-stamp": "2014-11-18 - 00:15:04 ",
244 "report": [
245 {
246 "port": "1",
247 "trace-profile": [
248 {
249 "realm": "lag-link-resolution",
250 "data": {
251 "lag-id": "2",
252 "lag-members": ["1", "2", "3", "4"],
253 "dst-lag-member": "4",
254 "fabric-trunk-id": "6",
255 "fabric-trunk-members": ["27", "28", "29"],
256 }
257 },
258 {
259 "realm": "ecmp-link-resolution",
260 "data":
261 [
262 {
263 "ecmp-group-id": "100256",
264 "ecmp-members": [["100004", "1.2.2.2", "18"],["100005", "1.6.6.1", "11"]],
265 "ecmp-dst-member": "100005",
266 "ecmp-dst-port": "11",
267 "ecmp-next-hop-ip": "1.6.6.2"
268 },
269 {
270 "ecmp-group-id": "200100",
271 "ecmp-members": [["200001", "2.3.3.1", "21"], ["200002", "2.7.7.2", "21"]],
272 "ecmp-dst-member": "200001",
273 "ecmp-dst-port": "21",
274 "ecmp-next-hop-ip": "2.3.3.2"
275 }
276 ]
277 }
278 ]
279 },
280 {
281 "port": "2",
282 "trace-profile": [
283 {
284 "realm": "lag-link-resolution",
285 "data": {
286 "lag-id": "2",
287 "lag-members": ["5", "6", "7", "8"],
288 "dst-lag-member": "5",
289 "fabric-trunk-id": "7",
290 "fabric-trunk-members": ["37", "38", "39"],
291 }
292 },
293 {
294 "realm": "ecmp-link-resolution",
295 "data":
296 [
297 {
298 "ecmp-group-id": "300256",
299 "ecmp-members": [["300004", "3.2.2.2", "38"],["300005", "3.6.6.1", "31"]],
300 "ecmp-dst-member": "300005",
301 "ecmp-dst-port": "31",
302 "ecmp-next-hop-ip": "3.6.6.2"
303 },
304 {
305 "ecmp-group-id": "400100",
306 "ecmp-members": [["400001", "4.3.3.1", "48"], ["400002", "4.7.7.2", "41"]],
307 "ecmp-dst-member": "400001",
308 "ecmp-dst-port": "41",
309 "ecmp-next-hop-ip": "4.3.3.2"
310 }
311 ]
312 }
313 ]
314 }
315 ],
316 "id": 1
317 }
318 self.packet_trace_lag_resolution_1 = {
319 "jsonrpc": "2.0",
320 "method": " get-packet-trace-lag-resolution",
321 "asic-id": "1",
322 "version": "1",
323 "time-stamp": "2014-11-18 - 00:15:04 ",
324 "report": [
325 {
326 "port": "1",
327 "lag-link-resolution": {
328 "lag-id": "1",
329 "lag-members": [
330 "1",
331 "2",
332 "3",
333 "4"
334 ],
335 "dst-lag-member": "4",
336 "fabric-trunk-id": "8",
337 "fabric-trunk-members": ["47", "48", "49"],
338 }
339 },
340 {
341 "port": "2",
342 "lag-link-resolution": {
343 "lag-id": "2",
344 "lag-members": [
345 "5",
346 "6",
347 "7",
348 "8"
349 ],
350 "dst-lag-member": "7",
351 "fabric-trunk-id": "9",
352 "fabric-trunk-members": ["57", "58", "59"],
353 }
354 }
355 ],
356 "id": 1
357 }
358
359 self.packet_trace_ecmp_resolution_1 = {
360 "jsonrpc": "2.0",
361 "method": " get-packet-trace-ecmp-resolution",
362 "asic-id": "1",
363 "version": "1",
364 "time-stamp": "2014-11-18 - 00:15:04 ",
365 "report": [
366 {
367 "port": "1",
368 "ecmp-link-resolution": [
369 {
370 "ecmp-group-id": "100256",
371 "ecmp-members": [["100004", "1.2.2.2", "18"],["100005", "1.6.6.1", "11"]],
372 "ecmp-dst-member": "100005",
373 "ecmp-dst-port": "11",
374 "ecmp-next-hop-ip": "1.6.6.2"
375 },
376 {
377 "ecmp-group-id": "200100",
378 "ecmp-members": [["200001", "2.3.3.1", "21"], ["200002", "2.7.7.2", "21"]],
379 "ecmp-dst-member": "200001",
380 "ecmp-dst-port": "21",
381 "ecmp-next-hop-ip": "2.3.3.2"
382 }
383 ]
384 },
385 {
386 "port": "2",
387 "ecmp-link-resolution": [
388 {
389 "ecmp-group-id": "300100",
390 "ecmp-members": [["300001", "3.3.3.1", "38"],["300002", "3.7.7.2", "31"]],
391 "ecmp-dst-member": "300005",
392 "ecmp-dst-port": "31",
393 "ecmp-next-hop-ip": "3.6.6.2"
394 },
395 {
396 "ecmp-group-id": "400100",
397 "ecmp-members": [["400001", "4.3.3.1", "48"], ["400002", "4.7.7.2", "41"]],
398 "ecmp-dst-member": "400001",
399 "ecmp-dst-port": "41",
400 "ecmp-next-hop-ip": "4.3.3.2"
401 }
402 ]
403 }
404 ],
405 "id": 1
406 }
407
408 self.packet_trace_drop_reason_1 = {
409 "jsonrpc": "2.0",
410 "method": "get-packet-trace-drop-reason",
411 "asic-id": "1",
412 "version": "1",
413 "result": [
414 {
415 "reason": "l2-lookup-failure",
416 "port-list": [
417 "1",
418 "5",
419 "6",
420 "10-15"
421 ],
422 "send-dropped-packet": 0,
423 "trace-profile": 0,
424 "packet-count": 4,
425 "packet-threshold": 0
426 },
427 {
428 "reason": "vlan-mismatch",
429 "port-list": [
430 "11",
431 "15",
432 "16",
433 "20-25"
434 ],
435 "send-dropped-packet": 1,
436 "trace-profile": 1,
437 "packet-count": 3,
438 "packet-threshold": 10
439 }
440 ],
441 "id": 1
442 }
443
444 self.packet_trace_drop_counter_report_1 = {
445 "jsonrpc": "2.0",
446 "method": " get-packet-trace-drop-counter-report",
447 "asic-id": "1",
448 "version": "1",
449 "report": [
450 {
451 "realm": "vlan-xlate-miss-drop",
452 "data": [
453 {
454 "port": "1",
455 "count": 10
456 },
457 {
458 "port": "5",
459 "count": 20
460 },
461 {
462 "port": "6",
463 "count": 30
464 },
465 {
466 "port": "10",
467 "count": 40
468 },
469 {
470 "port": "11",
471 "count": 50
472 },
473 {
474 "port": "12",
475 "count": 60
476 }
477 ]
478 },
479 {
480 "realm": "bpdu-drop",
481 "data": [
482 {
483 "port": "1",
484 "count": 70
485 },
486 {
487 "port": "5",
488 "count": 20
489 },
490 {
491 "port": "6",
492 "count": 30
493 },
494 {
495 "port": "10",
496 "count": 40
497 },
498 {
499 "port": "11",
500 "count": 80
501 },
502 {
503 "port": "12",
504 "count": 90
505 }
506 ]
507 },
508 {
509 "realm": "trill-slowpath-drop",
510 "data": [
511 {
512 "port": "1",
513 "count": 10
514 },
515 {
516 "port": "5",
517 "count": 20
518 },
519 {
520 "port": "6",
521 "count": 30
522 },
523 {
524 "port": "10",
525 "count": 40
526 },
527 {
528 "port": "11",
529 "count": 50
530 },
531 {
532 "port": "12",
533 "count": 60
534 }
535 ]
536 }
537 ]
538 }
539
540 self.packet_trace_supported_drop_reasons_1 = {
541 "jsonrpc": "2.0",
542 "method": "get-packet-trace-supported-drop-reasons",
543 "asic-id": "1",
544 "version": "1",
545 "result": [
546 "l2-lookup-failure",
547 "vlan-mismatch"
548 ],
549 "id": 1
550 }
551
552 def test_packet_trace_profile_1(self):
553 rep = PTParser()
554 rep.process(self.packet_trace_profile_1)
555 serializer = PTToMonasca()
556 ret = serializer.serialize(self._host, rep)
557 self.assertEqual(ret[0], True)
558 data = json.loads(ret[1])
559 self.assertTrue(len(data) == 6)
560
561 self.assertTrue("timestamp" in data[0])
562 timestamp = int(data[0]["timestamp"]) / 1000
563 self.assertTrue("name" in data[0])
564 self.assertTrue("payload" in data[0])
565 t1 = datetime.datetime.fromtimestamp(timestamp)
566 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
567 t2 = self.packet_trace_profile_1["time-stamp"].strip()
568 self.assertEqual(t1, t2)
569 self.assertEqual(data[0]["name"], "broadview.pt.packet-trace-profile")
570 dim = data[0]["payload"]
571 self.assertTrue("bv-agent" in dim)
572 self.assertTrue("asic-id" in dim)
573 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
574 self.assertTrue("realm" in dim)
575 self.assertEqual(dim["realm"], "lag-link-resolution")
576 self.assertTrue("lag-id" in dim)
577 self.assertEqual(dim["lag-id"], "2")
578 self.assertTrue("lag-members" in dim)
579 self.assertEqual(len(dim["lag-members"]), 4)
580 self.assertTrue("1" in dim["lag-members"])
581 self.assertTrue("2" in dim["lag-members"])
582 self.assertTrue("3" in dim["lag-members"])
583 self.assertTrue("4" in dim["lag-members"])
584 self.assertTrue("port" in dim)
585 self.assertEqual(dim["port"], "1")
586 self.assertTrue("dst-lag-member" in dim)
587 self.assertEqual(dim["dst-lag-member"], "4")
588 self.assertTrue("fabric-trunk-id" in dim)
589 self.assertEqual(dim["fabric-trunk-id"], "6")
590 self.assertTrue("fabric-trunk-members" in dim)
591 self.assertEqual(len(dim["fabric-trunk-members"]), 3)
592 self.assertTrue("27" in dim["fabric-trunk-members"])
593 self.assertTrue("28" in dim["fabric-trunk-members"])
594 self.assertTrue("29" in dim["fabric-trunk-members"])
595
596 self.assertTrue("timestamp" in data[1])
597 timestamp = int(data[1]["timestamp"]) / 1000
598 self.assertTrue("name" in data[1])
599 self.assertTrue("payload" in data[1])
600 t1 = datetime.datetime.fromtimestamp(timestamp)
601 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
602 t2 = self.packet_trace_profile_1["time-stamp"].strip()
603 self.assertEqual(t1, t2)
604 self.assertEqual(data[1]["name"], "broadview.pt.packet-trace-profile")
605 dim = data[1]["payload"]
606 self.assertTrue("asic-id" in dim)
607 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
608 self.assertTrue("realm" in dim)
609 self.assertEqual(dim["realm"], "ecmp-link-resolution")
610 self.assertTrue("ecmp-dst-member" in dim)
611 self.assertEqual(dim["ecmp-dst-member"], "100005")
612 self.assertTrue("bv-agent" in dim)
613 self.assertTrue("ecmp-next-hop-ip" in dim)
614 self.assertEqual(dim["ecmp-next-hop-ip"], "1.6.6.2")
615 self.assertTrue("ecmp-dst-port" in dim)
616 self.assertEqual(dim["ecmp-dst-port"], "11")
617 self.assertTrue("ecmp-members" in dim)
618 self.assertEqual(len(dim["ecmp-members"]), 2)
619 mem = dim["ecmp-members"][0]
620 self.assertTrue("ip" in mem)
621 self.assertEqual(mem["ip"], "1.2.2.2")
622 self.assertTrue("id" in mem)
623 self.assertEqual(mem["id"], "100004")
624 self.assertTrue("port" in mem)
625 self.assertEqual(mem["port"], "18")
626 mem = dim["ecmp-members"][1]
627 self.assertTrue("ip" in mem)
628 self.assertEqual(mem["ip"], "1.6.6.1")
629 self.assertTrue("id" in mem)
630 self.assertEqual(mem["id"], "100005")
631 self.assertTrue("port" in mem)
632 self.assertEqual(mem["port"], "11")
633 self.assertTrue("ecmp-group-id" in dim)
634 self.assertEqual(dim["ecmp-group-id"], "100256")
635 self.assertTrue("port" in dim)
636 self.assertEqual(dim["port"], "1")
637
638 self.assertTrue("timestamp" in data[2])
639 timestamp = int(data[1]["timestamp"]) / 1000
640 self.assertTrue("name" in data[2])
641 self.assertTrue("payload" in data[2])
642 t1 = datetime.datetime.fromtimestamp(timestamp)
643 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
644 t2 = self.packet_trace_profile_1["time-stamp"].strip()
645 self.assertEqual(t1, t2)
646 self.assertEqual(data[2]["name"], "broadview.pt.packet-trace-profile")
647 dim = data[2]["payload"]
648 self.assertTrue("asic-id" in dim)
649 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
650 self.assertTrue("realm" in dim)
651 self.assertEqual(dim["realm"], "ecmp-link-resolution")
652 self.assertTrue("ecmp-dst-member" in dim)
653 self.assertEqual(dim["ecmp-dst-member"], "200001")
654 self.assertTrue("bv-agent" in dim)
655 self.assertTrue("ecmp-next-hop-ip" in dim)
656 self.assertEqual(dim["ecmp-next-hop-ip"], "2.3.3.2")
657 self.assertTrue("ecmp-dst-port" in dim)
658 self.assertEqual(dim["ecmp-dst-port"], "21")
659 self.assertTrue("ecmp-members" in dim)
660 self.assertEqual(len(dim["ecmp-members"]), 2)
661 mem = dim["ecmp-members"][0]
662 self.assertTrue("ip" in mem)
663 self.assertEqual(mem["ip"], "2.3.3.1")
664 self.assertTrue("id" in mem)
665 self.assertEqual(mem["id"], "200001")
666 self.assertTrue("port" in mem)
667 self.assertEqual(mem["port"], "21")
668 mem = dim["ecmp-members"][1]
669 self.assertTrue("ip" in mem)
670 self.assertEqual(mem["ip"], "2.7.7.2")
671 self.assertTrue("id" in mem)
672 self.assertEqual(mem["id"], "200002")
673 self.assertTrue("port" in mem)
674 self.assertEqual(mem["port"], "21")
675 self.assertTrue("ecmp-group-id" in dim)
676 self.assertEqual(dim["ecmp-group-id"], "200100")
677 self.assertTrue("port" in dim)
678 self.assertEqual(dim["port"], "1")
679
680 def test_packet_trace_lag_resolution_1(self):
681 rep = PTParser()
682 rep.process(self.packet_trace_lag_resolution_1)
683 serializer = PTToMonasca()
684 ret = serializer.serialize(self._host, rep)
685 self.assertEqual(ret[0], True)
686 data = json.loads(ret[1])
687 self.assertTrue(len(data) == 2)
688
689 self.assertTrue("timestamp" in data[0])
690 timestamp = int(data[0]["timestamp"]) / 1000
691 self.assertTrue("name" in data[0])
692 self.assertTrue("payload" in data[0])
693 t1 = datetime.datetime.fromtimestamp(timestamp)
694 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
695 t2 = self.packet_trace_lag_resolution_1["time-stamp"].strip()
696 self.assertEqual(t1, t2)
697 self.assertEqual(data[0]["name"], "broadview.pt.packet-trace-lag-resolution")
698 dim = data[0]["payload"]
699 self.assertTrue("bv-agent" in dim)
700 self.assertTrue("asic-id" in dim)
701 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
702 self.assertTrue("lag-id" in dim)
703 self.assertEqual(dim["lag-id"], "1")
704 self.assertTrue("lag-members" in dim)
705 self.assertEqual(len(dim["lag-members"]), 4)
706 self.assertTrue("1" in dim["lag-members"])
707 self.assertTrue("2" in dim["lag-members"])
708 self.assertTrue("3" in dim["lag-members"])
709 self.assertTrue("4" in dim["lag-members"])
710 self.assertTrue("port" in dim)
711 self.assertEqual(dim["port"], "1")
712 self.assertTrue("dst-lag-member" in dim)
713 self.assertEqual(dim["dst-lag-member"], "4")
714 self.assertTrue("fabric-trunk-id" in dim)
715 self.assertEqual(dim["fabric-trunk-id"], "8")
716 self.assertTrue("fabric-trunk-members" in dim)
717 self.assertEqual(len(dim["fabric-trunk-members"]), 3)
718 self.assertTrue("47" in dim["fabric-trunk-members"])
719 self.assertTrue("48" in dim["fabric-trunk-members"])
720 self.assertTrue("49" in dim["fabric-trunk-members"])
721
722 self.assertTrue("timestamp" in data[1])
723 timestamp = int(data[0]["timestamp"]) / 1000
724 self.assertTrue("name" in data[1])
725 self.assertTrue("payload" in data[1])
726 t1 = datetime.datetime.fromtimestamp(timestamp)
727 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
728 t2 = self.packet_trace_lag_resolution_1["time-stamp"].strip()
729 self.assertEqual(t1, t2)
730 self.assertEqual(data[1]["name"], "broadview.pt.packet-trace-lag-resolution")
731 dim = data[1]["payload"]
732 self.assertTrue("bv-agent" in dim)
733 self.assertTrue("asic-id" in dim)
734 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
735 self.assertTrue("lag-id" in dim)
736 self.assertEqual(dim["lag-id"], "2")
737 self.assertTrue("lag-members" in dim)
738 self.assertEqual(len(dim["lag-members"]), 4)
739 self.assertTrue("5" in dim["lag-members"])
740 self.assertTrue("6" in dim["lag-members"])
741 self.assertTrue("7" in dim["lag-members"])
742 self.assertTrue("8" in dim["lag-members"])
743 self.assertTrue("port" in dim)
744 self.assertEqual(dim["port"], "2")
745 self.assertTrue("dst-lag-member" in dim)
746 self.assertEqual(dim["dst-lag-member"], "7")
747 self.assertTrue("fabric-trunk-id" in dim)
748 self.assertEqual(dim["fabric-trunk-id"], "9")
749 self.assertTrue("fabric-trunk-members" in dim)
750 self.assertEqual(len(dim["fabric-trunk-members"]), 3)
751 self.assertTrue("57" in dim["fabric-trunk-members"])
752 self.assertTrue("58" in dim["fabric-trunk-members"])
753 self.assertTrue("59" in dim["fabric-trunk-members"])
754
755 def test_packet_trace_ecmp_resolution_1(self):
756 rep = PTParser()
757 rep.process(self.packet_trace_ecmp_resolution_1)
758 serializer = PTToMonasca()
759 ret = serializer.serialize(self._host, rep)
760 self.assertEqual(ret[0], True)
761 data = json.loads(ret[1])
762 self.assertTrue(len(data) == 4)
763
764 self.assertTrue("timestamp" in data[0])
765 timestamp = int(data[0]["timestamp"]) / 1000
766 self.assertTrue("name" in data[0])
767 self.assertTrue("payload" in data[0])
768 t1 = datetime.datetime.fromtimestamp(timestamp)
769 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
770 t2 = self.packet_trace_ecmp_resolution_1["time-stamp"].strip()
771 self.assertEqual(t1, t2)
772 self.assertEqual(data[0]["name"], "broadview.pt.packet-trace-ecmp-resolution")
773 dim = data[0]["payload"]
774 self.assertTrue("asic-id" in dim)
775 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
776 self.assertTrue("ecmp-dst-member" in dim)
777 self.assertEqual(dim["ecmp-dst-member"], "100005")
778 self.assertTrue("bv-agent" in dim)
779 self.assertTrue("ecmp-next-hop-ip" in dim)
780 self.assertEqual(dim["ecmp-next-hop-ip"], "1.6.6.2")
781 self.assertTrue("ecmp-dst-port" in dim)
782 self.assertEqual(dim["ecmp-dst-port"], "11")
783 self.assertTrue("ecmp-members" in dim)
784 self.assertEqual(len(dim["ecmp-members"]), 2)
785 mem = dim["ecmp-members"][0]
786 self.assertTrue("ip" in mem)
787 self.assertEqual(mem["ip"], "1.2.2.2")
788 self.assertTrue("id" in mem)
789 self.assertEqual(mem["id"], "100004")
790 self.assertTrue("port" in mem)
791 self.assertEqual(mem["port"], "18")
792 mem = dim["ecmp-members"][1]
793 self.assertTrue("ip" in mem)
794 self.assertEqual(mem["ip"], "1.6.6.1")
795 self.assertTrue("id" in mem)
796 self.assertEqual(mem["id"], "100005")
797 self.assertTrue("port" in mem)
798 self.assertEqual(mem["port"], "11")
799 self.assertTrue("ecmp-group-id" in dim)
800 self.assertEqual(dim["ecmp-group-id"], "100256")
801 self.assertTrue("port" in dim)
802 self.assertEqual(dim["port"], "1")
803
804 self.assertTrue("timestamp" in data[1])
805 timestamp = int(data[1]["timestamp"]) / 1000
806 self.assertTrue("name" in data[1])
807 self.assertTrue("payload" in data[1])
808 t1 = datetime.datetime.fromtimestamp(timestamp)
809 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
810 t2 = self.packet_trace_ecmp_resolution_1["time-stamp"].strip()
811 self.assertEqual(t1, t2)
812 dim = data[1]["payload"]
813 self.assertTrue("asic-id" in dim)
814 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
815 self.assertTrue("ecmp-dst-member" in dim)
816 self.assertEqual(dim["ecmp-dst-member"], "200001")
817 self.assertTrue("bv-agent" in dim)
818 self.assertTrue("ecmp-next-hop-ip" in dim)
819 self.assertEqual(dim["ecmp-next-hop-ip"], "2.3.3.2")
820 self.assertTrue("ecmp-dst-port" in dim)
821 self.assertEqual(dim["ecmp-dst-port"], "21")
822 self.assertTrue("ecmp-members" in dim)
823 self.assertEqual(len(dim["ecmp-members"]), 2)
824 mem = dim["ecmp-members"][0]
825 self.assertTrue("ip" in mem)
826 self.assertEqual(mem["ip"], "2.3.3.1")
827 self.assertTrue("id" in mem)
828 self.assertEqual(mem["id"], "200001")
829 self.assertTrue("port" in mem)
830 self.assertEqual(mem["port"], "21")
831 mem = dim["ecmp-members"][1]
832 self.assertTrue("ip" in mem)
833 self.assertEqual(mem["ip"], "2.7.7.2")
834 self.assertTrue("id" in mem)
835 self.assertEqual(mem["id"], "200002")
836 self.assertTrue("port" in mem)
837 self.assertEqual(mem["port"], "21")
838 self.assertTrue("ecmp-group-id" in dim)
839 self.assertEqual(dim["ecmp-group-id"], "200100")
840 self.assertTrue("port" in dim)
841 self.assertEqual(dim["port"], "1")
842
843 self.assertTrue("timestamp" in data[2])
844 timestamp = int(data[2]["timestamp"]) / 1000
845 self.assertTrue("name" in data[2])
846 self.assertTrue("payload" in data[2])
847 t1 = datetime.datetime.fromtimestamp(timestamp)
848 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
849 t2 = self.packet_trace_ecmp_resolution_1["time-stamp"].strip()
850 self.assertEqual(t1, t2)
851 dim = data[2]["payload"]
852 self.assertTrue("asic-id" in dim)
853 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
854 self.assertTrue("ecmp-dst-member" in dim)
855 self.assertEqual(dim["ecmp-dst-member"], "300005")
856 self.assertTrue("bv-agent" in dim)
857 self.assertTrue("ecmp-next-hop-ip" in dim)
858 self.assertEqual(dim["ecmp-next-hop-ip"], "3.6.6.2")
859 self.assertTrue("ecmp-dst-port" in dim)
860 self.assertEqual(dim["ecmp-dst-port"], "31")
861 self.assertTrue("ecmp-members" in dim)
862 self.assertEqual(len(dim["ecmp-members"]), 2)
863 mem = dim["ecmp-members"][0]
864 self.assertTrue("ip" in mem)
865 self.assertEqual(mem["ip"], "3.3.3.1")
866 self.assertTrue("id" in mem)
867 self.assertEqual(mem["id"], "300001")
868 self.assertTrue("port" in mem)
869 self.assertEqual(mem["port"], "38")
870 mem = dim["ecmp-members"][1]
871 self.assertTrue("ip" in mem)
872 self.assertEqual(mem["ip"], "3.7.7.2")
873 self.assertTrue("id" in mem)
874 self.assertEqual(mem["id"], "300002")
875 self.assertTrue("port" in mem)
876 self.assertEqual(mem["port"], "31")
877 self.assertTrue("ecmp-group-id" in dim)
878 self.assertEqual(dim["ecmp-group-id"], "300100")
879 self.assertTrue("port" in dim)
880 self.assertEqual(dim["port"], "2")
881
882 self.assertTrue("timestamp" in data[3])
883 timestamp = int(data[3]["timestamp"]) / 1000
884 self.assertTrue("name" in data[3])
885 self.assertTrue("payload" in data[3])
886 t1 = datetime.datetime.fromtimestamp(timestamp)
887 t1 = t1.strftime("%Y-%m-%d - %H:%M:%S")
888 t2 = self.packet_trace_ecmp_resolution_1["time-stamp"].strip()
889 self.assertEqual(t1, t2)
890 dim = data[3]["payload"]
891 self.assertTrue("asic-id" in dim)
892 self.assertEqual(dim["asic-id"], self.packet_trace_profile_1["asic-id"])
893 self.assertTrue("ecmp-dst-member" in dim)
894 self.assertEqual(dim["ecmp-dst-member"], "400001")
895 self.assertTrue("bv-agent" in dim)
896 self.assertTrue("ecmp-next-hop-ip" in dim)
897 self.assertEqual(dim["ecmp-next-hop-ip"], "4.3.3.2")
898 self.assertTrue("ecmp-dst-port" in dim)
899 self.assertEqual(dim["ecmp-dst-port"], "41")
900 self.assertTrue("ecmp-members" in dim)
901 self.assertEqual(len(dim["ecmp-members"]), 2)
902 mem = dim["ecmp-members"][0]
903 self.assertTrue("ip" in mem)
904 self.assertEqual(mem["ip"], "4.3.3.1")
905 self.assertTrue("id" in mem)
906 self.assertEqual(mem["id"], "400001")
907 self.assertTrue("port" in mem)
908 self.assertEqual(mem["port"], "48")
909 mem = dim["ecmp-members"][1]
910 self.assertTrue("ip" in mem)
911 self.assertEqual(mem["ip"], "4.7.7.2")
912 self.assertTrue("id" in mem)
913 self.assertEqual(mem["id"], "400002")
914 self.assertTrue("port" in mem)
915 self.assertEqual(mem["port"], "41")
916 self.assertTrue("ecmp-group-id" in dim)
917 self.assertEqual(dim["ecmp-group-id"], "400100")
918 self.assertTrue("port" in dim)
919 self.assertEqual(dim["port"], "2")
920
921 def test_packet_trace_drop_reason(self):
922 rep = PTParser()
923 rep.process(self.packet_trace_drop_reason_1)
924 serializer = PTToMonasca()
925 ret = serializer.serialize(self._host, rep)
926 self.assertEqual(ret[0], True)
927 data = json.loads(ret[1])
928 self.assertTrue(len(data) == 2)
929 i = 0
930 for x in data:
931 self.assertTrue("timestamp" in x)
932 self.assertTrue("name" in x)
933 self.assertTrue("payload" in x)
934 self.assertEqual(x["name"], "broadview.pt.packet-trace-drop-reason")
935 dim = x["payload"]
936 if i == 0:
937 self.assertEqual(dim["reason"], "l2-lookup-failure")
938 l = dim["port-list"]
939 self.assertEqual(len(l), 4)
940 self.assertEqual(l[0], "1")
941 self.assertEqual(l[1], "5")
942 self.assertEqual(l[2], "6")
943 self.assertEqual(l[3], "10-15")
944 self.assertEqual(dim["send-dropped-packet"], 0)
945 self.assertEqual(dim["trace-profile"], 0)
946 self.assertEqual(dim["packet-threshold"], 0)
947 self.assertEqual(x["value"], 4)
948 else:
949 self.assertEqual(dim["reason"], "vlan-mismatch")
950 l = dim["port-list"]
951 self.assertEqual(len(l), 4)
952 self.assertEqual(l[0], "11")
953 self.assertEqual(l[1], "15")
954 self.assertEqual(l[2], "16")
955 self.assertEqual(l[3], "20-25")
956 self.assertEqual(dim["send-dropped-packet"], 1)
957 self.assertEqual(dim["trace-profile"], 1)
958 self.assertEqual(dim["packet-threshold"], 10)
959 self.assertEqual(x["value"], 3)
960 i = i + 1
961
962 def test_packet_trace_drop_counter_report(self):
963 rep = PTParser()
964 rep.process(self.packet_trace_drop_counter_report_1)
965 serializer = PTToMonasca()
966 ret = serializer.serialize(self._host, rep)
967 self.assertEqual(ret[0], True)
968 data = json.loads(ret[1])
969 self.assertTrue(len(data) == 18)
970 i = 0
971 for x in data:
972 self.assertTrue("timestamp" in x)
973 self.assertTrue("name" in x)
974 self.assertTrue("payload" in x)
975 self.assertEqual(x["name"], "broadview.pt.packet-trace-drop-counter-report")
976 dim = x["payload"]
977 if i == 0:
978 self.assertEqual(dim["realm"], "vlan-xlate-miss-drop")
979 self.assertEqual(dim["port"], "1")
980 self.assertEqual(x["value"], 10)
981 elif i == 1:
982 self.assertEqual(dim["realm"], "vlan-xlate-miss-drop")
983 self.assertEqual(dim["port"], "5")
984 self.assertEqual(x["value"], 20)
985 elif i == 2:
986 self.assertEqual(dim["realm"], "vlan-xlate-miss-drop")
987 self.assertEqual(dim["port"], "6")
988 self.assertEqual(x["value"], 30)
989 elif i == 3:
990 self.assertEqual(dim["realm"], "vlan-xlate-miss-drop")
991 self.assertEqual(dim["port"], "10")
992 self.assertEqual(x["value"], 40)
993 elif i == 4:
994 self.assertEqual(dim["realm"], "vlan-xlate-miss-drop")
995 self.assertEqual(dim["port"], "11")
996 self.assertEqual(x["value"], 50)
997 elif i == 5:
998 self.assertEqual(dim["realm"], "vlan-xlate-miss-drop")
999 self.assertEqual(dim["port"], "12")
1000 self.assertEqual(x["value"], 60)
1001 elif i == 6:
1002 self.assertEqual(dim["realm"], "bpdu-drop")
1003 self.assertEqual(dim["port"], "1")
1004 self.assertEqual(x["value"], 70)
1005 elif i == 7:
1006 self.assertEqual(dim["realm"], "bpdu-drop")
1007 self.assertEqual(dim["port"], "5")
1008 self.assertEqual(x["value"], 20)
1009 elif i == 8:
1010 self.assertEqual(dim["realm"], "bpdu-drop")
1011 self.assertEqual(dim["port"], "6")
1012 self.assertEqual(x["value"], 30)
1013 elif i == 9:
1014 self.assertEqual(dim["realm"], "bpdu-drop")
1015 self.assertEqual(dim["port"], "10")
1016 self.assertEqual(x["value"], 40)
1017 elif i == 10:
1018 self.assertEqual(dim["realm"], "bpdu-drop")
1019 self.assertEqual(dim["port"], "11")
1020 self.assertEqual(x["value"], 80)
1021 elif i == 11:
1022 self.assertEqual(dim["realm"], "bpdu-drop")
1023 self.assertEqual(dim["port"], "12")
1024 self.assertEqual(x["value"], 90)
1025 elif i == 12:
1026 self.assertEqual(dim["realm"], "trill-slowpath-drop")
1027 self.assertEqual(dim["port"], "1")
1028 self.assertEqual(x["value"], 10)
1029 elif i == 13:
1030 self.assertEqual(dim["realm"], "trill-slowpath-drop")
1031 self.assertEqual(dim["port"], "5")
1032 self.assertEqual(x["value"], 20)
1033 elif i == 14:
1034 self.assertEqual(dim["realm"], "trill-slowpath-drop")
1035 self.assertEqual(dim["port"], "6")
1036 self.assertEqual(x["value"], 30)
1037 elif i == 15:
1038 self.assertEqual(dim["realm"], "trill-slowpath-drop")
1039 self.assertEqual(dim["port"], "10")
1040 self.assertEqual(x["value"], 40)
1041 elif i == 16:
1042 self.assertEqual(dim["realm"], "trill-slowpath-drop")
1043 self.assertEqual(dim["port"], "11")
1044 self.assertEqual(x["value"], 50)
1045 elif i == 17:
1046 self.assertEqual(dim["realm"], "trill-slowpath-drop")
1047 self.assertEqual(dim["port"], "12")
1048 self.assertEqual(x["value"], 60)
1049 i = i + 1
1050
1051 def test_packet_trace_supported_drop_reasons(self):
1052 rep = PTParser()
1053 rep.process(self.packet_trace_supported_drop_reasons_1)
1054 serializer = PTToMonasca()
1055 ret = serializer.serialize(self._host, rep)
1056 self.assertEqual(ret[0], True)
1057 data = json.loads(ret[1])
1058 self.assertTrue(len(data) == 1)
1059 d = data[0]
1060 self.assertTrue("timestamp" in d)
1061 self.assertTrue("name" in d)
1062 self.assertTrue("payload" in d)
1063 self.assertEqual(d["name"], "broadview.pt.packet-trace-supported-drop-reasons")
1064 dim = d["payload"]
1065 self.assertTrue("reasons" in dim)
1066 self.assertEqual(len(dim["reasons"]), 2)
1067 self.assertEqual(dim["reasons"][0], "l2-lookup-failure")
1068 self.assertEqual(dim["reasons"][1], "vlan-mismatch")
1069
1070if __name__ == "__main__":
1071 unittest.main()
1072