3 # Copyright (c) 2017 Intel Corporation
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 from copy import deepcopy
24 from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
25 from tests.unit import STL_MOCKS
26 from yardstick.benchmark.contexts.base import Context
27 from yardstick.common import exceptions as y_exceptions
28 from yardstick.common import utils
29 from yardstick.network_services.nfvi.resource import ResourceProfile
30 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
33 class MockError(BaseException):
37 STLClient = mock.MagicMock()
38 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
42 from yardstick.network_services.vnf_generic.vnf import sample_vnf
43 from yardstick.network_services.vnf_generic.vnf.sample_vnf import VnfSshHelper
44 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper
45 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
46 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper
47 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
48 from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
49 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SetupEnvHelper
50 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF
51 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
52 from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
55 class TestVnfSshHelper(unittest.TestCase):
58 'short-name': 'VpeVnf',
63 'network': '152.16.100.20',
64 'netmask': '255.255.255.0',
65 'gateway': '152.16.100.20',
69 'network': '152.16.40.20',
70 'netmask': '255.255.255.0',
71 'gateway': '152.16.40.20',
75 'description': 'VPE approximation using DPDK',
76 'name': 'vpevnf-baremetal',
79 'network': '0064:ff9b:0:0:0:0:9810:6414',
81 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
85 'network': '0064:ff9b:0:0:0:0:9810:2814',
87 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
91 'id': 'vpevnf-baremetal',
92 'external-interface': [
94 'virtual-interface': {
95 'dst_mac': '00:00:00:00:00:03',
96 'vpci': '0000:05:00.0',
97 'local_ip': '152.16.100.19',
98 'type': 'PCI-PASSTHROUGH',
99 'netmask': '255.255.255.0',
101 'bandwidth': '10 Gbps',
102 'dst_ip': '152.16.100.20',
103 'local_mac': '00:00:00:00:00:01',
104 'vld_id': 'uplink_0',
107 'vnfd-connection-point-ref': 'xe0',
111 'virtual-interface': {
112 'dst_mac': '00:00:00:00:00:04',
113 'vpci': '0000:05:00.1',
114 'local_ip': '152.16.40.19',
115 'type': 'PCI-PASSTHROUGH',
116 'netmask': '255.255.255.0',
118 'bandwidth': '10 Gbps',
119 'dst_ip': '152.16.40.20',
120 'local_mac': '00:00:00:00:00:02',
121 'vld_id': 'downlink_0',
124 'vnfd-connection-point-ref': 'xe1',
130 'description': 'Vpe approximation using DPDK',
132 'vdu-id': 'vpevnf-baremetal',
145 'connection-point': [
155 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
159 'vnfd:vnfd-catalog': {
166 def assertAll(self, iterable, message=None):
167 self.assertTrue(all(iterable), message)
169 def test_get_class(self):
170 self.assertIs(VnfSshHelper.get_class(), VnfSshHelper)
172 @mock.patch('yardstick.ssh.paramiko')
173 def test_copy(self, _):
174 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
175 ssh_helper._run = mock.Mock()
177 ssh_helper.execute('ls')
178 self.assertTrue(ssh_helper.is_connected)
179 result = ssh_helper.copy()
180 self.assertIsInstance(result, VnfSshHelper)
181 self.assertFalse(result.is_connected)
182 self.assertEqual(result.bin_path, ssh_helper.bin_path)
183 self.assertEqual(result.host, ssh_helper.host)
184 self.assertEqual(result.port, ssh_helper.port)
185 self.assertEqual(result.user, ssh_helper.user)
186 self.assertEqual(result.password, ssh_helper.password)
187 self.assertEqual(result.key_filename, ssh_helper.key_filename)
189 @mock.patch('yardstick.ssh.paramiko')
190 def test_upload_config_file(self, mock_paramiko):
191 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
192 ssh_helper._run = mock.MagicMock()
194 self.assertFalse(ssh_helper.is_connected)
195 cfg_file = ssh_helper.upload_config_file('my/prefix', 'my content')
196 self.assertTrue(ssh_helper.is_connected)
197 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
198 self.assertTrue(cfg_file.startswith('/tmp'))
200 cfg_file = ssh_helper.upload_config_file('/my/prefix', 'my content')
201 self.assertTrue(ssh_helper.is_connected)
202 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
203 self.assertEqual(cfg_file, '/my/prefix')
205 def test_join_bin_path(self):
206 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
208 expected_start = 'my'
209 expected_middle_list = ['bin']
210 expected_end = 'path'
211 result = ssh_helper.join_bin_path()
212 self.assertTrue(result.startswith(expected_start))
213 self.assertAll(middle in result for middle in expected_middle_list)
214 self.assertTrue(result.endswith(expected_end))
216 expected_middle_list.append(expected_end)
217 expected_end = 'some_file.sh'
218 result = ssh_helper.join_bin_path('some_file.sh')
219 self.assertTrue(result.startswith(expected_start))
220 self.assertAll(middle in result for middle in expected_middle_list)
221 self.assertTrue(result.endswith(expected_end))
223 expected_middle_list.append('some_dir')
224 expected_end = 'some_file.sh'
225 result = ssh_helper.join_bin_path('some_dir', 'some_file.sh')
226 self.assertTrue(result.startswith(expected_start))
227 self.assertAll(middle in result for middle in expected_middle_list)
228 self.assertTrue(result.endswith(expected_end))
230 @mock.patch('yardstick.ssh.paramiko')
231 @mock.patch('yardstick.ssh.provision_tool')
232 def test_provision_tool(self, mock_provision_tool, mock_paramiko):
233 ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
234 ssh_helper._run = mock.MagicMock()
236 self.assertFalse(ssh_helper.is_connected)
237 ssh_helper.provision_tool()
238 self.assertTrue(ssh_helper.is_connected)
239 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
240 self.assertEqual(mock_provision_tool.call_count, 1)
242 ssh_helper.provision_tool(tool_file='my_tool.sh')
243 self.assertTrue(ssh_helper.is_connected)
244 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
245 self.assertEqual(mock_provision_tool.call_count, 2)
247 ssh_helper.provision_tool('tool_path', 'my_tool.sh')
248 self.assertTrue(ssh_helper.is_connected)
249 self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
250 self.assertEqual(mock_provision_tool.call_count, 3)
253 class TestSetupEnvHelper(unittest.TestCase):
256 'short-name': 'VpeVnf',
261 'network': '152.16.100.20',
262 'netmask': '255.255.255.0',
263 'gateway': '152.16.100.20',
267 'network': '152.16.40.20',
268 'netmask': '255.255.255.0',
269 'gateway': '152.16.40.20',
273 'description': 'VPE approximation using DPDK',
274 'name': 'vpevnf-baremetal',
277 'network': '0064:ff9b:0:0:0:0:9810:6414',
279 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
283 'network': '0064:ff9b:0:0:0:0:9810:2814',
285 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
289 'id': 'vpevnf-baremetal',
290 'external-interface': [
292 'virtual-interface': {
293 'dst_mac': '00:00:00:00:00:03',
294 'vpci': '0000:05:00.0',
295 'local_ip': '152.16.100.19',
296 'type': 'PCI-PASSTHROUGH',
297 'netmask': '255.255.255.0',
299 'bandwidth': '10 Gbps',
300 'dst_ip': '152.16.100.20',
301 'local_mac': '00:00:00:00:00:01',
302 'vld_id': 'uplink_0',
305 'vnfd-connection-point-ref': 'xe0',
309 'virtual-interface': {
310 'dst_mac': '00:00:00:00:00:04',
311 'vpci': '0000:05:00.1',
312 'local_ip': '152.16.40.19',
313 'type': 'PCI-PASSTHROUGH',
314 'netmask': '255.255.255.0',
316 'bandwidth': '10 Gbps',
317 'dst_ip': '152.16.40.20',
318 'local_mac': '00:00:00:00:00:02',
319 'vld_id': 'downlink_0',
322 'vnfd-connection-point-ref': 'xe1',
328 'description': 'Vpe approximation using DPDK',
330 'vdu-id': 'vpevnf-baremetal',
343 'connection-point': [
353 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
356 def test_build_config(self):
357 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
359 with self.assertRaises(NotImplementedError):
360 setup_env_helper.build_config()
362 def test_setup_vnf_environment(self):
363 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
364 self.assertIsNone(setup_env_helper.setup_vnf_environment())
366 def test_tear_down(self):
367 setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
369 with self.assertRaises(NotImplementedError):
370 setup_env_helper.tear_down()
373 class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
376 'short-name': 'VpeVnf',
381 'network': '152.16.100.20',
382 'netmask': '255.255.255.0',
383 'gateway': '152.16.100.20',
387 'network': '152.16.40.20',
388 'netmask': '255.255.255.0',
389 'gateway': '152.16.40.20',
393 'description': 'VPE approximation using DPDK',
394 'name': 'vpevnf-baremetal',
397 'network': '0064:ff9b:0:0:0:0:9810:6414',
399 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
403 'network': '0064:ff9b:0:0:0:0:9810:2814',
405 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
409 'id': 'vpevnf-baremetal',
410 'external-interface': [
412 'virtual-interface': {
413 'dst_mac': '00:00:00:00:00:03',
414 'vpci': '0000:05:00.0',
417 'local_ip': '152.16.100.19',
418 'type': 'PCI-PASSTHROUGH',
419 'netmask': '255.255.255.0',
420 'bandwidth': '10 Gbps',
421 'dst_ip': '152.16.100.20',
422 'local_mac': '00:00:00:00:00:01',
423 'vld_id': 'uplink_0',
426 'vnfd-connection-point-ref': 'xe0',
430 'virtual-interface': {
431 'dst_mac': '00:00:00:00:00:04',
432 'vpci': '0000:05:00.1',
435 'local_ip': '152.16.40.19',
436 'type': 'PCI-PASSTHROUGH',
437 'netmask': '255.255.255.0',
438 'bandwidth': '10 Gbps',
439 'dst_ip': '152.16.40.20',
440 'local_mac': '00:00:00:00:00:02',
441 'vld_id': 'downlink_0',
444 'vnfd-connection-point-ref': 'xe1',
450 'description': 'Vpe approximation using DPDK',
452 'vdu-id': 'vpevnf-baremetal',
465 'connection-point': [
475 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
479 'vnfd:vnfd-catalog': {
486 def test__update_packet_type(self):
487 ip_pipeline_cfg = 'pkt_type = ipv4'
488 pkt_type = {'pkt_type': '1'}
490 expected = "pkt_type = 1"
491 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
492 self.assertEqual(result, expected)
494 def test__update_packet_type_no_op(self):
495 ip_pipeline_cfg = 'pkt_type = ipv6'
496 pkt_type = {'pkt_type': '1'}
498 expected = "pkt_type = ipv6"
499 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
500 self.assertEqual(result, expected)
502 def test__update_packet_type_multi_op(self):
503 ip_pipeline_cfg = 'pkt_type = ipv4\npkt_type = 1\npkt_type = ipv4'
504 pkt_type = {'pkt_type': '1'}
506 expected = 'pkt_type = 1\npkt_type = 1\npkt_type = 1'
507 result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
508 self.assertEqual(result, expected)
510 def test__update_traffic_type(self):
511 ip_pipeline_cfg = 'pkt_type = ipv4'
513 traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 4}
514 expected = "pkt_type = ipv4"
515 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
516 self.assertEqual(result, expected)
518 def test__update_traffic_type_ipv6(self):
519 ip_pipeline_cfg = 'pkt_type = ipv4'
521 traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 6}
522 expected = "pkt_type = ipv6"
523 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
524 self.assertEqual(result, expected)
526 def test__update_traffic_type_not_app_name(self):
527 ip_pipeline_cfg = 'traffic_type = 4'
529 vnf_type = ''.join(["Not", DpdkVnfSetupEnvHelper.APP_NAME])
530 traffic_options = {"vnf_type": vnf_type, 'traffic_type': 8}
531 expected = "traffic_type = 8"
532 result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
533 self.assertEqual(result, expected)
535 @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n'))
536 @mock.patch.object(utils, 'read_meminfo',
537 return_value={'Hugepagesize': '2048'})
538 def test__setup_hugepages(self, mock_meminfo, *args):
539 ssh_helper = mock.Mock()
540 dpdk_setup_helper = DpdkVnfSetupEnvHelper(
541 mock.ANY, ssh_helper, mock.ANY)
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('yardstick.network_services.vnf_generic.vnf.sample_vnf.open')
550 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.find_relative_file')
551 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
552 def test_build_config(self, mock_multi_port_config_class, mock_find, *args):
553 mock_multi_port_config = mock_multi_port_config_class()
554 vnfd_helper = VnfdHelper(self.VNFD_0)
555 ssh_helper = mock.Mock()
556 scenario_helper = mock.Mock()
557 scenario_helper.vnf_cfg = {}
558 scenario_helper.all_options = {}
559 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
561 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
562 result = dpdk_setup_helper.build_config()
563 self.assertEqual(result, expected)
564 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
565 self.assertGreaterEqual(mock_find.call_count, 1)
566 self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
567 self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
569 def test__build_pipeline_kwargs(self):
570 vnfd_helper = VnfdHelper(self.VNFD_0)
571 ssh_helper = mock.Mock()
572 ssh_helper.provision_tool.return_value = 'tool_path'
573 scenario_helper = mock.Mock()
574 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
575 dpdk_setup_helper.CFG_CONFIG = 'config'
576 dpdk_setup_helper.CFG_SCRIPT = 'script'
577 dpdk_setup_helper.pipeline_kwargs = {}
578 dpdk_setup_helper.all_ports = [0, 1, 2]
581 'cfg_file': 'config',
583 'port_mask_hex': '0x3',
584 'tool_path': 'tool_path',
586 dpdk_setup_helper._build_pipeline_kwargs()
587 self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected)
589 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
590 @mock.patch('yardstick.ssh.SSH')
591 def test_setup_vnf_environment(self, *args):
593 if cmd.startswith('which '):
597 exec_success = (0, 'good output', '')
598 exec_failure = (1, 'bad output', 'error output')
600 vnfd_helper = VnfdHelper(self.VNFD_0)
601 ssh_helper = mock.Mock()
602 ssh_helper.execute = execute
604 dpdk_vnf_setup_env_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, mock.Mock())
605 dpdk_vnf_setup_env_helper._validate_cpu_cfg = mock.Mock(return_value=[])
607 with mock.patch.object(dpdk_vnf_setup_env_helper, '_setup_dpdk'):
608 self.assertIsInstance(
609 dpdk_vnf_setup_env_helper.setup_vnf_environment(),
612 def test__setup_dpdk(self):
613 ssh_helper = mock.Mock()
614 ssh_helper.execute = mock.Mock()
615 ssh_helper.execute.return_value = (0, 0, 0)
616 dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
617 with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
619 dpdk_setup_helper._setup_dpdk()
620 mock_setup_hp.assert_called_once()
621 ssh_helper.execute.assert_has_calls([
622 mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
623 mock.call('lsmod | grep -i igb_uio')
626 def test__setup_dpdk_igb_uio_not_loaded(self):
627 ssh_helper = mock.Mock()
628 ssh_helper.execute = mock.Mock()
629 ssh_helper.execute.side_effect = [(0, 0, 0), (1, 0, 0)]
630 dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
631 with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
633 with self.assertRaises(y_exceptions.DPDKSetupDriverError):
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 rv = ['0000:05:00.1', '0000:05:00.0']
680 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
681 dpdk_setup_helper.dpdk_bind_helper._get_bound_pci_addresses = mock.Mock(return_value=rv)
682 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
683 dpdk_setup_helper.dpdk_bind_helper.read_status = mock.Mock()
685 self.assertIsNone(dpdk_setup_helper._detect_and_bind_drivers())
687 intf_0 = vnfd_helper.vdu[0]['external-interface'][0]['virtual-interface']
688 intf_1 = vnfd_helper.vdu[0]['external-interface'][1]['virtual-interface']
689 self.assertEqual(0, intf_0['dpdk_port_num'])
690 self.assertEqual(1, intf_1['dpdk_port_num'])
692 def test_tear_down(self):
693 vnfd_helper = VnfdHelper(self.VNFD_0)
694 ssh_helper = mock.Mock()
695 scenario_helper = mock.Mock()
696 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
697 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
698 dpdk_setup_helper.dpdk_bind_helper.used_drivers = {
699 'd1': ['0000:05:00.0'],
700 'd3': ['0000:05:01.0'],
703 self.assertIsNone(dpdk_setup_helper.tear_down())
704 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True)
705 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0'], 'd3', True)
708 class TestResourceHelper(unittest.TestCase):
711 'short-name': 'VpeVnf',
716 'network': '152.16.100.20',
717 'netmask': '255.255.255.0',
718 'gateway': '152.16.100.20',
722 'network': '152.16.40.20',
723 'netmask': '255.255.255.0',
724 'gateway': '152.16.40.20',
728 'description': 'VPE approximation using DPDK',
729 'name': 'vpevnf-baremetal',
732 'network': '0064:ff9b:0:0:0:0:9810:6414',
734 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
738 'network': '0064:ff9b:0:0:0:0:9810:2814',
740 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
744 'id': 'vpevnf-baremetal',
745 'external-interface': [
747 'virtual-interface': {
748 'dst_mac': '00:00:00:00:00:03',
749 'vpci': '0000:05:00.0',
751 'local_ip': '152.16.100.19',
752 'type': 'PCI-PASSTHROUGH',
753 'netmask': '255.255.255.0',
755 'bandwidth': '10 Gbps',
756 'dst_ip': '152.16.100.20',
757 'local_mac': '00:00:00:00:00:01'
759 'vnfd-connection-point-ref': 'xe0',
763 'virtual-interface': {
764 'dst_mac': '00:00:00:00:00:04',
765 'vpci': '0000:05:00.1',
767 'local_ip': '152.16.40.19',
768 'type': 'PCI-PASSTHROUGH',
769 'netmask': '255.255.255.0',
771 'bandwidth': '10 Gbps',
772 'dst_ip': '152.16.40.20',
773 'local_mac': '00:00:00:00:00:02'
775 'vnfd-connection-point-ref': 'xe1',
781 'description': 'Vpe approximation using DPDK',
783 'vdu-id': 'vpevnf-baremetal',
796 'connection-point': [
806 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
809 def test_setup(self):
811 vnfd_helper = VnfdHelper(self.VNFD_0)
812 ssh_helper = mock.Mock()
813 scenario_helper = mock.Mock()
814 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
815 dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
816 resource_helper = ResourceHelper(dpdk_setup_helper)
818 self.assertIsNone(resource_helper.setup())
819 self.assertIs(resource_helper.resource, resource)
821 def test_generate_cfg(self):
822 vnfd_helper = VnfdHelper(self.VNFD_0)
823 ssh_helper = mock.Mock()
824 scenario_helper = mock.Mock()
825 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
826 resource_helper = ResourceHelper(dpdk_setup_helper)
828 self.assertIsNone(resource_helper.generate_cfg())
830 def test_stop_collect(self):
831 vnfd_helper = VnfdHelper(self.VNFD_0)
832 ssh_helper = mock.Mock()
833 scenario_helper = mock.Mock()
834 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
835 resource_helper = ResourceHelper(dpdk_setup_helper)
836 resource_helper.resource = mock.Mock()
838 self.assertIsNone(resource_helper.stop_collect())
840 def test_stop_collect_none(self):
841 vnfd_helper = VnfdHelper(self.VNFD_0)
842 ssh_helper = mock.Mock()
843 scenario_helper = mock.Mock()
844 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
845 resource_helper = ResourceHelper(dpdk_setup_helper)
846 resource_helper.resource = None
848 self.assertIsNone(resource_helper.stop_collect())
851 class TestClientResourceHelper(unittest.TestCase):
854 'short-name': 'VpeVnf',
859 'network': '152.16.100.20',
860 'netmask': '255.255.255.0',
861 'gateway': '152.16.100.20',
865 'network': '152.16.40.20',
866 'netmask': '255.255.255.0',
867 'gateway': '152.16.40.20',
871 'description': 'VPE approximation using DPDK',
872 'name': 'vpevnf-baremetal',
875 'network': '0064:ff9b:0:0:0:0:9810:6414',
877 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
881 'network': '0064:ff9b:0:0:0:0:9810:2814',
883 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
887 'id': 'vpevnf-baremetal',
888 'external-interface': [
890 'virtual-interface': {
891 'dst_mac': '00:00:00:00:00:03',
892 'vpci': '0000:05:00.0',
894 'local_ip': '152.16.100.19',
895 'type': 'PCI-PASSTHROUGH',
896 'netmask': '255.255.255.0',
898 'bandwidth': '10 Gbps',
899 'dst_ip': '152.16.100.20',
900 'local_mac': '00:00:00:00:00:01',
901 'vld_id': 'uplink_0',
904 'vnfd-connection-point-ref': 'xe0',
908 'virtual-interface': {
909 'dst_mac': '00:00:00:00:00:04',
910 'vpci': '0000:05:00.1',
912 'local_ip': '152.16.40.19',
913 'type': 'PCI-PASSTHROUGH',
914 'netmask': '255.255.255.0',
916 'bandwidth': '10 Gbps',
917 'dst_ip': '152.16.40.20',
918 'local_mac': '00:00:00:00:00:02',
919 'vld_id': 'downlink_0',
922 'vnfd-connection-point-ref': 'xe1',
926 'virtual-interface': {
927 'dst_mac': '00:00:00:00:00:13',
928 'vpci': '0000:05:00.2',
930 'local_ip': '152.16.40.19',
931 'type': 'PCI-PASSTHROUGH',
932 'netmask': '255.255.255.0',
934 'bandwidth': '10 Gbps',
935 'dst_ip': '152.16.40.30',
936 'local_mac': '00:00:00:00:00:11'
938 'vnfd-connection-point-ref': 'xe2',
944 'description': 'Vpe approximation using DPDK',
946 'vdu-id': 'vpevnf-baremetal',
959 'connection-point': [
969 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
973 'vnfd:vnfd-catalog': {
980 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
981 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
982 new_callable=lambda: MockError)
983 def test_get_stats_not_connected(self, mock_state_error, *args):
984 vnfd_helper = VnfdHelper(self.VNFD_0)
985 ssh_helper = mock.Mock()
986 scenario_helper = mock.Mock()
987 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
988 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
989 client_resource_helper.client = mock.MagicMock()
990 client_resource_helper.client.get_stats.side_effect = mock_state_error
992 self.assertEqual(client_resource_helper.get_stats(), {})
993 self.assertEqual(client_resource_helper.client.get_stats.call_count, 1)
995 def test_generate_samples(self):
996 vnfd_helper = VnfdHelper(self.VNFD_0)
997 ssh_helper = mock.Mock()
998 scenario_helper = mock.Mock()
999 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1000 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1001 client_resource_helper.client = mock.MagicMock()
1002 client_resource_helper.client.get_stats.return_value = {
1020 "rx_throughput_fps": 5.5,
1021 "tx_throughput_fps": 4.9,
1022 "rx_throughput_mbps": 234.78,
1023 "tx_throughput_mbps": 243.11,
1024 "in_packets": 34251,
1025 "out_packets": 52342,
1028 "rx_throughput_fps": 0.0,
1029 "tx_throughput_fps": 5.9,
1030 "rx_throughput_mbps": 434.78,
1031 "tx_throughput_mbps": 0.0,
1033 "out_packets": 48791,
1036 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1037 result = client_resource_helper.generate_samples(ports)
1038 self.assertDictEqual(result, expected)
1040 def test_generate_samples_with_key(self):
1041 vnfd_helper = VnfdHelper(self.VNFD_0)
1042 ssh_helper = mock.Mock()
1043 scenario_helper = mock.Mock()
1044 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1045 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1046 client_resource_helper.client = mock.MagicMock()
1047 client_resource_helper.client.get_stats.return_value = {
1048 'key_name': 'key_value',
1066 'key_name': 'key_value',
1067 "rx_throughput_fps": 5.5,
1068 "tx_throughput_fps": 4.9,
1069 "rx_throughput_mbps": 234.78,
1070 "tx_throughput_mbps": 243.11,
1071 "in_packets": 34251,
1072 "out_packets": 52342,
1075 'key_name': 'key_value',
1076 "rx_throughput_fps": 0.0,
1077 "tx_throughput_fps": 5.9,
1078 "rx_throughput_mbps": 434.78,
1079 "tx_throughput_mbps": 0.0,
1081 "out_packets": 48791,
1084 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1085 result = client_resource_helper.generate_samples(ports, 'key_name')
1086 self.assertDictEqual(result, expected)
1088 def test_generate_samples_with_key_and_default(self):
1089 vnfd_helper = VnfdHelper(self.VNFD_0)
1090 ssh_helper = mock.Mock()
1091 scenario_helper = mock.Mock()
1092 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1093 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1094 client_resource_helper.client = mock.MagicMock()
1095 client_resource_helper.client.get_stats.return_value = {
1113 'key_name': 'default',
1114 "rx_throughput_fps": 5.5,
1115 "tx_throughput_fps": 4.9,
1116 "rx_throughput_mbps": 234.78,
1117 "tx_throughput_mbps": 243.11,
1118 "in_packets": 34251,
1119 "out_packets": 52342,
1122 'key_name': 'default',
1123 "rx_throughput_fps": 0.0,
1124 "tx_throughput_fps": 5.9,
1125 "rx_throughput_mbps": 434.78,
1126 "tx_throughput_mbps": 0.0,
1128 "out_packets": 48791,
1131 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1132 result = client_resource_helper.generate_samples(ports, 'key_name', 'default')
1133 self.assertDictEqual(result, expected)
1135 def test_clear_stats(self):
1136 vnfd_helper = VnfdHelper(self.VNFD_0)
1137 ssh_helper = mock.Mock()
1138 scenario_helper = mock.Mock()
1139 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1140 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1141 client_resource_helper.client = mock.Mock()
1143 self.assertIsNone(client_resource_helper.clear_stats())
1144 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1146 def test_clear_stats_of_ports(self):
1147 vnfd_helper = VnfdHelper(self.VNFD_0)
1148 ssh_helper = mock.Mock()
1149 scenario_helper = mock.Mock()
1150 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1151 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1152 client_resource_helper.client = mock.Mock()
1154 self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
1155 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1157 def test_start(self):
1158 vnfd_helper = VnfdHelper(self.VNFD_0)
1159 ssh_helper = mock.Mock()
1160 scenario_helper = mock.Mock()
1161 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1162 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1163 client_resource_helper.client = mock.Mock()
1165 self.assertIsNone(client_resource_helper.start())
1166 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1168 def test_start_ports(self):
1169 vnfd_helper = VnfdHelper(self.VNFD_0)
1170 ssh_helper = mock.Mock()
1171 scenario_helper = mock.Mock()
1172 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1173 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1174 client_resource_helper.client = mock.Mock()
1176 self.assertIsNone(client_resource_helper.start([3, 4]))
1177 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1179 def test_collect_kpi_with_queue(self):
1180 vnfd_helper = VnfdHelper(self.VNFD_0)
1181 ssh_helper = mock.Mock()
1182 scenario_helper = mock.Mock()
1183 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1184 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1185 client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1186 client_resource_helper._queue = mock.Mock()
1187 client_resource_helper._queue.empty.return_value = False
1188 client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1195 result = client_resource_helper.collect_kpi()
1196 self.assertDictEqual(result, expected)
1198 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1199 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1200 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1201 new_callable=lambda: MockError)
1202 def test__connect_with_failures(self, mock_error, *args):
1203 vnfd_helper = VnfdHelper(self.VNFD_0)
1204 ssh_helper = mock.Mock()
1205 scenario_helper = mock.Mock()
1206 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1207 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1208 client = mock.MagicMock()
1209 client.connect.side_effect = mock_error
1211 self.assertIs(client_resource_helper._connect(client), client)
1214 class TestRfc2544ResourceHelper(unittest.TestCase):
1218 'correlated_traffic': True,
1219 'allowed_drop_rate': '0.1 - 0.15',
1223 'allowed_drop_rate': ' 0.25 - 0.05 ',
1227 'allowed_drop_rate': '0.2',
1236 'rfc2544': RFC2544_CFG_1,
1242 'rfc2544': RFC2544_CFG_2,
1248 'rfc2544': RFC2544_CFG_3,
1254 'rfc2544': RFC2544_CFG_4,
1258 def test_property_rfc2544(self):
1259 scenario_helper = ScenarioHelper('name1')
1260 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1261 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1263 self.assertIsNone(rfc2544_resource_helper._rfc2544)
1264 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1265 self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1266 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1267 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1269 def test_property_tolerance_high(self):
1270 scenario_helper = ScenarioHelper('name1')
1271 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1272 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1274 self.assertIsNone(rfc2544_resource_helper._tolerance_high)
1275 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1276 self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1277 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1278 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1280 def test_property_tolerance_low(self):
1281 scenario_helper = ScenarioHelper('name1')
1282 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1283 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1285 self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1286 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1287 self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1288 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1289 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1291 def test_property_tolerance_high_range_swap(self):
1292 scenario_helper = ScenarioHelper('name1')
1293 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1294 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1296 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1298 def test_property_tolerance_low_range_swap(self):
1299 scenario_helper = ScenarioHelper('name1')
1300 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1301 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1303 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1305 def test_property_tolerance_high_not_range(self):
1306 scenario_helper = ScenarioHelper('name1')
1307 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1308 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1310 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1312 def test_property_tolerance_low_not_range(self):
1313 scenario_helper = ScenarioHelper('name1')
1314 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1315 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1317 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1319 def test_property_tolerance_high_default(self):
1320 scenario_helper = ScenarioHelper('name1')
1321 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1322 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1324 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1326 def test_property_tolerance_low_default(self):
1327 scenario_helper = ScenarioHelper('name1')
1328 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1329 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1331 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1333 def test_property_latency(self):
1334 scenario_helper = ScenarioHelper('name1')
1335 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1336 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1338 self.assertIsNone(rfc2544_resource_helper._latency)
1339 self.assertTrue(rfc2544_resource_helper.latency)
1340 self.assertTrue(rfc2544_resource_helper._latency)
1341 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1342 self.assertTrue(rfc2544_resource_helper.latency)
1344 def test_property_latency_default(self):
1345 scenario_helper = ScenarioHelper('name1')
1346 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1347 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1349 self.assertFalse(rfc2544_resource_helper.latency)
1351 def test_property_correlated_traffic(self):
1352 scenario_helper = ScenarioHelper('name1')
1353 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1354 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1356 self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1357 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1358 self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1359 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1360 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1362 def test_property_correlated_traffic_default(self):
1363 scenario_helper = ScenarioHelper('name1')
1364 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1365 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1367 self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1370 class TestSampleVNFDeployHelper(unittest.TestCase):
1372 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1373 @mock.patch('subprocess.check_output')
1374 def test_deploy_vnfs_disabled(self, *args):
1375 vnfd_helper = mock.Mock()
1376 ssh_helper = mock.Mock()
1377 ssh_helper.join_bin_path.return_value = 'joined_path'
1378 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1379 ssh_helper.put.return_value = None
1380 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1382 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1383 sample_vnf_deploy_helper.DISABLE_DEPLOY = True
1384 self.assertEqual(ssh_helper.execute.call_count, 5)
1385 self.assertEqual(ssh_helper.put.call_count, 1)
1387 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1388 @mock.patch('subprocess.check_output')
1389 def test_deploy_vnfs(self, *args):
1390 vnfd_helper = mock.Mock()
1391 ssh_helper = mock.Mock()
1392 ssh_helper.join_bin_path.return_value = 'joined_path'
1393 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1394 ssh_helper.put.return_value = None
1395 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1396 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1398 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1399 self.assertEqual(ssh_helper.execute.call_count, 5)
1400 self.assertEqual(ssh_helper.put.call_count, 1)
1402 @mock.patch('subprocess.check_output')
1403 def test_deploy_vnfs_early_success(self, *args):
1404 vnfd_helper = mock.Mock()
1405 ssh_helper = mock.Mock()
1406 ssh_helper.join_bin_path.return_value = 'joined_path'
1407 ssh_helper.execute.return_value = 0, 'output', ''
1408 ssh_helper.put.return_value = None
1409 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1410 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1412 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1413 self.assertEqual(ssh_helper.execute.call_count, 1)
1414 self.assertEqual(ssh_helper.put.call_count, 0)
1417 class TestScenarioHelper(unittest.TestCase):
1419 def test_property_task_path(self):
1420 scenario_helper = ScenarioHelper('name1')
1421 scenario_helper.scenario_cfg = {
1422 'task_path': 'my_path',
1425 self.assertEqual(scenario_helper.task_path, 'my_path')
1427 def test_property_nodes(self):
1428 nodes = ['node1', 'node2']
1429 scenario_helper = ScenarioHelper('name1')
1430 scenario_helper.scenario_cfg = {
1434 self.assertEqual(scenario_helper.nodes, nodes)
1436 def test_property_all_options(self):
1443 scenario_helper = ScenarioHelper('name1')
1444 scenario_helper.scenario_cfg = {
1448 self.assertDictEqual(scenario_helper.all_options, data)
1450 def test_property_options(self):
1455 scenario_helper = ScenarioHelper('name1')
1456 scenario_helper.scenario_cfg = {
1462 self.assertDictEqual(scenario_helper.options, data)
1464 def test_property_vnf_cfg(self):
1465 scenario_helper = ScenarioHelper('name1')
1466 scenario_helper.scenario_cfg = {
1469 'vnf_config': 'my_config',
1474 self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1476 def test_property_vnf_cfg_default(self):
1477 scenario_helper = ScenarioHelper('name1')
1478 scenario_helper.scenario_cfg = {
1484 self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1486 def test_property_topology(self):
1487 scenario_helper = ScenarioHelper('name1')
1488 scenario_helper.scenario_cfg = {
1489 'topology': 'my_topology',
1492 self.assertEqual(scenario_helper.topology, 'my_topology')
1495 class TestSampleVnf(unittest.TestCase):
1498 'short-name': 'VpeVnf',
1503 'network': '152.16.100.20',
1504 'netmask': '255.255.255.0',
1505 'gateway': '152.16.100.20',
1509 'network': '152.16.40.20',
1510 'netmask': '255.255.255.0',
1511 'gateway': '152.16.40.20',
1515 'description': 'VPE approximation using DPDK',
1516 'name': 'vpevnf-baremetal',
1519 'network': '0064:ff9b:0:0:0:0:9810:6414',
1521 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1525 'network': '0064:ff9b:0:0:0:0:9810:2814',
1527 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1531 'id': 'vpevnf-baremetal',
1532 'external-interface': [
1534 'virtual-interface': {
1535 'dst_mac': '00:00:00:00:00:03',
1536 'vpci': '0000:05:00.0',
1537 'local_ip': '152.16.100.19',
1538 'type': 'PCI-PASSTHROUGH',
1539 'netmask': '255.255.255.0',
1541 'bandwidth': '10 Gbps',
1542 'dst_ip': '152.16.100.20',
1543 'local_mac': '00:00:00:00:00:01'
1545 'vnfd-connection-point-ref': 'xe0',
1549 'virtual-interface': {
1550 'dst_mac': '00:00:00:00:00:04',
1551 'vpci': '0000:05:00.1',
1552 'local_ip': '152.16.40.19',
1553 'type': 'PCI-PASSTHROUGH',
1554 'netmask': '255.255.255.0',
1556 'bandwidth': '10 Gbps',
1557 'dst_ip': '152.16.40.20',
1558 'local_mac': '00:00:00:00:00:02'
1560 'vnfd-connection-point-ref': 'xe1',
1566 'description': 'Vpe approximation using DPDK',
1568 'vdu-id': 'vpevnf-baremetal',
1581 'connection-point': [
1591 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1595 'vnfd:vnfd-catalog': {
1603 "schema": "isb:traffic_profile:0.1",
1605 "description": "Fixed traffic profile to run UDP traffic",
1606 "traffic_profile": {
1607 "traffic_type": "FixedTraffic",
1608 "frame_rate": 100, # pps
1614 def test___init__(self):
1615 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1617 self.assertEqual(sample_vnf.name, 'vnf1')
1618 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1620 # test the default setup helper is SetupEnvHelper, not subclass
1621 self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1623 # test the default resource helper is ResourceHelper, not subclass
1624 self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1626 def test___init___alt_types(self):
1627 class MySetupEnvHelper(SetupEnvHelper):
1630 class MyResourceHelper(ResourceHelper):
1633 sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1635 self.assertEqual(sample_vnf.name, 'vnf1')
1636 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1638 # test the default setup helper is MySetupEnvHelper, not subclass
1639 self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1641 # test the default resource helper is MyResourceHelper, not subclass
1642 self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1644 def test__get_port0localip6(self):
1645 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1646 expected = '0064:ff9b:0:0:0:0:9810:6414'
1647 result = sample_vnf._get_port0localip6()
1648 self.assertEqual(result, expected)
1650 def test__get_port1localip6(self):
1651 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1652 expected = '0064:ff9b:0:0:0:0:9810:2814'
1653 result = sample_vnf._get_port1localip6()
1654 self.assertEqual(result, expected)
1656 def test__get_port0prefixip6(self):
1657 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1659 result = sample_vnf._get_port0prefixlen6()
1660 self.assertEqual(result, expected)
1662 def test__get_port1prefixip6(self):
1663 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1665 result = sample_vnf._get_port1prefixlen6()
1666 self.assertEqual(result, expected)
1668 def test__get_port0gateway6(self):
1669 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1670 expected = '0064:ff9b:0:0:0:0:9810:6414'
1671 result = sample_vnf._get_port0gateway6()
1672 self.assertEqual(result, expected)
1674 def test__get_port1gateway6(self):
1675 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1676 expected = '0064:ff9b:0:0:0:0:9810:2814'
1677 result = sample_vnf._get_port1gateway6()
1678 self.assertEqual(result, expected)
1680 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1681 def test__start_vnf(self, *args):
1682 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1683 sample_vnf = SampleVNF('vnf1', vnfd)
1684 sample_vnf._run = mock.Mock()
1686 self.assertIsNone(sample_vnf.queue_wrapper)
1687 self.assertIsNone(sample_vnf._vnf_process)
1688 self.assertIsNone(sample_vnf._start_vnf())
1689 self.assertIsNotNone(sample_vnf.queue_wrapper)
1690 self.assertIsNotNone(sample_vnf._vnf_process)
1692 @mock.patch("yardstick.ssh.SSH")
1693 def test_instantiate(self, ssh):
1701 context1 = mock.Mock()
1702 context1._get_server.return_value = None
1703 context2 = mock.Mock()
1704 context2._get_server.return_value = context2
1707 Context.list.clear()
1708 except AttributeError:
1709 # clear() but works in Py2.7
1710 Context.list[:] = []
1712 Context.list.extend([
1717 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1718 sample_vnf = SampleVNF('vnf1', vnfd)
1719 sample_vnf.APP_NAME = 'sample1'
1720 sample_vnf._start_server = mock.Mock(return_value=0)
1721 sample_vnf._vnf_process = mock.MagicMock()
1722 sample_vnf._vnf_process._is_alive.return_value = 1
1723 sample_vnf.ssh_helper = mock.MagicMock()
1724 sample_vnf.deploy_helper = mock.MagicMock()
1725 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1730 self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1731 self.assertEqual(sample_vnf.nfvi_context, context2)
1733 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1734 @mock.patch("yardstick.ssh.SSH")
1735 def test_wait_for_instantiate_empty_queue(self, ssh, *args):
1736 mock_ssh(ssh, exec_result=(1, "", ""))
1750 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1751 sample_vnf = SampleVNF('vnf1', vnfd)
1752 sample_vnf.APP_NAME = 'sample1'
1753 sample_vnf.WAIT_TIME_FOR_SCRIPT = 0
1754 sample_vnf._start_server = mock.Mock(return_value=0)
1755 sample_vnf._vnf_process = mock.MagicMock()
1756 sample_vnf._vnf_process.exitcode = 0
1757 sample_vnf._vnf_process._is_alive.return_value = 1
1758 sample_vnf.queue_wrapper = mock.Mock()
1759 sample_vnf.q_out = mock.Mock()
1760 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1761 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1762 sample_vnf.ssh_helper = mock.MagicMock()
1763 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1764 sample_vnf.resource_helper.start_collect = mock.MagicMock()
1766 self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1768 def test__build_ports(self):
1769 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1770 sample_vnf = SampleVNF('vnf1', vnfd)
1772 self.assertIsNone(sample_vnf._build_ports())
1773 self.assertIsNotNone(sample_vnf.networks)
1774 self.assertIsNotNone(sample_vnf.uplink_ports)
1775 self.assertIsNotNone(sample_vnf.downlink_ports)
1776 self.assertIsNotNone(sample_vnf.my_ports)
1778 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1779 def test_vnf_execute_with_queue_data(self, *args):
1791 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1792 sample_vnf = SampleVNF('vnf1', vnfd)
1793 sample_vnf.APP_NAME = 'sample1'
1794 sample_vnf.q_out = mock.Mock()
1795 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1796 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1798 self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1800 def test_terminate_without_vnf_process(self):
1801 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1802 sample_vnf = SampleVNF('vnf1', vnfd)
1803 sample_vnf.APP_NAME = 'sample1'
1804 sample_vnf.vnf_execute = mock.Mock()
1805 sample_vnf.ssh_helper = mock.Mock()
1806 sample_vnf._tear_down = mock.Mock()
1807 sample_vnf.resource_helper = mock.Mock()
1809 self.assertIsNone(sample_vnf.terminate())
1811 def test_get_stats(self):
1812 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1813 sample_vnf = SampleVNF('vnf1', vnfd)
1814 sample_vnf.APP_NAME = 'sample1'
1815 sample_vnf.APP_WORD = 'sample1'
1816 sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1818 self.assertEqual(sample_vnf.get_stats(), 'the stats')
1820 def test_collect_kpi(self):
1821 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1822 sample_vnf = SampleVNF('vnf1', vnfd)
1823 sample_vnf.APP_NAME = 'sample1'
1824 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1825 sample_vnf.COLLECT_MAP = {
1830 sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
1831 sample_vnf.resource_helper = mock.Mock()
1832 sample_vnf.resource_helper.collect_kpi.return_value = {}
1838 'collect_stats': {},
1840 result = sample_vnf.collect_kpi()
1841 self.assertDictEqual(result, expected)
1843 def test_collect_kpi_default(self):
1844 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1845 sample_vnf = SampleVNF('vnf1', vnfd)
1846 sample_vnf.APP_NAME = 'sample1'
1847 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1848 sample_vnf.get_stats = mock.Mock(return_value='')
1853 'packets_dropped': 0,
1855 result = sample_vnf.collect_kpi()
1856 self.assertDictEqual(result, expected)
1858 def test_scale(self):
1859 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1860 sample_vnf = SampleVNF('vnf1', vnfd)
1861 self.assertRaises(y_exceptions.FunctionNotImplemented,
1864 def test__run(self):
1865 test_cmd = 'test cmd'
1866 run_kwargs = {'arg1': 'val1', 'arg2': 'val2'}
1867 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1868 sample_vnf = SampleVNF('vnf1', vnfd)
1869 sample_vnf.ssh_helper = mock.Mock()
1870 sample_vnf.setup_helper = mock.Mock()
1871 with mock.patch.object(sample_vnf, '_build_config',
1872 return_value=test_cmd), \
1873 mock.patch.object(sample_vnf, '_build_run_kwargs'):
1874 sample_vnf.run_kwargs = run_kwargs
1876 sample_vnf.ssh_helper.drop_connection.assert_called_once()
1877 sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd,
1879 sample_vnf.setup_helper.kill_vnf.assert_called_once()
1882 class TestSampleVNFTrafficGen(unittest.TestCase):
1885 'short-name': 'VpeVnf',
1890 'network': '152.16.100.20',
1891 'netmask': '255.255.255.0',
1892 'gateway': '152.16.100.20',
1896 'network': '152.16.40.20',
1897 'netmask': '255.255.255.0',
1898 'gateway': '152.16.40.20',
1902 'description': 'VPE approximation using DPDK',
1903 'name': 'vpevnf-baremetal',
1906 'network': '0064:ff9b:0:0:0:0:9810:6414',
1908 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1912 'network': '0064:ff9b:0:0:0:0:9810:2814',
1914 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1918 'id': 'vpevnf-baremetal',
1919 'external-interface': [
1921 'virtual-interface': {
1922 'dst_mac': '00:00:00:00:00:03',
1923 'vpci': '0000:05:00.0',
1925 'local_ip': '152.16.100.19',
1926 'type': 'PCI-PASSTHROUGH',
1927 'netmask': '255.255.255.0',
1929 'bandwidth': '10 Gbps',
1930 'dst_ip': '152.16.100.20',
1931 'local_mac': '00:00:00:00:00:01'
1933 'vnfd-connection-point-ref': 'xe0',
1937 'virtual-interface': {
1938 'dst_mac': '00:00:00:00:00:04',
1939 'vpci': '0000:05:00.1',
1941 'local_ip': '152.16.40.19',
1942 'type': 'PCI-PASSTHROUGH',
1943 'netmask': '255.255.255.0',
1945 'bandwidth': '10 Gbps',
1946 'dst_ip': '152.16.40.20',
1947 'local_mac': '00:00:00:00:00:02'
1949 'vnfd-connection-point-ref': 'xe1',
1955 'description': 'Vpe approximation using DPDK',
1957 'vdu-id': 'vpevnf-baremetal',
1970 'connection-point': [
1980 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1984 'vnfd:vnfd-catalog': {
1992 "schema": "isb:traffic_profile:0.1",
1994 "description": "Fixed traffic profile to run UDP traffic",
1995 "traffic_profile": {
1996 "traffic_type": "FixedTraffic",
1997 "frame_rate": 100, # pps
2003 def test__check_status(self):
2004 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2006 with self.assertRaises(NotImplementedError):
2007 sample_vnf_tg._check_status()
2009 def test_listen_traffic(self):
2010 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2012 sample_vnf_tg.listen_traffic(mock.Mock())
2014 def test_verify_traffic(self):
2015 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2017 sample_vnf_tg.verify_traffic(mock.Mock())
2019 def test_terminate(self):
2020 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2021 sample_vnf_tg._traffic_process = mock.Mock()
2022 sample_vnf_tg._tg_process = mock.Mock()
2024 sample_vnf_tg.terminate()
2026 def test__wait_for_process(self):
2027 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2028 with mock.patch.object(sample_vnf_tg, '_check_status',
2029 return_value=0) as mock_status, \
2030 mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2031 mock_proc.is_alive.return_value = True
2032 mock_proc.exitcode = 234
2033 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2034 mock_proc.is_alive.assert_called_once()
2035 mock_status.assert_called_once()
2037 def test__wait_for_process_not_alive(self):
2038 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2039 with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2040 mock_proc.is_alive.return_value = False
2041 self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process)
2042 mock_proc.is_alive.assert_called_once()
2044 def test__wait_for_process_delayed(self):
2045 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2046 with mock.patch.object(sample_vnf_tg, '_check_status',
2047 side_effect=[1, 0]) as mock_status, \
2048 mock.patch.object(sample_vnf_tg,
2049 '_tg_process') as mock_proc:
2050 mock_proc.is_alive.return_value = True
2051 mock_proc.exitcode = 234
2052 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2053 mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()])
2054 mock_status.assert_has_calls([mock.call(), mock.call()])
2056 def test_scale(self):
2057 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2058 self.assertRaises(y_exceptions.FunctionNotImplemented,
2059 sample_vnf_tg.scale)