1 # Copyright (c) 2017-2018 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.
16 from copy import deepcopy
22 from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
23 from yardstick.tests import STL_MOCKS
24 from yardstick.benchmark.contexts.base import Context
25 from yardstick.common import exceptions as y_exceptions
26 from yardstick.common import utils
27 from yardstick.network_services.nfvi.resource import ResourceProfile
28 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
31 class MockError(BaseException):
35 STLClient = mock.MagicMock()
36 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
40 from yardstick.network_services.vnf_generic.vnf import sample_vnf
41 from yardstick.network_services.vnf_generic.vnf.vnf_ssh_helper import VnfSshHelper
42 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper
43 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
44 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper
45 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
46 from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
47 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SetupEnvHelper
48 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF
49 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
50 from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
53 class TestVnfSshHelper(unittest.TestCase):
56 'short-name': 'VpeVnf',
61 'network': '152.16.100.20',
62 'netmask': '255.255.255.0',
63 'gateway': '152.16.100.20',
67 'network': '152.16.40.20',
68 'netmask': '255.255.255.0',
69 'gateway': '152.16.40.20',
73 'description': 'VPE approximation using DPDK',
74 'name': 'vpevnf-baremetal',
77 'network': '0064:ff9b:0:0:0:0:9810:6414',
79 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
83 'network': '0064:ff9b:0:0:0:0:9810:2814',
85 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
89 'id': 'vpevnf-baremetal',
90 'external-interface': [
92 'virtual-interface': {
93 'dst_mac': '00:00:00:00:00:03',
94 'vpci': '0000:05:00.0',
95 'local_ip': '152.16.100.19',
96 'type': 'PCI-PASSTHROUGH',
97 'netmask': '255.255.255.0',
99 'bandwidth': '10 Gbps',
100 'dst_ip': '152.16.100.20',
101 'local_mac': '00:00:00:00:00:01',
102 'vld_id': 'uplink_0',
105 'vnfd-connection-point-ref': 'xe0',
109 'virtual-interface': {
110 'dst_mac': '00:00:00:00:00:04',
111 'vpci': '0000:05:00.1',
112 'local_ip': '152.16.40.19',
113 'type': 'PCI-PASSTHROUGH',
114 'netmask': '255.255.255.0',
116 'bandwidth': '10 Gbps',
117 'dst_ip': '152.16.40.20',
118 'local_mac': '00:00:00:00:00:02',
119 'vld_id': 'downlink_0',
122 'vnfd-connection-point-ref': 'xe1',
128 'description': 'Vpe approximation using DPDK',
130 'vdu-id': 'vpevnf-baremetal',
143 'connection-point': [
153 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
157 'vnfd:vnfd-catalog': {
164 def assertAll(self, iterable, message=None):
165 self.assertTrue(all(iterable), message)
167 def test_get_class(self):
168 self.assertIs(VnfSshHelper.get_class(), VnfSshHelper)
170 @mock.patch('yardstick.ssh.paramiko')
171 def test_copy(self, _):
172 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
173 ssh_helper._run = mock.Mock()
175 ssh_helper.execute('ls')
176 self.assertTrue(ssh_helper.is_connected)
177 result = ssh_helper.copy()
178 self.assertIsInstance(result, VnfSshHelper)
179 self.assertFalse(result.is_connected)
180 self.assertEqual(result.bin_path, ssh_helper.bin_path)
181 self.assertEqual(result.host, ssh_helper.host)
182 self.assertEqual(result.port, ssh_helper.port)
183 self.assertEqual(result.user, ssh_helper.user)
184 self.assertEqual(result.password, ssh_helper.password)
185 self.assertEqual(result.key_filename, ssh_helper.key_filename)
187 @mock.patch('yardstick.ssh.paramiko')
188 def test_upload_config_file(self, mock_paramiko):
189 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
190 ssh_helper._run = mock.MagicMock()
192 self.assertFalse(ssh_helper.is_connected)
193 cfg_file = ssh_helper.upload_config_file('my/prefix', 'my content')
194 self.assertTrue(ssh_helper.is_connected)
195 mock_paramiko.SSHClient.assert_called_once()
196 self.assertTrue(cfg_file.startswith('/tmp'))
198 cfg_file = ssh_helper.upload_config_file('/my/prefix', 'my content')
199 self.assertTrue(ssh_helper.is_connected)
200 mock_paramiko.SSHClient.assert_called_once()
201 self.assertEqual(cfg_file, '/my/prefix')
203 def test_join_bin_path(self):
204 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
206 expected_start = 'my'
207 expected_middle_list = ['bin']
208 expected_end = 'path'
209 result = ssh_helper.join_bin_path()
210 self.assertTrue(result.startswith(expected_start))
211 self.assertAll(middle in result for middle in expected_middle_list)
212 self.assertTrue(result.endswith(expected_end))
214 expected_middle_list.append(expected_end)
215 expected_end = 'some_file.sh'
216 result = ssh_helper.join_bin_path('some_file.sh')
217 self.assertTrue(result.startswith(expected_start))
218 self.assertAll(middle in result for middle in expected_middle_list)
219 self.assertTrue(result.endswith(expected_end))
221 expected_middle_list.append('some_dir')
222 expected_end = 'some_file.sh'
223 result = ssh_helper.join_bin_path('some_dir', 'some_file.sh')
224 self.assertTrue(result.startswith(expected_start))
225 self.assertAll(middle in result for middle in expected_middle_list)
226 self.assertTrue(result.endswith(expected_end))
228 @mock.patch('yardstick.ssh.paramiko')
229 @mock.patch('yardstick.ssh.provision_tool')
230 def test_provision_tool(self, mock_provision_tool, mock_paramiko):
231 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
232 ssh_helper._run = mock.MagicMock()
234 self.assertFalse(ssh_helper.is_connected)
235 ssh_helper.provision_tool()
236 self.assertTrue(ssh_helper.is_connected)
237 mock_paramiko.SSHClient.assert_called_once()
238 mock_provision_tool.assert_called_once()
240 ssh_helper.provision_tool(tool_file='my_tool.sh')
241 self.assertTrue(ssh_helper.is_connected)
242 mock_paramiko.SSHClient.assert_called_once()
243 self.assertEqual(mock_provision_tool.call_count, 2)
245 ssh_helper.provision_tool('tool_path', 'my_tool.sh')
246 self.assertTrue(ssh_helper.is_connected)
247 mock_paramiko.SSHClient.assert_called_once()
248 self.assertEqual(mock_provision_tool.call_count, 3)
251 class TestSetupEnvHelper(unittest.TestCase):
254 'short-name': 'VpeVnf',
259 'network': '152.16.100.20',
260 'netmask': '255.255.255.0',
261 'gateway': '152.16.100.20',
265 'network': '152.16.40.20',
266 'netmask': '255.255.255.0',
267 'gateway': '152.16.40.20',
271 'description': 'VPE approximation using DPDK',
272 'name': 'vpevnf-baremetal',
275 'network': '0064:ff9b:0:0:0:0:9810:6414',
277 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
281 'network': '0064:ff9b:0:0:0:0:9810:2814',
283 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
287 'id': 'vpevnf-baremetal',
288 'external-interface': [
290 'virtual-interface': {
291 'dst_mac': '00:00:00:00:00:03',
292 'vpci': '0000:05:00.0',
293 'local_ip': '152.16.100.19',
294 'type': 'PCI-PASSTHROUGH',
295 'netmask': '255.255.255.0',
297 'bandwidth': '10 Gbps',
298 'dst_ip': '152.16.100.20',
299 'local_mac': '00:00:00:00:00:01',
300 'vld_id': 'uplink_0',
303 'vnfd-connection-point-ref': 'xe0',
307 'virtual-interface': {
308 'dst_mac': '00:00:00:00:00:04',
309 'vpci': '0000:05:00.1',
310 'local_ip': '152.16.40.19',
311 'type': 'PCI-PASSTHROUGH',
312 'netmask': '255.255.255.0',
314 'bandwidth': '10 Gbps',
315 'dst_ip': '152.16.40.20',
316 'local_mac': '00:00:00:00:00:02',
317 'vld_id': 'downlink_0',
320 'vnfd-connection-point-ref': 'xe1',
326 'description': 'Vpe approximation using DPDK',
328 'vdu-id': 'vpevnf-baremetal',
341 'connection-point': [
351 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
354 def test_build_config(self):
355 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
357 with self.assertRaises(NotImplementedError):
358 setup_env_helper.build_config()
360 def test_setup_vnf_environment(self):
361 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
362 self.assertIsNone(setup_env_helper.setup_vnf_environment())
364 def test_tear_down(self):
365 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
367 with self.assertRaises(NotImplementedError):
368 setup_env_helper.tear_down()
371 class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
374 'short-name': 'VpeVnf',
379 'network': '152.16.100.20',
380 'netmask': '255.255.255.0',
381 'gateway': '152.16.100.20',
385 'network': '152.16.40.20',
386 'netmask': '255.255.255.0',
387 'gateway': '152.16.40.20',
391 'description': 'VPE approximation using DPDK',
392 'name': 'vpevnf-baremetal',
395 'network': '0064:ff9b:0:0:0:0:9810:6414',
397 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
401 'network': '0064:ff9b:0:0:0:0:9810:2814',
403 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
407 'id': 'vpevnf-baremetal',
408 'external-interface': [
410 'virtual-interface': {
411 'dst_mac': '00:00:00:00:00:03',
412 'vpci': '0000:05:00.0',
415 'local_ip': '152.16.100.19',
416 'type': 'PCI-PASSTHROUGH',
417 'netmask': '255.255.255.0',
418 'bandwidth': '10 Gbps',
419 'dst_ip': '152.16.100.20',
420 'local_mac': '00:00:00:00:00:01',
421 'vld_id': 'uplink_0',
424 'vnfd-connection-point-ref': 'xe0',
428 'virtual-interface': {
429 'dst_mac': '00:00:00:00:00:04',
430 'vpci': '0000:05:00.1',
433 'local_ip': '152.16.40.19',
434 'type': 'PCI-PASSTHROUGH',
435 'netmask': '255.255.255.0',
436 'bandwidth': '10 Gbps',
437 'dst_ip': '152.16.40.20',
438 'local_mac': '00:00:00:00:00:02',
439 'vld_id': 'downlink_0',
442 'vnfd-connection-point-ref': 'xe1',
448 'description': 'Vpe approximation using DPDK',
450 'vdu-id': 'vpevnf-baremetal',
463 'connection-point': [
473 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
477 'vnfd:vnfd-catalog': {
484 def test__update_packet_type(self):
485 ip_pipeline_cfg = 'pkt_type = ipv4'
486 pkt_type = {'pkt_type': '1'}
488 expected = "pkt_type = 1"
489 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
490 self.assertEqual(result, expected)
492 def test__update_packet_type_no_op(self):
493 ip_pipeline_cfg = 'pkt_type = ipv6'
494 pkt_type = {'pkt_type': '1'}
496 expected = "pkt_type = ipv6"
497 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
498 self.assertEqual(result, expected)
500 def test__update_packet_type_multi_op(self):
501 ip_pipeline_cfg = 'pkt_type = ipv4\npkt_type = 1\npkt_type = ipv4'
502 pkt_type = {'pkt_type': '1'}
504 expected = 'pkt_type = 1\npkt_type = 1\npkt_type = 1'
505 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
506 self.assertEqual(result, expected)
508 def test__update_traffic_type(self):
509 ip_pipeline_cfg = 'pkt_type = ipv4'
511 traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 4}
512 expected = "pkt_type = ipv4"
513 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
514 self.assertEqual(result, expected)
516 def test__update_traffic_type_ipv6(self):
517 ip_pipeline_cfg = 'pkt_type = ipv4'
519 traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 6}
520 expected = "pkt_type = ipv6"
521 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
522 self.assertEqual(result, expected)
524 def test__update_traffic_type_not_app_name(self):
525 ip_pipeline_cfg = 'traffic_type = 4'
527 vnf_type = ''.join(["Not", DpdkVnfSetupEnvHelper.APP_NAME])
528 traffic_options = {"vnf_type": vnf_type, 'traffic_type': 8}
529 expected = "traffic_type = 8"
530 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
531 self.assertEqual(result, expected)
533 @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n'))
534 @mock.patch.object(utils, 'read_meminfo',
535 return_value={'Hugepagesize': '2048'})
536 def test__setup_hugepages_no_hugepages_defined(self, mock_meminfo, *args):
537 ssh_helper = mock.Mock()
538 scenario_helper = mock.Mock()
539 scenario_helper.all_options = {}
540 dpdk_setup_helper = DpdkVnfSetupEnvHelper(
541 mock.ANY, ssh_helper, scenario_helper)
542 with mock.patch.object(sample_vnf.LOG, 'info') as mock_info:
543 dpdk_setup_helper._setup_hugepages()
544 mock_info.assert_called_once_with(
545 'Hugepages size (kB): %s, number claimed: %s, number set: '
546 '%s', 2048, 8192, 100)
547 mock_meminfo.assert_called_once_with(ssh_helper)
549 @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n'))
550 @mock.patch.object(utils, 'read_meminfo',
551 return_value={'Hugepagesize': '1048576'})
552 def test__setup_hugepages_8gb_hugepages_defined(self, mock_meminfo, *args):
553 ssh_helper = mock.Mock()
554 scenario_helper = mock.Mock()
555 scenario_helper.all_options = {'hugepages_gb': 8}
556 dpdk_setup_helper = DpdkVnfSetupEnvHelper(
557 mock.ANY, ssh_helper, scenario_helper)
558 with mock.patch.object(sample_vnf.LOG, 'info') as mock_info:
559 dpdk_setup_helper._setup_hugepages()
560 mock_info.assert_called_once_with(
561 'Hugepages size (kB): %s, number claimed: %s, number set: '
562 '%s', 1048576, 8, 100)
563 mock_meminfo.assert_called_once_with(ssh_helper)
565 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open')
566 @mock.patch.object(utils, 'find_relative_file')
567 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
568 @mock.patch.object(utils, 'open_relative_file')
569 def test_build_config(self, mock_open_rf, mock_multi_port_config_class, mock_find, *args):
570 mock_multi_port_config = mock_multi_port_config_class()
571 vnfd_helper = VnfdHelper(self.VNFD_0)
572 ssh_helper = mock.Mock()
573 scenario_helper = mock.Mock()
574 scenario_helper.vnf_cfg = {}
575 scenario_helper.options = {}
576 scenario_helper.all_options = {}
577 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
579 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
580 result = dpdk_setup_helper.build_config()
581 self.assertEqual(result, expected)
582 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
583 mock_find.assert_called()
584 mock_multi_port_config.generate_config.assert_called()
585 mock_multi_port_config.generate_script.assert_called()
587 scenario_helper.options = {'rules': 'fake_file'}
588 scenario_helper.vnf_cfg = {'file': 'fake_file'}
589 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
590 mock_open_rf.side_effect = mock.mock_open(read_data='fake_data')
591 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
593 result = dpdk_setup_helper.build_config()
595 mock_open_rf.assert_called()
596 self.assertEqual(result, expected)
597 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
598 mock_find.assert_called()
599 mock_multi_port_config.generate_config.assert_called()
600 mock_multi_port_config.generate_script.assert_called()
602 def test__build_pipeline_kwargs(self):
603 vnfd_helper = VnfdHelper(self.VNFD_0)
604 ssh_helper = mock.Mock()
605 ssh_helper.provision_tool.return_value = 'tool_path'
606 scenario_helper = mock.Mock()
607 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
608 dpdk_setup_helper.CFG_CONFIG = 'config'
609 dpdk_setup_helper.CFG_SCRIPT = 'script'
610 dpdk_setup_helper.pipeline_kwargs = {}
611 dpdk_setup_helper.all_ports = [0, 1, 2]
612 dpdk_setup_helper.scenario_helper.vnf_cfg = {'lb_config': 'HW',
616 'cfg_file': 'config',
618 'port_mask_hex': '0x3',
619 'tool_path': 'tool_path',
622 dpdk_setup_helper._build_pipeline_kwargs()
623 self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected)
625 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
626 @mock.patch('yardstick.ssh.SSH')
627 def test_setup_vnf_environment(self, *args):
629 if cmd.startswith('which '):
633 exec_success = (0, 'good output', '')
634 exec_failure = (1, 'bad output', 'error output')
636 vnfd_helper = VnfdHelper(self.VNFD_0)
637 ssh_helper = mock.Mock()
638 ssh_helper.execute = execute
640 scenario_helper = mock.Mock()
641 scenario_helper.nodes = [None, None]
642 dpdk_vnf_setup_env_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
643 dpdk_vnf_setup_env_helper._validate_cpu_cfg = mock.Mock(return_value=[])
645 with mock.patch.object(dpdk_vnf_setup_env_helper, '_setup_dpdk'):
646 self.assertIsInstance(
647 dpdk_vnf_setup_env_helper.setup_vnf_environment(),
650 def test__setup_dpdk(self):
651 ssh_helper = mock.Mock()
652 ssh_helper.execute = mock.Mock()
653 ssh_helper.execute.return_value = (0, 0, 0)
654 dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
655 with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
657 dpdk_setup_helper._setup_dpdk()
658 mock_setup_hp.assert_called_once()
659 ssh_helper.execute.assert_has_calls([
660 mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
661 mock.call('lsmod | grep -i igb_uio')
664 @mock.patch('yardstick.ssh.SSH')
665 def test__setup_resources(self, _):
666 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
667 ssh_helper = mock.Mock()
668 scenario_helper = mock.Mock()
669 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
670 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
672 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
673 vnfd_helper.interfaces]
674 result = dpdk_setup_helper._setup_resources()
675 self.assertIsInstance(result, ResourceProfile)
676 self.assertEqual(dpdk_setup_helper.socket, 0)
678 @mock.patch('yardstick.ssh.SSH')
679 def test__setup_resources_socket_1(self, _):
680 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
681 vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0'
682 vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0'
683 ssh_helper = mock.Mock()
684 scenario_helper = mock.Mock()
685 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
686 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
688 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
689 vnfd_helper.interfaces]
690 result = dpdk_setup_helper._setup_resources()
691 self.assertIsInstance(result, ResourceProfile)
692 self.assertEqual(dpdk_setup_helper.socket, 1)
694 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
695 def test__detect_and_bind_drivers(self, *args):
696 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
697 ssh_helper = mock.Mock()
698 # ssh_helper.execute = mock.Mock(return_value = (0, 'text', ''))
699 # ssh_helper.execute.return_value = 0, 'output', ''
700 scenario_helper = mock.Mock()
701 scenario_helper.nodes = [None, None]
702 rv = ['0000:05:00.1', '0000:05:00.0']
704 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
705 dpdk_setup_helper.dpdk_bind_helper._get_bound_pci_addresses = mock.Mock(return_value=rv)
706 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
707 dpdk_setup_helper.dpdk_bind_helper.read_status = mock.Mock()
709 self.assertIsNone(dpdk_setup_helper._detect_and_bind_drivers())
711 intf_0 = vnfd_helper.vdu[0]['external-interface'][0]['virtual-interface']
712 intf_1 = vnfd_helper.vdu[0]['external-interface'][1]['virtual-interface']
713 self.assertEqual(0, intf_0['dpdk_port_num'])
714 self.assertEqual(1, intf_1['dpdk_port_num'])
716 def test_tear_down(self):
717 vnfd_helper = VnfdHelper(self.VNFD_0)
718 ssh_helper = mock.Mock()
719 scenario_helper = mock.Mock()
720 scenario_helper.nodes = [None, None]
721 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
722 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
723 dpdk_setup_helper.dpdk_bind_helper.used_drivers = {
724 'd1': ['0000:05:00.0'],
725 'd3': ['0000:05:01.0'],
728 self.assertIsNone(dpdk_setup_helper.tear_down())
729 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True)
730 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0'], 'd3', True)
733 class TestResourceHelper(unittest.TestCase):
736 'short-name': 'VpeVnf',
741 'network': '152.16.100.20',
742 'netmask': '255.255.255.0',
743 'gateway': '152.16.100.20',
747 'network': '152.16.40.20',
748 'netmask': '255.255.255.0',
749 'gateway': '152.16.40.20',
753 'description': 'VPE approximation using DPDK',
754 'name': 'vpevnf-baremetal',
757 'network': '0064:ff9b:0:0:0:0:9810:6414',
759 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
763 'network': '0064:ff9b:0:0:0:0:9810:2814',
765 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
769 'id': 'vpevnf-baremetal',
770 'external-interface': [
772 'virtual-interface': {
773 'dst_mac': '00:00:00:00:00:03',
774 'vpci': '0000:05:00.0',
776 'local_ip': '152.16.100.19',
777 'type': 'PCI-PASSTHROUGH',
778 'netmask': '255.255.255.0',
780 'bandwidth': '10 Gbps',
781 'dst_ip': '152.16.100.20',
782 'local_mac': '00:00:00:00:00:01'
784 'vnfd-connection-point-ref': 'xe0',
788 'virtual-interface': {
789 'dst_mac': '00:00:00:00:00:04',
790 'vpci': '0000:05:00.1',
792 'local_ip': '152.16.40.19',
793 'type': 'PCI-PASSTHROUGH',
794 'netmask': '255.255.255.0',
796 'bandwidth': '10 Gbps',
797 'dst_ip': '152.16.40.20',
798 'local_mac': '00:00:00:00:00:02'
800 'vnfd-connection-point-ref': 'xe1',
806 'description': 'Vpe approximation using DPDK',
808 'vdu-id': 'vpevnf-baremetal',
821 'connection-point': [
831 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
834 def test_setup(self):
836 vnfd_helper = VnfdHelper(self.VNFD_0)
837 ssh_helper = mock.Mock()
838 scenario_helper = mock.Mock()
839 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
840 dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
841 resource_helper = ResourceHelper(dpdk_setup_helper)
843 self.assertIsNone(resource_helper.setup())
844 self.assertIs(resource_helper.resource, resource)
846 def test_generate_cfg(self):
847 vnfd_helper = VnfdHelper(self.VNFD_0)
848 ssh_helper = mock.Mock()
849 scenario_helper = mock.Mock()
850 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
851 resource_helper = ResourceHelper(dpdk_setup_helper)
853 self.assertIsNone(resource_helper.generate_cfg())
855 def test_stop_collect(self):
856 vnfd_helper = VnfdHelper(self.VNFD_0)
857 ssh_helper = mock.Mock()
858 scenario_helper = mock.Mock()
859 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
860 resource_helper = ResourceHelper(dpdk_setup_helper)
861 resource_helper.resource = mock.Mock()
863 self.assertIsNone(resource_helper.stop_collect())
865 def test_stop_collect_none(self):
866 vnfd_helper = VnfdHelper(self.VNFD_0)
867 ssh_helper = mock.Mock()
868 scenario_helper = mock.Mock()
869 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
870 resource_helper = ResourceHelper(dpdk_setup_helper)
871 resource_helper.resource = None
873 self.assertIsNone(resource_helper.stop_collect())
876 class TestClientResourceHelper(unittest.TestCase):
879 'short-name': 'VpeVnf',
884 'network': '152.16.100.20',
885 'netmask': '255.255.255.0',
886 'gateway': '152.16.100.20',
890 'network': '152.16.40.20',
891 'netmask': '255.255.255.0',
892 'gateway': '152.16.40.20',
896 'description': 'VPE approximation using DPDK',
897 'name': 'vpevnf-baremetal',
900 'network': '0064:ff9b:0:0:0:0:9810:6414',
902 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
906 'network': '0064:ff9b:0:0:0:0:9810:2814',
908 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
912 'id': 'vpevnf-baremetal',
913 'external-interface': [
915 'virtual-interface': {
916 'dst_mac': '00:00:00:00:00:03',
917 'vpci': '0000:05:00.0',
919 'local_ip': '152.16.100.19',
920 'type': 'PCI-PASSTHROUGH',
921 'netmask': '255.255.255.0',
923 'bandwidth': '10 Gbps',
924 'dst_ip': '152.16.100.20',
925 'local_mac': '00:00:00:00:00:01',
926 'vld_id': 'uplink_0',
929 'vnfd-connection-point-ref': 'xe0',
933 'virtual-interface': {
934 'dst_mac': '00:00:00:00:00:04',
935 'vpci': '0000:05:00.1',
937 'local_ip': '152.16.40.19',
938 'type': 'PCI-PASSTHROUGH',
939 'netmask': '255.255.255.0',
941 'bandwidth': '10 Gbps',
942 'dst_ip': '152.16.40.20',
943 'local_mac': '00:00:00:00:00:02',
944 'vld_id': 'downlink_0',
947 'vnfd-connection-point-ref': 'xe1',
951 'virtual-interface': {
952 'dst_mac': '00:00:00:00:00:13',
953 'vpci': '0000:05:00.2',
955 'local_ip': '152.16.40.19',
956 'type': 'PCI-PASSTHROUGH',
957 'netmask': '255.255.255.0',
959 'bandwidth': '10 Gbps',
960 'dst_ip': '152.16.40.30',
961 'local_mac': '00:00:00:00:00:11'
963 'vnfd-connection-point-ref': 'xe2',
969 'description': 'Vpe approximation using DPDK',
971 'vdu-id': 'vpevnf-baremetal',
984 'connection-point': [
994 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
998 'vnfd:vnfd-catalog': {
1005 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1006 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1007 new_callable=lambda: MockError)
1008 def test_get_stats_not_connected(self, mock_state_error, *args):
1009 vnfd_helper = VnfdHelper(self.VNFD_0)
1010 ssh_helper = mock.Mock()
1011 scenario_helper = mock.Mock()
1012 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1013 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1014 client_resource_helper.client = mock.MagicMock()
1015 client_resource_helper.client.get_stats.side_effect = mock_state_error
1017 self.assertEqual(client_resource_helper.get_stats(), {})
1018 client_resource_helper.client.get_stats.assert_called_once()
1020 def test_generate_samples(self):
1021 vnfd_helper = VnfdHelper(self.VNFD_0)
1022 ssh_helper = mock.Mock()
1023 scenario_helper = mock.Mock()
1024 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1025 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1026 client_resource_helper.client = mock.MagicMock()
1027 client_resource_helper.client.get_stats.return_value = {
1045 "rx_throughput_fps": 5.5,
1046 "tx_throughput_fps": 4.9,
1047 "rx_throughput_mbps": 234.78,
1048 "tx_throughput_mbps": 243.11,
1049 "in_packets": 34251,
1050 "out_packets": 52342,
1053 "rx_throughput_fps": 0.0,
1054 "tx_throughput_fps": 5.9,
1055 "rx_throughput_mbps": 434.78,
1056 "tx_throughput_mbps": 0.0,
1058 "out_packets": 48791,
1061 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1062 result = client_resource_helper.generate_samples(ports)
1063 self.assertDictEqual(result, expected)
1065 def test_generate_samples_with_key(self):
1066 vnfd_helper = VnfdHelper(self.VNFD_0)
1067 ssh_helper = mock.Mock()
1068 scenario_helper = mock.Mock()
1069 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1070 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1071 client_resource_helper.client = mock.MagicMock()
1072 client_resource_helper.client.get_stats.return_value = {
1073 'key_name': 'key_value',
1091 'key_name': 'key_value',
1092 "rx_throughput_fps": 5.5,
1093 "tx_throughput_fps": 4.9,
1094 "rx_throughput_mbps": 234.78,
1095 "tx_throughput_mbps": 243.11,
1096 "in_packets": 34251,
1097 "out_packets": 52342,
1100 'key_name': 'key_value',
1101 "rx_throughput_fps": 0.0,
1102 "tx_throughput_fps": 5.9,
1103 "rx_throughput_mbps": 434.78,
1104 "tx_throughput_mbps": 0.0,
1106 "out_packets": 48791,
1109 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1110 result = client_resource_helper.generate_samples(ports, 'key_name')
1111 self.assertDictEqual(result, expected)
1113 def test_generate_samples_with_key_and_default(self):
1114 vnfd_helper = VnfdHelper(self.VNFD_0)
1115 ssh_helper = mock.Mock()
1116 scenario_helper = mock.Mock()
1117 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1118 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1119 client_resource_helper.client = mock.MagicMock()
1120 client_resource_helper.client.get_stats.return_value = {
1138 'key_name': 'default',
1139 "rx_throughput_fps": 5.5,
1140 "tx_throughput_fps": 4.9,
1141 "rx_throughput_mbps": 234.78,
1142 "tx_throughput_mbps": 243.11,
1143 "in_packets": 34251,
1144 "out_packets": 52342,
1147 'key_name': 'default',
1148 "rx_throughput_fps": 0.0,
1149 "tx_throughput_fps": 5.9,
1150 "rx_throughput_mbps": 434.78,
1151 "tx_throughput_mbps": 0.0,
1153 "out_packets": 48791,
1156 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1157 result = client_resource_helper.generate_samples(ports, 'key_name', 'default')
1158 self.assertDictEqual(result, expected)
1160 def test_clear_stats(self):
1161 vnfd_helper = VnfdHelper(self.VNFD_0)
1162 ssh_helper = mock.Mock()
1163 scenario_helper = mock.Mock()
1164 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1165 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1166 client_resource_helper.client = mock.Mock()
1168 self.assertIsNone(client_resource_helper.clear_stats())
1169 client_resource_helper.client.clear_stats.assert_called_once()
1171 def test_clear_stats_of_ports(self):
1172 vnfd_helper = VnfdHelper(self.VNFD_0)
1173 ssh_helper = mock.Mock()
1174 scenario_helper = mock.Mock()
1175 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1176 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1177 client_resource_helper.client = mock.Mock()
1179 self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
1180 client_resource_helper.client.clear_stats.assert_called_once()
1182 def test_start(self):
1183 vnfd_helper = VnfdHelper(self.VNFD_0)
1184 ssh_helper = mock.Mock()
1185 scenario_helper = mock.Mock()
1186 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1187 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1188 client_resource_helper.client = mock.Mock()
1190 self.assertIsNone(client_resource_helper.start())
1191 client_resource_helper.client.start.assert_called_once()
1193 def test_start_ports(self):
1194 vnfd_helper = VnfdHelper(self.VNFD_0)
1195 ssh_helper = mock.Mock()
1196 scenario_helper = mock.Mock()
1197 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1198 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1199 client_resource_helper.client = mock.Mock()
1201 self.assertIsNone(client_resource_helper.start([3, 4]))
1202 client_resource_helper.client.start.assert_called_once()
1204 def test_collect_kpi_with_queue(self):
1205 vnfd_helper = VnfdHelper(self.VNFD_0)
1206 ssh_helper = mock.Mock()
1207 scenario_helper = mock.Mock()
1208 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1209 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1210 client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1211 client_resource_helper._queue = mock.Mock()
1212 client_resource_helper._queue.empty.return_value = False
1213 client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1220 result = client_resource_helper.collect_kpi()
1221 self.assertDictEqual(result, expected)
1223 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1224 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1225 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1226 new_callable=lambda: MockError)
1227 def test__connect_with_failures(self, mock_error, *args):
1228 vnfd_helper = VnfdHelper(self.VNFD_0)
1229 ssh_helper = mock.Mock()
1230 scenario_helper = mock.Mock()
1231 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1232 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1233 client = mock.MagicMock()
1234 client.connect.side_effect = mock_error
1236 self.assertIs(client_resource_helper._connect(client), client)
1239 class TestRfc2544ResourceHelper(unittest.TestCase):
1243 'correlated_traffic': True,
1244 'allowed_drop_rate': '0.1 - 0.15',
1248 'allowed_drop_rate': ' 0.25 - 0.05 ',
1252 'allowed_drop_rate': '0.2',
1261 'rfc2544': RFC2544_CFG_1,
1267 'rfc2544': RFC2544_CFG_2,
1273 'rfc2544': RFC2544_CFG_3,
1279 'rfc2544': RFC2544_CFG_4,
1283 def test_property_rfc2544(self):
1284 scenario_helper = ScenarioHelper('name1')
1285 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1286 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1288 self.assertIsNone(rfc2544_resource_helper._rfc2544)
1289 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1290 self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1291 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1292 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1294 def test_property_tolerance_high(self):
1295 scenario_helper = ScenarioHelper('name1')
1296 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1297 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1299 self.assertIsNone(rfc2544_resource_helper._tolerance_high)
1300 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1301 self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1302 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1303 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1305 def test_property_tolerance_low(self):
1306 scenario_helper = ScenarioHelper('name1')
1307 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1308 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1310 self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1311 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1312 self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1313 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1314 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1316 def test_property_tolerance_high_range_swap(self):
1317 scenario_helper = ScenarioHelper('name1')
1318 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1319 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1321 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1323 def test_property_tolerance_low_range_swap(self):
1324 scenario_helper = ScenarioHelper('name1')
1325 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1326 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1328 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1330 def test_property_tolerance_high_not_range(self):
1331 scenario_helper = ScenarioHelper('name1')
1332 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1333 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1335 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1337 def test_property_tolerance_low_not_range(self):
1338 scenario_helper = ScenarioHelper('name1')
1339 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1340 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1342 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1344 def test_property_tolerance_high_default(self):
1345 scenario_helper = ScenarioHelper('name1')
1346 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1347 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1349 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1351 def test_property_tolerance_low_default(self):
1352 scenario_helper = ScenarioHelper('name1')
1353 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1354 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1356 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1358 def test_property_latency(self):
1359 scenario_helper = ScenarioHelper('name1')
1360 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1361 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1363 self.assertIsNone(rfc2544_resource_helper._latency)
1364 self.assertTrue(rfc2544_resource_helper.latency)
1365 self.assertTrue(rfc2544_resource_helper._latency)
1366 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1367 self.assertTrue(rfc2544_resource_helper.latency)
1369 def test_property_latency_default(self):
1370 scenario_helper = ScenarioHelper('name1')
1371 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1372 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1374 self.assertFalse(rfc2544_resource_helper.latency)
1376 def test_property_correlated_traffic(self):
1377 scenario_helper = ScenarioHelper('name1')
1378 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1379 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1381 self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1382 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1383 self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1384 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1385 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1387 def test_property_correlated_traffic_default(self):
1388 scenario_helper = ScenarioHelper('name1')
1389 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1390 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1392 self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1395 class TestSampleVNFDeployHelper(unittest.TestCase):
1397 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1398 @mock.patch('subprocess.check_output')
1399 def test_deploy_vnfs_disabled(self, *_):
1400 vnfd_helper = mock.Mock()
1401 ssh_helper = mock.Mock()
1402 ssh_helper.join_bin_path.return_value = 'joined_path'
1403 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1404 ssh_helper.put.return_value = None
1405 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1407 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1408 sample_vnf_deploy_helper.DISABLE_DEPLOY = True
1409 self.assertEqual(ssh_helper.execute.call_count, 5)
1410 ssh_helper.put.assert_called_once()
1412 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1413 @mock.patch('subprocess.check_output')
1414 def test_deploy_vnfs(self, *args):
1415 vnfd_helper = mock.Mock()
1416 ssh_helper = mock.Mock()
1417 ssh_helper.join_bin_path.return_value = 'joined_path'
1418 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1419 ssh_helper.put.return_value = None
1420 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1421 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1423 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1424 self.assertEqual(ssh_helper.execute.call_count, 5)
1425 ssh_helper.put.assert_called_once()
1427 @mock.patch('subprocess.check_output')
1428 def test_deploy_vnfs_early_success(self, *args):
1429 vnfd_helper = mock.Mock()
1430 ssh_helper = mock.Mock()
1431 ssh_helper.join_bin_path.return_value = 'joined_path'
1432 ssh_helper.execute.return_value = 0, 'output', ''
1433 ssh_helper.put.return_value = None
1434 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1435 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1437 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1438 ssh_helper.execute.assert_called_once()
1439 ssh_helper.put.assert_not_called()
1442 class TestScenarioHelper(unittest.TestCase):
1444 def test_property_task_path(self):
1445 scenario_helper = ScenarioHelper('name1')
1446 scenario_helper.scenario_cfg = {
1447 'task_path': 'my_path',
1450 self.assertEqual(scenario_helper.task_path, 'my_path')
1452 def test_property_nodes(self):
1453 nodes = ['node1', 'node2']
1454 scenario_helper = ScenarioHelper('name1')
1455 scenario_helper.scenario_cfg = {
1459 self.assertEqual(scenario_helper.nodes, nodes)
1461 def test_property_all_options(self):
1468 scenario_helper = ScenarioHelper('name1')
1469 scenario_helper.scenario_cfg = {
1473 self.assertDictEqual(scenario_helper.all_options, data)
1475 def test_property_options(self):
1480 scenario_helper = ScenarioHelper('name1')
1481 scenario_helper.scenario_cfg = {
1487 self.assertDictEqual(scenario_helper.options, data)
1489 def test_property_vnf_cfg(self):
1490 scenario_helper = ScenarioHelper('name1')
1491 scenario_helper.scenario_cfg = {
1494 'vnf_config': 'my_config',
1499 self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1501 def test_property_vnf_cfg_default(self):
1502 scenario_helper = ScenarioHelper('name1')
1503 scenario_helper.scenario_cfg = {
1509 self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1511 def test_property_topology(self):
1512 scenario_helper = ScenarioHelper('name1')
1513 scenario_helper.scenario_cfg = {
1514 'topology': 'my_topology',
1517 self.assertEqual(scenario_helper.topology, 'my_topology')
1520 class TestSampleVnf(unittest.TestCase):
1523 'short-name': 'VpeVnf',
1528 'network': '152.16.100.20',
1529 'netmask': '255.255.255.0',
1530 'gateway': '152.16.100.20',
1534 'network': '152.16.40.20',
1535 'netmask': '255.255.255.0',
1536 'gateway': '152.16.40.20',
1540 'description': 'VPE approximation using DPDK',
1541 'name': 'vpevnf-baremetal',
1544 'network': '0064:ff9b:0:0:0:0:9810:6414',
1546 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1550 'network': '0064:ff9b:0:0:0:0:9810:2814',
1552 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1556 'id': 'vpevnf-baremetal',
1557 'external-interface': [
1559 'virtual-interface': {
1560 'dst_mac': '00:00:00:00:00:03',
1561 'vpci': '0000:05:00.0',
1562 'local_ip': '152.16.100.19',
1563 'type': 'PCI-PASSTHROUGH',
1564 'netmask': '255.255.255.0',
1566 'bandwidth': '10 Gbps',
1567 'dst_ip': '152.16.100.20',
1568 'local_mac': '00:00:00:00:00:01'
1570 'vnfd-connection-point-ref': 'xe0',
1574 'virtual-interface': {
1575 'dst_mac': '00:00:00:00:00:04',
1576 'vpci': '0000:05:00.1',
1577 'local_ip': '152.16.40.19',
1578 'type': 'PCI-PASSTHROUGH',
1579 'netmask': '255.255.255.0',
1581 'bandwidth': '10 Gbps',
1582 'dst_ip': '152.16.40.20',
1583 'local_mac': '00:00:00:00:00:02'
1585 'vnfd-connection-point-ref': 'xe1',
1591 'description': 'Vpe approximation using DPDK',
1593 'vdu-id': 'vpevnf-baremetal',
1606 'connection-point': [
1616 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1620 'vnfd:vnfd-catalog': {
1628 "schema": "isb:traffic_profile:0.1",
1630 "description": "Fixed traffic profile to run UDP traffic",
1631 "traffic_profile": {
1632 "traffic_type": "FixedTraffic",
1633 "frame_rate": 100, # pps
1639 def test___init__(self):
1640 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1642 self.assertEqual(sample_vnf.name, 'vnf1')
1643 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1645 # test the default setup helper is SetupEnvHelper, not subclass
1646 self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1648 # test the default resource helper is ResourceHelper, not subclass
1649 self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1651 def test___init___alt_types(self):
1652 class MySetupEnvHelper(SetupEnvHelper):
1655 class MyResourceHelper(ResourceHelper):
1658 sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1660 self.assertEqual(sample_vnf.name, 'vnf1')
1661 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1663 # test the default setup helper is MySetupEnvHelper, not subclass
1664 self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1666 # test the default resource helper is MyResourceHelper, not subclass
1667 self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1669 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1670 def test__start_vnf(self, *args):
1671 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1672 sample_vnf = SampleVNF('vnf1', vnfd)
1673 sample_vnf._run = mock.Mock()
1675 self.assertIsNone(sample_vnf.queue_wrapper)
1676 self.assertIsNone(sample_vnf._vnf_process)
1677 self.assertIsNone(sample_vnf._start_vnf())
1678 self.assertIsNotNone(sample_vnf.queue_wrapper)
1679 self.assertIsNotNone(sample_vnf._vnf_process)
1681 @mock.patch("yardstick.ssh.SSH")
1682 def test_instantiate(self, ssh):
1690 context1 = mock.Mock()
1691 context1._get_server.return_value = None
1692 context2 = mock.Mock()
1693 context2._get_server.return_value = context2
1696 Context.list.clear()
1697 except AttributeError:
1698 # clear() but works in Py2.7
1699 Context.list[:] = []
1701 Context.list.extend([
1706 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1707 sample_vnf = SampleVNF('vnf1', vnfd)
1708 sample_vnf.APP_NAME = 'sample1'
1709 sample_vnf._start_server = mock.Mock(return_value=0)
1710 sample_vnf._vnf_process = mock.MagicMock()
1711 sample_vnf._vnf_process._is_alive.return_value = 1
1712 sample_vnf.ssh_helper = mock.MagicMock()
1713 sample_vnf.deploy_helper = mock.MagicMock()
1714 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1719 self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1720 self.assertEqual(sample_vnf.nfvi_context, context2)
1722 def test__update_collectd_options(self):
1723 scenario_cfg = {'options':
1727 {'plugin3': {'param': 3}}},
1732 {'plugin3': {'param': 2},
1733 'plugin2': {'param': 2}}}}}}
1734 context_cfg = {'nodes':
1739 {'plugin3': {'param': 1},
1740 'plugin2': {'param': 1},
1741 'plugin1': {'param': 1}}}}}}
1742 expected = {'interval': 1,
1744 {'plugin3': {'param': 1},
1745 'plugin2': {'param': 1},
1746 'plugin1': {'param': 1}}}
1748 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1749 sample_vnf = SampleVNF('vnf__0', vnfd)
1750 sample_vnf._update_collectd_options(scenario_cfg, context_cfg)
1751 self.assertEqual(sample_vnf.setup_helper.collectd_options, expected)
1753 def test__update_options(self):
1754 options1 = {'interval': 1,
1757 {'plugin3': {'param': 3},
1758 'plugin2': {'param': 1},
1759 'plugin1': {'param': 1}}}
1760 options2 = {'interval': 2,
1763 {'plugin4': {'param': 4},
1764 'plugin2': {'param': 2},
1765 'plugin1': {'param': 2}}}
1766 expected = {'interval': 1,
1770 {'plugin4': {'param': 4},
1771 'plugin3': {'param': 3},
1772 'plugin2': {'param': 1},
1773 'plugin1': {'param': 1}}}
1775 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1776 sample_vnf = SampleVNF('vnf1', vnfd)
1777 sample_vnf._update_options(options2, options1)
1778 self.assertEqual(options2, expected)
1780 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1781 @mock.patch("yardstick.ssh.SSH")
1782 def test_wait_for_instantiate_empty_queue(self, ssh, *args):
1783 mock_ssh(ssh, exec_result=(1, "", ""))
1797 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1798 sample_vnf = SampleVNF('vnf1', vnfd)
1799 sample_vnf.APP_NAME = 'sample1'
1800 sample_vnf.WAIT_TIME_FOR_SCRIPT = 0
1801 sample_vnf._start_server = mock.Mock(return_value=0)
1802 sample_vnf._vnf_process = mock.MagicMock()
1803 sample_vnf._vnf_process.exitcode = 0
1804 sample_vnf._vnf_process._is_alive.return_value = 1
1805 sample_vnf.queue_wrapper = mock.Mock()
1806 sample_vnf.q_out = mock.Mock()
1807 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1808 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1809 sample_vnf.ssh_helper = mock.MagicMock()
1810 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1811 sample_vnf.resource_helper.start_collect = mock.MagicMock()
1813 self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1815 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1816 def test_vnf_execute_with_queue_data(self, *args):
1828 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1829 sample_vnf = SampleVNF('vnf1', vnfd)
1830 sample_vnf.APP_NAME = 'sample1'
1831 sample_vnf.q_out = mock.Mock()
1832 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1833 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1835 self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1837 def test_terminate_without_vnf_process(self):
1838 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1839 sample_vnf = SampleVNF('vnf1', vnfd)
1840 sample_vnf.APP_NAME = 'sample1'
1841 sample_vnf.vnf_execute = mock.Mock()
1842 sample_vnf.ssh_helper = mock.Mock()
1843 sample_vnf._tear_down = mock.Mock()
1844 sample_vnf.resource_helper = mock.Mock()
1846 self.assertIsNone(sample_vnf.terminate())
1848 def test_get_stats(self):
1849 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1850 sample_vnf = SampleVNF('vnf1', vnfd)
1851 sample_vnf.APP_NAME = 'sample1'
1852 sample_vnf.APP_WORD = 'sample1'
1853 sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1855 self.assertEqual(sample_vnf.get_stats(), 'the stats')
1857 def test_collect_kpi(self):
1858 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1859 sample_vnf = SampleVNF('vnf1', vnfd)
1860 sample_vnf.APP_NAME = 'sample1'
1861 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1862 sample_vnf.COLLECT_MAP = {
1867 sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
1868 sample_vnf.resource_helper = mock.Mock()
1869 sample_vnf.resource_helper.collect_kpi.return_value = {}
1875 'collect_stats': {},
1877 result = sample_vnf.collect_kpi()
1878 self.assertDictEqual(result, expected)
1880 def test_collect_kpi_default(self):
1881 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1882 sample_vnf = SampleVNF('vnf1', vnfd)
1883 sample_vnf.APP_NAME = 'sample1'
1884 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1885 sample_vnf.get_stats = mock.Mock(return_value='')
1890 'packets_dropped': 0,
1892 result = sample_vnf.collect_kpi()
1893 self.assertDictEqual(result, expected)
1895 def test_scale(self):
1896 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1897 sample_vnf = SampleVNF('vnf1', vnfd)
1898 self.assertRaises(y_exceptions.FunctionNotImplemented,
1901 def test__run(self):
1902 test_cmd = 'test cmd'
1903 run_kwargs = {'arg1': 'val1', 'arg2': 'val2'}
1904 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1905 sample_vnf = SampleVNF('vnf1', vnfd)
1906 sample_vnf.ssh_helper = mock.Mock()
1907 sample_vnf.setup_helper = mock.Mock()
1908 with mock.patch.object(sample_vnf, '_build_config',
1909 return_value=test_cmd), \
1910 mock.patch.object(sample_vnf, '_build_run_kwargs'):
1911 sample_vnf.run_kwargs = run_kwargs
1913 sample_vnf.ssh_helper.drop_connection.assert_called_once()
1914 sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd,
1916 sample_vnf.setup_helper.kill_vnf.assert_called_once()
1919 class TestSampleVNFTrafficGen(unittest.TestCase):
1922 'short-name': 'VpeVnf',
1927 'network': '152.16.100.20',
1928 'netmask': '255.255.255.0',
1929 'gateway': '152.16.100.20',
1933 'network': '152.16.40.20',
1934 'netmask': '255.255.255.0',
1935 'gateway': '152.16.40.20',
1939 'description': 'VPE approximation using DPDK',
1940 'name': 'vpevnf-baremetal',
1943 'network': '0064:ff9b:0:0:0:0:9810:6414',
1945 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1949 'network': '0064:ff9b:0:0:0:0:9810:2814',
1951 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1955 'id': 'vpevnf-baremetal',
1956 'external-interface': [
1958 'virtual-interface': {
1959 'dst_mac': '00:00:00:00:00:03',
1960 'vpci': '0000:05:00.0',
1962 'local_ip': '152.16.100.19',
1963 'type': 'PCI-PASSTHROUGH',
1964 'netmask': '255.255.255.0',
1966 'bandwidth': '10 Gbps',
1967 'dst_ip': '152.16.100.20',
1968 'local_mac': '00:00:00:00:00:01'
1970 'vnfd-connection-point-ref': 'xe0',
1974 'virtual-interface': {
1975 'dst_mac': '00:00:00:00:00:04',
1976 'vpci': '0000:05:00.1',
1978 'local_ip': '152.16.40.19',
1979 'type': 'PCI-PASSTHROUGH',
1980 'netmask': '255.255.255.0',
1982 'bandwidth': '10 Gbps',
1983 'dst_ip': '152.16.40.20',
1984 'local_mac': '00:00:00:00:00:02'
1986 'vnfd-connection-point-ref': 'xe1',
1992 'description': 'Vpe approximation using DPDK',
1994 'vdu-id': 'vpevnf-baremetal',
2007 'connection-point': [
2017 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
2021 'vnfd:vnfd-catalog': {
2029 "schema": "isb:traffic_profile:0.1",
2031 "description": "Fixed traffic profile to run UDP traffic",
2032 "traffic_profile": {
2033 "traffic_type": "FixedTraffic",
2034 "frame_rate": 100, # pps
2040 def test__check_status(self):
2041 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2043 with self.assertRaises(NotImplementedError):
2044 sample_vnf_tg._check_status()
2046 def test_listen_traffic(self):
2047 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2049 sample_vnf_tg.listen_traffic(mock.Mock())
2051 def test_verify_traffic(self):
2052 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2054 sample_vnf_tg.verify_traffic(mock.Mock())
2056 def test_terminate(self):
2057 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2058 sample_vnf_tg._traffic_process = mock.Mock()
2059 sample_vnf_tg._tg_process = mock.Mock()
2061 sample_vnf_tg.terminate()
2063 def test__wait_for_process(self):
2064 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2065 with mock.patch.object(sample_vnf_tg, '_check_status',
2066 return_value=0) as mock_status, \
2067 mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2068 mock_proc.is_alive.return_value = True
2069 mock_proc.exitcode = 234
2070 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2071 mock_proc.is_alive.assert_called_once()
2072 mock_status.assert_called_once()
2074 def test__wait_for_process_not_alive(self):
2075 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2076 with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2077 mock_proc.is_alive.return_value = False
2078 self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process)
2079 mock_proc.is_alive.assert_called_once()
2081 def test__wait_for_process_delayed(self):
2082 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2083 with mock.patch.object(sample_vnf_tg, '_check_status',
2084 side_effect=[1, 0]) as mock_status, \
2085 mock.patch.object(sample_vnf_tg,
2086 '_tg_process') as mock_proc:
2087 mock_proc.is_alive.return_value = True
2088 mock_proc.exitcode = 234
2089 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2090 mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()])
2091 mock_status.assert_has_calls([mock.call(), mock.call()])
2093 def test_scale(self):
2094 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2095 self.assertRaises(y_exceptions.FunctionNotImplemented,
2096 sample_vnf_tg.scale)