3 # Copyright (c) 2017 Intel Corporation
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 # Unittest for yardstick.network_services.vnf_generic.vnf.sample_vnf
20 from __future__ import absolute_import
23 from copy import deepcopy
25 from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
26 from yardstick.benchmark.contexts.base import Context
27 from yardstick.network_services.nfvi.resource import ResourceProfile
28 from yardstick.network_services.traffic_profile.base import TrafficProfile
29 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
30 from yardstick.ssh import SSHError
33 class MockError(BaseException):
38 'stl': mock.MagicMock(),
39 'stl.trex_stl_lib': mock.MagicMock(),
40 'stl.trex_stl_lib.base64': mock.MagicMock(),
41 'stl.trex_stl_lib.binascii': mock.MagicMock(),
42 'stl.trex_stl_lib.collections': mock.MagicMock(),
43 'stl.trex_stl_lib.copy': mock.MagicMock(),
44 'stl.trex_stl_lib.datetime': mock.MagicMock(),
45 'stl.trex_stl_lib.functools': mock.MagicMock(),
46 'stl.trex_stl_lib.imp': mock.MagicMock(),
47 'stl.trex_stl_lib.inspect': mock.MagicMock(),
48 'stl.trex_stl_lib.json': mock.MagicMock(),
49 'stl.trex_stl_lib.linecache': mock.MagicMock(),
50 'stl.trex_stl_lib.math': mock.MagicMock(),
51 'stl.trex_stl_lib.os': mock.MagicMock(),
52 'stl.trex_stl_lib.platform': mock.MagicMock(),
53 'stl.trex_stl_lib.pprint': mock.MagicMock(),
54 'stl.trex_stl_lib.random': mock.MagicMock(),
55 'stl.trex_stl_lib.re': mock.MagicMock(),
56 'stl.trex_stl_lib.scapy': mock.MagicMock(),
57 'stl.trex_stl_lib.socket': mock.MagicMock(),
58 'stl.trex_stl_lib.string': mock.MagicMock(),
59 'stl.trex_stl_lib.struct': mock.MagicMock(),
60 'stl.trex_stl_lib.sys': mock.MagicMock(),
61 'stl.trex_stl_lib.threading': mock.MagicMock(),
62 'stl.trex_stl_lib.time': mock.MagicMock(),
63 'stl.trex_stl_lib.traceback': mock.MagicMock(),
64 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
65 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
66 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
67 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
68 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
69 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
70 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
71 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
72 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
73 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
74 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
75 'stl.trex_stl_lib.types': mock.MagicMock(),
76 'stl.trex_stl_lib.utils': mock.MagicMock(),
77 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
78 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
79 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
80 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
81 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
82 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
83 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
84 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
85 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
86 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
87 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
88 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
89 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
90 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
91 'stl.trex_stl_lib.warnings': mock.MagicMock(),
92 'stl.trex_stl_lib.yaml': mock.MagicMock(),
93 'stl.trex_stl_lib.zlib': mock.MagicMock(),
94 'stl.trex_stl_lib.zmq': mock.MagicMock(),
97 STLClient = mock.MagicMock()
98 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
102 from yardstick.network_services.vnf_generic.vnf.sample_vnf import VnfSshHelper
103 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper
104 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
105 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper
106 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
107 from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
108 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SetupEnvHelper
109 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF
110 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
111 from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
114 class TestVnfSshHelper(unittest.TestCase):
117 'short-name': 'VpeVnf',
122 'network': '152.16.100.20',
123 'netmask': '255.255.255.0',
124 'gateway': '152.16.100.20',
128 'network': '152.16.40.20',
129 'netmask': '255.255.255.0',
130 'gateway': '152.16.40.20',
134 'description': 'VPE approximation using DPDK',
135 'name': 'vpevnf-baremetal',
138 'network': '0064:ff9b:0:0:0:0:9810:6414',
140 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
144 'network': '0064:ff9b:0:0:0:0:9810:2814',
146 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
150 'id': 'vpevnf-baremetal',
151 'external-interface': [
153 'virtual-interface': {
154 'dst_mac': '00:00:00:00:00:03',
155 'vpci': '0000:05:00.0',
156 'local_ip': '152.16.100.19',
157 'type': 'PCI-PASSTHROUGH',
158 'netmask': '255.255.255.0',
159 'dpdk_port_num': '0',
160 'bandwidth': '10 Gbps',
161 'dst_ip': '152.16.100.20',
162 'local_mac': '00:00:00:00:00:01'
164 'vnfd-connection-point-ref': 'xe0',
168 'virtual-interface': {
169 'dst_mac': '00:00:00:00:00:04',
170 'vpci': '0000:05:00.1',
171 'local_ip': '152.16.40.19',
172 'type': 'PCI-PASSTHROUGH',
173 'netmask': '255.255.255.0',
174 'dpdk_port_num': '1',
175 'bandwidth': '10 Gbps',
176 'dst_ip': '152.16.40.20',
177 'local_mac': '00:00:00:00:00:02'
179 'vnfd-connection-point-ref': 'xe1',
185 'description': 'Vpe approximation using DPDK',
187 'vdu-id': 'vpevnf-baremetal',
200 'connection-point': [
210 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
214 'vnfd:vnfd-catalog': {
221 def assertAll(self, iterable, message=None):
222 self.assertTrue(all(iterable), message)
224 def test_get_class(self):
225 self.assertIs(VnfSshHelper.get_class(), VnfSshHelper)
227 @mock.patch('yardstick.ssh.paramiko')
228 def test_copy(self, _):
229 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
230 ssh_helper._run = mock.Mock()
232 ssh_helper.execute('ls')
233 self.assertTrue(ssh_helper.is_connected)
234 result = ssh_helper.copy()
235 self.assertIsInstance(result, VnfSshHelper)
236 self.assertFalse(result.is_connected)
237 self.assertEqual(result.bin_path, ssh_helper.bin_path)
238 self.assertEqual(result.host, ssh_helper.host)
239 self.assertEqual(result.port, ssh_helper.port)
240 self.assertEqual(result.user, ssh_helper.user)
241 self.assertEqual(result.password, ssh_helper.password)
242 self.assertEqual(result.key_filename, ssh_helper.key_filename)
244 @mock.patch('yardstick.ssh.paramiko')
245 def test_upload_config_file(self, mock_paramiko):
246 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
248 self.assertFalse(ssh_helper.is_connected)
249 cfg_file = ssh_helper.upload_config_file('my/prefix', 'my content')
250 self.assertTrue(ssh_helper.is_connected)
251 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
252 self.assertTrue(cfg_file.startswith('/tmp'))
254 cfg_file = ssh_helper.upload_config_file('/my/prefix', 'my content')
255 self.assertTrue(ssh_helper.is_connected)
256 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
257 self.assertEqual(cfg_file, '/my/prefix')
259 def test_join_bin_path(self):
260 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
262 expected_start = 'my'
263 expected_middle_list = ['bin']
264 expected_end = 'path'
265 result = ssh_helper.join_bin_path()
266 self.assertTrue(result.startswith(expected_start))
267 self.assertAll(middle in result for middle in expected_middle_list)
268 self.assertTrue(result.endswith(expected_end))
270 expected_middle_list.append(expected_end)
271 expected_end = 'some_file.sh'
272 result = ssh_helper.join_bin_path('some_file.sh')
273 self.assertTrue(result.startswith(expected_start))
274 self.assertAll(middle in result for middle in expected_middle_list)
275 self.assertTrue(result.endswith(expected_end))
277 expected_middle_list.append('some_dir')
278 expected_end = 'some_file.sh'
279 result = ssh_helper.join_bin_path('some_dir', 'some_file.sh')
280 self.assertTrue(result.startswith(expected_start))
281 self.assertAll(middle in result for middle in expected_middle_list)
282 self.assertTrue(result.endswith(expected_end))
284 @mock.patch('yardstick.ssh.paramiko')
285 @mock.patch('yardstick.ssh.provision_tool')
286 def test_provision_tool(self, mock_provision_tool, mock_paramiko):
287 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
289 self.assertFalse(ssh_helper.is_connected)
290 ssh_helper.provision_tool()
291 self.assertTrue(ssh_helper.is_connected)
292 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
293 self.assertEqual(mock_provision_tool.call_count, 1)
295 ssh_helper.provision_tool(tool_file='my_tool.sh')
296 self.assertTrue(ssh_helper.is_connected)
297 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
298 self.assertEqual(mock_provision_tool.call_count, 2)
300 ssh_helper.provision_tool('tool_path', 'my_tool.sh')
301 self.assertTrue(ssh_helper.is_connected)
302 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
303 self.assertEqual(mock_provision_tool.call_count, 3)
306 class TestSetupEnvHelper(unittest.TestCase):
309 'short-name': 'VpeVnf',
314 'network': '152.16.100.20',
315 'netmask': '255.255.255.0',
316 'gateway': '152.16.100.20',
320 'network': '152.16.40.20',
321 'netmask': '255.255.255.0',
322 'gateway': '152.16.40.20',
326 'description': 'VPE approximation using DPDK',
327 'name': 'vpevnf-baremetal',
330 'network': '0064:ff9b:0:0:0:0:9810:6414',
332 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
336 'network': '0064:ff9b:0:0:0:0:9810:2814',
338 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
342 'id': 'vpevnf-baremetal',
343 'external-interface': [
345 'virtual-interface': {
346 'dst_mac': '00:00:00:00:00:03',
347 'vpci': '0000:05:00.0',
348 'local_ip': '152.16.100.19',
349 'type': 'PCI-PASSTHROUGH',
350 'netmask': '255.255.255.0',
351 'dpdk_port_num': '0',
352 'bandwidth': '10 Gbps',
353 'dst_ip': '152.16.100.20',
354 'local_mac': '00:00:00:00:00:01'
356 'vnfd-connection-point-ref': 'xe0',
360 'virtual-interface': {
361 'dst_mac': '00:00:00:00:00:04',
362 'vpci': '0000:05:00.1',
363 'local_ip': '152.16.40.19',
364 'type': 'PCI-PASSTHROUGH',
365 'netmask': '255.255.255.0',
366 'dpdk_port_num': '1',
367 'bandwidth': '10 Gbps',
368 'dst_ip': '152.16.40.20',
369 'local_mac': '00:00:00:00:00:02'
371 'vnfd-connection-point-ref': 'xe1',
377 'description': 'Vpe approximation using DPDK',
379 'vdu-id': 'vpevnf-baremetal',
392 'connection-point': [
402 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
405 def test_build_config(self):
406 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
408 with self.assertRaises(NotImplementedError):
409 setup_env_helper.build_config()
411 def test__get_ports_gateway(self):
412 vnfd_helper = VnfdHelper(self.VNFD_0)
413 setup_env_helper = SetupEnvHelper(vnfd_helper, mock.Mock(), mock.Mock())
414 result = setup_env_helper._get_ports_gateway("xe0")
415 self.assertEqual(result, "152.16.100.20")
417 result = setup_env_helper._get_ports_gateway("xe123")
418 self.assertIsNone(result)
420 def test_setup_vnf_environment(self):
421 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
422 self.assertIsNone(setup_env_helper.setup_vnf_environment())
424 def test_tear_down(self):
425 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
427 with self.assertRaises(NotImplementedError):
428 setup_env_helper.tear_down()
431 class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
434 'short-name': 'VpeVnf',
439 'network': '152.16.100.20',
440 'netmask': '255.255.255.0',
441 'gateway': '152.16.100.20',
445 'network': '152.16.40.20',
446 'netmask': '255.255.255.0',
447 'gateway': '152.16.40.20',
451 'description': 'VPE approximation using DPDK',
452 'name': 'vpevnf-baremetal',
455 'network': '0064:ff9b:0:0:0:0:9810:6414',
457 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
461 'network': '0064:ff9b:0:0:0:0:9810:2814',
463 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
467 'id': 'vpevnf-baremetal',
468 'external-interface': [
470 'virtual-interface': {
471 'dst_mac': '00:00:00:00:00:03',
472 'vpci': '0000:05:00.0',
474 'local_ip': '152.16.100.19',
475 'type': 'PCI-PASSTHROUGH',
476 'netmask': '255.255.255.0',
477 'dpdk_port_num': '0',
478 'bandwidth': '10 Gbps',
479 'dst_ip': '152.16.100.20',
480 'local_mac': '00:00:00:00:00:01'
482 'vnfd-connection-point-ref': 'xe0',
486 'virtual-interface': {
487 'dst_mac': '00:00:00:00:00:04',
488 'vpci': '0000:05:00.1',
490 'local_ip': '152.16.40.19',
491 'type': 'PCI-PASSTHROUGH',
492 'netmask': '255.255.255.0',
493 'dpdk_port_num': '1',
494 'bandwidth': '10 Gbps',
495 'dst_ip': '152.16.40.20',
496 'local_mac': '00:00:00:00:00:02'
498 'vnfd-connection-point-ref': 'xe1',
504 'description': 'Vpe approximation using DPDK',
506 'vdu-id': 'vpevnf-baremetal',
519 'connection-point': [
529 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
533 'vnfd:vnfd-catalog': {
540 def test__update_packet_type(self):
541 ip_pipeline_cfg = 'pkt_type = ipv4'
542 pkt_type = {'pkt_type': '1'}
544 expected = "pkt_type = 1"
545 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
546 self.assertEqual(result, expected)
548 def test__update_packet_type_no_op(self):
549 ip_pipeline_cfg = 'pkt_type = ipv6'
550 pkt_type = {'pkt_type': '1'}
552 expected = "pkt_type = ipv6"
553 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
554 self.assertEqual(result, expected)
556 def test__update_packet_type_multi_op(self):
557 ip_pipeline_cfg = 'pkt_type = ipv4\npkt_type = 1\npkt_type = ipv4'
558 pkt_type = {'pkt_type': '1'}
560 expected = 'pkt_type = 1\npkt_type = 1\npkt_type = 1'
561 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
562 self.assertEqual(result, expected)
564 def test__update_traffic_type(self):
565 ip_pipeline_cfg = 'pkt_type = ipv4'
567 traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 4}
568 expected = "pkt_type = ipv4"
569 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
570 self.assertEqual(result, expected)
572 def test__update_traffic_type_ipv6(self):
573 ip_pipeline_cfg = 'pkt_type = ipv4'
575 traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 6}
576 expected = "pkt_type = ipv6"
577 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
578 self.assertEqual(result, expected)
580 def test__update_traffic_type_not_app_name(self):
581 ip_pipeline_cfg = 'traffic_type = 4'
583 vnf_type = ''.join(["Not", DpdkVnfSetupEnvHelper.APP_NAME])
584 traffic_options = {"vnf_type": vnf_type, 'traffic_type': 8}
585 expected = "traffic_type = 8"
586 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
587 self.assertEqual(result, expected)
589 def test__setup_hugepages(self):
590 vnfd_helper = VnfdHelper(self.VNFD_0)
591 ssh_helper = mock.Mock()
592 ssh_helper.execute.return_value = 0, '', ''
593 scenario_helper = mock.Mock()
594 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
596 result = dpdk_setup_helper._setup_hugepages()
597 expect_start_list = ['awk', 'awk', 'echo']
598 expect_in_list = ['meminfo', 'nr_hugepages', '16']
599 call_args_iter = (args[0][0] for args in ssh_helper.execute.call_args_list)
600 self.assertIsNone(result)
601 self.assertEqual(ssh_helper.execute.call_count, 3)
602 for expect_start, expect_in, arg0 in zip(expect_start_list, expect_in_list, call_args_iter):
603 self.assertTrue(arg0.startswith(expect_start))
604 self.assertIn(expect_in, arg0)
606 def test__setup_hugepages_2_mb(self):
607 vnfd_helper = VnfdHelper(self.VNFD_0)
608 ssh_helper = mock.Mock()
609 ssh_helper.execute.return_value = 0, '2048kB ', ''
610 scenario_helper = mock.Mock()
611 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
613 result = dpdk_setup_helper._setup_hugepages()
614 expect_start_list = ['awk', 'awk', 'echo']
615 expect_in_list = ['meminfo', 'nr_hugepages', '16384']
616 call_args_iter = (args[0][0] for args in ssh_helper.execute.call_args_list)
617 self.assertIsNone(result)
618 self.assertEqual(ssh_helper.execute.call_count, 3)
619 for expect_start, expect_in, arg0 in zip(expect_start_list, expect_in_list, call_args_iter):
620 self.assertTrue(arg0.startswith(expect_start))
621 self.assertIn(expect_in, arg0)
623 def test__get_dpdk_port_num(self):
624 vnfd_helper = VnfdHelper(self.VNFD_0)
625 ssh_helper = mock.Mock()
626 scenario_helper = mock.Mock()
627 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
629 result = dpdk_setup_helper._get_dpdk_port_num('xe0')
630 self.assertEqual(result, expected)
632 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open')
633 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.find_relative_file')
634 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
635 def test_build_config(self, mock_multi_port_config_class, mock_find, _):
636 mock_multi_port_config = mock_multi_port_config_class()
637 vnfd_helper = VnfdHelper(self.VNFD_0)
638 ssh_helper = mock.Mock()
639 scenario_helper = mock.Mock()
640 scenario_helper.vnf_cfg = {}
641 scenario_helper.all_options = {}
642 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
643 dpdk_setup_helper.all_ports = []
645 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
646 result = dpdk_setup_helper.build_config()
647 self.assertEqual(result, expected)
648 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
649 self.assertGreaterEqual(mock_find.call_count, 1)
650 self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
651 self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
653 def test__build_pipeline_kwargs(self):
654 vnfd_helper = VnfdHelper(self.VNFD_0)
655 ssh_helper = mock.Mock()
656 ssh_helper.provision_tool.return_value = 'tool_path'
657 scenario_helper = mock.Mock()
658 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
659 dpdk_setup_helper.CFG_CONFIG = 'config'
660 dpdk_setup_helper.CFG_SCRIPT = 'script'
661 dpdk_setup_helper.all_ports = [3, 4, 5]
662 dpdk_setup_helper.pipeline_kwargs = {}
665 'cfg_file': 'config',
667 'ports_len_hex': '0xf',
668 'tool_path': 'tool_path',
670 dpdk_setup_helper._build_pipeline_kwargs()
671 self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected)
673 def test__get_app_cpu(self):
674 vnfd_helper = VnfdHelper(self.VNFD_0)
675 ssh_helper = mock.Mock()
676 ssh_helper.provision_tool.return_value = 'tool_path'
677 scenario_helper = mock.Mock()
678 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
680 dpdk_setup_helper.CORES = expected = [5, 4, 3]
681 result = dpdk_setup_helper._get_app_cpu()
682 self.assertEqual(result, expected)
684 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores')
685 def test__get_app_cpu_no_cores_sw(self, mock_cpu_sys_cores_class):
686 mock_cpu_sys_cores = mock_cpu_sys_cores_class()
687 mock_cpu_sys_cores.get_core_socket.return_value = {
688 'socket': [2, 4, 8, 10, 12],
690 vnfd_helper = VnfdHelper(self.VNFD_0)
691 ssh_helper = mock.Mock()
692 ssh_helper.provision_tool.return_value = 'tool_path'
693 scenario_helper = mock.Mock()
694 scenario_helper.vnf_cfg = {
695 'worker_threads': '2',
697 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
698 dpdk_setup_helper.CORES = []
699 dpdk_setup_helper.SW_DEFAULT_CORE = 1
700 dpdk_setup_helper.HW_DEFAULT_CORE = 2
701 dpdk_setup_helper.socket = 'socket'
704 result = dpdk_setup_helper._get_app_cpu()
705 self.assertEqual(result, expected)
707 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores')
708 def test__get_app_cpu_no_cores_hw(self, mock_cpu_sys_cores_class):
709 mock_cpu_sys_cores = mock_cpu_sys_cores_class()
710 mock_cpu_sys_cores.get_core_socket.return_value = {
711 'socket': [2, 4, 8, 10, 12],
713 vnfd_helper = VnfdHelper(self.VNFD_0)
714 ssh_helper = mock.Mock()
715 scenario_helper = mock.Mock()
716 scenario_helper.vnf_cfg = {
717 'worker_threads': '2',
720 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
721 dpdk_setup_helper.CORES = []
722 dpdk_setup_helper.SW_DEFAULT_CORE = 1
723 dpdk_setup_helper.HW_DEFAULT_CORE = 2
724 dpdk_setup_helper.socket = 'socket'
726 expected = [2, 4, 8, 10]
727 result = dpdk_setup_helper._get_app_cpu()
728 self.assertEqual(result, expected)
730 def test__get_cpu_sibling_list(self):
731 vnfd_helper = VnfdHelper(self.VNFD_0)
732 ssh_helper = mock.Mock()
733 ssh_helper.execute.side_effect = iter([(0, '5', ''), (0, '3,4', ''), (0, '10', '')])
734 scenario_helper = mock.Mock()
735 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
736 dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[])
738 expected = ['5', '3', '4', '10']
739 result = dpdk_setup_helper._get_cpu_sibling_list([1, 3, 7])
740 self.assertEqual(result, expected)
742 def test__get_cpu_sibling_list_no_core_arg(self):
743 vnfd_helper = VnfdHelper(self.VNFD_0)
744 ssh_helper = mock.Mock()
745 ssh_helper.execute.side_effect = iter([(0, '5', ''), (0, '3,4', ''), (0, '10', '')])
746 scenario_helper = mock.Mock()
747 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
748 dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[1, 7])
750 expected = ['5', '3', '4']
751 result = dpdk_setup_helper._get_cpu_sibling_list()
752 self.assertEqual(result, expected)
754 def test__get_cpu_sibling_list_ssh_failure(self):
755 vnfd_helper = VnfdHelper(self.VNFD_0)
756 ssh_helper = mock.Mock()
757 ssh_helper.execute.side_effect = iter([(0, '5', ''), SSHError, (0, '10', '')])
758 scenario_helper = mock.Mock()
759 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
760 dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[])
763 result = dpdk_setup_helper._get_cpu_sibling_list([1, 3, 7])
764 self.assertEqual(result, expected)
766 def test__validate_cpu_cfg(self):
767 vnfd_helper = VnfdHelper(self.VNFD_0)
768 ssh_helper = mock.Mock()
769 ssh_helper.execute.side_effect = iter([(0, '5', ''), (0, '3,4', ''), (0, '10', '')])
770 scenario_helper = mock.Mock()
771 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
772 dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[1, 3, 7])
774 expected = ['5', '3', '4', '10']
775 result = dpdk_setup_helper._validate_cpu_cfg()
776 self.assertEqual(result, expected)
778 def test__find_used_drivers(self):
779 vnfd_helper = VnfdHelper(self.VNFD_0)
780 ssh_helper = mock.Mock()
782 00:01.2 foo drv=name1
783 00:01.4 drv foo=name2
787 ssh_helper.execute.return_value = 0, stdout, ''
788 scenario_helper = mock.Mock()
789 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
790 dpdk_setup_helper.used_drivers = None
791 dpdk_setup_helper._dpdk_nic_bind = ''
792 dpdk_setup_helper.bound_pci = [
798 '00:01.2': (0, 'name1'),
799 '00:02.3': (2, 'name4'),
801 dpdk_setup_helper._find_used_drivers()
802 self.assertEqual(dpdk_setup_helper.used_drivers, expected)
804 def test_dpdk_nic_bind(self):
805 vnfd_helper = VnfdHelper(self.VNFD_0)
806 ssh_helper = mock.Mock()
807 ssh_helper.provision_tool.return_value = nic_bind = object()
808 scenario_helper = mock.Mock()
809 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
811 self.assertIsNone(dpdk_setup_helper._dpdk_nic_bind)
812 self.assertIs(dpdk_setup_helper.dpdk_nic_bind, nic_bind)
813 self.assertIs(dpdk_setup_helper.dpdk_nic_bind, nic_bind)
814 self.assertEqual(ssh_helper.provision_tool.call_count, 1)
816 # ensure provision tool is not called a second time
817 self.assertIs(dpdk_setup_helper.dpdk_nic_bind, nic_bind)
818 self.assertEqual(ssh_helper.provision_tool.call_count, 1)
820 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
821 @mock.patch('yardstick.ssh.SSH')
822 def test_setup_vnf_environment(self, _, mock_time):
825 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
826 ssh_helper = mock.Mock()
827 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
828 ssh_helper.join_bin_path.return_value = 'joined_path'
829 ssh_helper.provision_tool.return_value = 'provision string'
830 scenario_helper = mock.Mock()
831 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
832 dpdk_setup_helper._setup_hugepages = mock.Mock()
833 dpdk_setup_helper._validate_cpu_cfg = mock.Mock(return_value=cores)
834 dpdk_setup_helper._find_used_drivers = mock.Mock()
835 dpdk_setup_helper.used_drivers = {
836 '0000:05:00.0': (1, ''),
837 '0000:05:01.0': (3, ''),
840 result = dpdk_setup_helper.setup_vnf_environment()
841 self.assertIsInstance(result, ResourceProfile)
842 self.assertEqual(result.cores, cores)
843 self.assertEqual(vnfd_helper.interfaces[0]['dpdk_port_num'], 1)
844 self.assertNotIn('dpdk_port_num', vnfd_helper.interfaces[1])
846 def test__setup_dpdk_early_success(self):
847 vnfd_helper = VnfdHelper(self.VNFD_0)
848 ssh_helper = mock.Mock()
849 ssh_helper.execute.return_value = 0, 'output', ''
850 ssh_helper.join_bin_path.return_value = 'joined_path'
851 ssh_helper.provision_tool.return_value = 'provision string'
852 scenario_helper = mock.Mock()
853 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
854 dpdk_setup_helper._setup_hugepages = mock.Mock()
856 self.assertIsNone(dpdk_setup_helper._setup_dpdk())
857 self.assertEqual(dpdk_setup_helper.ssh_helper.execute.call_count, 2)
859 @mock.patch('yardstick.ssh.SSH')
860 def test__setup_dpdk_short(self, _):
861 def execute_side(cmd, *args, **kwargs):
862 if 'joined_path' in cmd:
863 return 0, 'output', ''
864 return 1, 'bad output', 'error output'
866 vnfd_helper = VnfdHelper(self.VNFD_0)
867 ssh_helper = mock.Mock()
868 ssh_helper.execute.side_effect = execute_side
869 ssh_helper.join_bin_path.return_value = 'joined_path'
870 ssh_helper.provision_tool.return_value = 'provision string'
871 scenario_helper = mock.Mock()
872 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
873 dpdk_setup_helper._setup_hugepages = mock.Mock()
875 self.assertIsNone(dpdk_setup_helper._setup_dpdk())
876 self.assertEqual(dpdk_setup_helper.ssh_helper.execute.call_count, 3)
878 @mock.patch('yardstick.ssh.SSH')
879 def test__setup_resources(self, _):
880 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
881 ssh_helper = mock.Mock()
882 scenario_helper = mock.Mock()
883 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
884 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
886 result = dpdk_setup_helper._setup_resources()
887 self.assertIsInstance(result, ResourceProfile)
888 self.assertEqual(dpdk_setup_helper.socket, 0)
890 @mock.patch('yardstick.ssh.SSH')
891 def test__setup_resources_socket_1(self, _):
892 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
893 vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0'
894 vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0'
895 ssh_helper = mock.Mock()
896 scenario_helper = mock.Mock()
897 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
898 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
900 result = dpdk_setup_helper._setup_resources()
901 self.assertIsInstance(result, ResourceProfile)
902 self.assertEqual(dpdk_setup_helper.socket, 1)
904 def test__bind_dpdk_unforced(self):
905 vnfd_helper = VnfdHelper(self.VNFD_0)
906 ssh_helper = mock.Mock()
907 scenario_helper = mock.Mock()
908 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
910 dpdk_setup_helper._bind_dpdk('x', 'y', force=False)
911 self.assertNotIn('--force', ssh_helper.execute.call_args_list[0][0][0])
913 def test__detect_and_bind_dpdk_short(self):
914 vnfd_helper = VnfdHelper(self.VNFD_0)
915 ssh_helper = mock.Mock()
916 ssh_helper.execute.return_value = 0, 'output', ''
917 scenario_helper = mock.Mock()
918 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
920 self.assertIsNone(dpdk_setup_helper._detect_and_bind_dpdk('a', 'b'))
921 self.assertEqual(ssh_helper.execute.call_count, 1)
923 def test__detect_and_bind_dpdk_fail_to_bind(self):
924 vnfd_helper = VnfdHelper(self.VNFD_0)
925 ssh_helper = mock.Mock()
926 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
927 scenario_helper = mock.Mock()
928 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
929 dpdk_setup_helper._bind_dpdk = mock.Mock()
931 self.assertIsNone(dpdk_setup_helper._detect_and_bind_dpdk('a', 'b'))
932 self.assertEqual(ssh_helper.execute.call_count, 2)
934 def test__detect_and_bind_dpdk(self):
935 vnfd_helper = VnfdHelper(self.VNFD_0)
936 ssh_helper = mock.Mock()
937 ssh_helper.execute.side_effect = iter([
938 (1, 'bad output', 'error output'),
941 scenario_helper = mock.Mock()
942 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
943 dpdk_setup_helper._bind_dpdk = mock.Mock()
945 self.assertEqual(dpdk_setup_helper._detect_and_bind_dpdk('a', 'b'), 'output')
946 self.assertEqual(ssh_helper.execute.call_count, 2)
948 def test__bind_kernel_devices(self):
954 vnfd_helper = VnfdHelper(self.VNFD_0)
955 ssh_helper = mock.Mock()
956 scenario_helper = mock.Mock()
957 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
958 dpdk_setup_helper._detect_and_bind_dpdk = mock.Mock(side_effect=bind_iter)
960 self.assertIsNone(dpdk_setup_helper._bind_kernel_devices())
962 def test_tear_down(self):
963 vnfd_helper = VnfdHelper(self.VNFD_0)
964 ssh_helper = mock.Mock()
965 scenario_helper = mock.Mock()
966 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
967 dpdk_setup_helper._dpdk_nic_bind = 'a'
968 dpdk_setup_helper.used_drivers = {
969 '0000:05:00.0': (1, 'd1'),
970 '0000:05:01.0': (3, 'd3'),
973 self.assertIsNone(dpdk_setup_helper.tear_down())
976 class TestResourceHelper(unittest.TestCase):
978 def test_setup(self):
980 vnfd_helper = VnfdHelper({})
981 ssh_helper = mock.Mock()
982 scenario_helper = mock.Mock()
983 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
984 dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
985 resource_helper = ResourceHelper(dpdk_setup_helper)
987 self.assertIsNone(resource_helper.setup())
988 self.assertIs(resource_helper.resource, resource)
990 def test_generate_cfg(self):
991 vnfd_helper = VnfdHelper({})
992 ssh_helper = mock.Mock()
993 scenario_helper = mock.Mock()
994 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
995 resource_helper = ResourceHelper(dpdk_setup_helper)
997 self.assertIsNone(resource_helper.generate_cfg())
999 def test_stop_collect(self):
1000 vnfd_helper = VnfdHelper({})
1001 ssh_helper = mock.Mock()
1002 scenario_helper = mock.Mock()
1003 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1004 resource_helper = ResourceHelper(dpdk_setup_helper)
1005 resource_helper.resource = mock.Mock()
1007 self.assertIsNone(resource_helper.stop_collect())
1009 def test_stop_collect_none(self):
1010 vnfd_helper = VnfdHelper({})
1011 ssh_helper = mock.Mock()
1012 scenario_helper = mock.Mock()
1013 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1014 resource_helper = ResourceHelper(dpdk_setup_helper)
1015 resource_helper.resource = None
1017 self.assertIsNone(resource_helper.stop_collect())
1019 class TestClientResourceHelper(unittest.TestCase):
1022 'short-name': 'VpeVnf',
1027 'network': '152.16.100.20',
1028 'netmask': '255.255.255.0',
1029 'gateway': '152.16.100.20',
1033 'network': '152.16.40.20',
1034 'netmask': '255.255.255.0',
1035 'gateway': '152.16.40.20',
1039 'description': 'VPE approximation using DPDK',
1040 'name': 'vpevnf-baremetal',
1043 'network': '0064:ff9b:0:0:0:0:9810:6414',
1045 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1049 'network': '0064:ff9b:0:0:0:0:9810:2814',
1051 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1055 'id': 'vpevnf-baremetal',
1056 'external-interface': [
1058 'virtual-interface': {
1059 'dst_mac': '00:00:00:00:00:03',
1060 'vpci': '0000:05:00.0',
1062 'local_ip': '152.16.100.19',
1063 'type': 'PCI-PASSTHROUGH',
1064 'netmask': '255.255.255.0',
1065 'dpdk_port_num': '0',
1066 'bandwidth': '10 Gbps',
1067 'dst_ip': '152.16.100.20',
1068 'local_mac': '00:00:00:00:00:01'
1070 'vnfd-connection-point-ref': 'xe0',
1074 'virtual-interface': {
1075 'dst_mac': '00:00:00:00:00:04',
1076 'vpci': '0000:05:00.1',
1078 'local_ip': '152.16.40.19',
1079 'type': 'PCI-PASSTHROUGH',
1080 'netmask': '255.255.255.0',
1081 'dpdk_port_num': '1',
1082 'bandwidth': '10 Gbps',
1083 'dst_ip': '152.16.40.20',
1084 'local_mac': '00:00:00:00:00:02'
1086 'vnfd-connection-point-ref': 'xe1',
1090 'virtual-interface': {
1091 'dst_mac': '00:00:00:00:00:13',
1092 'vpci': '0000:05:00.2',
1094 'local_ip': '152.16.40.19',
1095 'type': 'PCI-PASSTHROUGH',
1096 'netmask': '255.255.255.0',
1097 'dpdk_port_num': '1',
1098 'bandwidth': '10 Gbps',
1099 'dst_ip': '152.16.40.30',
1100 'local_mac': '00:00:00:00:00:11'
1102 'vnfd-connection-point-ref': 'xe2',
1108 'description': 'Vpe approximation using DPDK',
1110 'vdu-id': 'vpevnf-baremetal',
1123 'connection-point': [
1133 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1137 'vnfd:vnfd-catalog': {
1144 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1145 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1146 new_callable=lambda: MockError)
1147 def test_get_stats_not_connected(self, mock_state_error, mock_logger):
1148 vnfd_helper = VnfdHelper({})
1149 ssh_helper = mock.Mock()
1150 scenario_helper = mock.Mock()
1151 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1152 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1153 client_resource_helper.client = mock.MagicMock()
1154 client_resource_helper.client.get_stats.side_effect = mock_state_error
1156 self.assertEqual(client_resource_helper.get_stats(), {})
1157 self.assertEqual(client_resource_helper.client.get_stats.call_count, 1)
1159 def test_generate_samples(self):
1160 vnfd_helper = VnfdHelper(self.VNFD_0)
1161 ssh_helper = mock.Mock()
1162 scenario_helper = mock.Mock()
1163 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1164 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1165 client_resource_helper.client = mock.MagicMock()
1166 client_resource_helper._vpci_ascending = [
1171 client_resource_helper.client.get_stats.return_value = {
1189 "rx_throughput_fps": 5.5,
1190 "tx_throughput_fps": 4.9,
1191 "rx_throughput_mbps": 234.78,
1192 "tx_throughput_mbps": 243.11,
1193 "in_packets": 34251,
1194 "out_packets": 52342,
1197 "rx_throughput_fps": 0.0,
1198 "tx_throughput_fps": 5.9,
1199 "rx_throughput_mbps": 434.78,
1200 "tx_throughput_mbps": 0.0,
1202 "out_packets": 48791,
1205 "rx_throughput_fps": 0.0,
1206 "tx_throughput_fps": 0.0,
1207 "rx_throughput_mbps": 0.0,
1208 "tx_throughput_mbps": 0.0,
1213 result = client_resource_helper.generate_samples()
1214 self.assertDictEqual(result, expected)
1216 def test_generate_samples_with_key(self):
1217 vnfd_helper = VnfdHelper(self.VNFD_0)
1218 ssh_helper = mock.Mock()
1219 scenario_helper = mock.Mock()
1220 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1221 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1222 client_resource_helper.client = mock.MagicMock()
1223 client_resource_helper._vpci_ascending = [
1227 client_resource_helper.client.get_stats.return_value = {
1228 'key_name': 'key_value',
1246 'key_name': 'key_value',
1247 "rx_throughput_fps": 5.5,
1248 "tx_throughput_fps": 4.9,
1249 "rx_throughput_mbps": 234.78,
1250 "tx_throughput_mbps": 243.11,
1251 "in_packets": 34251,
1252 "out_packets": 52342,
1255 'key_name': 'key_value',
1256 "rx_throughput_fps": 0.0,
1257 "tx_throughput_fps": 5.9,
1258 "rx_throughput_mbps": 434.78,
1259 "tx_throughput_mbps": 0.0,
1261 "out_packets": 48791,
1264 result = client_resource_helper.generate_samples('key_name')
1265 self.assertDictEqual(result, expected)
1267 def test_generate_samples_with_key_and_default(self):
1268 vnfd_helper = VnfdHelper(self.VNFD_0)
1269 ssh_helper = mock.Mock()
1270 scenario_helper = mock.Mock()
1271 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1272 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1273 client_resource_helper.client = mock.MagicMock()
1274 client_resource_helper._vpci_ascending = [
1278 client_resource_helper.client.get_stats.return_value = {
1296 'key_name': 'default',
1297 "rx_throughput_fps": 5.5,
1298 "tx_throughput_fps": 4.9,
1299 "rx_throughput_mbps": 234.78,
1300 "tx_throughput_mbps": 243.11,
1301 "in_packets": 34251,
1302 "out_packets": 52342,
1305 'key_name': 'default',
1306 "rx_throughput_fps": 0.0,
1307 "tx_throughput_fps": 5.9,
1308 "rx_throughput_mbps": 434.78,
1309 "tx_throughput_mbps": 0.0,
1311 "out_packets": 48791,
1314 result = client_resource_helper.generate_samples('key_name', 'default')
1315 self.assertDictEqual(result, expected)
1317 def test_clear_stats(self):
1318 vnfd_helper = VnfdHelper({})
1319 ssh_helper = mock.Mock()
1320 scenario_helper = mock.Mock()
1321 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1322 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1323 client_resource_helper.client = mock.Mock()
1325 self.assertIsNone(client_resource_helper.clear_stats())
1326 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1328 def test_clear_stats_of_ports(self):
1329 vnfd_helper = VnfdHelper({})
1330 ssh_helper = mock.Mock()
1331 scenario_helper = mock.Mock()
1332 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1333 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1334 client_resource_helper.client = mock.Mock()
1336 self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
1337 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1339 def test_start(self):
1340 vnfd_helper = VnfdHelper({})
1341 ssh_helper = mock.Mock()
1342 scenario_helper = mock.Mock()
1343 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1344 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1345 client_resource_helper.client = mock.Mock()
1347 self.assertIsNone(client_resource_helper.start())
1348 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1350 def test_start_ports(self):
1351 vnfd_helper = VnfdHelper({})
1352 ssh_helper = mock.Mock()
1353 scenario_helper = mock.Mock()
1354 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1355 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1356 client_resource_helper.client = mock.Mock()
1358 self.assertIsNone(client_resource_helper.start([3, 4]))
1359 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1361 def test_collect_kpi_with_queue(self):
1362 vnfd_helper = VnfdHelper({})
1363 ssh_helper = mock.Mock()
1364 scenario_helper = mock.Mock()
1365 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1366 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1367 client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1368 client_resource_helper._queue = mock.Mock()
1369 client_resource_helper._queue.empty.return_value = False
1370 client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1377 result = client_resource_helper.collect_kpi()
1378 self.assertDictEqual(result, expected)
1380 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1381 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1382 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1383 new_callable=lambda: MockError)
1384 def test__connect_with_failures(self, mock_error, mock_logger, mock_time):
1385 vnfd_helper = VnfdHelper({})
1386 ssh_helper = mock.Mock()
1387 scenario_helper = mock.Mock()
1388 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1389 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1390 client = mock.MagicMock()
1391 client.connect.side_effect = mock_error
1393 self.assertIs(client_resource_helper._connect(client), client)
1396 class TestRfc2544ResourceHelper(unittest.TestCase):
1400 'correlated_traffic': True,
1401 'allowed_drop_rate': '0.1 - 0.15',
1405 'allowed_drop_rate': ' 0.25 - 0.05 ',
1409 'allowed_drop_rate': '0.2',
1418 'rfc2544': RFC2544_CFG_1,
1424 'rfc2544': RFC2544_CFG_2,
1430 'rfc2544': RFC2544_CFG_3,
1436 'rfc2544': RFC2544_CFG_4,
1440 def test_property_rfc2544(self):
1441 scenario_helper = ScenarioHelper('name1')
1442 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1443 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1445 self.assertIsNone(rfc2544_resource_helper._rfc2544)
1446 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1447 self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1448 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1449 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1451 def test_property_tolerance_high(self):
1452 scenario_helper = ScenarioHelper('name1')
1453 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1454 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1456 self.assertIsNone(rfc2544_resource_helper._tolerance_high)
1457 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1458 self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1459 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1460 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1462 def test_property_tolerance_low(self):
1463 scenario_helper = ScenarioHelper('name1')
1464 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1465 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1467 self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1468 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1469 self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1470 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1471 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1473 def test_property_tolerance_high_range_swap(self):
1474 scenario_helper = ScenarioHelper('name1')
1475 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1476 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1478 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1480 def test_property_tolerance_low_range_swap(self):
1481 scenario_helper = ScenarioHelper('name1')
1482 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1483 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1485 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1487 def test_property_tolerance_high_not_range(self):
1488 scenario_helper = ScenarioHelper('name1')
1489 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1490 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1492 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1494 def test_property_tolerance_low_not_range(self):
1495 scenario_helper = ScenarioHelper('name1')
1496 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1497 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1499 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1501 def test_property_tolerance_high_default(self):
1502 scenario_helper = ScenarioHelper('name1')
1503 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1504 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1506 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1508 def test_property_tolerance_low_default(self):
1509 scenario_helper = ScenarioHelper('name1')
1510 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1511 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1513 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1515 def test_property_latency(self):
1516 scenario_helper = ScenarioHelper('name1')
1517 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1518 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1520 self.assertIsNone(rfc2544_resource_helper._latency)
1521 self.assertTrue(rfc2544_resource_helper.latency)
1522 self.assertTrue(rfc2544_resource_helper._latency)
1523 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1524 self.assertTrue(rfc2544_resource_helper.latency)
1526 def test_property_latency_default(self):
1527 scenario_helper = ScenarioHelper('name1')
1528 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1529 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1531 self.assertFalse(rfc2544_resource_helper.latency)
1533 def test_property_correlated_traffic(self):
1534 scenario_helper = ScenarioHelper('name1')
1535 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1536 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1538 self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1539 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1540 self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1541 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1542 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1544 def test_property_correlated_traffic_default(self):
1545 scenario_helper = ScenarioHelper('name1')
1546 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1547 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1549 self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1552 class TestSampleVNFDeployHelper(unittest.TestCase):
1554 @mock.patch('subprocess.check_output')
1555 def test_deploy_vnfs_disabled(self, mock_check_output):
1556 vnfd_helper = mock.Mock()
1557 ssh_helper = mock.Mock()
1558 ssh_helper.join_bin_path.return_value = 'joined_path'
1559 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1560 ssh_helper.put.return_value = None
1561 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1563 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1564 self.assertEqual(ssh_helper.execute.call_count, 0)
1565 self.assertEqual(ssh_helper.put.call_count, 0)
1567 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1568 @mock.patch('subprocess.check_output')
1569 def test_deploy_vnfs(self, mock_check_output, mock_time):
1570 vnfd_helper = mock.Mock()
1571 ssh_helper = mock.Mock()
1572 ssh_helper.join_bin_path.return_value = 'joined_path'
1573 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1574 ssh_helper.put.return_value = None
1575 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1576 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1578 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1579 self.assertEqual(ssh_helper.execute.call_count, 5)
1580 self.assertEqual(ssh_helper.put.call_count, 1)
1582 @mock.patch('subprocess.check_output')
1583 def test_deploy_vnfs_early_success(self, mock_check_output):
1584 vnfd_helper = mock.Mock()
1585 ssh_helper = mock.Mock()
1586 ssh_helper.join_bin_path.return_value = 'joined_path'
1587 ssh_helper.execute.return_value = 0, 'output', ''
1588 ssh_helper.put.return_value = None
1589 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1590 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1592 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1593 self.assertEqual(ssh_helper.execute.call_count, 1)
1594 self.assertEqual(ssh_helper.put.call_count, 0)
1597 class TestScenarioHelper(unittest.TestCase):
1599 def test_property_task_path(self):
1600 scenario_helper = ScenarioHelper('name1')
1601 scenario_helper.scenario_cfg = {
1602 'task_path': 'my_path',
1605 self.assertEqual(scenario_helper.task_path, 'my_path')
1607 def test_property_nodes(self):
1608 nodes = ['node1', 'node2']
1609 scenario_helper = ScenarioHelper('name1')
1610 scenario_helper.scenario_cfg = {
1614 self.assertEqual(scenario_helper.nodes, nodes)
1616 def test_property_all_options(self):
1623 scenario_helper = ScenarioHelper('name1')
1624 scenario_helper.scenario_cfg = {
1628 self.assertDictEqual(scenario_helper.all_options, data)
1630 def test_property_options(self):
1635 scenario_helper = ScenarioHelper('name1')
1636 scenario_helper.scenario_cfg = {
1642 self.assertDictEqual(scenario_helper.options, data)
1644 def test_property_vnf_cfg(self):
1645 scenario_helper = ScenarioHelper('name1')
1646 scenario_helper.scenario_cfg = {
1649 'vnf_config': 'my_config',
1654 self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1656 def test_property_vnf_cfg_default(self):
1657 scenario_helper = ScenarioHelper('name1')
1658 scenario_helper.scenario_cfg = {
1664 self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1666 def test_property_topology(self):
1667 scenario_helper = ScenarioHelper('name1')
1668 scenario_helper.scenario_cfg = {
1669 'topology': 'my_topology',
1672 self.assertEqual(scenario_helper.topology, 'my_topology')
1675 class TestSampleVnf(unittest.TestCase):
1678 'short-name': 'VpeVnf',
1683 'network': '152.16.100.20',
1684 'netmask': '255.255.255.0',
1685 'gateway': '152.16.100.20',
1689 'network': '152.16.40.20',
1690 'netmask': '255.255.255.0',
1691 'gateway': '152.16.40.20',
1695 'description': 'VPE approximation using DPDK',
1696 'name': 'vpevnf-baremetal',
1699 'network': '0064:ff9b:0:0:0:0:9810:6414',
1701 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1705 'network': '0064:ff9b:0:0:0:0:9810:2814',
1707 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1711 'id': 'vpevnf-baremetal',
1712 'external-interface': [
1714 'virtual-interface': {
1715 'dst_mac': '00:00:00:00:00:03',
1716 'vpci': '0000:05:00.0',
1717 'local_ip': '152.16.100.19',
1718 'type': 'PCI-PASSTHROUGH',
1719 'netmask': '255.255.255.0',
1720 'dpdk_port_num': '0',
1721 'bandwidth': '10 Gbps',
1722 'dst_ip': '152.16.100.20',
1723 'local_mac': '00:00:00:00:00:01'
1725 'vnfd-connection-point-ref': 'xe0',
1729 'virtual-interface': {
1730 'dst_mac': '00:00:00:00:00:04',
1731 'vpci': '0000:05:00.1',
1732 'local_ip': '152.16.40.19',
1733 'type': 'PCI-PASSTHROUGH',
1734 'netmask': '255.255.255.0',
1735 'dpdk_port_num': '1',
1736 'bandwidth': '10 Gbps',
1737 'dst_ip': '152.16.40.20',
1738 'local_mac': '00:00:00:00:00:02'
1740 'vnfd-connection-point-ref': 'xe1',
1746 'description': 'Vpe approximation using DPDK',
1748 'vdu-id': 'vpevnf-baremetal',
1761 'connection-point': [
1771 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1775 'vnfd:vnfd-catalog': {
1783 "schema": "isb:traffic_profile:0.1",
1785 "description": "Fixed traffic profile to run UDP traffic",
1786 "traffic_profile": {
1787 "traffic_type": "FixedTraffic",
1788 "frame_rate": 100, # pps
1794 def test___init__(self):
1795 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1797 self.assertEqual(sample_vnf.name, 'vnf1')
1798 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1800 # test the default setup helper is SetupEnvHelper, not subclass
1801 self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1803 # test the default resource helper is ResourceHelper, not subclass
1804 self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1806 def test___init___alt_types(self):
1807 class MySetupEnvHelper(SetupEnvHelper):
1811 class MyResourceHelper(ResourceHelper):
1814 sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1816 self.assertEqual(sample_vnf.name, 'vnf1')
1817 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1819 # test the default setup helper is MySetupEnvHelper, not subclass
1820 self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1822 # test the default resource helper is MyResourceHelper, not subclass
1823 self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1825 def test__get_port0localip6(self):
1826 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1827 expected = '0064:ff9b:0:0:0:0:9810:6414'
1828 result = sample_vnf._get_port0localip6()
1829 self.assertEqual(result, expected)
1831 def test__get_port1localip6(self):
1832 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1833 expected = '0064:ff9b:0:0:0:0:9810:2814'
1834 result = sample_vnf._get_port1localip6()
1835 self.assertEqual(result, expected)
1837 def test__get_port0prefixip6(self):
1838 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1840 result = sample_vnf._get_port0prefixlen6()
1841 self.assertEqual(result, expected)
1843 def test__get_port1prefixip6(self):
1844 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1846 result = sample_vnf._get_port1prefixlen6()
1847 self.assertEqual(result, expected)
1849 def test__get_port0gateway6(self):
1850 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1851 expected = '0064:ff9b:0:0:0:0:9810:6414'
1852 result = sample_vnf._get_port0gateway6()
1853 self.assertEqual(result, expected)
1855 def test__get_port1gateway6(self):
1856 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1857 expected = '0064:ff9b:0:0:0:0:9810:2814'
1858 result = sample_vnf._get_port1gateway6()
1859 self.assertEqual(result, expected)
1861 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1862 def test__start_vnf(self, mock_process_type):
1863 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1864 sample_vnf = SampleVNF('vnf1', vnfd)
1865 sample_vnf._run = mock.Mock()
1867 self.assertIsNone(sample_vnf.queue_wrapper)
1868 self.assertIsNone(sample_vnf._vnf_process)
1869 self.assertIsNone(sample_vnf._start_vnf())
1870 self.assertIsNotNone(sample_vnf.queue_wrapper)
1871 self.assertIsNotNone(sample_vnf._vnf_process)
1873 @mock.patch("yardstick.ssh.SSH")
1874 def test_instantiate(self, ssh):
1882 context1 = mock.Mock()
1883 context1._get_server.return_value = None
1884 context2 = mock.Mock()
1885 context2._get_server.return_value = context2
1888 Context.list.clear()
1889 except AttributeError:
1890 # clear() but works in Py2.7
1891 Context.list[:] = []
1893 Context.list.extend([
1898 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1899 sample_vnf = SampleVNF('vnf1', vnfd)
1900 sample_vnf.APP_NAME = 'sample1'
1901 sample_vnf._start_server = mock.Mock(return_value=0)
1902 sample_vnf._vnf_process = mock.MagicMock()
1903 sample_vnf._vnf_process._is_alive.return_value = 1
1904 sample_vnf.ssh_helper = mock.MagicMock()
1905 sample_vnf.deploy_helper = mock.MagicMock()
1906 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1911 self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1912 self.assertEqual(sample_vnf.nfvi_context, context2)
1914 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1915 @mock.patch("yardstick.ssh.SSH")
1916 def test_wait_for_instantiate_empty_queue(self, ssh, mock_time):
1917 mock_ssh(ssh, exec_result=(1, "", ""))
1931 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1932 sample_vnf = SampleVNF('vnf1', vnfd)
1933 sample_vnf.APP_NAME = 'sample1'
1934 sample_vnf._start_server = mock.Mock(return_value=0)
1935 sample_vnf._vnf_process = mock.MagicMock()
1936 sample_vnf._vnf_process.exitcode = 0
1937 sample_vnf._vnf_process._is_alive.return_value = 1
1938 sample_vnf.queue_wrapper = mock.Mock()
1939 sample_vnf.q_out = mock.Mock()
1940 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1941 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1942 sample_vnf.ssh_helper = mock.MagicMock()
1943 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1944 sample_vnf.resource_helper.start_collect = mock.MagicMock()
1946 self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1948 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1949 def test_vnf_execute_with_queue_data(self, mock_time):
1961 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1962 sample_vnf = SampleVNF('vnf1', vnfd)
1963 sample_vnf.APP_NAME = 'sample1'
1964 sample_vnf.q_out = mock.Mock()
1965 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1966 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1968 self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1970 def test_terminate_without_vnf_process(self):
1971 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1972 sample_vnf = SampleVNF('vnf1', vnfd)
1973 sample_vnf.APP_NAME = 'sample1'
1974 sample_vnf.vnf_execute = mock.Mock()
1975 sample_vnf.ssh_helper = mock.Mock()
1976 sample_vnf._tear_down = mock.Mock()
1977 sample_vnf.resource_helper = mock.Mock()
1979 self.assertIsNone(sample_vnf.terminate())
1981 def test_get_stats(self):
1982 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1983 sample_vnf = SampleVNF('vnf1', vnfd)
1984 sample_vnf.APP_NAME = 'sample1'
1985 sample_vnf.APP_WORD = 'sample1'
1986 sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1988 self.assertEqual(sample_vnf.get_stats(), 'the stats')
1990 def test_collect_kpi(self):
1991 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1992 sample_vnf = SampleVNF('vnf1', vnfd)
1993 sample_vnf.APP_NAME = 'sample1'
1994 sample_vnf.COLLECT_KPI = '\s(\d+)\D*(\d+)\D*(\d+)'
1995 sample_vnf.COLLECT_MAP = {
2000 sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
2001 sample_vnf.resource_helper = mock.Mock()
2002 sample_vnf.resource_helper.collect_kpi.return_value = {}
2008 'collect_stats': {},
2010 result = sample_vnf.collect_kpi()
2011 self.assertDictEqual(result, expected)
2013 def test_collect_kpi_default(self):
2014 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
2015 sample_vnf = SampleVNF('vnf1', vnfd)
2016 sample_vnf.APP_NAME = 'sample1'
2017 sample_vnf.COLLECT_KPI = '\s(\d+)\D*(\d+)\D*(\d+)'
2018 sample_vnf.get_stats = mock.Mock(return_value='')
2023 'packets_dropped': 0,
2025 result = sample_vnf.collect_kpi()
2026 self.assertDictEqual(result, expected)
2029 class TestSampleVNFTrafficGen(unittest.TestCase):
2032 'short-name': 'VpeVnf',
2037 'network': '152.16.100.20',
2038 'netmask': '255.255.255.0',
2039 'gateway': '152.16.100.20',
2043 'network': '152.16.40.20',
2044 'netmask': '255.255.255.0',
2045 'gateway': '152.16.40.20',
2049 'description': 'VPE approximation using DPDK',
2050 'name': 'vpevnf-baremetal',
2053 'network': '0064:ff9b:0:0:0:0:9810:6414',
2055 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
2059 'network': '0064:ff9b:0:0:0:0:9810:2814',
2061 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
2065 'id': 'vpevnf-baremetal',
2066 'external-interface': [
2068 'virtual-interface': {
2069 'dst_mac': '00:00:00:00:00:03',
2070 'vpci': '0000:05:00.0',
2072 'local_ip': '152.16.100.19',
2073 'type': 'PCI-PASSTHROUGH',
2074 'netmask': '255.255.255.0',
2075 'dpdk_port_num': '0',
2076 'bandwidth': '10 Gbps',
2077 'dst_ip': '152.16.100.20',
2078 'local_mac': '00:00:00:00:00:01'
2080 'vnfd-connection-point-ref': 'xe0',
2084 'virtual-interface': {
2085 'dst_mac': '00:00:00:00:00:04',
2086 'vpci': '0000:05:00.1',
2088 'local_ip': '152.16.40.19',
2089 'type': 'PCI-PASSTHROUGH',
2090 'netmask': '255.255.255.0',
2091 'dpdk_port_num': '1',
2092 'bandwidth': '10 Gbps',
2093 'dst_ip': '152.16.40.20',
2094 'local_mac': '00:00:00:00:00:02'
2096 'vnfd-connection-point-ref': 'xe1',
2100 'virtual-interface': {
2101 'dst_mac': '00:00:00:00:00:13',
2102 'vpci': '0000:05:00.2',
2104 'local_ip': '152.16.40.19',
2105 'type': 'PCI-PASSTHROUGH',
2106 'netmask': '255.255.255.0',
2107 'dpdk_port_num': '1',
2108 'bandwidth': '10 Gbps',
2109 'dst_ip': '152.16.40.30',
2110 'local_mac': '00:00:00:00:00:11'
2112 'vnfd-connection-point-ref': 'xe2',
2118 'description': 'Vpe approximation using DPDK',
2120 'vdu-id': 'vpevnf-baremetal',
2133 'connection-point': [
2143 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
2147 'vnfd:vnfd-catalog': {
2155 "schema": "isb:traffic_profile:0.1",
2157 "description": "Fixed traffic profile to run UDP traffic",
2158 "traffic_profile": {
2159 "traffic_type": "FixedTraffic",
2160 "frame_rate": 100, # pps
2166 def test__check_status(self):
2167 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2169 with self.assertRaises(NotImplementedError):
2170 sample_vnf_tg._check_status()
2172 def test_listen_traffic(self):
2173 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2175 sample_vnf_tg.listen_traffic(mock.Mock())
2177 def test_verify_traffic(self):
2178 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2180 sample_vnf_tg.verify_traffic(mock.Mock())
2182 def test_terminate(self):
2183 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2184 sample_vnf_tg._traffic_process = mock.Mock()
2186 sample_vnf_tg.terminate()
2188 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
2189 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
2190 def test_wait_for_instantiate(self, mock_logger, mock_time):
2191 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2192 sample_vnf_tg._check_status = mock.Mock(side_effect=iter([1, 0]))
2193 sample_vnf_tg._tg_process = mock.Mock()
2194 sample_vnf_tg._tg_process.is_alive.return_value = True
2195 sample_vnf_tg._tg_process.exitcode = 234
2197 self.assertEqual(sample_vnf_tg.wait_for_instantiate(), 234)
2199 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
2200 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
2201 def test_wait_for_instantiate_not_alive(self, mock_logger, mock_time):
2202 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2203 sample_vnf_tg._check_status = mock.Mock(return_value=1)
2204 sample_vnf_tg._tg_process = mock.Mock()
2205 sample_vnf_tg._tg_process.is_alive.side_effect = iter([True, False])
2206 sample_vnf_tg._tg_process.exitcode = 234
2208 with self.assertRaises(RuntimeError):
2209 sample_vnf_tg.wait_for_instantiate()
2211 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
2212 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
2213 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
2214 def test_wait_for_instantiate_delayed(self, mock_process, mock_logger, mock_time):
2215 class MockClientStarted(mock.Mock):
2217 def __init__(self, *args, **kwargs):
2218 super(MockClientStarted, self).__init__(*args, **kwargs)
2219 self.iter = iter([0, 0, 1])
2223 return next(self.iter)
2225 mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
2226 mock_traffic_profile.get_traffic_definition.return_value = "64"
2227 mock_traffic_profile.execute.return_value = "64"
2228 mock_traffic_profile.params = self.TRAFFIC_PROFILE
2230 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2231 sample_vnf_tg._check_status = mock.Mock(side_effect=iter([1, 0]))
2232 sample_vnf_tg._tg_process = mock.Mock()
2233 sample_vnf_tg._tg_process.is_alive.return_value = True
2234 sample_vnf_tg._tg_process.exitcode = 234
2235 sample_vnf_tg.resource_helper = mock.Mock()
2236 sample_vnf_tg.resource_helper.client_started = MockClientStarted()
2238 self.assertTrue(sample_vnf_tg.run_traffic(mock_traffic_profile))
2239 self.assertEqual(mock_time.sleep.call_count, 2)