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 tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
23 from tests.unit 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 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
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 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
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 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
238 self.assertEqual(mock_provision_tool.call_count, 1)
240 ssh_helper.provision_tool(tool_file='my_tool.sh')
241 self.assertTrue(ssh_helper.is_connected)
242 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
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 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
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(self, mock_meminfo, *args):
537 ssh_helper = mock.Mock()
538 dpdk_setup_helper = DpdkVnfSetupEnvHelper(
539 mock.ANY, ssh_helper, mock.ANY)
540 with mock.patch.object(sample_vnf.LOG, 'info') as mock_info:
541 dpdk_setup_helper._setup_hugepages()
542 mock_info.assert_called_once_with(
543 'Hugepages size (kB): %s, number claimed: %s, number set: '
544 '%s', 2048, 8192, 100)
545 mock_meminfo.assert_called_once_with(ssh_helper)
547 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open')
548 @mock.patch.object(utils, 'find_relative_file')
549 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
550 @mock.patch.object(utils, 'open_relative_file')
551 def test_build_config(self, mock_open_rf, mock_multi_port_config_class, mock_find, *args):
552 mock_multi_port_config = mock_multi_port_config_class()
553 vnfd_helper = VnfdHelper(self.VNFD_0)
554 ssh_helper = mock.Mock()
555 scenario_helper = mock.Mock()
556 scenario_helper.vnf_cfg = {}
557 scenario_helper.all_options = {}
558 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
560 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
561 result = dpdk_setup_helper.build_config()
562 self.assertEqual(result, expected)
563 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
564 self.assertGreaterEqual(mock_find.call_count, 1)
565 self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
566 self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
568 scenario_helper.vnf_cfg = {'file': 'fake_file'}
569 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
570 mock_open_rf.side_effect = mock.mock_open(read_data='fake_data')
571 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
573 result = dpdk_setup_helper.build_config()
575 mock_open_rf.assert_called_once()
576 self.assertEqual(result, expected)
577 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
578 self.assertGreaterEqual(mock_find.call_count, 1)
579 self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
580 self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
582 def test__build_pipeline_kwargs(self):
583 vnfd_helper = VnfdHelper(self.VNFD_0)
584 ssh_helper = mock.Mock()
585 ssh_helper.provision_tool.return_value = 'tool_path'
586 scenario_helper = mock.Mock()
587 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
588 dpdk_setup_helper.CFG_CONFIG = 'config'
589 dpdk_setup_helper.CFG_SCRIPT = 'script'
590 dpdk_setup_helper.pipeline_kwargs = {}
591 dpdk_setup_helper.all_ports = [0, 1, 2]
594 'cfg_file': 'config',
596 'port_mask_hex': '0x3',
597 'tool_path': 'tool_path',
599 dpdk_setup_helper._build_pipeline_kwargs()
600 self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected)
602 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
603 @mock.patch('yardstick.ssh.SSH')
604 def test_setup_vnf_environment(self, *args):
606 if cmd.startswith('which '):
610 exec_success = (0, 'good output', '')
611 exec_failure = (1, 'bad output', 'error output')
613 vnfd_helper = VnfdHelper(self.VNFD_0)
614 ssh_helper = mock.Mock()
615 ssh_helper.execute = execute
617 scenario_helper = mock.Mock()
618 scenario_helper.nodes = [None, None]
619 dpdk_vnf_setup_env_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
620 dpdk_vnf_setup_env_helper._validate_cpu_cfg = mock.Mock(return_value=[])
622 with mock.patch.object(dpdk_vnf_setup_env_helper, '_setup_dpdk'):
623 self.assertIsInstance(
624 dpdk_vnf_setup_env_helper.setup_vnf_environment(),
627 def test__setup_dpdk(self):
628 ssh_helper = mock.Mock()
629 ssh_helper.execute = mock.Mock()
630 ssh_helper.execute.return_value = (0, 0, 0)
631 dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
632 with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
634 dpdk_setup_helper._setup_dpdk()
635 mock_setup_hp.assert_called_once()
636 ssh_helper.execute.assert_has_calls([
637 mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
638 mock.call('lsmod | grep -i igb_uio')
641 @mock.patch('yardstick.ssh.SSH')
642 def test__setup_resources(self, _):
643 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
644 ssh_helper = mock.Mock()
645 scenario_helper = mock.Mock()
646 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
647 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
649 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
650 vnfd_helper.interfaces]
651 result = dpdk_setup_helper._setup_resources()
652 self.assertIsInstance(result, ResourceProfile)
653 self.assertEqual(dpdk_setup_helper.socket, 0)
655 @mock.patch('yardstick.ssh.SSH')
656 def test__setup_resources_socket_1(self, _):
657 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
658 vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0'
659 vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0'
660 ssh_helper = mock.Mock()
661 scenario_helper = mock.Mock()
662 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
663 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
665 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
666 vnfd_helper.interfaces]
667 result = dpdk_setup_helper._setup_resources()
668 self.assertIsInstance(result, ResourceProfile)
669 self.assertEqual(dpdk_setup_helper.socket, 1)
671 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
672 def test__detect_and_bind_drivers(self, *args):
673 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
674 ssh_helper = mock.Mock()
675 # ssh_helper.execute = mock.Mock(return_value = (0, 'text', ''))
676 # ssh_helper.execute.return_value = 0, 'output', ''
677 scenario_helper = mock.Mock()
678 scenario_helper.nodes = [None, None]
679 rv = ['0000:05:00.1', '0000:05:00.0']
681 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
682 dpdk_setup_helper.dpdk_bind_helper._get_bound_pci_addresses = mock.Mock(return_value=rv)
683 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
684 dpdk_setup_helper.dpdk_bind_helper.read_status = mock.Mock()
686 self.assertIsNone(dpdk_setup_helper._detect_and_bind_drivers())
688 intf_0 = vnfd_helper.vdu[0]['external-interface'][0]['virtual-interface']
689 intf_1 = vnfd_helper.vdu[0]['external-interface'][1]['virtual-interface']
690 self.assertEqual(0, intf_0['dpdk_port_num'])
691 self.assertEqual(1, intf_1['dpdk_port_num'])
693 def test_tear_down(self):
694 vnfd_helper = VnfdHelper(self.VNFD_0)
695 ssh_helper = mock.Mock()
696 scenario_helper = mock.Mock()
697 scenario_helper.nodes = [None, None]
698 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
699 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
700 dpdk_setup_helper.dpdk_bind_helper.used_drivers = {
701 'd1': ['0000:05:00.0'],
702 'd3': ['0000:05:01.0'],
705 self.assertIsNone(dpdk_setup_helper.tear_down())
706 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True)
707 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0'], 'd3', True)
710 class TestResourceHelper(unittest.TestCase):
713 'short-name': 'VpeVnf',
718 'network': '152.16.100.20',
719 'netmask': '255.255.255.0',
720 'gateway': '152.16.100.20',
724 'network': '152.16.40.20',
725 'netmask': '255.255.255.0',
726 'gateway': '152.16.40.20',
730 'description': 'VPE approximation using DPDK',
731 'name': 'vpevnf-baremetal',
734 'network': '0064:ff9b:0:0:0:0:9810:6414',
736 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
740 'network': '0064:ff9b:0:0:0:0:9810:2814',
742 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
746 'id': 'vpevnf-baremetal',
747 'external-interface': [
749 'virtual-interface': {
750 'dst_mac': '00:00:00:00:00:03',
751 'vpci': '0000:05:00.0',
753 'local_ip': '152.16.100.19',
754 'type': 'PCI-PASSTHROUGH',
755 'netmask': '255.255.255.0',
757 'bandwidth': '10 Gbps',
758 'dst_ip': '152.16.100.20',
759 'local_mac': '00:00:00:00:00:01'
761 'vnfd-connection-point-ref': 'xe0',
765 'virtual-interface': {
766 'dst_mac': '00:00:00:00:00:04',
767 'vpci': '0000:05:00.1',
769 'local_ip': '152.16.40.19',
770 'type': 'PCI-PASSTHROUGH',
771 'netmask': '255.255.255.0',
773 'bandwidth': '10 Gbps',
774 'dst_ip': '152.16.40.20',
775 'local_mac': '00:00:00:00:00:02'
777 'vnfd-connection-point-ref': 'xe1',
783 'description': 'Vpe approximation using DPDK',
785 'vdu-id': 'vpevnf-baremetal',
798 'connection-point': [
808 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
811 def test_setup(self):
813 vnfd_helper = VnfdHelper(self.VNFD_0)
814 ssh_helper = mock.Mock()
815 scenario_helper = mock.Mock()
816 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
817 dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
818 resource_helper = ResourceHelper(dpdk_setup_helper)
820 self.assertIsNone(resource_helper.setup())
821 self.assertIs(resource_helper.resource, resource)
823 def test_generate_cfg(self):
824 vnfd_helper = VnfdHelper(self.VNFD_0)
825 ssh_helper = mock.Mock()
826 scenario_helper = mock.Mock()
827 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
828 resource_helper = ResourceHelper(dpdk_setup_helper)
830 self.assertIsNone(resource_helper.generate_cfg())
832 def test_stop_collect(self):
833 vnfd_helper = VnfdHelper(self.VNFD_0)
834 ssh_helper = mock.Mock()
835 scenario_helper = mock.Mock()
836 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
837 resource_helper = ResourceHelper(dpdk_setup_helper)
838 resource_helper.resource = mock.Mock()
840 self.assertIsNone(resource_helper.stop_collect())
842 def test_stop_collect_none(self):
843 vnfd_helper = VnfdHelper(self.VNFD_0)
844 ssh_helper = mock.Mock()
845 scenario_helper = mock.Mock()
846 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
847 resource_helper = ResourceHelper(dpdk_setup_helper)
848 resource_helper.resource = None
850 self.assertIsNone(resource_helper.stop_collect())
853 class TestClientResourceHelper(unittest.TestCase):
856 'short-name': 'VpeVnf',
861 'network': '152.16.100.20',
862 'netmask': '255.255.255.0',
863 'gateway': '152.16.100.20',
867 'network': '152.16.40.20',
868 'netmask': '255.255.255.0',
869 'gateway': '152.16.40.20',
873 'description': 'VPE approximation using DPDK',
874 'name': 'vpevnf-baremetal',
877 'network': '0064:ff9b:0:0:0:0:9810:6414',
879 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
883 'network': '0064:ff9b:0:0:0:0:9810:2814',
885 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
889 'id': 'vpevnf-baremetal',
890 'external-interface': [
892 'virtual-interface': {
893 'dst_mac': '00:00:00:00:00:03',
894 'vpci': '0000:05:00.0',
896 'local_ip': '152.16.100.19',
897 'type': 'PCI-PASSTHROUGH',
898 'netmask': '255.255.255.0',
900 'bandwidth': '10 Gbps',
901 'dst_ip': '152.16.100.20',
902 'local_mac': '00:00:00:00:00:01',
903 'vld_id': 'uplink_0',
906 'vnfd-connection-point-ref': 'xe0',
910 'virtual-interface': {
911 'dst_mac': '00:00:00:00:00:04',
912 'vpci': '0000:05:00.1',
914 'local_ip': '152.16.40.19',
915 'type': 'PCI-PASSTHROUGH',
916 'netmask': '255.255.255.0',
918 'bandwidth': '10 Gbps',
919 'dst_ip': '152.16.40.20',
920 'local_mac': '00:00:00:00:00:02',
921 'vld_id': 'downlink_0',
924 'vnfd-connection-point-ref': 'xe1',
928 'virtual-interface': {
929 'dst_mac': '00:00:00:00:00:13',
930 'vpci': '0000:05:00.2',
932 'local_ip': '152.16.40.19',
933 'type': 'PCI-PASSTHROUGH',
934 'netmask': '255.255.255.0',
936 'bandwidth': '10 Gbps',
937 'dst_ip': '152.16.40.30',
938 'local_mac': '00:00:00:00:00:11'
940 'vnfd-connection-point-ref': 'xe2',
946 'description': 'Vpe approximation using DPDK',
948 'vdu-id': 'vpevnf-baremetal',
961 'connection-point': [
971 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
975 'vnfd:vnfd-catalog': {
982 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
983 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
984 new_callable=lambda: MockError)
985 def test_get_stats_not_connected(self, mock_state_error, *args):
986 vnfd_helper = VnfdHelper(self.VNFD_0)
987 ssh_helper = mock.Mock()
988 scenario_helper = mock.Mock()
989 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
990 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
991 client_resource_helper.client = mock.MagicMock()
992 client_resource_helper.client.get_stats.side_effect = mock_state_error
994 self.assertEqual(client_resource_helper.get_stats(), {})
995 self.assertEqual(client_resource_helper.client.get_stats.call_count, 1)
997 def test_generate_samples(self):
998 vnfd_helper = VnfdHelper(self.VNFD_0)
999 ssh_helper = mock.Mock()
1000 scenario_helper = mock.Mock()
1001 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1002 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1003 client_resource_helper.client = mock.MagicMock()
1004 client_resource_helper.client.get_stats.return_value = {
1022 "rx_throughput_fps": 5.5,
1023 "tx_throughput_fps": 4.9,
1024 "rx_throughput_mbps": 234.78,
1025 "tx_throughput_mbps": 243.11,
1026 "in_packets": 34251,
1027 "out_packets": 52342,
1030 "rx_throughput_fps": 0.0,
1031 "tx_throughput_fps": 5.9,
1032 "rx_throughput_mbps": 434.78,
1033 "tx_throughput_mbps": 0.0,
1035 "out_packets": 48791,
1038 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1039 result = client_resource_helper.generate_samples(ports)
1040 self.assertDictEqual(result, expected)
1042 def test_generate_samples_with_key(self):
1043 vnfd_helper = VnfdHelper(self.VNFD_0)
1044 ssh_helper = mock.Mock()
1045 scenario_helper = mock.Mock()
1046 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1047 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1048 client_resource_helper.client = mock.MagicMock()
1049 client_resource_helper.client.get_stats.return_value = {
1050 'key_name': 'key_value',
1068 'key_name': 'key_value',
1069 "rx_throughput_fps": 5.5,
1070 "tx_throughput_fps": 4.9,
1071 "rx_throughput_mbps": 234.78,
1072 "tx_throughput_mbps": 243.11,
1073 "in_packets": 34251,
1074 "out_packets": 52342,
1077 'key_name': 'key_value',
1078 "rx_throughput_fps": 0.0,
1079 "tx_throughput_fps": 5.9,
1080 "rx_throughput_mbps": 434.78,
1081 "tx_throughput_mbps": 0.0,
1083 "out_packets": 48791,
1086 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1087 result = client_resource_helper.generate_samples(ports, 'key_name')
1088 self.assertDictEqual(result, expected)
1090 def test_generate_samples_with_key_and_default(self):
1091 vnfd_helper = VnfdHelper(self.VNFD_0)
1092 ssh_helper = mock.Mock()
1093 scenario_helper = mock.Mock()
1094 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1095 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1096 client_resource_helper.client = mock.MagicMock()
1097 client_resource_helper.client.get_stats.return_value = {
1115 'key_name': 'default',
1116 "rx_throughput_fps": 5.5,
1117 "tx_throughput_fps": 4.9,
1118 "rx_throughput_mbps": 234.78,
1119 "tx_throughput_mbps": 243.11,
1120 "in_packets": 34251,
1121 "out_packets": 52342,
1124 'key_name': 'default',
1125 "rx_throughput_fps": 0.0,
1126 "tx_throughput_fps": 5.9,
1127 "rx_throughput_mbps": 434.78,
1128 "tx_throughput_mbps": 0.0,
1130 "out_packets": 48791,
1133 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1134 result = client_resource_helper.generate_samples(ports, 'key_name', 'default')
1135 self.assertDictEqual(result, expected)
1137 def test_clear_stats(self):
1138 vnfd_helper = VnfdHelper(self.VNFD_0)
1139 ssh_helper = mock.Mock()
1140 scenario_helper = mock.Mock()
1141 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1142 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1143 client_resource_helper.client = mock.Mock()
1145 self.assertIsNone(client_resource_helper.clear_stats())
1146 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1148 def test_clear_stats_of_ports(self):
1149 vnfd_helper = VnfdHelper(self.VNFD_0)
1150 ssh_helper = mock.Mock()
1151 scenario_helper = mock.Mock()
1152 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1153 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1154 client_resource_helper.client = mock.Mock()
1156 self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
1157 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1159 def test_start(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.Mock()
1167 self.assertIsNone(client_resource_helper.start())
1168 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1170 def test_start_ports(self):
1171 vnfd_helper = VnfdHelper(self.VNFD_0)
1172 ssh_helper = mock.Mock()
1173 scenario_helper = mock.Mock()
1174 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1175 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1176 client_resource_helper.client = mock.Mock()
1178 self.assertIsNone(client_resource_helper.start([3, 4]))
1179 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1181 def test_collect_kpi_with_queue(self):
1182 vnfd_helper = VnfdHelper(self.VNFD_0)
1183 ssh_helper = mock.Mock()
1184 scenario_helper = mock.Mock()
1185 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1186 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1187 client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1188 client_resource_helper._queue = mock.Mock()
1189 client_resource_helper._queue.empty.return_value = False
1190 client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1197 result = client_resource_helper.collect_kpi()
1198 self.assertDictEqual(result, expected)
1200 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1201 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1202 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1203 new_callable=lambda: MockError)
1204 def test__connect_with_failures(self, mock_error, *args):
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 = mock.MagicMock()
1211 client.connect.side_effect = mock_error
1213 self.assertIs(client_resource_helper._connect(client), client)
1216 class TestRfc2544ResourceHelper(unittest.TestCase):
1220 'correlated_traffic': True,
1221 'allowed_drop_rate': '0.1 - 0.15',
1225 'allowed_drop_rate': ' 0.25 - 0.05 ',
1229 'allowed_drop_rate': '0.2',
1238 'rfc2544': RFC2544_CFG_1,
1244 'rfc2544': RFC2544_CFG_2,
1250 'rfc2544': RFC2544_CFG_3,
1256 'rfc2544': RFC2544_CFG_4,
1260 def test_property_rfc2544(self):
1261 scenario_helper = ScenarioHelper('name1')
1262 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1263 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1265 self.assertIsNone(rfc2544_resource_helper._rfc2544)
1266 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1267 self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1268 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1269 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1271 def test_property_tolerance_high(self):
1272 scenario_helper = ScenarioHelper('name1')
1273 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1274 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1276 self.assertIsNone(rfc2544_resource_helper._tolerance_high)
1277 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1278 self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1279 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1280 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1282 def test_property_tolerance_low(self):
1283 scenario_helper = ScenarioHelper('name1')
1284 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1285 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1287 self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1288 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1289 self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1290 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1291 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1293 def test_property_tolerance_high_range_swap(self):
1294 scenario_helper = ScenarioHelper('name1')
1295 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1296 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1298 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1300 def test_property_tolerance_low_range_swap(self):
1301 scenario_helper = ScenarioHelper('name1')
1302 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1303 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1305 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1307 def test_property_tolerance_high_not_range(self):
1308 scenario_helper = ScenarioHelper('name1')
1309 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1310 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1312 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1314 def test_property_tolerance_low_not_range(self):
1315 scenario_helper = ScenarioHelper('name1')
1316 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1317 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1319 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1321 def test_property_tolerance_high_default(self):
1322 scenario_helper = ScenarioHelper('name1')
1323 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1324 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1326 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1328 def test_property_tolerance_low_default(self):
1329 scenario_helper = ScenarioHelper('name1')
1330 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1331 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1333 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1335 def test_property_latency(self):
1336 scenario_helper = ScenarioHelper('name1')
1337 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1338 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1340 self.assertIsNone(rfc2544_resource_helper._latency)
1341 self.assertTrue(rfc2544_resource_helper.latency)
1342 self.assertTrue(rfc2544_resource_helper._latency)
1343 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1344 self.assertTrue(rfc2544_resource_helper.latency)
1346 def test_property_latency_default(self):
1347 scenario_helper = ScenarioHelper('name1')
1348 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1349 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1351 self.assertFalse(rfc2544_resource_helper.latency)
1353 def test_property_correlated_traffic(self):
1354 scenario_helper = ScenarioHelper('name1')
1355 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1356 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1358 self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1359 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1360 self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1361 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1362 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1364 def test_property_correlated_traffic_default(self):
1365 scenario_helper = ScenarioHelper('name1')
1366 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1367 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1369 self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1372 class TestSampleVNFDeployHelper(unittest.TestCase):
1374 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1375 @mock.patch('subprocess.check_output')
1376 def test_deploy_vnfs_disabled(self, *_):
1377 vnfd_helper = mock.Mock()
1378 ssh_helper = mock.Mock()
1379 ssh_helper.join_bin_path.return_value = 'joined_path'
1380 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1381 ssh_helper.put.return_value = None
1382 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1384 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1385 sample_vnf_deploy_helper.DISABLE_DEPLOY = True
1386 self.assertEqual(ssh_helper.execute.call_count, 5)
1387 self.assertEqual(ssh_helper.put.call_count, 1)
1389 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1390 @mock.patch('subprocess.check_output')
1391 def test_deploy_vnfs(self, *args):
1392 vnfd_helper = mock.Mock()
1393 ssh_helper = mock.Mock()
1394 ssh_helper.join_bin_path.return_value = 'joined_path'
1395 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1396 ssh_helper.put.return_value = None
1397 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1398 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1400 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1401 self.assertEqual(ssh_helper.execute.call_count, 5)
1402 self.assertEqual(ssh_helper.put.call_count, 1)
1404 @mock.patch('subprocess.check_output')
1405 def test_deploy_vnfs_early_success(self, *args):
1406 vnfd_helper = mock.Mock()
1407 ssh_helper = mock.Mock()
1408 ssh_helper.join_bin_path.return_value = 'joined_path'
1409 ssh_helper.execute.return_value = 0, 'output', ''
1410 ssh_helper.put.return_value = None
1411 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1412 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1414 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1415 self.assertEqual(ssh_helper.execute.call_count, 1)
1416 self.assertEqual(ssh_helper.put.call_count, 0)
1419 class TestScenarioHelper(unittest.TestCase):
1421 def test_property_task_path(self):
1422 scenario_helper = ScenarioHelper('name1')
1423 scenario_helper.scenario_cfg = {
1424 'task_path': 'my_path',
1427 self.assertEqual(scenario_helper.task_path, 'my_path')
1429 def test_property_nodes(self):
1430 nodes = ['node1', 'node2']
1431 scenario_helper = ScenarioHelper('name1')
1432 scenario_helper.scenario_cfg = {
1436 self.assertEqual(scenario_helper.nodes, nodes)
1438 def test_property_all_options(self):
1445 scenario_helper = ScenarioHelper('name1')
1446 scenario_helper.scenario_cfg = {
1450 self.assertDictEqual(scenario_helper.all_options, data)
1452 def test_property_options(self):
1457 scenario_helper = ScenarioHelper('name1')
1458 scenario_helper.scenario_cfg = {
1464 self.assertDictEqual(scenario_helper.options, data)
1466 def test_property_vnf_cfg(self):
1467 scenario_helper = ScenarioHelper('name1')
1468 scenario_helper.scenario_cfg = {
1471 'vnf_config': 'my_config',
1476 self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1478 def test_property_vnf_cfg_default(self):
1479 scenario_helper = ScenarioHelper('name1')
1480 scenario_helper.scenario_cfg = {
1486 self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1488 def test_property_topology(self):
1489 scenario_helper = ScenarioHelper('name1')
1490 scenario_helper.scenario_cfg = {
1491 'topology': 'my_topology',
1494 self.assertEqual(scenario_helper.topology, 'my_topology')
1497 class TestSampleVnf(unittest.TestCase):
1500 'short-name': 'VpeVnf',
1505 'network': '152.16.100.20',
1506 'netmask': '255.255.255.0',
1507 'gateway': '152.16.100.20',
1511 'network': '152.16.40.20',
1512 'netmask': '255.255.255.0',
1513 'gateway': '152.16.40.20',
1517 'description': 'VPE approximation using DPDK',
1518 'name': 'vpevnf-baremetal',
1521 'network': '0064:ff9b:0:0:0:0:9810:6414',
1523 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1527 'network': '0064:ff9b:0:0:0:0:9810:2814',
1529 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1533 'id': 'vpevnf-baremetal',
1534 'external-interface': [
1536 'virtual-interface': {
1537 'dst_mac': '00:00:00:00:00:03',
1538 'vpci': '0000:05:00.0',
1539 'local_ip': '152.16.100.19',
1540 'type': 'PCI-PASSTHROUGH',
1541 'netmask': '255.255.255.0',
1543 'bandwidth': '10 Gbps',
1544 'dst_ip': '152.16.100.20',
1545 'local_mac': '00:00:00:00:00:01'
1547 'vnfd-connection-point-ref': 'xe0',
1551 'virtual-interface': {
1552 'dst_mac': '00:00:00:00:00:04',
1553 'vpci': '0000:05:00.1',
1554 'local_ip': '152.16.40.19',
1555 'type': 'PCI-PASSTHROUGH',
1556 'netmask': '255.255.255.0',
1558 'bandwidth': '10 Gbps',
1559 'dst_ip': '152.16.40.20',
1560 'local_mac': '00:00:00:00:00:02'
1562 'vnfd-connection-point-ref': 'xe1',
1568 'description': 'Vpe approximation using DPDK',
1570 'vdu-id': 'vpevnf-baremetal',
1583 'connection-point': [
1593 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1597 'vnfd:vnfd-catalog': {
1605 "schema": "isb:traffic_profile:0.1",
1607 "description": "Fixed traffic profile to run UDP traffic",
1608 "traffic_profile": {
1609 "traffic_type": "FixedTraffic",
1610 "frame_rate": 100, # pps
1616 def test___init__(self):
1617 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1619 self.assertEqual(sample_vnf.name, 'vnf1')
1620 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1622 # test the default setup helper is SetupEnvHelper, not subclass
1623 self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1625 # test the default resource helper is ResourceHelper, not subclass
1626 self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1628 def test___init___alt_types(self):
1629 class MySetupEnvHelper(SetupEnvHelper):
1632 class MyResourceHelper(ResourceHelper):
1635 sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1637 self.assertEqual(sample_vnf.name, 'vnf1')
1638 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1640 # test the default setup helper is MySetupEnvHelper, not subclass
1641 self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1643 # test the default resource helper is MyResourceHelper, not subclass
1644 self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1646 def test__get_port0localip6(self):
1647 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1648 expected = '0064:ff9b:0:0:0:0:9810:6414'
1649 result = sample_vnf._get_port0localip6()
1650 self.assertEqual(result, expected)
1652 def test__get_port1localip6(self):
1653 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1654 expected = '0064:ff9b:0:0:0:0:9810:2814'
1655 result = sample_vnf._get_port1localip6()
1656 self.assertEqual(result, expected)
1658 def test__get_port0prefixip6(self):
1659 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1661 result = sample_vnf._get_port0prefixlen6()
1662 self.assertEqual(result, expected)
1664 def test__get_port1prefixip6(self):
1665 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1667 result = sample_vnf._get_port1prefixlen6()
1668 self.assertEqual(result, expected)
1670 def test__get_port0gateway6(self):
1671 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1672 expected = '0064:ff9b:0:0:0:0:9810:6414'
1673 result = sample_vnf._get_port0gateway6()
1674 self.assertEqual(result, expected)
1676 def test__get_port1gateway6(self):
1677 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1678 expected = '0064:ff9b:0:0:0:0:9810:2814'
1679 result = sample_vnf._get_port1gateway6()
1680 self.assertEqual(result, expected)
1682 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1683 def test__start_vnf(self, *args):
1684 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1685 sample_vnf = SampleVNF('vnf1', vnfd)
1686 sample_vnf._run = mock.Mock()
1688 self.assertIsNone(sample_vnf.queue_wrapper)
1689 self.assertIsNone(sample_vnf._vnf_process)
1690 self.assertIsNone(sample_vnf._start_vnf())
1691 self.assertIsNotNone(sample_vnf.queue_wrapper)
1692 self.assertIsNotNone(sample_vnf._vnf_process)
1694 @mock.patch("yardstick.ssh.SSH")
1695 def test_instantiate(self, ssh):
1703 context1 = mock.Mock()
1704 context1._get_server.return_value = None
1705 context2 = mock.Mock()
1706 context2._get_server.return_value = context2
1709 Context.list.clear()
1710 except AttributeError:
1711 # clear() but works in Py2.7
1712 Context.list[:] = []
1714 Context.list.extend([
1719 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1720 sample_vnf = SampleVNF('vnf1', vnfd)
1721 sample_vnf.APP_NAME = 'sample1'
1722 sample_vnf._start_server = mock.Mock(return_value=0)
1723 sample_vnf._vnf_process = mock.MagicMock()
1724 sample_vnf._vnf_process._is_alive.return_value = 1
1725 sample_vnf.ssh_helper = mock.MagicMock()
1726 sample_vnf.deploy_helper = mock.MagicMock()
1727 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1732 self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1733 self.assertEqual(sample_vnf.nfvi_context, context2)
1735 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1736 @mock.patch("yardstick.ssh.SSH")
1737 def test_wait_for_instantiate_empty_queue(self, ssh, *args):
1738 mock_ssh(ssh, exec_result=(1, "", ""))
1752 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1753 sample_vnf = SampleVNF('vnf1', vnfd)
1754 sample_vnf.APP_NAME = 'sample1'
1755 sample_vnf.WAIT_TIME_FOR_SCRIPT = 0
1756 sample_vnf._start_server = mock.Mock(return_value=0)
1757 sample_vnf._vnf_process = mock.MagicMock()
1758 sample_vnf._vnf_process.exitcode = 0
1759 sample_vnf._vnf_process._is_alive.return_value = 1
1760 sample_vnf.queue_wrapper = mock.Mock()
1761 sample_vnf.q_out = mock.Mock()
1762 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1763 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1764 sample_vnf.ssh_helper = mock.MagicMock()
1765 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1766 sample_vnf.resource_helper.start_collect = mock.MagicMock()
1768 self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1770 def test__build_ports(self):
1771 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1772 sample_vnf = SampleVNF('vnf1', vnfd)
1774 self.assertIsNone(sample_vnf._build_ports())
1775 self.assertIsNotNone(sample_vnf.networks)
1776 self.assertIsNotNone(sample_vnf.uplink_ports)
1777 self.assertIsNotNone(sample_vnf.downlink_ports)
1778 self.assertIsNotNone(sample_vnf.my_ports)
1780 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1781 def test_vnf_execute_with_queue_data(self, *args):
1793 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1794 sample_vnf = SampleVNF('vnf1', vnfd)
1795 sample_vnf.APP_NAME = 'sample1'
1796 sample_vnf.q_out = mock.Mock()
1797 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1798 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1800 self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1802 def test_terminate_without_vnf_process(self):
1803 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1804 sample_vnf = SampleVNF('vnf1', vnfd)
1805 sample_vnf.APP_NAME = 'sample1'
1806 sample_vnf.vnf_execute = mock.Mock()
1807 sample_vnf.ssh_helper = mock.Mock()
1808 sample_vnf._tear_down = mock.Mock()
1809 sample_vnf.resource_helper = mock.Mock()
1811 self.assertIsNone(sample_vnf.terminate())
1813 def test_get_stats(self):
1814 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1815 sample_vnf = SampleVNF('vnf1', vnfd)
1816 sample_vnf.APP_NAME = 'sample1'
1817 sample_vnf.APP_WORD = 'sample1'
1818 sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1820 self.assertEqual(sample_vnf.get_stats(), 'the stats')
1822 def test_collect_kpi(self):
1823 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1824 sample_vnf = SampleVNF('vnf1', vnfd)
1825 sample_vnf.APP_NAME = 'sample1'
1826 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1827 sample_vnf.COLLECT_MAP = {
1832 sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
1833 sample_vnf.resource_helper = mock.Mock()
1834 sample_vnf.resource_helper.collect_kpi.return_value = {}
1840 'collect_stats': {},
1842 result = sample_vnf.collect_kpi()
1843 self.assertDictEqual(result, expected)
1845 def test_collect_kpi_default(self):
1846 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1847 sample_vnf = SampleVNF('vnf1', vnfd)
1848 sample_vnf.APP_NAME = 'sample1'
1849 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1850 sample_vnf.get_stats = mock.Mock(return_value='')
1855 'packets_dropped': 0,
1857 result = sample_vnf.collect_kpi()
1858 self.assertDictEqual(result, expected)
1860 def test_scale(self):
1861 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1862 sample_vnf = SampleVNF('vnf1', vnfd)
1863 self.assertRaises(y_exceptions.FunctionNotImplemented,
1866 def test__run(self):
1867 test_cmd = 'test cmd'
1868 run_kwargs = {'arg1': 'val1', 'arg2': 'val2'}
1869 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1870 sample_vnf = SampleVNF('vnf1', vnfd)
1871 sample_vnf.ssh_helper = mock.Mock()
1872 sample_vnf.setup_helper = mock.Mock()
1873 with mock.patch.object(sample_vnf, '_build_config',
1874 return_value=test_cmd), \
1875 mock.patch.object(sample_vnf, '_build_run_kwargs'):
1876 sample_vnf.run_kwargs = run_kwargs
1878 sample_vnf.ssh_helper.drop_connection.assert_called_once()
1879 sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd,
1881 sample_vnf.setup_helper.kill_vnf.assert_called_once()
1884 class TestSampleVNFTrafficGen(unittest.TestCase):
1887 'short-name': 'VpeVnf',
1892 'network': '152.16.100.20',
1893 'netmask': '255.255.255.0',
1894 'gateway': '152.16.100.20',
1898 'network': '152.16.40.20',
1899 'netmask': '255.255.255.0',
1900 'gateway': '152.16.40.20',
1904 'description': 'VPE approximation using DPDK',
1905 'name': 'vpevnf-baremetal',
1908 'network': '0064:ff9b:0:0:0:0:9810:6414',
1910 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1914 'network': '0064:ff9b:0:0:0:0:9810:2814',
1916 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1920 'id': 'vpevnf-baremetal',
1921 'external-interface': [
1923 'virtual-interface': {
1924 'dst_mac': '00:00:00:00:00:03',
1925 'vpci': '0000:05:00.0',
1927 'local_ip': '152.16.100.19',
1928 'type': 'PCI-PASSTHROUGH',
1929 'netmask': '255.255.255.0',
1931 'bandwidth': '10 Gbps',
1932 'dst_ip': '152.16.100.20',
1933 'local_mac': '00:00:00:00:00:01'
1935 'vnfd-connection-point-ref': 'xe0',
1939 'virtual-interface': {
1940 'dst_mac': '00:00:00:00:00:04',
1941 'vpci': '0000:05:00.1',
1943 'local_ip': '152.16.40.19',
1944 'type': 'PCI-PASSTHROUGH',
1945 'netmask': '255.255.255.0',
1947 'bandwidth': '10 Gbps',
1948 'dst_ip': '152.16.40.20',
1949 'local_mac': '00:00:00:00:00:02'
1951 'vnfd-connection-point-ref': 'xe1',
1957 'description': 'Vpe approximation using DPDK',
1959 'vdu-id': 'vpevnf-baremetal',
1972 'connection-point': [
1982 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1986 'vnfd:vnfd-catalog': {
1994 "schema": "isb:traffic_profile:0.1",
1996 "description": "Fixed traffic profile to run UDP traffic",
1997 "traffic_profile": {
1998 "traffic_type": "FixedTraffic",
1999 "frame_rate": 100, # pps
2005 def test__check_status(self):
2006 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2008 with self.assertRaises(NotImplementedError):
2009 sample_vnf_tg._check_status()
2011 def test_listen_traffic(self):
2012 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2014 sample_vnf_tg.listen_traffic(mock.Mock())
2016 def test_verify_traffic(self):
2017 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2019 sample_vnf_tg.verify_traffic(mock.Mock())
2021 def test_terminate(self):
2022 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2023 sample_vnf_tg._traffic_process = mock.Mock()
2024 sample_vnf_tg._tg_process = mock.Mock()
2026 sample_vnf_tg.terminate()
2028 def test__wait_for_process(self):
2029 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2030 with mock.patch.object(sample_vnf_tg, '_check_status',
2031 return_value=0) as mock_status, \
2032 mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2033 mock_proc.is_alive.return_value = True
2034 mock_proc.exitcode = 234
2035 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2036 mock_proc.is_alive.assert_called_once()
2037 mock_status.assert_called_once()
2039 def test__wait_for_process_not_alive(self):
2040 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2041 with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2042 mock_proc.is_alive.return_value = False
2043 self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process)
2044 mock_proc.is_alive.assert_called_once()
2046 def test__wait_for_process_delayed(self):
2047 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2048 with mock.patch.object(sample_vnf_tg, '_check_status',
2049 side_effect=[1, 0]) as mock_status, \
2050 mock.patch.object(sample_vnf_tg,
2051 '_tg_process') as mock_proc:
2052 mock_proc.is_alive.return_value = True
2053 mock_proc.exitcode = 234
2054 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2055 mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()])
2056 mock_status.assert_has_calls([mock.call(), mock.call()])
2058 def test_scale(self):
2059 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2060 self.assertRaises(y_exceptions.FunctionNotImplemented,
2061 sample_vnf_tg.scale)