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