3 # Copyright (c) 2017-2018 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.vnf_ssh_helper 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.object(utils, 'find_relative_file')
551 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
552 @mock.patch.object(utils, 'open_relative_file')
553 def test_build_config(self, mock_open_rf, mock_multi_port_config_class, mock_find, *args):
554 mock_multi_port_config = mock_multi_port_config_class()
555 vnfd_helper = VnfdHelper(self.VNFD_0)
556 ssh_helper = mock.Mock()
557 scenario_helper = mock.Mock()
558 scenario_helper.vnf_cfg = {}
559 scenario_helper.all_options = {}
560 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
562 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
563 result = dpdk_setup_helper.build_config()
564 self.assertEqual(result, expected)
565 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
566 self.assertGreaterEqual(mock_find.call_count, 1)
567 self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
568 self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
570 scenario_helper.vnf_cfg = {'file': 'fake_file'}
571 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
572 mock_open_rf.side_effect = mock.mock_open(read_data='fake_data')
573 dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
575 result = dpdk_setup_helper.build_config()
577 mock_open_rf.assert_called_once()
578 self.assertEqual(result, expected)
579 self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
580 self.assertGreaterEqual(mock_find.call_count, 1)
581 self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
582 self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
584 def test__build_pipeline_kwargs(self):
585 vnfd_helper = VnfdHelper(self.VNFD_0)
586 ssh_helper = mock.Mock()
587 ssh_helper.provision_tool.return_value = 'tool_path'
588 scenario_helper = mock.Mock()
589 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
590 dpdk_setup_helper.CFG_CONFIG = 'config'
591 dpdk_setup_helper.CFG_SCRIPT = 'script'
592 dpdk_setup_helper.pipeline_kwargs = {}
593 dpdk_setup_helper.all_ports = [0, 1, 2]
596 'cfg_file': 'config',
598 'port_mask_hex': '0x3',
599 'tool_path': 'tool_path',
601 dpdk_setup_helper._build_pipeline_kwargs()
602 self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected)
604 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
605 @mock.patch('yardstick.ssh.SSH')
606 def test_setup_vnf_environment(self, *args):
608 if cmd.startswith('which '):
612 exec_success = (0, 'good output', '')
613 exec_failure = (1, 'bad output', 'error output')
615 vnfd_helper = VnfdHelper(self.VNFD_0)
616 ssh_helper = mock.Mock()
617 ssh_helper.execute = execute
619 scenario_helper = mock.Mock()
620 scenario_helper.nodes = [None, None]
621 dpdk_vnf_setup_env_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
622 dpdk_vnf_setup_env_helper._validate_cpu_cfg = mock.Mock(return_value=[])
624 with mock.patch.object(dpdk_vnf_setup_env_helper, '_setup_dpdk'):
625 self.assertIsInstance(
626 dpdk_vnf_setup_env_helper.setup_vnf_environment(),
629 def test__setup_dpdk(self):
630 ssh_helper = mock.Mock()
631 ssh_helper.execute = mock.Mock()
632 ssh_helper.execute.return_value = (0, 0, 0)
633 dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
634 with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
636 dpdk_setup_helper._setup_dpdk()
637 mock_setup_hp.assert_called_once()
638 ssh_helper.execute.assert_has_calls([
639 mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
640 mock.call('lsmod | grep -i igb_uio')
643 @mock.patch('yardstick.ssh.SSH')
644 def test__setup_resources(self, _):
645 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
646 ssh_helper = mock.Mock()
647 scenario_helper = mock.Mock()
648 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
649 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
651 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
652 vnfd_helper.interfaces]
653 result = dpdk_setup_helper._setup_resources()
654 self.assertIsInstance(result, ResourceProfile)
655 self.assertEqual(dpdk_setup_helper.socket, 0)
657 @mock.patch('yardstick.ssh.SSH')
658 def test__setup_resources_socket_1(self, _):
659 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
660 vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0'
661 vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0'
662 ssh_helper = mock.Mock()
663 scenario_helper = mock.Mock()
664 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
665 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
667 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
668 vnfd_helper.interfaces]
669 result = dpdk_setup_helper._setup_resources()
670 self.assertIsInstance(result, ResourceProfile)
671 self.assertEqual(dpdk_setup_helper.socket, 1)
673 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
674 def test__detect_and_bind_drivers(self, *args):
675 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
676 ssh_helper = mock.Mock()
677 # ssh_helper.execute = mock.Mock(return_value = (0, 'text', ''))
678 # ssh_helper.execute.return_value = 0, 'output', ''
679 scenario_helper = mock.Mock()
680 scenario_helper.nodes = [None, None]
681 rv = ['0000:05:00.1', '0000:05:00.0']
683 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
684 dpdk_setup_helper.dpdk_bind_helper._get_bound_pci_addresses = mock.Mock(return_value=rv)
685 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
686 dpdk_setup_helper.dpdk_bind_helper.read_status = mock.Mock()
688 self.assertIsNone(dpdk_setup_helper._detect_and_bind_drivers())
690 intf_0 = vnfd_helper.vdu[0]['external-interface'][0]['virtual-interface']
691 intf_1 = vnfd_helper.vdu[0]['external-interface'][1]['virtual-interface']
692 self.assertEqual(0, intf_0['dpdk_port_num'])
693 self.assertEqual(1, intf_1['dpdk_port_num'])
695 def test_tear_down(self):
696 vnfd_helper = VnfdHelper(self.VNFD_0)
697 ssh_helper = mock.Mock()
698 scenario_helper = mock.Mock()
699 scenario_helper.nodes = [None, None]
700 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
701 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
702 dpdk_setup_helper.dpdk_bind_helper.used_drivers = {
703 'd1': ['0000:05:00.0'],
704 'd3': ['0000:05:01.0'],
707 self.assertIsNone(dpdk_setup_helper.tear_down())
708 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True)
709 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0'], 'd3', True)
712 class TestResourceHelper(unittest.TestCase):
715 'short-name': 'VpeVnf',
720 'network': '152.16.100.20',
721 'netmask': '255.255.255.0',
722 'gateway': '152.16.100.20',
726 'network': '152.16.40.20',
727 'netmask': '255.255.255.0',
728 'gateway': '152.16.40.20',
732 'description': 'VPE approximation using DPDK',
733 'name': 'vpevnf-baremetal',
736 'network': '0064:ff9b:0:0:0:0:9810:6414',
738 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
742 'network': '0064:ff9b:0:0:0:0:9810:2814',
744 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
748 'id': 'vpevnf-baremetal',
749 'external-interface': [
751 'virtual-interface': {
752 'dst_mac': '00:00:00:00:00:03',
753 'vpci': '0000:05:00.0',
755 'local_ip': '152.16.100.19',
756 'type': 'PCI-PASSTHROUGH',
757 'netmask': '255.255.255.0',
759 'bandwidth': '10 Gbps',
760 'dst_ip': '152.16.100.20',
761 'local_mac': '00:00:00:00:00:01'
763 'vnfd-connection-point-ref': 'xe0',
767 'virtual-interface': {
768 'dst_mac': '00:00:00:00:00:04',
769 'vpci': '0000:05:00.1',
771 'local_ip': '152.16.40.19',
772 'type': 'PCI-PASSTHROUGH',
773 'netmask': '255.255.255.0',
775 'bandwidth': '10 Gbps',
776 'dst_ip': '152.16.40.20',
777 'local_mac': '00:00:00:00:00:02'
779 'vnfd-connection-point-ref': 'xe1',
785 'description': 'Vpe approximation using DPDK',
787 'vdu-id': 'vpevnf-baremetal',
800 'connection-point': [
810 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
813 def test_setup(self):
815 vnfd_helper = VnfdHelper(self.VNFD_0)
816 ssh_helper = mock.Mock()
817 scenario_helper = mock.Mock()
818 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
819 dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
820 resource_helper = ResourceHelper(dpdk_setup_helper)
822 self.assertIsNone(resource_helper.setup())
823 self.assertIs(resource_helper.resource, resource)
825 def test_generate_cfg(self):
826 vnfd_helper = VnfdHelper(self.VNFD_0)
827 ssh_helper = mock.Mock()
828 scenario_helper = mock.Mock()
829 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
830 resource_helper = ResourceHelper(dpdk_setup_helper)
832 self.assertIsNone(resource_helper.generate_cfg())
834 def test_stop_collect(self):
835 vnfd_helper = VnfdHelper(self.VNFD_0)
836 ssh_helper = mock.Mock()
837 scenario_helper = mock.Mock()
838 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
839 resource_helper = ResourceHelper(dpdk_setup_helper)
840 resource_helper.resource = mock.Mock()
842 self.assertIsNone(resource_helper.stop_collect())
844 def test_stop_collect_none(self):
845 vnfd_helper = VnfdHelper(self.VNFD_0)
846 ssh_helper = mock.Mock()
847 scenario_helper = mock.Mock()
848 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
849 resource_helper = ResourceHelper(dpdk_setup_helper)
850 resource_helper.resource = None
852 self.assertIsNone(resource_helper.stop_collect())
855 class TestClientResourceHelper(unittest.TestCase):
858 'short-name': 'VpeVnf',
863 'network': '152.16.100.20',
864 'netmask': '255.255.255.0',
865 'gateway': '152.16.100.20',
869 'network': '152.16.40.20',
870 'netmask': '255.255.255.0',
871 'gateway': '152.16.40.20',
875 'description': 'VPE approximation using DPDK',
876 'name': 'vpevnf-baremetal',
879 'network': '0064:ff9b:0:0:0:0:9810:6414',
881 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
885 'network': '0064:ff9b:0:0:0:0:9810:2814',
887 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
891 'id': 'vpevnf-baremetal',
892 'external-interface': [
894 'virtual-interface': {
895 'dst_mac': '00:00:00:00:00:03',
896 'vpci': '0000:05:00.0',
898 'local_ip': '152.16.100.19',
899 'type': 'PCI-PASSTHROUGH',
900 'netmask': '255.255.255.0',
902 'bandwidth': '10 Gbps',
903 'dst_ip': '152.16.100.20',
904 'local_mac': '00:00:00:00:00:01',
905 'vld_id': 'uplink_0',
908 'vnfd-connection-point-ref': 'xe0',
912 'virtual-interface': {
913 'dst_mac': '00:00:00:00:00:04',
914 'vpci': '0000:05:00.1',
916 'local_ip': '152.16.40.19',
917 'type': 'PCI-PASSTHROUGH',
918 'netmask': '255.255.255.0',
920 'bandwidth': '10 Gbps',
921 'dst_ip': '152.16.40.20',
922 'local_mac': '00:00:00:00:00:02',
923 'vld_id': 'downlink_0',
926 'vnfd-connection-point-ref': 'xe1',
930 'virtual-interface': {
931 'dst_mac': '00:00:00:00:00:13',
932 'vpci': '0000:05:00.2',
934 'local_ip': '152.16.40.19',
935 'type': 'PCI-PASSTHROUGH',
936 'netmask': '255.255.255.0',
938 'bandwidth': '10 Gbps',
939 'dst_ip': '152.16.40.30',
940 'local_mac': '00:00:00:00:00:11'
942 'vnfd-connection-point-ref': 'xe2',
948 'description': 'Vpe approximation using DPDK',
950 'vdu-id': 'vpevnf-baremetal',
963 'connection-point': [
973 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
977 'vnfd:vnfd-catalog': {
984 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
985 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
986 new_callable=lambda: MockError)
987 def test_get_stats_not_connected(self, mock_state_error, *args):
988 vnfd_helper = VnfdHelper(self.VNFD_0)
989 ssh_helper = mock.Mock()
990 scenario_helper = mock.Mock()
991 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
992 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
993 client_resource_helper.client = mock.MagicMock()
994 client_resource_helper.client.get_stats.side_effect = mock_state_error
996 self.assertEqual(client_resource_helper.get_stats(), {})
997 self.assertEqual(client_resource_helper.client.get_stats.call_count, 1)
999 def test_generate_samples(self):
1000 vnfd_helper = VnfdHelper(self.VNFD_0)
1001 ssh_helper = mock.Mock()
1002 scenario_helper = mock.Mock()
1003 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1004 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1005 client_resource_helper.client = mock.MagicMock()
1006 client_resource_helper.client.get_stats.return_value = {
1024 "rx_throughput_fps": 5.5,
1025 "tx_throughput_fps": 4.9,
1026 "rx_throughput_mbps": 234.78,
1027 "tx_throughput_mbps": 243.11,
1028 "in_packets": 34251,
1029 "out_packets": 52342,
1032 "rx_throughput_fps": 0.0,
1033 "tx_throughput_fps": 5.9,
1034 "rx_throughput_mbps": 434.78,
1035 "tx_throughput_mbps": 0.0,
1037 "out_packets": 48791,
1040 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1041 result = client_resource_helper.generate_samples(ports)
1042 self.assertDictEqual(result, expected)
1044 def test_generate_samples_with_key(self):
1045 vnfd_helper = VnfdHelper(self.VNFD_0)
1046 ssh_helper = mock.Mock()
1047 scenario_helper = mock.Mock()
1048 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1049 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1050 client_resource_helper.client = mock.MagicMock()
1051 client_resource_helper.client.get_stats.return_value = {
1052 'key_name': 'key_value',
1070 'key_name': 'key_value',
1071 "rx_throughput_fps": 5.5,
1072 "tx_throughput_fps": 4.9,
1073 "rx_throughput_mbps": 234.78,
1074 "tx_throughput_mbps": 243.11,
1075 "in_packets": 34251,
1076 "out_packets": 52342,
1079 'key_name': 'key_value',
1080 "rx_throughput_fps": 0.0,
1081 "tx_throughput_fps": 5.9,
1082 "rx_throughput_mbps": 434.78,
1083 "tx_throughput_mbps": 0.0,
1085 "out_packets": 48791,
1088 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1089 result = client_resource_helper.generate_samples(ports, 'key_name')
1090 self.assertDictEqual(result, expected)
1092 def test_generate_samples_with_key_and_default(self):
1093 vnfd_helper = VnfdHelper(self.VNFD_0)
1094 ssh_helper = mock.Mock()
1095 scenario_helper = mock.Mock()
1096 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1097 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1098 client_resource_helper.client = mock.MagicMock()
1099 client_resource_helper.client.get_stats.return_value = {
1117 'key_name': 'default',
1118 "rx_throughput_fps": 5.5,
1119 "tx_throughput_fps": 4.9,
1120 "rx_throughput_mbps": 234.78,
1121 "tx_throughput_mbps": 243.11,
1122 "in_packets": 34251,
1123 "out_packets": 52342,
1126 'key_name': 'default',
1127 "rx_throughput_fps": 0.0,
1128 "tx_throughput_fps": 5.9,
1129 "rx_throughput_mbps": 434.78,
1130 "tx_throughput_mbps": 0.0,
1132 "out_packets": 48791,
1135 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1136 result = client_resource_helper.generate_samples(ports, 'key_name', 'default')
1137 self.assertDictEqual(result, expected)
1139 def test_clear_stats(self):
1140 vnfd_helper = VnfdHelper(self.VNFD_0)
1141 ssh_helper = mock.Mock()
1142 scenario_helper = mock.Mock()
1143 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1144 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1145 client_resource_helper.client = mock.Mock()
1147 self.assertIsNone(client_resource_helper.clear_stats())
1148 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1150 def test_clear_stats_of_ports(self):
1151 vnfd_helper = VnfdHelper(self.VNFD_0)
1152 ssh_helper = mock.Mock()
1153 scenario_helper = mock.Mock()
1154 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1155 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1156 client_resource_helper.client = mock.Mock()
1158 self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
1159 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1161 def test_start(self):
1162 vnfd_helper = VnfdHelper(self.VNFD_0)
1163 ssh_helper = mock.Mock()
1164 scenario_helper = mock.Mock()
1165 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1166 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1167 client_resource_helper.client = mock.Mock()
1169 self.assertIsNone(client_resource_helper.start())
1170 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1172 def test_start_ports(self):
1173 vnfd_helper = VnfdHelper(self.VNFD_0)
1174 ssh_helper = mock.Mock()
1175 scenario_helper = mock.Mock()
1176 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1177 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1178 client_resource_helper.client = mock.Mock()
1180 self.assertIsNone(client_resource_helper.start([3, 4]))
1181 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1183 def test_collect_kpi_with_queue(self):
1184 vnfd_helper = VnfdHelper(self.VNFD_0)
1185 ssh_helper = mock.Mock()
1186 scenario_helper = mock.Mock()
1187 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1188 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1189 client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1190 client_resource_helper._queue = mock.Mock()
1191 client_resource_helper._queue.empty.return_value = False
1192 client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1199 result = client_resource_helper.collect_kpi()
1200 self.assertDictEqual(result, expected)
1202 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1203 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1204 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1205 new_callable=lambda: MockError)
1206 def test__connect_with_failures(self, mock_error, *args):
1207 vnfd_helper = VnfdHelper(self.VNFD_0)
1208 ssh_helper = mock.Mock()
1209 scenario_helper = mock.Mock()
1210 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1211 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1212 client = mock.MagicMock()
1213 client.connect.side_effect = mock_error
1215 self.assertIs(client_resource_helper._connect(client), client)
1218 class TestRfc2544ResourceHelper(unittest.TestCase):
1222 'correlated_traffic': True,
1223 'allowed_drop_rate': '0.1 - 0.15',
1227 'allowed_drop_rate': ' 0.25 - 0.05 ',
1231 'allowed_drop_rate': '0.2',
1240 'rfc2544': RFC2544_CFG_1,
1246 'rfc2544': RFC2544_CFG_2,
1252 'rfc2544': RFC2544_CFG_3,
1258 'rfc2544': RFC2544_CFG_4,
1262 def test_property_rfc2544(self):
1263 scenario_helper = ScenarioHelper('name1')
1264 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1265 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1267 self.assertIsNone(rfc2544_resource_helper._rfc2544)
1268 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1269 self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1270 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1271 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1273 def test_property_tolerance_high(self):
1274 scenario_helper = ScenarioHelper('name1')
1275 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1276 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1278 self.assertIsNone(rfc2544_resource_helper._tolerance_high)
1279 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1280 self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1281 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1282 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1284 def test_property_tolerance_low(self):
1285 scenario_helper = ScenarioHelper('name1')
1286 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1287 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1289 self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1290 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1291 self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1292 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1293 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1295 def test_property_tolerance_high_range_swap(self):
1296 scenario_helper = ScenarioHelper('name1')
1297 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1298 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1300 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1302 def test_property_tolerance_low_range_swap(self):
1303 scenario_helper = ScenarioHelper('name1')
1304 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1305 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1307 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1309 def test_property_tolerance_high_not_range(self):
1310 scenario_helper = ScenarioHelper('name1')
1311 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1312 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1314 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1316 def test_property_tolerance_low_not_range(self):
1317 scenario_helper = ScenarioHelper('name1')
1318 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1319 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1321 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1323 def test_property_tolerance_high_default(self):
1324 scenario_helper = ScenarioHelper('name1')
1325 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1326 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1328 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1330 def test_property_tolerance_low_default(self):
1331 scenario_helper = ScenarioHelper('name1')
1332 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1333 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1335 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1337 def test_property_latency(self):
1338 scenario_helper = ScenarioHelper('name1')
1339 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1340 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1342 self.assertIsNone(rfc2544_resource_helper._latency)
1343 self.assertTrue(rfc2544_resource_helper.latency)
1344 self.assertTrue(rfc2544_resource_helper._latency)
1345 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1346 self.assertTrue(rfc2544_resource_helper.latency)
1348 def test_property_latency_default(self):
1349 scenario_helper = ScenarioHelper('name1')
1350 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1351 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1353 self.assertFalse(rfc2544_resource_helper.latency)
1355 def test_property_correlated_traffic(self):
1356 scenario_helper = ScenarioHelper('name1')
1357 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1358 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1360 self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1361 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1362 self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1363 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1364 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1366 def test_property_correlated_traffic_default(self):
1367 scenario_helper = ScenarioHelper('name1')
1368 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1369 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1371 self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1374 class TestSampleVNFDeployHelper(unittest.TestCase):
1376 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1377 @mock.patch('subprocess.check_output')
1378 def test_deploy_vnfs_disabled(self, *_):
1379 vnfd_helper = mock.Mock()
1380 ssh_helper = mock.Mock()
1381 ssh_helper.join_bin_path.return_value = 'joined_path'
1382 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1383 ssh_helper.put.return_value = None
1384 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1386 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1387 sample_vnf_deploy_helper.DISABLE_DEPLOY = True
1388 self.assertEqual(ssh_helper.execute.call_count, 5)
1389 self.assertEqual(ssh_helper.put.call_count, 1)
1391 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1392 @mock.patch('subprocess.check_output')
1393 def test_deploy_vnfs(self, *args):
1394 vnfd_helper = mock.Mock()
1395 ssh_helper = mock.Mock()
1396 ssh_helper.join_bin_path.return_value = 'joined_path'
1397 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1398 ssh_helper.put.return_value = None
1399 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1400 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1402 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1403 self.assertEqual(ssh_helper.execute.call_count, 5)
1404 self.assertEqual(ssh_helper.put.call_count, 1)
1406 @mock.patch('subprocess.check_output')
1407 def test_deploy_vnfs_early_success(self, *args):
1408 vnfd_helper = mock.Mock()
1409 ssh_helper = mock.Mock()
1410 ssh_helper.join_bin_path.return_value = 'joined_path'
1411 ssh_helper.execute.return_value = 0, 'output', ''
1412 ssh_helper.put.return_value = None
1413 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1414 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1416 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1417 self.assertEqual(ssh_helper.execute.call_count, 1)
1418 self.assertEqual(ssh_helper.put.call_count, 0)
1421 class TestScenarioHelper(unittest.TestCase):
1423 def test_property_task_path(self):
1424 scenario_helper = ScenarioHelper('name1')
1425 scenario_helper.scenario_cfg = {
1426 'task_path': 'my_path',
1429 self.assertEqual(scenario_helper.task_path, 'my_path')
1431 def test_property_nodes(self):
1432 nodes = ['node1', 'node2']
1433 scenario_helper = ScenarioHelper('name1')
1434 scenario_helper.scenario_cfg = {
1438 self.assertEqual(scenario_helper.nodes, nodes)
1440 def test_property_all_options(self):
1447 scenario_helper = ScenarioHelper('name1')
1448 scenario_helper.scenario_cfg = {
1452 self.assertDictEqual(scenario_helper.all_options, data)
1454 def test_property_options(self):
1459 scenario_helper = ScenarioHelper('name1')
1460 scenario_helper.scenario_cfg = {
1466 self.assertDictEqual(scenario_helper.options, data)
1468 def test_property_vnf_cfg(self):
1469 scenario_helper = ScenarioHelper('name1')
1470 scenario_helper.scenario_cfg = {
1473 'vnf_config': 'my_config',
1478 self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1480 def test_property_vnf_cfg_default(self):
1481 scenario_helper = ScenarioHelper('name1')
1482 scenario_helper.scenario_cfg = {
1488 self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1490 def test_property_topology(self):
1491 scenario_helper = ScenarioHelper('name1')
1492 scenario_helper.scenario_cfg = {
1493 'topology': 'my_topology',
1496 self.assertEqual(scenario_helper.topology, 'my_topology')
1499 class TestSampleVnf(unittest.TestCase):
1502 'short-name': 'VpeVnf',
1507 'network': '152.16.100.20',
1508 'netmask': '255.255.255.0',
1509 'gateway': '152.16.100.20',
1513 'network': '152.16.40.20',
1514 'netmask': '255.255.255.0',
1515 'gateway': '152.16.40.20',
1519 'description': 'VPE approximation using DPDK',
1520 'name': 'vpevnf-baremetal',
1523 'network': '0064:ff9b:0:0:0:0:9810:6414',
1525 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1529 'network': '0064:ff9b:0:0:0:0:9810:2814',
1531 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1535 'id': 'vpevnf-baremetal',
1536 'external-interface': [
1538 'virtual-interface': {
1539 'dst_mac': '00:00:00:00:00:03',
1540 'vpci': '0000:05:00.0',
1541 'local_ip': '152.16.100.19',
1542 'type': 'PCI-PASSTHROUGH',
1543 'netmask': '255.255.255.0',
1545 'bandwidth': '10 Gbps',
1546 'dst_ip': '152.16.100.20',
1547 'local_mac': '00:00:00:00:00:01'
1549 'vnfd-connection-point-ref': 'xe0',
1553 'virtual-interface': {
1554 'dst_mac': '00:00:00:00:00:04',
1555 'vpci': '0000:05:00.1',
1556 'local_ip': '152.16.40.19',
1557 'type': 'PCI-PASSTHROUGH',
1558 'netmask': '255.255.255.0',
1560 'bandwidth': '10 Gbps',
1561 'dst_ip': '152.16.40.20',
1562 'local_mac': '00:00:00:00:00:02'
1564 'vnfd-connection-point-ref': 'xe1',
1570 'description': 'Vpe approximation using DPDK',
1572 'vdu-id': 'vpevnf-baremetal',
1585 'connection-point': [
1595 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1599 'vnfd:vnfd-catalog': {
1607 "schema": "isb:traffic_profile:0.1",
1609 "description": "Fixed traffic profile to run UDP traffic",
1610 "traffic_profile": {
1611 "traffic_type": "FixedTraffic",
1612 "frame_rate": 100, # pps
1618 def test___init__(self):
1619 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1621 self.assertEqual(sample_vnf.name, 'vnf1')
1622 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1624 # test the default setup helper is SetupEnvHelper, not subclass
1625 self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1627 # test the default resource helper is ResourceHelper, not subclass
1628 self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1630 def test___init___alt_types(self):
1631 class MySetupEnvHelper(SetupEnvHelper):
1634 class MyResourceHelper(ResourceHelper):
1637 sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1639 self.assertEqual(sample_vnf.name, 'vnf1')
1640 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1642 # test the default setup helper is MySetupEnvHelper, not subclass
1643 self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1645 # test the default resource helper is MyResourceHelper, not subclass
1646 self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1648 def test__get_port0localip6(self):
1649 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1650 expected = '0064:ff9b:0:0:0:0:9810:6414'
1651 result = sample_vnf._get_port0localip6()
1652 self.assertEqual(result, expected)
1654 def test__get_port1localip6(self):
1655 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1656 expected = '0064:ff9b:0:0:0:0:9810:2814'
1657 result = sample_vnf._get_port1localip6()
1658 self.assertEqual(result, expected)
1660 def test__get_port0prefixip6(self):
1661 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1663 result = sample_vnf._get_port0prefixlen6()
1664 self.assertEqual(result, expected)
1666 def test__get_port1prefixip6(self):
1667 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1669 result = sample_vnf._get_port1prefixlen6()
1670 self.assertEqual(result, expected)
1672 def test__get_port0gateway6(self):
1673 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1674 expected = '0064:ff9b:0:0:0:0:9810:6414'
1675 result = sample_vnf._get_port0gateway6()
1676 self.assertEqual(result, expected)
1678 def test__get_port1gateway6(self):
1679 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1680 expected = '0064:ff9b:0:0:0:0:9810:2814'
1681 result = sample_vnf._get_port1gateway6()
1682 self.assertEqual(result, expected)
1684 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1685 def test__start_vnf(self, *args):
1686 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1687 sample_vnf = SampleVNF('vnf1', vnfd)
1688 sample_vnf._run = mock.Mock()
1690 self.assertIsNone(sample_vnf.queue_wrapper)
1691 self.assertIsNone(sample_vnf._vnf_process)
1692 self.assertIsNone(sample_vnf._start_vnf())
1693 self.assertIsNotNone(sample_vnf.queue_wrapper)
1694 self.assertIsNotNone(sample_vnf._vnf_process)
1696 @mock.patch("yardstick.ssh.SSH")
1697 def test_instantiate(self, ssh):
1705 context1 = mock.Mock()
1706 context1._get_server.return_value = None
1707 context2 = mock.Mock()
1708 context2._get_server.return_value = context2
1711 Context.list.clear()
1712 except AttributeError:
1713 # clear() but works in Py2.7
1714 Context.list[:] = []
1716 Context.list.extend([
1721 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1722 sample_vnf = SampleVNF('vnf1', vnfd)
1723 sample_vnf.APP_NAME = 'sample1'
1724 sample_vnf._start_server = mock.Mock(return_value=0)
1725 sample_vnf._vnf_process = mock.MagicMock()
1726 sample_vnf._vnf_process._is_alive.return_value = 1
1727 sample_vnf.ssh_helper = mock.MagicMock()
1728 sample_vnf.deploy_helper = mock.MagicMock()
1729 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1734 self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1735 self.assertEqual(sample_vnf.nfvi_context, context2)
1737 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1738 @mock.patch("yardstick.ssh.SSH")
1739 def test_wait_for_instantiate_empty_queue(self, ssh, *args):
1740 mock_ssh(ssh, exec_result=(1, "", ""))
1754 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1755 sample_vnf = SampleVNF('vnf1', vnfd)
1756 sample_vnf.APP_NAME = 'sample1'
1757 sample_vnf.WAIT_TIME_FOR_SCRIPT = 0
1758 sample_vnf._start_server = mock.Mock(return_value=0)
1759 sample_vnf._vnf_process = mock.MagicMock()
1760 sample_vnf._vnf_process.exitcode = 0
1761 sample_vnf._vnf_process._is_alive.return_value = 1
1762 sample_vnf.queue_wrapper = mock.Mock()
1763 sample_vnf.q_out = mock.Mock()
1764 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1765 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1766 sample_vnf.ssh_helper = mock.MagicMock()
1767 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1768 sample_vnf.resource_helper.start_collect = mock.MagicMock()
1770 self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1772 def test__build_ports(self):
1773 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1774 sample_vnf = SampleVNF('vnf1', vnfd)
1776 self.assertIsNone(sample_vnf._build_ports())
1777 self.assertIsNotNone(sample_vnf.networks)
1778 self.assertIsNotNone(sample_vnf.uplink_ports)
1779 self.assertIsNotNone(sample_vnf.downlink_ports)
1780 self.assertIsNotNone(sample_vnf.my_ports)
1782 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1783 def test_vnf_execute_with_queue_data(self, *args):
1795 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1796 sample_vnf = SampleVNF('vnf1', vnfd)
1797 sample_vnf.APP_NAME = 'sample1'
1798 sample_vnf.q_out = mock.Mock()
1799 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1800 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1802 self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1804 def test_terminate_without_vnf_process(self):
1805 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1806 sample_vnf = SampleVNF('vnf1', vnfd)
1807 sample_vnf.APP_NAME = 'sample1'
1808 sample_vnf.vnf_execute = mock.Mock()
1809 sample_vnf.ssh_helper = mock.Mock()
1810 sample_vnf._tear_down = mock.Mock()
1811 sample_vnf.resource_helper = mock.Mock()
1813 self.assertIsNone(sample_vnf.terminate())
1815 def test_get_stats(self):
1816 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1817 sample_vnf = SampleVNF('vnf1', vnfd)
1818 sample_vnf.APP_NAME = 'sample1'
1819 sample_vnf.APP_WORD = 'sample1'
1820 sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1822 self.assertEqual(sample_vnf.get_stats(), 'the stats')
1824 def test_collect_kpi(self):
1825 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1826 sample_vnf = SampleVNF('vnf1', vnfd)
1827 sample_vnf.APP_NAME = 'sample1'
1828 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1829 sample_vnf.COLLECT_MAP = {
1834 sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
1835 sample_vnf.resource_helper = mock.Mock()
1836 sample_vnf.resource_helper.collect_kpi.return_value = {}
1842 'collect_stats': {},
1844 result = sample_vnf.collect_kpi()
1845 self.assertDictEqual(result, expected)
1847 def test_collect_kpi_default(self):
1848 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1849 sample_vnf = SampleVNF('vnf1', vnfd)
1850 sample_vnf.APP_NAME = 'sample1'
1851 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1852 sample_vnf.get_stats = mock.Mock(return_value='')
1857 'packets_dropped': 0,
1859 result = sample_vnf.collect_kpi()
1860 self.assertDictEqual(result, expected)
1862 def test_scale(self):
1863 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1864 sample_vnf = SampleVNF('vnf1', vnfd)
1865 self.assertRaises(y_exceptions.FunctionNotImplemented,
1868 def test__run(self):
1869 test_cmd = 'test cmd'
1870 run_kwargs = {'arg1': 'val1', 'arg2': 'val2'}
1871 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1872 sample_vnf = SampleVNF('vnf1', vnfd)
1873 sample_vnf.ssh_helper = mock.Mock()
1874 sample_vnf.setup_helper = mock.Mock()
1875 with mock.patch.object(sample_vnf, '_build_config',
1876 return_value=test_cmd), \
1877 mock.patch.object(sample_vnf, '_build_run_kwargs'):
1878 sample_vnf.run_kwargs = run_kwargs
1880 sample_vnf.ssh_helper.drop_connection.assert_called_once()
1881 sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd,
1883 sample_vnf.setup_helper.kill_vnf.assert_called_once()
1886 class TestSampleVNFTrafficGen(unittest.TestCase):
1889 'short-name': 'VpeVnf',
1894 'network': '152.16.100.20',
1895 'netmask': '255.255.255.0',
1896 'gateway': '152.16.100.20',
1900 'network': '152.16.40.20',
1901 'netmask': '255.255.255.0',
1902 'gateway': '152.16.40.20',
1906 'description': 'VPE approximation using DPDK',
1907 'name': 'vpevnf-baremetal',
1910 'network': '0064:ff9b:0:0:0:0:9810:6414',
1912 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1916 'network': '0064:ff9b:0:0:0:0:9810:2814',
1918 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1922 'id': 'vpevnf-baremetal',
1923 'external-interface': [
1925 'virtual-interface': {
1926 'dst_mac': '00:00:00:00:00:03',
1927 'vpci': '0000:05:00.0',
1929 'local_ip': '152.16.100.19',
1930 'type': 'PCI-PASSTHROUGH',
1931 'netmask': '255.255.255.0',
1933 'bandwidth': '10 Gbps',
1934 'dst_ip': '152.16.100.20',
1935 'local_mac': '00:00:00:00:00:01'
1937 'vnfd-connection-point-ref': 'xe0',
1941 'virtual-interface': {
1942 'dst_mac': '00:00:00:00:00:04',
1943 'vpci': '0000:05:00.1',
1945 'local_ip': '152.16.40.19',
1946 'type': 'PCI-PASSTHROUGH',
1947 'netmask': '255.255.255.0',
1949 'bandwidth': '10 Gbps',
1950 'dst_ip': '152.16.40.20',
1951 'local_mac': '00:00:00:00:00:02'
1953 'vnfd-connection-point-ref': 'xe1',
1959 'description': 'Vpe approximation using DPDK',
1961 'vdu-id': 'vpevnf-baremetal',
1974 'connection-point': [
1984 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1988 'vnfd:vnfd-catalog': {
1996 "schema": "isb:traffic_profile:0.1",
1998 "description": "Fixed traffic profile to run UDP traffic",
1999 "traffic_profile": {
2000 "traffic_type": "FixedTraffic",
2001 "frame_rate": 100, # pps
2007 def test__check_status(self):
2008 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2010 with self.assertRaises(NotImplementedError):
2011 sample_vnf_tg._check_status()
2013 def test_listen_traffic(self):
2014 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2016 sample_vnf_tg.listen_traffic(mock.Mock())
2018 def test_verify_traffic(self):
2019 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2021 sample_vnf_tg.verify_traffic(mock.Mock())
2023 def test_terminate(self):
2024 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2025 sample_vnf_tg._traffic_process = mock.Mock()
2026 sample_vnf_tg._tg_process = mock.Mock()
2028 sample_vnf_tg.terminate()
2030 def test__wait_for_process(self):
2031 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2032 with mock.patch.object(sample_vnf_tg, '_check_status',
2033 return_value=0) as mock_status, \
2034 mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2035 mock_proc.is_alive.return_value = True
2036 mock_proc.exitcode = 234
2037 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2038 mock_proc.is_alive.assert_called_once()
2039 mock_status.assert_called_once()
2041 def test__wait_for_process_not_alive(self):
2042 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2043 with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2044 mock_proc.is_alive.return_value = False
2045 self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process)
2046 mock_proc.is_alive.assert_called_once()
2048 def test__wait_for_process_delayed(self):
2049 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2050 with mock.patch.object(sample_vnf_tg, '_check_status',
2051 side_effect=[1, 0]) as mock_status, \
2052 mock.patch.object(sample_vnf_tg,
2053 '_tg_process') as mock_proc:
2054 mock_proc.is_alive.return_value = True
2055 mock_proc.exitcode = 234
2056 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2057 mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()])
2058 mock_status.assert_has_calls([mock.call(), mock.call()])
2060 def test_scale(self):
2061 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2062 self.assertRaises(y_exceptions.FunctionNotImplemented,
2063 sample_vnf_tg.scale)