1 # Copyright (c) 2016-2019 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.
22 from collections import OrderedDict
24 from yardstick.common import utils
25 from yardstick.common import exceptions
26 from yardstick.benchmark import contexts
27 from yardstick.benchmark.contexts import base as ctx_base
28 from yardstick.network_services.libs.ixia_libs.ixnet import ixnet_api
29 from yardstick.network_services.traffic_profile import base as tp_base
30 from yardstick.network_services.vnf_generic.vnf import tg_rfc2544_ixia
31 from yardstick.network_services.traffic_profile import ixia_rfc2544
34 TEST_FILE_YAML = 'nsb_test_case.yaml'
39 class TestIxiaResourceHelper(unittest.TestCase):
42 self._mock_IxNextgen = mock.patch.object(ixnet_api, 'IxNextgen')
43 self.mock_IxNextgen = self._mock_IxNextgen.start()
44 self.addCleanup(self._stop_mocks)
46 def _stop_mocks(self):
47 self._mock_IxNextgen.stop()
49 def test___init___with_custom_rfc_helper(self):
50 class MyRfcHelper(tg_rfc2544_ixia.IxiaRfc2544Helper):
53 ixia_resource_helper = tg_rfc2544_ixia.IxiaResourceHelper(
54 mock.Mock(), MyRfcHelper)
55 self.assertIsInstance(ixia_resource_helper.rfc_helper, MyRfcHelper)
57 def test__init_ix_scenario(self):
58 mock_scenario = mock.Mock()
59 mock_scenario_helper = mock.Mock()
60 mock_scenario_helper.scenario_cfg = {'ixia_config': 'TestScenario',
61 'options': 'scenario_options'}
62 mock_setup_helper = mock.Mock(scenario_helper=mock_scenario_helper)
63 ixia_resource_helper = tg_rfc2544_ixia.IxiaResourceHelper(mock_setup_helper)
64 ixia_resource_helper._ixia_scenarios = {'TestScenario': mock_scenario}
65 ixia_resource_helper.client = 'client'
66 ixia_resource_helper.context_cfg = 'context'
67 ixia_resource_helper._init_ix_scenario()
68 mock_scenario.assert_called_once_with('client', 'context', 'scenario_options')
70 def test__init_ix_scenario_not_supported_cfg_type(self):
71 mock_scenario_helper = mock.Mock()
72 mock_scenario_helper.scenario_cfg = {'ixia_config': 'FakeScenario',
73 'options': 'scenario_options'}
74 mock_setup_helper = mock.Mock(scenario_helper=mock_scenario_helper)
75 ixia_resource_helper = tg_rfc2544_ixia.IxiaResourceHelper(mock_setup_helper)
76 ixia_resource_helper._ixia_scenarios = {'TestScenario': mock.Mock()}
77 with self.assertRaises(RuntimeError):
78 ixia_resource_helper._init_ix_scenario()
80 @mock.patch.object(tg_rfc2544_ixia.IxiaResourceHelper, '_init_ix_scenario')
81 def test_setup(self, mock__init_ix_scenario):
82 ixia_resource_helper = tg_rfc2544_ixia.IxiaResourceHelper(mock.Mock())
83 ixia_resource_helper.setup()
84 mock__init_ix_scenario.assert_called_once()
86 def test_stop_collect_with_client(self):
87 mock_client = mock.Mock()
88 ixia_resource_helper = tg_rfc2544_ixia.IxiaResourceHelper(mock.Mock())
89 ixia_resource_helper.client = mock_client
90 ixia_resource_helper._ix_scenario = mock.Mock()
91 ixia_resource_helper.stop_collect()
92 self.assertEqual(1, ixia_resource_helper._terminated.value)
93 ixia_resource_helper._ix_scenario.stop_protocols.assert_called_once()
95 def test_run_traffic(self):
96 mock_tprofile = mock.Mock()
97 mock_tprofile.config.duration = 10
98 mock_tprofile.get_drop_percentage.return_value = True, 'fake_samples'
99 ixia_rhelper = tg_rfc2544_ixia.IxiaResourceHelper(mock.Mock())
100 ixia_rhelper.rfc_helper = mock.Mock()
101 ixia_rhelper.vnfd_helper = mock.Mock()
102 ixia_rhelper._ix_scenario = mock.Mock()
103 ixia_rhelper.vnfd_helper.port_pairs.all_ports = []
104 with mock.patch.object(ixia_rhelper, 'generate_samples'), \
105 mock.patch.object(ixia_rhelper, '_build_ports'), \
106 mock.patch.object(ixia_rhelper, '_initialize_client'), \
107 mock.patch.object(utils, 'wait_until_true'):
108 ixia_rhelper.run_traffic(mock_tprofile)
110 self.assertEqual('fake_samples', ixia_rhelper._queue.get())
111 mock_tprofile.update_traffic_profile.assert_called_once()
113 def test_run_test(self):
114 expected_result = {'test': 'fake_samples', 'Iteration': 1}
115 mock_tprofile = mock.Mock()
116 mock_tprofile.config.duration = 10
117 mock_tprofile.get_drop_percentage.return_value = \
118 True, {'test': 'fake_samples'}
119 ixia_rhelper = tg_rfc2544_ixia.IxiaResourceHelper(mock.Mock())
120 tasks_queue = mock.Mock()
121 tasks_queue.get.return_value = 'RUN_TRAFFIC'
122 results_queue = mock.Mock()
123 ixia_rhelper.rfc_helper = mock.Mock()
124 ixia_rhelper.vnfd_helper = mock.Mock()
125 ixia_rhelper._ix_scenario = mock.Mock()
126 ixia_rhelper.vnfd_helper.port_pairs.all_ports = []
127 with mock.patch.object(ixia_rhelper, 'generate_samples'), \
128 mock.patch.object(ixia_rhelper, '_build_ports'), \
129 mock.patch.object(ixia_rhelper, '_initialize_client'), \
130 mock.patch.object(utils, 'wait_until_true'):
131 ixia_rhelper.run_test(mock_tprofile, tasks_queue, results_queue)
133 self.assertEqual(expected_result, ixia_rhelper._queue.get())
134 mock_tprofile.update_traffic_profile.assert_called_once()
135 tasks_queue.task_done.assert_called_once()
136 results_queue.put.assert_called_once_with('COMPLETE')
139 @mock.patch.object(tg_rfc2544_ixia, 'ixnet_api')
140 class TestIXIATrafficGen(unittest.TestCase):
141 VNFD = {'vnfd:vnfd-catalog':
143 [{'short-name': 'VpeVnf',
146 [{'network': '152.16.100.20',
147 'netmask': '255.255.255.0',
148 'gateway': '152.16.100.20',
150 {'network': '152.16.40.20',
151 'netmask': '255.255.255.0',
152 'gateway': '152.16.40.20',
154 'description': 'VPE approximation using DPDK',
155 'name': 'vpevnf-baremetal',
157 [{'network': '0064:ff9b:0:0:0:0:9810:6414',
159 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
161 {'network': '0064:ff9b:0:0:0:0:9810:2814',
163 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
165 'id': 'vpevnf-baremetal',
166 'external-interface':
167 [{'virtual-interface':
168 {'dst_mac': '00:00:00:00:00:04',
169 'vpci': '0000:05:00.0',
170 'local_ip': '152.16.100.19',
171 'type': 'PCI-PASSTHROUGH',
172 'netmask': '255.255.255.0',
174 'bandwidth': '10 Gbps',
176 'dst_ip': '152.16.100.20',
177 'local_iface_name': 'xe0',
178 'local_mac': '00:00:00:00:00:02'},
179 'vnfd-connection-point-ref': 'xe0',
181 {'virtual-interface':
182 {'dst_mac': '00:00:00:00:00:03',
183 'vpci': '0000:05:00.1',
184 'local_ip': '152.16.40.19',
185 'type': 'PCI-PASSTHROUGH',
187 'netmask': '255.255.255.0',
189 'bandwidth': '10 Gbps',
190 'dst_ip': '152.16.40.20',
191 'local_iface_name': 'xe1',
192 'local_mac': '00:00:00:00:00:01'},
193 'vnfd-connection-point-ref': 'xe1',
195 'description': 'Vpe approximation using DPDK',
197 {'vdu-id': 'vpevnf-baremetal',
203 {'kpi': ['packets_in', 'packets_fwd',
205 'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
206 {'type': 'VPORT', 'name': 'xe1'}],
207 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
210 "schema": "isb:traffic_profile:0.1",
212 "description": "Fixed traffic profile to run UDP traffic",
214 "traffic_type": "FixedTraffic",
215 "frame_rate": 100, # pps
219 TC_YAML = {'scenarios': [{'tc_options':
220 {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}},
221 'runner': {'duration': 400,
222 'interval': 35, 'type': 'Duration'},
224 {'flow': 'ipv4_1flow_Packets_vpe.yaml',
225 'imix': 'imix_voice.yaml'},
226 'vnf_options': {'vpe': {'cfg': 'vpe_config'}},
227 'traffic_profile': 'ipv4_throughput_vpe.yaml',
229 'nodes': {'tg__1': 'trafficgen_1.yardstick',
230 'vnf__1': 'vnf.yardstick'},
231 'topology': 'vpe_vnf_topology.yaml'}],
232 'context': {'nfvi_type': 'baremetal',
233 'type': contexts.CONTEXT_NODE,
235 'file': '/etc/yardstick/nodes/pod.yaml'},
236 'schema': 'yardstick:task:0.1'}
238 def test___init__(self, *args):
239 with mock.patch("yardstick.ssh.SSH") as ssh:
240 ssh_mock = mock.Mock(autospec=ssh.SSH)
242 mock.Mock(return_value=(0, "", ""))
243 ssh.from_node.return_value = ssh_mock
244 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
245 # NOTE(ralonsoh): check the object returned.
246 tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
248 def test_listen_traffic(self, *args):
249 with mock.patch("yardstick.ssh.SSH") as ssh:
250 ssh_mock = mock.Mock(autospec=ssh.SSH)
252 mock.Mock(return_value=(0, "", ""))
253 ssh.from_node.return_value = ssh_mock
254 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
255 ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
256 self.assertIsNone(ixnet_traffic_gen.listen_traffic({}))
258 @mock.patch.object(ctx_base.Context, 'get_context_from_server', return_value='fake_context')
259 def test_instantiate(self, *args):
260 with mock.patch("yardstick.ssh.SSH") as ssh:
261 ssh_mock = mock.Mock(autospec=ssh.SSH)
263 mock.Mock(return_value=(0, "", ""))
265 mock.Mock(return_value=(0, "", ""))
266 ssh.from_node.return_value = ssh_mock
267 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
268 ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
269 scenario_cfg = {'tc': "nsb_test_case",
277 'allowed_drop_rate': '0.8 - 1'},
279 'rules': 'acl_1rule.yaml',
283 'worker_config': '1C/1T',
284 'worker_threads': 1}}}})
285 scenario_cfg.update({
286 'nodes': {ixnet_traffic_gen.name: "mock"}
288 ixnet_traffic_gen.topology = ""
289 ixnet_traffic_gen.get_ixobj = mock.MagicMock()
290 ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock()
291 ixnet_traffic_gen._ixia_traffic_gen._connect = mock.Mock()
294 ixnet_traffic_gen.instantiate(scenario_cfg, {}))
296 @mock.patch.object(ctx_base.Context, 'get_physical_node_from_server', return_value='mock_node')
297 def test_collect_kpi(self, *args):
298 with mock.patch("yardstick.ssh.SSH") as ssh:
299 ssh_mock = mock.Mock(autospec=ssh.SSH)
301 mock.Mock(return_value=(0, "", ""))
302 ssh.from_node.return_value = ssh_mock
304 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
305 ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
306 ixnet_traffic_gen.scenario_helper.scenario_cfg = {
307 'nodes': {ixnet_traffic_gen.name: "mock"}
309 ixnet_traffic_gen.data = {}
310 restult = ixnet_traffic_gen.collect_kpi()
312 expected = {'collect_stats': {},
313 'physical_node': 'mock_node'}
315 self.assertEqual(expected, restult)
317 def test_terminate(self, *args):
318 with mock.patch("yardstick.ssh.SSH") as ssh:
319 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
320 ssh_mock = mock.Mock(autospec=ssh.SSH)
322 mock.Mock(return_value=(0, "", ""))
323 ssh.from_node.return_value = ssh_mock
324 ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(
325 NAME, vnfd, resource_helper_type=mock.Mock())
326 ixnet_traffic_gen._terminated = mock.MagicMock()
327 ixnet_traffic_gen._terminated.value = 0
328 ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock()
329 ixnet_traffic_gen._ixia_traffic_gen.ix_stop_traffic = mock.Mock()
330 ixnet_traffic_gen._traffic_process = mock.MagicMock()
331 ixnet_traffic_gen._traffic_process.terminate = mock.Mock()
332 self.assertIsNone(ixnet_traffic_gen.terminate())
334 def _get_file_abspath(self, filename):
335 curr_path = os.path.dirname(os.path.abspath(__file__))
336 file_path = os.path.join(curr_path, filename)
339 def test__check_status(self, *args):
340 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
341 sut = tg_rfc2544_ixia.IxiaTrafficGen('vnf1', vnfd)
344 @mock.patch("yardstick.ssh.SSH")
345 def test_traffic_runner(self, mock_ssh, *args):
346 mock_traffic_profile = mock.Mock(autospec=tp_base.TrafficProfile)
347 mock_traffic_profile.get_traffic_definition.return_value = "64"
348 mock_traffic_profile.params = self.TRAFFIC_PROFILE
349 # traffic_profile.ports is standardized on port_num
350 mock_traffic_profile.ports = [0, 1]
352 mock_ssh_instance = mock.Mock(autospec=mock_ssh.SSH)
353 mock_ssh_instance.execute.return_value = 0, "", ""
354 mock_ssh_instance.run.return_value = 0, "", ""
356 mock_ssh.from_node.return_value = mock_ssh_instance
358 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
359 vnfd["mgmt-interface"].update({
361 "ixchassis": "1.1.1.1",
362 "py_bin_path": "/root",
368 for ifname in range(1):
369 name = "xe{}".format(ifname)
377 "Valid_Frames_Rx": 1000,
383 samples.update({"CurrentDropPercentage": 0.0})
388 "Rx_Rate_Kbps": [20, 20],
389 "Tx_Rate_Kbps": [20, 20],
390 "Rx_Rate_Mbps": [10, 10],
391 "Tx_Rate_Mbps": [10, 10],
392 "CurrentDropPercentage": [0, 0],
393 "RxThroughput": [10, 10],
394 "TxThroughput": [10, 10],
395 "Frames_Tx": [1000, 1000],
396 "in_packets": [1000, 1000],
397 "Valid_Frames_Rx": [1000, 1000],
398 "out_packets": [1000, 1000],
402 mock_traffic_profile.execute_traffic.return_value = [
403 'Completed', samples]
404 mock_traffic_profile.get_drop_percentage.return_value = [
405 'Completed', samples]
407 sut = tg_rfc2544_ixia.IxiaTrafficGen(name, vnfd)
408 sut.vnf_port_pairs = [[[0], [1]]]
409 sut.tc_file_name = self._get_file_abspath(TEST_FILE_YAML)
412 sut.ssh_helper = mock.Mock()
413 sut._traffic_process = mock.MagicMock()
414 sut.generate_port_pairs = mock.Mock()
416 sut._ixia_traffic_gen = mock.MagicMock()
417 sut._ixia_traffic_gen.ix_get_statistics.return_value = last_res
419 sut.resource_helper.client = mock.MagicMock()
420 sut.resource_helper.client_started = mock.MagicMock()
421 sut.resource_helper.client_started.value = 1
422 sut.resource_helper.rfc_helper.iteration.value = 11
423 sut.resource_helper._ix_scenario = mock.Mock()
425 sut.scenario_helper.scenario_cfg = {
430 'allowed_drop_rate': '0.8 - 1',
434 'rules': 'acl_1rule.yaml',
438 'worker_config': '1C/1T',
443 'task_path': '/path/to/task'
446 @mock.patch.object(six.moves.builtins, 'open', create=True)
447 @mock.patch('yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.open',
448 mock.mock_open(), create=True)
449 @mock.patch('yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.LOG.exception')
450 def _traffic_runner(*args):
451 result = sut._traffic_runner(mock_traffic_profile)
452 self.assertIsNone(result)
456 def test_run_traffic_once(self, *args):
457 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
458 sut = tg_rfc2544_ixia.IxiaTrafficGen('vnf1', vnfd)
459 sut._init_traffic_process = mock.Mock()
460 sut._tasks_queue.put = mock.Mock()
461 sut.resource_helper.client_started.value = 0
462 sut.run_traffic_once(self.TRAFFIC_PROFILE)
463 sut._tasks_queue.put.assert_called_once_with("RUN_TRAFFIC")
464 sut._init_traffic_process.assert_called_once_with(self.TRAFFIC_PROFILE)
466 def test__test_runner(self, *args):
467 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
468 sut = tg_rfc2544_ixia.IxiaTrafficGen('vnf1', vnfd)
471 sut.resource_helper = mock.Mock()
472 sut._test_runner(self.TRAFFIC_PROFILE, tasks, results)
473 sut.resource_helper.run_test.assert_called_once_with(self.TRAFFIC_PROFILE,
476 @mock.patch.object(time, 'sleep', return_value=0)
477 def test__init_traffic_process(self, *args):
478 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
479 sut = tg_rfc2544_ixia.IxiaTrafficGen('vnf1', vnfd)
480 sut._test_runner = mock.Mock(return_value=0)
481 sut.resource_helper = mock.Mock()
482 sut.resource_helper.client_started.value = 0
483 sut._init_traffic_process(self.TRAFFIC_PROFILE)
485 def test_wait_on_traffic(self, *args):
486 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
487 sut = tg_rfc2544_ixia.IxiaTrafficGen('vnf1', vnfd)
488 sut._tasks_queue.join = mock.Mock(return_value=0)
489 sut._result_queue.get = mock.Mock(return_value='COMPLETE')
490 result = sut.wait_on_traffic()
491 sut._tasks_queue.join.assert_called_once()
492 sut._result_queue.get.assert_called_once()
493 self.assertEqual(result, 'COMPLETE')
496 class TestIxiaBasicScenario(unittest.TestCase):
498 STATS = {'stat_name': ['Card01/Port01',
500 'port_name': ['Ethernet - 001', 'Ethernet - 002'],
501 'Frames_Tx': ['150', '150'],
502 'Valid_Frames_Rx': ['150', '150'],
503 'Frames_Tx_Rate': ['0.0', '0.0'],
504 'Valid_Frames_Rx_Rate': ['0.0', '0.0'],
505 'Bytes_Rx': ['9600', '9600'],
506 'Bytes_Tx': ['9600', '9600'],
507 'Tx_Rate_Kbps': ['0.0', '0.0'],
508 'Rx_Rate_Mbps': ['0.0', '0.0'],
509 'Tx_Rate_Mbps': ['0.0', '0.0'],
510 'Rx_Rate_Kbps': ['0.0', '0.0'],
511 'Store-Forward_Max_latency_ns': ['100', '200'],
512 'Store-Forward_Min_latency_ns': ['100', '200'],
513 'Store-Forward_Avg_latency_ns': ['100', '200']}
516 self._mock_IxNextgen = mock.patch.object(ixnet_api, 'IxNextgen')
517 self.mock_IxNextgen = self._mock_IxNextgen.start()
518 self.context_cfg = mock.Mock()
519 self.ixia_cfg = mock.Mock()
520 self.scenario = tg_rfc2544_ixia.IxiaBasicScenario(self.mock_IxNextgen,
523 self.addCleanup(self._stop_mocks)
525 def _stop_mocks(self):
526 self._mock_IxNextgen.stop()
528 def test___init___(self):
529 self.assertIsInstance(self.scenario, tg_rfc2544_ixia.IxiaBasicScenario)
530 self.assertEqual(self.scenario.client, self.mock_IxNextgen)
532 def test_create_traffic_model(self):
533 self.mock_IxNextgen.get_vports.return_value = [1, 2, 3, 4]
534 yaml_data = {'traffic_profile': {}
536 traffic_profile = ixia_rfc2544.IXIARFC2544Profile(yaml_data)
537 self.scenario.create_traffic_model(traffic_profile)
538 self.scenario.client.get_vports.assert_called_once()
539 self.scenario.client.create_traffic_model.assert_called_once_with(
540 [1, 3], [2, 4], traffic_profile)
542 def test_apply_config(self):
543 self.assertIsNone(self.scenario.apply_config())
545 def test_run_protocols(self):
546 self.assertIsNone(self.scenario.run_protocols())
548 def test_stop_protocols(self):
549 self.assertIsNone(self.scenario.stop_protocols())
551 def test__get_stats(self):
552 self.scenario._get_stats()
553 self.scenario.client.get_statistics.assert_called_once()
555 @mock.patch.object(tg_rfc2544_ixia.IxiaBasicScenario, '_get_stats')
556 def test_generate_samples(self, mock_get_stats):
558 expected_samples = {'xe0': {
563 'rx_throughput_mbps': 0.0,
564 'rx_throughput_kps': 0.0,
567 'RxThroughputBps': 320.0,
568 'TxThroughputBps': 320.0,
569 'tx_throughput_mbps': 0.0,
570 'tx_throughput_kps': 0.0,
571 'Store-Forward_Max_latency_ns': 100,
572 'Store-Forward_Min_latency_ns': 100,
573 'Store-Forward_Avg_latency_ns': 100},
579 'rx_throughput_mbps': 0.0,
580 'rx_throughput_kps': 0.0,
583 'RxThroughputBps': 320.0,
584 'TxThroughputBps': 320.0,
585 'tx_throughput_mbps': 0.0,
586 'tx_throughput_kps': 0.0,
587 'Store-Forward_Max_latency_ns': 200,
588 'Store-Forward_Min_latency_ns': 200,
589 'Store-Forward_Avg_latency_ns': 200}}
591 res_helper = mock.Mock()
592 res_helper.vnfd_helper.find_interface_by_port.side_effect = \
593 [{'name': 'xe0'}, {'name': 'xe1'}]
596 mock_get_stats.return_value = self.STATS
597 samples = self.scenario.generate_samples(res_helper, ports, duration)
598 mock_get_stats.assert_called_once()
599 self.assertEqual(samples, expected_samples)
602 class TestIxiaL3Scenario(TestIxiaBasicScenario):
605 'src_ip': ['192.168.0.1-192.168.0.50'],
606 'dst_ip': ['192.168.1.1-192.168.1.150']
616 'vld_id': 'uplink_0',
617 'local_ip': '10.1.1.1',
618 'local_mac': 'aa:bb:cc:dd:ee:ff',
622 'vld_id': 'downlink_0',
623 'local_ip': '20.2.2.2',
624 'local_mac': 'bb:bb:cc:dd:ee:ee',
629 'network': "152.16.100.20",
630 'netmask': '255.255.0.0',
631 'gateway': '152.16.100.21',
639 super(TestIxiaL3Scenario, self).setUp()
640 self.ixia_cfg = self.IXIA_CFG
641 self.context_cfg = self.CONTEXT_CFG
642 self.scenario = tg_rfc2544_ixia.IxiaL3Scenario(self.mock_IxNextgen,
646 def test___init___(self):
647 self.assertIsInstance(self.scenario, tg_rfc2544_ixia.IxiaL3Scenario)
648 self.assertEqual(self.scenario.client, self.mock_IxNextgen)
650 def test_create_traffic_model(self):
651 self.mock_IxNextgen.get_vports.return_value = ['1', '2']
652 self.scenario.create_traffic_model()
653 self.scenario.client.get_vports.assert_called_once()
654 self.scenario.client.create_ipv4_traffic_model.\
655 assert_called_once_with(['1/protocols/static'],
656 ['2/protocols/static'])
658 def test_apply_config(self):
659 self.scenario._add_interfaces = mock.Mock()
660 self.scenario._add_static_ips = mock.Mock()
661 self.assertIsNone(self.scenario.apply_config())
663 def test__add_static(self):
664 self.mock_IxNextgen.get_vports.return_value = ['1', '2']
665 self.mock_IxNextgen.get_static_interface.side_effect = ['intf1',
668 self.scenario._add_static_ips()
670 self.mock_IxNextgen.get_static_interface.assert_any_call('1')
671 self.mock_IxNextgen.get_static_interface.assert_any_call('2')
673 self.scenario.client.add_static_ipv4.assert_any_call(
674 'intf1', '1', '192.168.0.1', 49, '32')
675 self.scenario.client.add_static_ipv4.assert_any_call(
676 'intf2', '2', '192.168.1.1', 149, '32')
678 def test__add_interfaces(self):
679 self.mock_IxNextgen.get_vports.return_value = ['1', '2']
681 self.scenario._add_interfaces()
683 self.mock_IxNextgen.add_interface.assert_any_call('1',
687 self.mock_IxNextgen.add_interface.assert_any_call('2',
693 class TestIxiaPppoeClientScenario(unittest.TestCase):
697 'sessions_per_port': 4,
698 'sessions_per_svlan': 1,
701 'ip': ['10.3.3.1', '10.4.4.1']
704 'sessions_per_port': 1,
705 'sessions_per_vlan': 1,
707 'gateway_ip': ['10.1.1.1', '10.2.2.1'],
708 'ip': ['10.1.1.1', '10.2.2.1'],
709 'prefix': ['24', '24']
712 'tos': {'precedence': [0, 4]}
718 'interfaces': {'xe0': {
719 'local_ip': '10.1.1.1',
720 'netmask': '255.255.255.0'
724 self._mock_IxNextgen = mock.patch.object(ixnet_api, 'IxNextgen')
725 self.mock_IxNextgen = self._mock_IxNextgen.start()
726 self.scenario = tg_rfc2544_ixia.IxiaPppoeClientScenario(
727 self.mock_IxNextgen, self.CONTEXT_CFG, self.IXIA_CFG)
728 tg_rfc2544_ixia.WAIT_PROTOCOLS_STARTED = 2
729 self.addCleanup(self._stop_mocks)
731 def _stop_mocks(self):
732 self._mock_IxNextgen.stop()
734 def test___init___(self):
735 self.assertIsInstance(self.scenario, tg_rfc2544_ixia.IxiaPppoeClientScenario)
736 self.assertEqual(self.scenario.client, self.mock_IxNextgen)
738 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
740 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
741 '_apply_access_network_config')
742 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
743 '_apply_core_network_config')
744 def test_apply_config(self, mock_apply_core_net_cfg,
745 mock_apply_access_net_cfg,
746 mock_fill_ixia_config):
747 self.mock_IxNextgen.get_vports.return_value = [1, 2, 3, 4]
748 self.scenario.apply_config()
749 self.scenario.client.get_vports.assert_called_once()
750 self.assertEqual(self.scenario._uplink_vports, [1, 3])
751 self.assertEqual(self.scenario._downlink_vports, [2, 4])
752 mock_fill_ixia_config.assert_called_once()
753 mock_apply_core_net_cfg.assert_called_once()
754 mock_apply_access_net_cfg.assert_called_once()
756 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
757 '_get_endpoints_src_dst_id_pairs')
758 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
759 '_get_endpoints_src_dst_obj_pairs')
760 def test_create_traffic_model(self, mock_obj_pairs, mock_id_pairs):
761 uplink_endpoints = ['group1', 'group2']
762 downlink_endpoints = ['group3', 'group3']
763 mock_id_pairs.return_value = ['xe0', 'xe1', 'xe0', 'xe1']
764 mock_obj_pairs.return_value = ['group1', 'group3', 'group2', 'group3']
765 mock_tp = mock.Mock()
766 mock_tp.full_profile = {'uplink_0': 'data',
767 'downlink_0': 'data',
771 self.scenario.create_traffic_model(mock_tp)
772 mock_id_pairs.assert_called_once_with(mock_tp.full_profile)
773 mock_obj_pairs.assert_called_once_with(['xe0', 'xe1', 'xe0', 'xe1'])
774 self.scenario.client.create_ipv4_traffic_model.assert_called_once_with(
775 uplink_endpoints, downlink_endpoints)
777 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
778 '_get_endpoints_src_dst_id_pairs')
779 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
780 '_get_endpoints_src_dst_obj_pairs')
781 def test_create_traffic_model_topology_based_flows(self, mock_obj_pairs,
783 uplink_topologies = ['topology1', 'topology3']
784 downlink_topologies = ['topology2', 'topology4']
785 mock_id_pairs.return_value = []
786 mock_obj_pairs.return_value = []
787 mock_tp = mock.Mock()
788 mock_tp.full_profile = {'uplink_0': 'data',
789 'downlink_0': 'data',
793 self.scenario._access_topologies = ['topology1', 'topology3']
794 self.scenario._core_topologies = ['topology2', 'topology4']
795 self.scenario.create_traffic_model(mock_tp)
796 mock_id_pairs.assert_called_once_with(mock_tp.full_profile)
797 mock_obj_pairs.assert_called_once_with([])
798 self.scenario.client.create_ipv4_traffic_model.assert_called_once_with(
799 uplink_topologies, downlink_topologies)
801 def test__get_endpoints_src_dst_id_pairs(self):
802 full_tp = OrderedDict([
803 ('uplink_0', {'ipv4': {'port': 'xe0'}}),
804 ('downlink_0', {'ipv4': {'port': 'xe1'}}),
805 ('uplink_1', {'ipv4': {'port': 'xe0'}}),
806 ('downlink_1', {'ipv4': {'port': 'xe3'}})])
807 endpoints_src_dst_pairs = ['xe0', 'xe1', 'xe0', 'xe3']
808 res = self.scenario._get_endpoints_src_dst_id_pairs(full_tp)
809 self.assertEqual(res, endpoints_src_dst_pairs)
811 def test__get_endpoints_src_dst_id_pairs_wrong_flows_number(self):
812 full_tp = OrderedDict([
813 ('uplink_0', {'ipv4': {'port': 'xe0'}}),
814 ('downlink_0', {'ipv4': {'port': 'xe1'}}),
815 ('uplink_1', {'ipv4': {'port': 'xe0'}})])
816 with self.assertRaises(RuntimeError):
817 self.scenario._get_endpoints_src_dst_id_pairs(full_tp)
819 def test__get_endpoints_src_dst_id_pairs_no_port_key(self):
820 full_tp = OrderedDict([
821 ('uplink_0', {'ipv4': {'id': 1}}),
822 ('downlink_0', {'ipv4': {'id': 2}})])
824 self.scenario._get_endpoints_src_dst_id_pairs(full_tp), [])
826 def test__get_endpoints_src_dst_obj_pairs_tp_with_port_key(self):
827 endpoints_id_pairs = ['xe0', 'xe1',
833 'sessions_per_port': 4,
834 'sessions_per_svlan': 1
837 'src_ip': [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}],
838 'dst_ip': [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
842 expected_result = ['tp1_dg1', 'tp3_dg1', 'tp1_dg2', 'tp3_dg1',
843 'tp1_dg3', 'tp4_dg1', 'tp1_dg4', 'tp4_dg1']
845 self.scenario._ixia_cfg = ixia_cfg
846 self.scenario._access_topologies = ['topology1', 'topology2']
847 self.scenario._core_topologies = ['topology3', 'topology4']
848 self.mock_IxNextgen.get_topology_device_groups.side_effect = \
849 [['tp1_dg1', 'tp1_dg2', 'tp1_dg3', 'tp1_dg4'],
850 ['tp2_dg1', 'tp2_dg2', 'tp2_dg3', 'tp2_dg4'],
853 res = self.scenario._get_endpoints_src_dst_obj_pairs(
855 self.assertEqual(res, expected_result)
857 def test__get_endpoints_src_dst_obj_pairs_default_flows_mapping(self):
858 endpoints_id_pairs = []
861 'sessions_per_port': 4,
862 'sessions_per_svlan': 1
865 'src_ip': [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}],
866 'dst_ip': [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
870 self.scenario._ixia_cfg = ixia_cfg
871 res = self.scenario._get_endpoints_src_dst_obj_pairs(
873 self.assertEqual(res, [])
875 def test_run_protocols(self):
876 self.scenario.client.is_protocols_running.return_value = True
877 self.scenario.run_protocols()
878 self.scenario.client.start_protocols.assert_called_once()
880 def test_run_protocols_timeout_exception(self):
881 self.scenario.client.is_protocols_running.return_value = False
882 with self.assertRaises(exceptions.WaitTimeout):
883 self.scenario.run_protocols()
884 self.scenario.client.start_protocols.assert_called_once()
886 def test_stop_protocols(self):
887 self.scenario.stop_protocols()
888 self.scenario.client.stop_protocols.assert_called_once()
890 def test__get_intf_addr_str_type_input(self):
891 intf = '192.168.10.2/24'
892 ip, mask = self.scenario._get_intf_addr(intf)
893 self.assertEqual(ip, '192.168.10.2')
894 self.assertEqual(mask, 24)
896 def test__get_intf_addr_dict_type_input(self):
897 intf = {'tg__0': 'xe0'}
898 ip, mask = self.scenario._get_intf_addr(intf)
899 self.assertEqual(ip, '10.1.1.1')
900 self.assertEqual(mask, 24)
902 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario, '_get_intf_addr')
903 def test__fill_ixia_config(self, mock_get_intf_addr):
907 'sessions_per_port': 4,
908 'sessions_per_svlan': 1,
911 'ip': ['10.3.3.1/24', '10.4.4.1/24']
914 'sessions_per_port': 1,
915 'sessions_per_vlan': 1,
917 'gateway_ip': ['10.1.1.1/24', '10.2.2.1/24'],
918 'ip': ['10.1.1.1/24', '10.2.2.1/24']
922 mock_get_intf_addr.side_effect = [
930 self.scenario._ixia_cfg = ixia_cfg
931 self.scenario._fill_ixia_config()
932 self.assertEqual(mock_get_intf_addr.call_count, 6)
933 self.assertEqual(self.scenario._ixia_cfg['pppoe_client']['ip'],
934 ['10.3.3.1', '10.4.4.1'])
935 self.assertEqual(self.scenario._ixia_cfg['ipv4_client']['ip'],
936 ['10.1.1.1', '10.2.2.1'])
937 self.assertEqual(self.scenario._ixia_cfg['ipv4_client']['prefix'],
940 @mock.patch('yardstick.network_services.libs.ixia_libs.ixnet.ixnet_api.Vlan')
941 def test__apply_access_network_config_pap_auth(self, mock_vlan):
944 'sessions_per_port': 4,
945 'sessions_per_svlan': 1,
948 'pap_user': 'test_pap',
949 'pap_password': 'pap'
951 pap_user = _ixia_cfg['pppoe_client']['pap_user']
952 pap_passwd = _ixia_cfg['pppoe_client']['pap_password']
953 self.scenario._ixia_cfg = _ixia_cfg
954 self.scenario._uplink_vports = [0, 2]
955 self.scenario.client.add_topology.side_effect = ['Topology 1', 'Topology 2']
956 self.scenario.client.add_device_group.side_effect = ['Dg1', 'Dg2', 'Dg3',
959 self.scenario.client.add_ethernet.side_effect = ['Eth1', 'Eth2', 'Eth3',
960 'Eth4', 'Eth5', 'Eth6',
962 self.scenario._apply_access_network_config()
963 self.assertEqual(self.scenario.client.add_topology.call_count, 2)
964 self.assertEqual(self.scenario.client.add_device_group.call_count, 8)
965 self.assertEqual(self.scenario.client.add_ethernet.call_count, 8)
966 self.assertEqual(mock_vlan.call_count, 16)
967 self.assertEqual(self.scenario.client.add_vlans.call_count, 8)
968 self.assertEqual(self.scenario.client.add_pppox_client.call_count, 8)
969 self.scenario.client.add_topology.assert_has_calls([
970 mock.call('Topology access 0', 0),
971 mock.call('Topology access 1', 2)
973 self.scenario.client.add_device_group.assert_has_calls([
974 mock.call('Topology 1', 'SVLAN 10', 1),
975 mock.call('Topology 1', 'SVLAN 11', 1),
976 mock.call('Topology 1', 'SVLAN 12', 1),
977 mock.call('Topology 1', 'SVLAN 13', 1),
978 mock.call('Topology 2', 'SVLAN 14', 1),
979 mock.call('Topology 2', 'SVLAN 15', 1),
980 mock.call('Topology 2', 'SVLAN 16', 1),
981 mock.call('Topology 2', 'SVLAN 17', 1)
983 self.scenario.client.add_ethernet.assert_has_calls([
984 mock.call('Dg1', 'Ethernet'),
985 mock.call('Dg2', 'Ethernet'),
986 mock.call('Dg3', 'Ethernet'),
987 mock.call('Dg4', 'Ethernet'),
988 mock.call('Dg5', 'Ethernet'),
989 mock.call('Dg6', 'Ethernet'),
990 mock.call('Dg7', 'Ethernet'),
991 mock.call('Dg8', 'Ethernet')
993 mock_vlan.assert_has_calls([
994 mock.call(vlan_id=10),
995 mock.call(vlan_id=20, vlan_id_step=1),
996 mock.call(vlan_id=11),
997 mock.call(vlan_id=20, vlan_id_step=1),
998 mock.call(vlan_id=12),
999 mock.call(vlan_id=20, vlan_id_step=1),
1000 mock.call(vlan_id=13),
1001 mock.call(vlan_id=20, vlan_id_step=1),
1002 mock.call(vlan_id=14),
1003 mock.call(vlan_id=20, vlan_id_step=1),
1004 mock.call(vlan_id=15),
1005 mock.call(vlan_id=20, vlan_id_step=1),
1006 mock.call(vlan_id=16),
1007 mock.call(vlan_id=20, vlan_id_step=1),
1008 mock.call(vlan_id=17),
1009 mock.call(vlan_id=20, vlan_id_step=1)
1011 self.scenario.client.add_pppox_client.assert_has_calls([
1012 mock.call('Eth1', 'pap', pap_user, pap_passwd),
1013 mock.call('Eth2', 'pap', pap_user, pap_passwd),
1014 mock.call('Eth3', 'pap', pap_user, pap_passwd),
1015 mock.call('Eth4', 'pap', pap_user, pap_passwd),
1016 mock.call('Eth5', 'pap', pap_user, pap_passwd),
1017 mock.call('Eth6', 'pap', pap_user, pap_passwd),
1018 mock.call('Eth7', 'pap', pap_user, pap_passwd),
1019 mock.call('Eth8', 'pap', pap_user, pap_passwd)
1022 def test__apply_access_network_config_chap_auth(self):
1025 'sessions_per_port': 4,
1026 'sessions_per_svlan': 1,
1029 'chap_user': 'test_chap',
1030 'chap_password': 'chap'
1032 chap_user = _ixia_cfg['pppoe_client']['chap_user']
1033 chap_passwd = _ixia_cfg['pppoe_client']['chap_password']
1034 self.scenario._ixia_cfg = _ixia_cfg
1035 self.scenario._uplink_vports = [0, 2]
1036 self.scenario.client.add_ethernet.side_effect = ['Eth1', 'Eth2', 'Eth3',
1037 'Eth4', 'Eth5', 'Eth6',
1039 self.scenario._apply_access_network_config()
1040 self.assertEqual(self.scenario.client.add_pppox_client.call_count, 8)
1041 self.scenario.client.add_pppox_client.assert_has_calls([
1042 mock.call('Eth1', 'chap', chap_user, chap_passwd),
1043 mock.call('Eth2', 'chap', chap_user, chap_passwd),
1044 mock.call('Eth3', 'chap', chap_user, chap_passwd),
1045 mock.call('Eth4', 'chap', chap_user, chap_passwd),
1046 mock.call('Eth5', 'chap', chap_user, chap_passwd),
1047 mock.call('Eth6', 'chap', chap_user, chap_passwd),
1048 mock.call('Eth7', 'chap', chap_user, chap_passwd),
1049 mock.call('Eth8', 'chap', chap_user, chap_passwd)
1052 @mock.patch('yardstick.network_services.libs.ixia_libs.ixnet.ixnet_api.Vlan')
1053 def test__apply_core_network_config_no_bgp_proto(self, mock_vlan):
1054 self.scenario._downlink_vports = [1, 3]
1055 self.scenario.client.add_topology.side_effect = ['Topology 1', 'Topology 2']
1056 self.scenario.client.add_device_group.side_effect = ['Dg1', 'Dg2']
1057 self.scenario.client.add_ethernet.side_effect = ['Eth1', 'Eth2']
1058 self.scenario._apply_core_network_config()
1059 self.assertEqual(self.scenario.client.add_topology.call_count, 2)
1060 self.assertEqual(self.scenario.client.add_device_group.call_count, 2)
1061 self.assertEqual(self.scenario.client.add_ethernet.call_count, 2)
1062 self.assertEqual(mock_vlan.call_count, 2)
1063 self.assertEqual(self.scenario.client.add_vlans.call_count, 2)
1064 self.assertEqual(self.scenario.client.add_ipv4.call_count, 2)
1065 self.scenario.client.add_topology.assert_has_calls([
1066 mock.call('Topology core 0', 1),
1067 mock.call('Topology core 1', 3)
1069 self.scenario.client.add_device_group.assert_has_calls([
1070 mock.call('Topology 1', 'Core port 0', 1),
1071 mock.call('Topology 2', 'Core port 1', 1)
1073 self.scenario.client.add_ethernet.assert_has_calls([
1074 mock.call('Dg1', 'Ethernet'),
1075 mock.call('Dg2', 'Ethernet')
1077 mock_vlan.assert_has_calls([
1078 mock.call(vlan_id=101),
1079 mock.call(vlan_id=102)
1081 self.scenario.client.add_ipv4.assert_has_calls([
1082 mock.call('Eth1', name='ipv4', addr=ipaddress.IPv4Address('10.1.1.2'),
1083 addr_step='0.0.0.1', prefix='24', gateway='10.1.1.1'),
1084 mock.call('Eth2', name='ipv4', addr=ipaddress.IPv4Address('10.2.2.2'),
1085 addr_step='0.0.0.1', prefix='24', gateway='10.2.2.1')
1087 self.scenario.client.add_bgp.assert_not_called()
1089 def test__apply_core_network_config_with_bgp_proto(self):
1092 'bgp_type': 'external',
1093 'dut_ip': '10.0.0.1',
1097 self.scenario._ixia_cfg['ipv4_client'].update(bgp_params)
1098 self.scenario._downlink_vports = [1, 3]
1099 self.scenario.client.add_ipv4.side_effect = ['ipv4_1', 'ipv4_2']
1100 self.scenario._apply_core_network_config()
1101 self.assertEqual(self.scenario.client.add_bgp.call_count, 2)
1102 self.scenario.client.add_bgp.assert_has_calls([
1103 mock.call('ipv4_1', dut_ip=bgp_params["bgp"]["dut_ip"],
1104 local_as=bgp_params["bgp"]["as_number"],
1105 bgp_type=bgp_params["bgp"]["bgp_type"]),
1106 mock.call('ipv4_2', dut_ip=bgp_params["bgp"]["dut_ip"],
1107 local_as=bgp_params["bgp"]["as_number"],
1108 bgp_type=bgp_params["bgp"]["bgp_type"])
1111 def test_update_tracking_options_raw_priority(self):
1112 raw_priority = {'raw': 4}
1113 self.scenario._ixia_cfg['priority'] = raw_priority
1114 self.scenario.update_tracking_options()
1115 self.scenario.client.set_flow_tracking.assert_called_once_with(
1116 ['flowGroup0', 'vlanVlanId0', 'ipv4Raw0'])
1118 def test_update_tracking_options_tos_priority(self):
1119 tos_priority = {'tos': {'precedence': [4, 7]}}
1120 self.scenario._ixia_cfg['priority'] = tos_priority
1121 self.scenario.update_tracking_options()
1122 self.scenario.client.set_flow_tracking.assert_called_once_with(
1123 ['flowGroup0', 'vlanVlanId0', 'ipv4Precedence0'])
1125 def test_update_tracking_options_dscp_priority(self):
1126 dscp_priority = {'dscp': {'defaultPHB': [4, 7]}}
1127 self.scenario._ixia_cfg['priority'] = dscp_priority
1128 self.scenario.update_tracking_options()
1129 self.scenario.client.set_flow_tracking.assert_called_once_with(
1130 ['flowGroup0', 'vlanVlanId0', 'ipv4DefaultPhb0'])
1132 def test_update_tracking_options_invalid_priority_data(self):
1133 invalid_priority = {'tos': {'inet-precedence': [4, 7]}}
1134 self.scenario._ixia_cfg['priority'] = invalid_priority
1135 self.scenario.update_tracking_options()
1136 self.scenario.client.set_flow_tracking.assert_called_once_with(
1137 ['flowGroup0', 'vlanVlanId0', 'ipv4Precedence0'])
1139 def test_get_tc_rfc2544_options(self):
1140 rfc2544_tc_opts = {'allowed_drop_rate': '0.0001 - 0.0001'}
1141 self.scenario._ixia_cfg['rfc2544'] = rfc2544_tc_opts
1142 res = self.scenario.get_tc_rfc2544_options()
1143 self.assertEqual(res, rfc2544_tc_opts)
1145 def test__get_stats(self):
1146 self.scenario._get_stats()
1147 self.scenario.client.get_pppoe_scenario_statistics.assert_called_once()
1149 def test_get_flow_id_data(self):
1150 stats = [{'id': 1, 'in_packets': 10, 'out_packets': 20}]
1153 res = self.scenario.get_flow_id_data(stats, flow_id, key)
1154 self.assertEqual(res, 10)
1156 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario, '_get_stats')
1157 @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
1158 'get_priority_flows_stats')
1159 def test_generate_samples(self, mock_prio_flow_statistics,
1163 {'Flow_Group': 'RFC2544-1 - Flow Group 0001',
1164 'Frames_Delta': '0',
1166 'Rx_Frames': '3000',
1167 'Tx_Frames': '3000',
1169 'Tx_Port': 'Ethernet - 001',
1170 'Store-Forward_Avg_latency_ns': '2',
1171 'Store-Forward_Min_latency_ns': '2',
1172 'Store-Forward_Max_latency_ns': '2'},
1173 {'Flow_Group': 'RFC2544-2 - Flow Group 0001',
1174 'Frames_Delta': '0',
1176 'Rx_Frames': '3000',
1177 'Tx_Frames': '3000',
1179 'Tx_Port': 'Ethernet - 002',
1180 'Store-Forward_Avg_latency_ns': '2',
1181 'Store-Forward_Min_latency_ns': '2',
1182 'Store-Forward_Max_latency_ns': '2'
1184 'port_statistics': [
1185 {'Frames_Tx': '3000',
1186 'Valid_Frames_Rx': '3000',
1187 'Bytes_Rx': '192000',
1188 'Bytes_Tx': '192000',
1189 'Rx_Rate_Kbps': '0.0',
1190 'Tx_Rate_Kbps': '0.0',
1191 'Rx_Rate_Mbps': '0.0',
1192 'Tx_Rate_Mbps': '0.0',
1193 'port_name': 'Ethernet - 001'},
1194 {'Frames_Tx': '3000',
1195 'Valid_Frames_Rx': '3000',
1196 'Bytes_Rx': '192000',
1197 'Bytes_Tx': '192000',
1198 'Rx_Rate_Kbps': '0.0',
1199 'Tx_Rate_Kbps': '0.0',
1200 'Rx_Rate_Mbps': '0.0',
1201 'Tx_Rate_Mbps': '0.0',
1202 'port_name': 'Ethernet - 002'}],
1203 'pppox_client_per_port': [
1204 {'Sessions_Down': '0',
1205 'Sessions_Not_Started': '0',
1206 'Sessions_Total': '1',
1208 'subs_port': 'Ethernet - 001'}]}
1210 prio_flows_stats = {
1213 'out_packets': 6000,
1214 'RxThroughput': 200.0,
1215 'TxThroughput': 200.0,
1216 'avg_latency_ns': 2,
1217 'max_latency_ns': 2,
1222 expected_result = {'priority_stats': {
1223 '0': {'RxThroughput': 200.0,
1224 'TxThroughput': 200.0,
1225 'avg_latency_ns': 2,
1226 'max_latency_ns': 2,
1227 'min_latency_ns': 2,
1229 'out_packets': 6000}},
1230 'xe0': {'RxThroughput': 100.0,
1231 'Store-Forward_Avg_latency_ns': 2,
1232 'Store-Forward_Max_latency_ns': 2,
1233 'Store-Forward_Min_latency_ns': 2,
1234 'TxThroughput': 100.0,
1236 'out_packets': 3000,
1238 'out_bytes': 192000,
1239 'RxThroughputBps': 6400.0,
1240 'TxThroughputBps': 6400.0,
1241 'rx_throughput_kps': 0.0,
1242 'rx_throughput_mbps': 0.0,
1244 'sessions_not_started': 0,
1245 'sessions_total': 1,
1247 'tx_throughput_kps': 0.0,
1248 'tx_throughput_mbps': 0.0},
1249 'xe1': {'RxThroughput': 100.0,
1250 'Store-Forward_Avg_latency_ns': 2,
1251 'Store-Forward_Max_latency_ns': 2,
1252 'Store-Forward_Min_latency_ns': 2,
1253 'TxThroughput': 100.0,
1255 'out_packets': 3000,
1257 'out_bytes': 192000,
1258 'RxThroughputBps': 6400.0,
1259 'TxThroughputBps': 6400.0,
1260 'rx_throughput_kps': 0.0,
1261 'rx_throughput_mbps': 0.0,
1262 'tx_throughput_kps': 0.0,
1263 'tx_throughput_mbps': 0.0}}
1265 mock_get_stats.return_value = ixia_stats
1266 mock_prio_flow_statistics.return_value = prio_flows_stats
1268 port_names = [{'name': 'xe0'}, {'name': 'xe1'}]
1270 res_helper = mock.Mock()
1271 res_helper.vnfd_helper.find_interface_by_port.side_effect = \
1273 samples = self.scenario.generate_samples(res_helper, ports, duration)
1274 self.assertIsNotNone(samples)
1275 self.assertIsNotNone(samples.get('xe0'))
1276 self.assertIsNotNone(samples.get('xe1'))
1277 self.assertEqual(samples, expected_result)
1278 mock_get_stats.assert_called_once()
1279 mock_prio_flow_statistics.assert_called_once()