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