1 # Copyright (c) 2016-2017 Intel Corporation
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 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
20 from yardstick.network_services.traffic_profile import ixia_rfc2544
21 from yardstick.network_services.traffic_profile import trex_traffic_profile
24 class TestIXIARFC2544Profile(unittest.TestCase):
27 "schema": "isb:traffic_profile:0.1",
29 "description": "Fixed traffic profile to run UDP traffic",
31 "traffic_type": "FixedTraffic",
32 "frame_rate": 100, # pps
39 'description': 'Traffic profile to run RFC2544 latency',
42 'traffic_type': 'IXIARFC2544Profile',
44 ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
56 'dstip4': '1.1.1.1-1.15.255.255',
59 'srcip4': '90.90.1.1-90.105.255.255',
65 ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
77 'dstip4': '9.9.1.1-90.105.255.255',
80 'srcip4': '1.1.1.1-1.15.255.255',
86 'schema': 'isb:traffic_profile:0.1'}
88 def test_get_ixia_traffic_profile_error(self):
89 traffic_generator = mock.Mock(
90 autospec=trex_traffic_profile.TrexProfile)
91 traffic_generator.my_ports = [0, 1]
92 traffic_generator.uplink_ports = [-1]
93 traffic_generator.downlink_ports = [1]
94 traffic_generator.client = \
95 mock.Mock(return_value=True)
97 ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
103 "dstmac": "00:00:00:00:00:03",
104 "framesPerSecond": True,
106 "srcmac": "00:00:00:00:00:01"
110 "dstip4": "152.16.40.20",
112 "srcip4": "152.16.100.20",
117 "dstip4": "152.16.40.20",
119 "srcip4": "152.16.100.20",
125 "dstip4": "152.16.100.20",
127 "srcip4": "152.16.40.20",
134 "traffic_type": "continuous"
136 ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
142 "dstmac": "00:00:00:00:00:04",
143 "framesPerSecond": True,
145 "srcmac": "00:00:00:00:00:01"
150 "dstip4": "152.16.100.20",
152 "srcip4": "152.16.40.20",
158 "dstip4": "152.16.100.20",
160 "srcip4": "152.16.40.20",
166 "dstip4": "152.16.100.20",
168 "srcip4": "152.16.40.20",
175 "traffic_type": "continuous"
178 ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
180 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
181 self.TRAFFIC_PROFILE)
182 r_f_c2544_profile.rate = 100
183 mac = {"src_mac_0": "00:00:00:00:00:01",
184 "src_mac_1": "00:00:00:00:00:02",
185 "src_mac_2": "00:00:00:00:00:02",
186 "dst_mac_0": "00:00:00:00:00:03",
187 "dst_mac_1": "00:00:00:00:00:04",
188 "dst_mac_2": "00:00:00:00:00:04"}
189 result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac)
190 self.assertIsNotNone(result)
192 def test_get_ixia_traffic_profile(self):
193 traffic_generator = mock.Mock(
194 autospec=trex_traffic_profile.TrexProfile)
195 traffic_generator.my_ports = [0, 1]
196 traffic_generator.uplink_ports = [-1]
197 traffic_generator.downlink_ports = [1]
198 traffic_generator.client = \
199 mock.Mock(return_value=True)
201 ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
207 "dstmac": "00:00:00:00:00:03",
208 "framesPerSecond": True,
210 "srcmac": "00:00:00:00:00:01"
214 "dstip4": "152.16.40.20",
216 "srcip4": "152.16.100.20",
221 "dstip4": "152.16.40.20",
223 "srcip4": "152.16.100.20",
229 "dstip4": "152.16.100.20",
231 "srcip4": "152.16.40.20",
239 "traffic_type": "continuous"
241 ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
247 "dstmac": "00:00:00:00:00:04",
248 "framesPerSecond": True,
250 "srcmac": "00:00:00:00:00:01"
255 "dstip4": "152.16.100.20",
257 "srcip4": "152.16.40.20",
262 "dstip4": "152.16.100.20",
264 "srcip4": "152.16.40.20",
269 "dstip4": "152.16.100.20",
271 "srcip4": "152.16.40.20",
279 "traffic_type": "continuous"
282 ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
284 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
285 self.TRAFFIC_PROFILE)
286 r_f_c2544_profile.rate = 100
287 mac = {"src_mac_0": "00:00:00:00:00:01",
288 "src_mac_1": "00:00:00:00:00:02",
289 "src_mac_2": "00:00:00:00:00:02",
290 "dst_mac_0": "00:00:00:00:00:03",
291 "dst_mac_1": "00:00:00:00:00:04",
292 "dst_mac_2": "00:00:00:00:00:04"}
293 result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac)
294 self.assertIsNotNone(result)
296 @mock.patch("yardstick.network_services.traffic_profile.ixia_rfc2544.open")
297 def test_get_ixia_traffic_profile_v6(self, *args):
298 traffic_generator = mock.Mock(
299 autospec=trex_traffic_profile.TrexProfile)
300 traffic_generator.my_ports = [0, 1]
301 traffic_generator.uplink_ports = [-1]
302 traffic_generator.downlink_ports = [1]
303 traffic_generator.client = \
304 mock.Mock(return_value=True)
306 ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
312 "dstmac": "00:00:00:00:00:03",
313 "framesPerSecond": True,
315 "srcmac": "00:00:00:00:00:01"
319 "dstip4": "152.16.40.20",
321 "srcip4": "152.16.100.20",
326 "dstip4": "152.16.40.20",
328 "srcip4": "152.16.100.20",
334 "dstip4": "152.16.100.20",
336 "srcip4": "152.16.40.20",
343 "traffic_type": "continuous"
345 ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
351 "dstmac": "00:00:00:00:00:04",
352 "framesPerSecond": True,
354 "srcmac": "00:00:00:00:00:01"
359 "dstip4": "152.16.100.20",
361 "srcip4": "152.16.40.20",
367 "dstip4": "152.16.100.20",
369 "srcip4": "152.16.40.20",
375 "dstip4": "152.16.100.20",
377 "srcip4": "152.16.40.20",
384 "traffic_type": "continuous"
387 ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
389 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
390 self.TRAFFIC_PROFILE)
391 r_f_c2544_profile.rate = 100
392 mac = {"src_mac_0": "00:00:00:00:00:01",
393 "src_mac_1": "00:00:00:00:00:02",
394 "src_mac_2": "00:00:00:00:00:02",
395 "dst_mac_0": "00:00:00:00:00:03",
396 "dst_mac_1": "00:00:00:00:00:04",
397 "dst_mac_2": "00:00:00:00:00:04"}
398 profile_data = {'description': 'Traffic profile to run RFC2544',
401 {'traffic_type': 'IXIARFC2544Profile',
403 ixia_rfc2544.IXIARFC2544Profile.DOWNLINK:
405 {'outer_l2': {'framesize':
406 {'64B': '100', '1518B': '0',
407 '128B': '0', '1400B': '0',
408 '256B': '0', '373b': '0',
410 'outer_l3v4': {'dstip4': '1.1.1.1-1.15.255.255',
411 'proto': 'udp', 'count': '1',
412 'srcip4': '90.90.1.1-90.105.255.255',
413 'dscp': 0, 'ttl': 32},
414 'outer_l3v6': {'dstip6': '1.1.1.1-1.15.255.255',
415 'proto': 'udp', 'count': '1',
416 'srcip6': '90.90.1.1-90.105.255.255',
417 'dscp': 0, 'ttl': 32},
418 'outer_l4': {'srcport': '2001',
419 'dsrport': '1234'}}},
420 ixia_rfc2544.IXIARFC2544Profile.UPLINK: {'ipv4':
421 {'outer_l2': {'framesize':
422 {'64B': '100', '1518B': '0',
423 '128B': '0', '1400B': '0',
424 '256B': '0', '373b': '0',
427 {'dstip4': '9.9.1.1-90.105.255.255',
428 'proto': 'udp', 'count': '1',
429 'srcip4': '1.1.1.1-1.15.255.255',
430 'dscp': 0, 'ttl': 32},
432 {'dstip6': '9.9.1.1-90.105.255.255',
433 'proto': 'udp', 'count': '1',
434 'srcip6': '1.1.1.1-1.15.255.255',
435 'dscp': 0, 'ttl': 32},
437 'outer_l4': {'dstport': '2001',
438 'srcport': '1234'}}},
439 'schema': 'isb:traffic_profile:0.1'}
440 result = r_f_c2544_profile._get_ixia_traffic_profile(profile_data, mac)
441 self.assertIsNotNone(result)
443 def test__init__(self):
444 t_profile_data = copy.deepcopy(self.TRAFFIC_PROFILE)
445 t_profile_data['traffic_profile']['frame_rate'] = 12345678
446 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(t_profile_data)
447 self.assertEqual(12345678, r_f_c2544_profile.rate)
449 def test__get_ip_and_mask_range(self):
450 ip_range = '1.2.0.2-1.2.255.254'
451 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
452 self.TRAFFIC_PROFILE)
453 ip, mask = r_f_c2544_profile._get_ip_and_mask(ip_range)
454 self.assertEqual('1.2.0.2', ip)
455 self.assertEqual(16, mask)
457 def test__get_ip_and_mask_single(self):
458 ip_range = '192.168.1.10'
459 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
460 self.TRAFFIC_PROFILE)
461 ip, mask = r_f_c2544_profile._get_ip_and_mask(ip_range)
462 self.assertEqual('192.168.1.10', ip)
463 self.assertIsNone(mask)
465 def test__get_fixed_and_mask_range(self):
467 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
468 self.TRAFFIC_PROFILE)
469 fixed, mask = r_f_c2544_profile._get_fixed_and_mask(fixed_mask)
470 self.assertEqual(8, fixed)
471 self.assertEqual(48, mask)
473 def test__get_fixed_and_mask_single(self):
475 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
476 self.TRAFFIC_PROFILE)
477 fixed, mask = r_f_c2544_profile._get_fixed_and_mask(fixed_mask)
478 self.assertEqual(1234, fixed)
479 self.assertEqual(0, mask)
481 def test__get_ixia_traffic_profile_default_args(self):
482 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
483 self.TRAFFIC_PROFILE)
486 result = r_f_c2544_profile._get_ixia_traffic_profile({})
487 self.assertDictEqual(result, expected)
489 def test__ixia_traffic_generate(self):
490 traffic_generator = mock.Mock(
491 autospec=trex_traffic_profile.TrexProfile)
492 traffic_generator.networks = {
494 "downlink_0": ["xe1"],
496 traffic_generator.client = \
497 mock.Mock(return_value=True)
498 traffic = {ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {'iload': 10},
499 ixia_rfc2544.IXIARFC2544Profile.UPLINK: {'iload': 10}}
500 ixia_obj = mock.MagicMock()
501 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
502 self.TRAFFIC_PROFILE)
503 r_f_c2544_profile.rate = 100
504 result = r_f_c2544_profile._ixia_traffic_generate(traffic, ixia_obj)
505 self.assertIsNone(result)
507 def test_execute_traffic_first_run(self):
508 rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
509 rfc2544_profile.first_run = True
510 rfc2544_profile.rate = 50
511 with mock.patch.object(rfc2544_profile, '_get_ixia_traffic_profile') \
513 mock.patch.object(rfc2544_profile, '_ixia_traffic_generate') \
515 mock.patch.object(rfc2544_profile, 'update_traffic_profile') \
517 mock_get_tp.return_value = 'fake_tprofile'
518 output = rfc2544_profile.execute_traffic(mock.ANY,
521 self.assertTrue(output)
522 self.assertFalse(rfc2544_profile.first_run)
523 self.assertEqual(50, rfc2544_profile.max_rate)
524 self.assertEqual(0, rfc2544_profile.min_rate)
525 mock_get_tp.assert_called_once()
526 mock_tgenerate.assert_called_once()
527 mock_update_tp.assert_called_once()
529 def test_execute_traffic_not_first_run(self):
530 rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
531 rfc2544_profile.first_run = False
532 rfc2544_profile.max_rate = 70
533 rfc2544_profile.min_rate = 0
534 with mock.patch.object(rfc2544_profile, '_get_ixia_traffic_profile') \
536 mock.patch.object(rfc2544_profile, '_ixia_traffic_generate') \
538 mock_get_tp.return_value = 'fake_tprofile'
539 rfc2544_profile.full_profile = mock.ANY
540 output = rfc2544_profile.execute_traffic(mock.ANY,
543 self.assertFalse(output)
544 self.assertEqual(35.0, rfc2544_profile.rate)
545 mock_get_tp.assert_called_once()
546 mock_tgenerate.assert_called_once()
548 def test_update_traffic_profile(self):
549 traffic_generator = mock.Mock(
550 autospec=trex_traffic_profile.TrexProfile)
551 traffic_generator.networks = {
552 "uplink_0": ["xe0"], # private, one value for intfs
553 "downlink_0": ["xe1", "xe2"], # public, two values for intfs
554 "downlink_1": ["xe3"], # not in TRAFFIC PROFILE
555 "tenant_0": ["xe4"], # not public or private
558 ports_expected = [8, 3, 5]
559 traffic_generator.vnfd_helper.port_num.side_effect = ports_expected
560 traffic_generator.client.return_value = True
562 traffic_profile = copy.deepcopy(self.TRAFFIC_PROFILE)
563 traffic_profile.update({
565 "downlink_0": ["xe1", "xe2"],
568 r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(traffic_profile)
569 r_f_c2544_profile.full_profile = {}
570 r_f_c2544_profile.get_streams = mock.Mock()
573 r_f_c2544_profile.update_traffic_profile(traffic_generator))
574 self.assertEqual(r_f_c2544_profile.ports, ports_expected)
576 def test_get_drop_percentage_completed(self):
577 samples = {'iface_name_1':
578 {'in_packets': 1000, 'out_packets': 1000,
579 'Store-Forward_Avg_latency_ns': 20,
580 'Store-Forward_Min_latency_ns': 15,
581 'Store-Forward_Max_latency_ns': 25},
583 {'in_packets': 1005, 'out_packets': 1007,
584 'Store-Forward_Avg_latency_ns': 23,
585 'Store-Forward_Min_latency_ns': 13,
586 'Store-Forward_Max_latency_ns': 28}
588 rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
589 completed, samples = rfc2544_profile.get_drop_percentage(samples, 0, 1)
590 self.assertTrue(completed)
591 self.assertEqual(66.9, samples['TxThroughput'])
592 self.assertEqual(66.833, samples['RxThroughput'])
593 self.assertEqual(0.099651, samples['DropPercentage'])
594 self.assertEqual(21.5, samples['latency_ns_avg'])
595 self.assertEqual(14.0, samples['latency_ns_min'])
596 self.assertEqual(26.5, samples['latency_ns_max'])
598 def test_get_drop_percentage_over_drop_percentage(self):
599 samples = {'iface_name_1':
600 {'in_packets': 1000, 'out_packets': 1000,
601 'Store-Forward_Avg_latency_ns': 20,
602 'Store-Forward_Min_latency_ns': 15,
603 'Store-Forward_Max_latency_ns': 25},
605 {'in_packets': 1005, 'out_packets': 1007,
606 'Store-Forward_Avg_latency_ns': 20,
607 'Store-Forward_Min_latency_ns': 15,
608 'Store-Forward_Max_latency_ns': 25}
610 rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
611 rfc2544_profile.rate = 1000
612 completed, samples = rfc2544_profile.get_drop_percentage(
614 self.assertFalse(completed)
615 self.assertEqual(66.9, samples['TxThroughput'])
616 self.assertEqual(66.833, samples['RxThroughput'])
617 self.assertEqual(0.099651, samples['DropPercentage'])
618 self.assertEqual(rfc2544_profile.rate, rfc2544_profile.max_rate)
620 def test_get_drop_percentage_under_drop_percentage(self):
621 samples = {'iface_name_1':
622 {'in_packets': 1000, 'out_packets': 1000,
623 'Store-Forward_Avg_latency_ns': 20,
624 'Store-Forward_Min_latency_ns': 15,
625 'Store-Forward_Max_latency_ns': 25},
627 {'in_packets': 1005, 'out_packets': 1007,
628 'Store-Forward_Avg_latency_ns': 20,
629 'Store-Forward_Min_latency_ns': 15,
630 'Store-Forward_Max_latency_ns': 25}
632 rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
633 rfc2544_profile.rate = 1000
634 completed, samples = rfc2544_profile.get_drop_percentage(
636 self.assertFalse(completed)
637 self.assertEqual(66.9, samples['TxThroughput'])
638 self.assertEqual(66.833, samples['RxThroughput'])
639 self.assertEqual(0.099651, samples['DropPercentage'])
640 self.assertEqual(rfc2544_profile.rate, rfc2544_profile.min_rate)
642 @mock.patch.object(ixia_rfc2544.LOG, 'info')
643 def test_get_drop_percentage_not_flow(self, *args):
644 samples = {'iface_name_1':
645 {'in_packets': 1000, 'out_packets': 0,
646 'Store-Forward_Avg_latency_ns': 20,
647 'Store-Forward_Min_latency_ns': 15,
648 'Store-Forward_Max_latency_ns': 25},
650 {'in_packets': 1005, 'out_packets': 0,
651 'Store-Forward_Avg_latency_ns': 20,
652 'Store-Forward_Min_latency_ns': 15,
653 'Store-Forward_Max_latency_ns': 25}
655 rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
656 rfc2544_profile.rate = 1000
657 completed, samples = rfc2544_profile.get_drop_percentage(
659 self.assertFalse(completed)
660 self.assertEqual(0.0, samples['TxThroughput'])
661 self.assertEqual(66.833, samples['RxThroughput'])
662 self.assertEqual(100, samples['DropPercentage'])
663 self.assertEqual(rfc2544_profile.rate, rfc2544_profile.max_rate)
665 def test_get_drop_percentage_first_run(self):
666 samples = {'iface_name_1':
667 {'in_packets': 1000, 'out_packets': 1000,
668 'Store-Forward_Avg_latency_ns': 20,
669 'Store-Forward_Min_latency_ns': 15,
670 'Store-Forward_Max_latency_ns': 25},
672 {'in_packets': 1005, 'out_packets': 1007,
673 'Store-Forward_Avg_latency_ns': 20,
674 'Store-Forward_Min_latency_ns': 15,
675 'Store-Forward_Max_latency_ns': 25}
677 rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
678 completed, samples = rfc2544_profile.get_drop_percentage(
679 samples, 0, 1, first_run=True)
680 self.assertTrue(completed)
681 self.assertEqual(66.9, samples['TxThroughput'])
682 self.assertEqual(66.833, samples['RxThroughput'])
683 self.assertEqual(0.099651, samples['DropPercentage'])
684 self.assertEqual(33.45, rfc2544_profile.rate)