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.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 dpdk_vnf_setup_env_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, mock.Mock())
620 dpdk_vnf_setup_env_helper._validate_cpu_cfg = mock.Mock(return_value=[])
622 with mock.patch.object(dpdk_vnf_setup_env_helper, '_setup_dpdk'):
623 self.assertIsInstance(
624 dpdk_vnf_setup_env_helper.setup_vnf_environment(),
627 def test__setup_dpdk(self):
628 ssh_helper = mock.Mock()
629 ssh_helper.execute = mock.Mock()
630 ssh_helper.execute.return_value = (0, 0, 0)
631 dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
632 with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
634 dpdk_setup_helper._setup_dpdk()
635 mock_setup_hp.assert_called_once()
636 ssh_helper.execute.assert_has_calls([
637 mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
638 mock.call('lsmod | grep -i igb_uio')
641 def test__setup_dpdk_igb_uio_not_loaded(self):
642 ssh_helper = mock.Mock()
643 ssh_helper.execute = mock.Mock()
644 ssh_helper.execute.side_effect = [(0, 0, 0), (1, 0, 0)]
645 dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
646 with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
648 with self.assertRaises(y_exceptions.DPDKSetupDriverError):
649 dpdk_setup_helper._setup_dpdk()
650 mock_setup_hp.assert_called_once()
651 ssh_helper.execute.assert_has_calls([
652 mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
653 mock.call('lsmod | grep -i igb_uio')
656 @mock.patch('yardstick.ssh.SSH')
657 def test__setup_resources(self, _):
658 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
659 ssh_helper = mock.Mock()
660 scenario_helper = mock.Mock()
661 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
662 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
664 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
665 vnfd_helper.interfaces]
666 result = dpdk_setup_helper._setup_resources()
667 self.assertIsInstance(result, ResourceProfile)
668 self.assertEqual(dpdk_setup_helper.socket, 0)
670 @mock.patch('yardstick.ssh.SSH')
671 def test__setup_resources_socket_1(self, _):
672 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
673 vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0'
674 vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0'
675 ssh_helper = mock.Mock()
676 scenario_helper = mock.Mock()
677 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
678 dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
680 dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
681 vnfd_helper.interfaces]
682 result = dpdk_setup_helper._setup_resources()
683 self.assertIsInstance(result, ResourceProfile)
684 self.assertEqual(dpdk_setup_helper.socket, 1)
686 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
687 def test__detect_and_bind_drivers(self, *args):
688 vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
689 ssh_helper = mock.Mock()
690 # ssh_helper.execute = mock.Mock(return_value = (0, 'text', ''))
691 # ssh_helper.execute.return_value = 0, 'output', ''
692 scenario_helper = mock.Mock()
693 rv = ['0000:05:00.1', '0000:05:00.0']
695 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
696 dpdk_setup_helper.dpdk_bind_helper._get_bound_pci_addresses = mock.Mock(return_value=rv)
697 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
698 dpdk_setup_helper.dpdk_bind_helper.read_status = mock.Mock()
700 self.assertIsNone(dpdk_setup_helper._detect_and_bind_drivers())
702 intf_0 = vnfd_helper.vdu[0]['external-interface'][0]['virtual-interface']
703 intf_1 = vnfd_helper.vdu[0]['external-interface'][1]['virtual-interface']
704 self.assertEqual(0, intf_0['dpdk_port_num'])
705 self.assertEqual(1, intf_1['dpdk_port_num'])
707 def test_tear_down(self):
708 vnfd_helper = VnfdHelper(self.VNFD_0)
709 ssh_helper = mock.Mock()
710 scenario_helper = mock.Mock()
711 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
712 dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
713 dpdk_setup_helper.dpdk_bind_helper.used_drivers = {
714 'd1': ['0000:05:00.0'],
715 'd3': ['0000:05:01.0'],
718 self.assertIsNone(dpdk_setup_helper.tear_down())
719 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True)
720 dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0'], 'd3', True)
723 class TestResourceHelper(unittest.TestCase):
726 'short-name': 'VpeVnf',
731 'network': '152.16.100.20',
732 'netmask': '255.255.255.0',
733 'gateway': '152.16.100.20',
737 'network': '152.16.40.20',
738 'netmask': '255.255.255.0',
739 'gateway': '152.16.40.20',
743 'description': 'VPE approximation using DPDK',
744 'name': 'vpevnf-baremetal',
747 'network': '0064:ff9b:0:0:0:0:9810:6414',
749 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
753 'network': '0064:ff9b:0:0:0:0:9810:2814',
755 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
759 'id': 'vpevnf-baremetal',
760 'external-interface': [
762 'virtual-interface': {
763 'dst_mac': '00:00:00:00:00:03',
764 'vpci': '0000:05:00.0',
766 'local_ip': '152.16.100.19',
767 'type': 'PCI-PASSTHROUGH',
768 'netmask': '255.255.255.0',
770 'bandwidth': '10 Gbps',
771 'dst_ip': '152.16.100.20',
772 'local_mac': '00:00:00:00:00:01'
774 'vnfd-connection-point-ref': 'xe0',
778 'virtual-interface': {
779 'dst_mac': '00:00:00:00:00:04',
780 'vpci': '0000:05:00.1',
782 'local_ip': '152.16.40.19',
783 'type': 'PCI-PASSTHROUGH',
784 'netmask': '255.255.255.0',
786 'bandwidth': '10 Gbps',
787 'dst_ip': '152.16.40.20',
788 'local_mac': '00:00:00:00:00:02'
790 'vnfd-connection-point-ref': 'xe1',
796 'description': 'Vpe approximation using DPDK',
798 'vdu-id': 'vpevnf-baremetal',
811 'connection-point': [
821 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
824 def test_setup(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 dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
831 resource_helper = ResourceHelper(dpdk_setup_helper)
833 self.assertIsNone(resource_helper.setup())
834 self.assertIs(resource_helper.resource, resource)
836 def test_generate_cfg(self):
837 vnfd_helper = VnfdHelper(self.VNFD_0)
838 ssh_helper = mock.Mock()
839 scenario_helper = mock.Mock()
840 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
841 resource_helper = ResourceHelper(dpdk_setup_helper)
843 self.assertIsNone(resource_helper.generate_cfg())
845 def test_stop_collect(self):
846 vnfd_helper = VnfdHelper(self.VNFD_0)
847 ssh_helper = mock.Mock()
848 scenario_helper = mock.Mock()
849 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
850 resource_helper = ResourceHelper(dpdk_setup_helper)
851 resource_helper.resource = mock.Mock()
853 self.assertIsNone(resource_helper.stop_collect())
855 def test_stop_collect_none(self):
856 vnfd_helper = VnfdHelper(self.VNFD_0)
857 ssh_helper = mock.Mock()
858 scenario_helper = mock.Mock()
859 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
860 resource_helper = ResourceHelper(dpdk_setup_helper)
861 resource_helper.resource = None
863 self.assertIsNone(resource_helper.stop_collect())
866 class TestClientResourceHelper(unittest.TestCase):
869 'short-name': 'VpeVnf',
874 'network': '152.16.100.20',
875 'netmask': '255.255.255.0',
876 'gateway': '152.16.100.20',
880 'network': '152.16.40.20',
881 'netmask': '255.255.255.0',
882 'gateway': '152.16.40.20',
886 'description': 'VPE approximation using DPDK',
887 'name': 'vpevnf-baremetal',
890 'network': '0064:ff9b:0:0:0:0:9810:6414',
892 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
896 'network': '0064:ff9b:0:0:0:0:9810:2814',
898 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
902 'id': 'vpevnf-baremetal',
903 'external-interface': [
905 'virtual-interface': {
906 'dst_mac': '00:00:00:00:00:03',
907 'vpci': '0000:05:00.0',
909 'local_ip': '152.16.100.19',
910 'type': 'PCI-PASSTHROUGH',
911 'netmask': '255.255.255.0',
913 'bandwidth': '10 Gbps',
914 'dst_ip': '152.16.100.20',
915 'local_mac': '00:00:00:00:00:01',
916 'vld_id': 'uplink_0',
919 'vnfd-connection-point-ref': 'xe0',
923 'virtual-interface': {
924 'dst_mac': '00:00:00:00:00:04',
925 'vpci': '0000:05:00.1',
927 'local_ip': '152.16.40.19',
928 'type': 'PCI-PASSTHROUGH',
929 'netmask': '255.255.255.0',
931 'bandwidth': '10 Gbps',
932 'dst_ip': '152.16.40.20',
933 'local_mac': '00:00:00:00:00:02',
934 'vld_id': 'downlink_0',
937 'vnfd-connection-point-ref': 'xe1',
941 'virtual-interface': {
942 'dst_mac': '00:00:00:00:00:13',
943 'vpci': '0000:05:00.2',
945 'local_ip': '152.16.40.19',
946 'type': 'PCI-PASSTHROUGH',
947 'netmask': '255.255.255.0',
949 'bandwidth': '10 Gbps',
950 'dst_ip': '152.16.40.30',
951 'local_mac': '00:00:00:00:00:11'
953 'vnfd-connection-point-ref': 'xe2',
959 'description': 'Vpe approximation using DPDK',
961 'vdu-id': 'vpevnf-baremetal',
974 'connection-point': [
984 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
988 'vnfd:vnfd-catalog': {
995 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
996 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
997 new_callable=lambda: MockError)
998 def test_get_stats_not_connected(self, mock_state_error, *args):
999 vnfd_helper = VnfdHelper(self.VNFD_0)
1000 ssh_helper = mock.Mock()
1001 scenario_helper = mock.Mock()
1002 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1003 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1004 client_resource_helper.client = mock.MagicMock()
1005 client_resource_helper.client.get_stats.side_effect = mock_state_error
1007 self.assertEqual(client_resource_helper.get_stats(), {})
1008 self.assertEqual(client_resource_helper.client.get_stats.call_count, 1)
1010 def test_generate_samples(self):
1011 vnfd_helper = VnfdHelper(self.VNFD_0)
1012 ssh_helper = mock.Mock()
1013 scenario_helper = mock.Mock()
1014 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1015 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1016 client_resource_helper.client = mock.MagicMock()
1017 client_resource_helper.client.get_stats.return_value = {
1035 "rx_throughput_fps": 5.5,
1036 "tx_throughput_fps": 4.9,
1037 "rx_throughput_mbps": 234.78,
1038 "tx_throughput_mbps": 243.11,
1039 "in_packets": 34251,
1040 "out_packets": 52342,
1043 "rx_throughput_fps": 0.0,
1044 "tx_throughput_fps": 5.9,
1045 "rx_throughput_mbps": 434.78,
1046 "tx_throughput_mbps": 0.0,
1048 "out_packets": 48791,
1051 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1052 result = client_resource_helper.generate_samples(ports)
1053 self.assertDictEqual(result, expected)
1055 def test_generate_samples_with_key(self):
1056 vnfd_helper = VnfdHelper(self.VNFD_0)
1057 ssh_helper = mock.Mock()
1058 scenario_helper = mock.Mock()
1059 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1060 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1061 client_resource_helper.client = mock.MagicMock()
1062 client_resource_helper.client.get_stats.return_value = {
1063 'key_name': 'key_value',
1081 'key_name': 'key_value',
1082 "rx_throughput_fps": 5.5,
1083 "tx_throughput_fps": 4.9,
1084 "rx_throughput_mbps": 234.78,
1085 "tx_throughput_mbps": 243.11,
1086 "in_packets": 34251,
1087 "out_packets": 52342,
1090 'key_name': 'key_value',
1091 "rx_throughput_fps": 0.0,
1092 "tx_throughput_fps": 5.9,
1093 "rx_throughput_mbps": 434.78,
1094 "tx_throughput_mbps": 0.0,
1096 "out_packets": 48791,
1099 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1100 result = client_resource_helper.generate_samples(ports, 'key_name')
1101 self.assertDictEqual(result, expected)
1103 def test_generate_samples_with_key_and_default(self):
1104 vnfd_helper = VnfdHelper(self.VNFD_0)
1105 ssh_helper = mock.Mock()
1106 scenario_helper = mock.Mock()
1107 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1108 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1109 client_resource_helper.client = mock.MagicMock()
1110 client_resource_helper.client.get_stats.return_value = {
1128 'key_name': 'default',
1129 "rx_throughput_fps": 5.5,
1130 "tx_throughput_fps": 4.9,
1131 "rx_throughput_mbps": 234.78,
1132 "tx_throughput_mbps": 243.11,
1133 "in_packets": 34251,
1134 "out_packets": 52342,
1137 'key_name': 'default',
1138 "rx_throughput_fps": 0.0,
1139 "tx_throughput_fps": 5.9,
1140 "rx_throughput_mbps": 434.78,
1141 "tx_throughput_mbps": 0.0,
1143 "out_packets": 48791,
1146 ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1147 result = client_resource_helper.generate_samples(ports, 'key_name', 'default')
1148 self.assertDictEqual(result, expected)
1150 def test_clear_stats(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())
1159 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1161 def test_clear_stats_of_ports(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.clear_stats([3, 4]))
1170 self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1172 def test_start(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())
1181 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1183 def test_start_ports(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.client = mock.Mock()
1191 self.assertIsNone(client_resource_helper.start([3, 4]))
1192 self.assertEqual(client_resource_helper.client.start.call_count, 1)
1194 def test_collect_kpi_with_queue(self):
1195 vnfd_helper = VnfdHelper(self.VNFD_0)
1196 ssh_helper = mock.Mock()
1197 scenario_helper = mock.Mock()
1198 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1199 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1200 client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1201 client_resource_helper._queue = mock.Mock()
1202 client_resource_helper._queue.empty.return_value = False
1203 client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1210 result = client_resource_helper.collect_kpi()
1211 self.assertDictEqual(result, expected)
1213 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1214 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1215 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1216 new_callable=lambda: MockError)
1217 def test__connect_with_failures(self, mock_error, *args):
1218 vnfd_helper = VnfdHelper(self.VNFD_0)
1219 ssh_helper = mock.Mock()
1220 scenario_helper = mock.Mock()
1221 dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1222 client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1223 client = mock.MagicMock()
1224 client.connect.side_effect = mock_error
1226 self.assertIs(client_resource_helper._connect(client), client)
1229 class TestRfc2544ResourceHelper(unittest.TestCase):
1233 'correlated_traffic': True,
1234 'allowed_drop_rate': '0.1 - 0.15',
1238 'allowed_drop_rate': ' 0.25 - 0.05 ',
1242 'allowed_drop_rate': '0.2',
1251 'rfc2544': RFC2544_CFG_1,
1257 'rfc2544': RFC2544_CFG_2,
1263 'rfc2544': RFC2544_CFG_3,
1269 'rfc2544': RFC2544_CFG_4,
1273 def test_property_rfc2544(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._rfc2544)
1279 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1280 self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1281 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1282 self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1284 def test_property_tolerance_high(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_high)
1290 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1291 self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1292 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1293 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1295 def test_property_tolerance_low(self):
1296 scenario_helper = ScenarioHelper('name1')
1297 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1298 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1300 self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1301 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1302 self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1303 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1304 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1306 def test_property_tolerance_high_range_swap(self):
1307 scenario_helper = ScenarioHelper('name1')
1308 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1309 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1311 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1313 def test_property_tolerance_low_range_swap(self):
1314 scenario_helper = ScenarioHelper('name1')
1315 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1316 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1318 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1320 def test_property_tolerance_high_not_range(self):
1321 scenario_helper = ScenarioHelper('name1')
1322 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1323 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1325 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1327 def test_property_tolerance_low_not_range(self):
1328 scenario_helper = ScenarioHelper('name1')
1329 scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1330 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1332 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1334 def test_property_tolerance_high_default(self):
1335 scenario_helper = ScenarioHelper('name1')
1336 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1337 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1339 self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1341 def test_property_tolerance_low_default(self):
1342 scenario_helper = ScenarioHelper('name1')
1343 scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1344 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1346 self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1348 def test_property_latency(self):
1349 scenario_helper = ScenarioHelper('name1')
1350 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1351 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1353 self.assertIsNone(rfc2544_resource_helper._latency)
1354 self.assertTrue(rfc2544_resource_helper.latency)
1355 self.assertTrue(rfc2544_resource_helper._latency)
1356 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1357 self.assertTrue(rfc2544_resource_helper.latency)
1359 def test_property_latency_default(self):
1360 scenario_helper = ScenarioHelper('name1')
1361 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1362 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1364 self.assertFalse(rfc2544_resource_helper.latency)
1366 def test_property_correlated_traffic(self):
1367 scenario_helper = ScenarioHelper('name1')
1368 scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1369 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1371 self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1372 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1373 self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1374 scenario_helper.scenario_cfg = {} # ensure that resource_helper caches
1375 self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1377 def test_property_correlated_traffic_default(self):
1378 scenario_helper = ScenarioHelper('name1')
1379 scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1380 rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1382 self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1385 class TestSampleVNFDeployHelper(unittest.TestCase):
1387 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1388 @mock.patch('subprocess.check_output')
1389 def test_deploy_vnfs_disabled(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)
1397 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1398 sample_vnf_deploy_helper.DISABLE_DEPLOY = True
1399 self.assertEqual(ssh_helper.execute.call_count, 5)
1400 self.assertEqual(ssh_helper.put.call_count, 1)
1402 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1403 @mock.patch('subprocess.check_output')
1404 def test_deploy_vnfs(self, *args):
1405 vnfd_helper = mock.Mock()
1406 ssh_helper = mock.Mock()
1407 ssh_helper.join_bin_path.return_value = 'joined_path'
1408 ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1409 ssh_helper.put.return_value = None
1410 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1411 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1413 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1414 self.assertEqual(ssh_helper.execute.call_count, 5)
1415 self.assertEqual(ssh_helper.put.call_count, 1)
1417 @mock.patch('subprocess.check_output')
1418 def test_deploy_vnfs_early_success(self, *args):
1419 vnfd_helper = mock.Mock()
1420 ssh_helper = mock.Mock()
1421 ssh_helper.join_bin_path.return_value = 'joined_path'
1422 ssh_helper.execute.return_value = 0, 'output', ''
1423 ssh_helper.put.return_value = None
1424 sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1425 sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1427 self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1428 self.assertEqual(ssh_helper.execute.call_count, 1)
1429 self.assertEqual(ssh_helper.put.call_count, 0)
1432 class TestScenarioHelper(unittest.TestCase):
1434 def test_property_task_path(self):
1435 scenario_helper = ScenarioHelper('name1')
1436 scenario_helper.scenario_cfg = {
1437 'task_path': 'my_path',
1440 self.assertEqual(scenario_helper.task_path, 'my_path')
1442 def test_property_nodes(self):
1443 nodes = ['node1', 'node2']
1444 scenario_helper = ScenarioHelper('name1')
1445 scenario_helper.scenario_cfg = {
1449 self.assertEqual(scenario_helper.nodes, nodes)
1451 def test_property_all_options(self):
1458 scenario_helper = ScenarioHelper('name1')
1459 scenario_helper.scenario_cfg = {
1463 self.assertDictEqual(scenario_helper.all_options, data)
1465 def test_property_options(self):
1470 scenario_helper = ScenarioHelper('name1')
1471 scenario_helper.scenario_cfg = {
1477 self.assertDictEqual(scenario_helper.options, data)
1479 def test_property_vnf_cfg(self):
1480 scenario_helper = ScenarioHelper('name1')
1481 scenario_helper.scenario_cfg = {
1484 'vnf_config': 'my_config',
1489 self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1491 def test_property_vnf_cfg_default(self):
1492 scenario_helper = ScenarioHelper('name1')
1493 scenario_helper.scenario_cfg = {
1499 self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1501 def test_property_topology(self):
1502 scenario_helper = ScenarioHelper('name1')
1503 scenario_helper.scenario_cfg = {
1504 'topology': 'my_topology',
1507 self.assertEqual(scenario_helper.topology, 'my_topology')
1510 class TestSampleVnf(unittest.TestCase):
1513 'short-name': 'VpeVnf',
1518 'network': '152.16.100.20',
1519 'netmask': '255.255.255.0',
1520 'gateway': '152.16.100.20',
1524 'network': '152.16.40.20',
1525 'netmask': '255.255.255.0',
1526 'gateway': '152.16.40.20',
1530 'description': 'VPE approximation using DPDK',
1531 'name': 'vpevnf-baremetal',
1534 'network': '0064:ff9b:0:0:0:0:9810:6414',
1536 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1540 'network': '0064:ff9b:0:0:0:0:9810:2814',
1542 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1546 'id': 'vpevnf-baremetal',
1547 'external-interface': [
1549 'virtual-interface': {
1550 'dst_mac': '00:00:00:00:00:03',
1551 'vpci': '0000:05:00.0',
1552 'local_ip': '152.16.100.19',
1553 'type': 'PCI-PASSTHROUGH',
1554 'netmask': '255.255.255.0',
1556 'bandwidth': '10 Gbps',
1557 'dst_ip': '152.16.100.20',
1558 'local_mac': '00:00:00:00:00:01'
1560 'vnfd-connection-point-ref': 'xe0',
1564 'virtual-interface': {
1565 'dst_mac': '00:00:00:00:00:04',
1566 'vpci': '0000:05:00.1',
1567 'local_ip': '152.16.40.19',
1568 'type': 'PCI-PASSTHROUGH',
1569 'netmask': '255.255.255.0',
1571 'bandwidth': '10 Gbps',
1572 'dst_ip': '152.16.40.20',
1573 'local_mac': '00:00:00:00:00:02'
1575 'vnfd-connection-point-ref': 'xe1',
1581 'description': 'Vpe approximation using DPDK',
1583 'vdu-id': 'vpevnf-baremetal',
1596 'connection-point': [
1606 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1610 'vnfd:vnfd-catalog': {
1618 "schema": "isb:traffic_profile:0.1",
1620 "description": "Fixed traffic profile to run UDP traffic",
1621 "traffic_profile": {
1622 "traffic_type": "FixedTraffic",
1623 "frame_rate": 100, # pps
1629 def test___init__(self):
1630 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1632 self.assertEqual(sample_vnf.name, 'vnf1')
1633 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1635 # test the default setup helper is SetupEnvHelper, not subclass
1636 self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1638 # test the default resource helper is ResourceHelper, not subclass
1639 self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1641 def test___init___alt_types(self):
1642 class MySetupEnvHelper(SetupEnvHelper):
1645 class MyResourceHelper(ResourceHelper):
1648 sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1650 self.assertEqual(sample_vnf.name, 'vnf1')
1651 self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1653 # test the default setup helper is MySetupEnvHelper, not subclass
1654 self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1656 # test the default resource helper is MyResourceHelper, not subclass
1657 self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1659 def test__get_port0localip6(self):
1660 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1661 expected = '0064:ff9b:0:0:0:0:9810:6414'
1662 result = sample_vnf._get_port0localip6()
1663 self.assertEqual(result, expected)
1665 def test__get_port1localip6(self):
1666 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1667 expected = '0064:ff9b:0:0:0:0:9810:2814'
1668 result = sample_vnf._get_port1localip6()
1669 self.assertEqual(result, expected)
1671 def test__get_port0prefixip6(self):
1672 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1674 result = sample_vnf._get_port0prefixlen6()
1675 self.assertEqual(result, expected)
1677 def test__get_port1prefixip6(self):
1678 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1680 result = sample_vnf._get_port1prefixlen6()
1681 self.assertEqual(result, expected)
1683 def test__get_port0gateway6(self):
1684 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1685 expected = '0064:ff9b:0:0:0:0:9810:6414'
1686 result = sample_vnf._get_port0gateway6()
1687 self.assertEqual(result, expected)
1689 def test__get_port1gateway6(self):
1690 sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1691 expected = '0064:ff9b:0:0:0:0:9810:2814'
1692 result = sample_vnf._get_port1gateway6()
1693 self.assertEqual(result, expected)
1695 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1696 def test__start_vnf(self, *args):
1697 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1698 sample_vnf = SampleVNF('vnf1', vnfd)
1699 sample_vnf._run = mock.Mock()
1701 self.assertIsNone(sample_vnf.queue_wrapper)
1702 self.assertIsNone(sample_vnf._vnf_process)
1703 self.assertIsNone(sample_vnf._start_vnf())
1704 self.assertIsNotNone(sample_vnf.queue_wrapper)
1705 self.assertIsNotNone(sample_vnf._vnf_process)
1707 @mock.patch("yardstick.ssh.SSH")
1708 def test_instantiate(self, ssh):
1716 context1 = mock.Mock()
1717 context1._get_server.return_value = None
1718 context2 = mock.Mock()
1719 context2._get_server.return_value = context2
1722 Context.list.clear()
1723 except AttributeError:
1724 # clear() but works in Py2.7
1725 Context.list[:] = []
1727 Context.list.extend([
1732 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1733 sample_vnf = SampleVNF('vnf1', vnfd)
1734 sample_vnf.APP_NAME = 'sample1'
1735 sample_vnf._start_server = mock.Mock(return_value=0)
1736 sample_vnf._vnf_process = mock.MagicMock()
1737 sample_vnf._vnf_process._is_alive.return_value = 1
1738 sample_vnf.ssh_helper = mock.MagicMock()
1739 sample_vnf.deploy_helper = mock.MagicMock()
1740 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1745 self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1746 self.assertEqual(sample_vnf.nfvi_context, context2)
1748 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1749 @mock.patch("yardstick.ssh.SSH")
1750 def test_wait_for_instantiate_empty_queue(self, ssh, *args):
1751 mock_ssh(ssh, exec_result=(1, "", ""))
1765 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1766 sample_vnf = SampleVNF('vnf1', vnfd)
1767 sample_vnf.APP_NAME = 'sample1'
1768 sample_vnf.WAIT_TIME_FOR_SCRIPT = 0
1769 sample_vnf._start_server = mock.Mock(return_value=0)
1770 sample_vnf._vnf_process = mock.MagicMock()
1771 sample_vnf._vnf_process.exitcode = 0
1772 sample_vnf._vnf_process._is_alive.return_value = 1
1773 sample_vnf.queue_wrapper = mock.Mock()
1774 sample_vnf.q_out = mock.Mock()
1775 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1776 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1777 sample_vnf.ssh_helper = mock.MagicMock()
1778 sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1779 sample_vnf.resource_helper.start_collect = mock.MagicMock()
1781 self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1783 def test__build_ports(self):
1784 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1785 sample_vnf = SampleVNF('vnf1', vnfd)
1787 self.assertIsNone(sample_vnf._build_ports())
1788 self.assertIsNotNone(sample_vnf.networks)
1789 self.assertIsNotNone(sample_vnf.uplink_ports)
1790 self.assertIsNotNone(sample_vnf.downlink_ports)
1791 self.assertIsNotNone(sample_vnf.my_ports)
1793 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1794 def test_vnf_execute_with_queue_data(self, *args):
1806 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1807 sample_vnf = SampleVNF('vnf1', vnfd)
1808 sample_vnf.APP_NAME = 'sample1'
1809 sample_vnf.q_out = mock.Mock()
1810 sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1811 sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1813 self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1815 def test_terminate_without_vnf_process(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.vnf_execute = mock.Mock()
1820 sample_vnf.ssh_helper = mock.Mock()
1821 sample_vnf._tear_down = mock.Mock()
1822 sample_vnf.resource_helper = mock.Mock()
1824 self.assertIsNone(sample_vnf.terminate())
1826 def test_get_stats(self):
1827 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1828 sample_vnf = SampleVNF('vnf1', vnfd)
1829 sample_vnf.APP_NAME = 'sample1'
1830 sample_vnf.APP_WORD = 'sample1'
1831 sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1833 self.assertEqual(sample_vnf.get_stats(), 'the stats')
1835 def test_collect_kpi(self):
1836 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1837 sample_vnf = SampleVNF('vnf1', vnfd)
1838 sample_vnf.APP_NAME = 'sample1'
1839 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1840 sample_vnf.COLLECT_MAP = {
1845 sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
1846 sample_vnf.resource_helper = mock.Mock()
1847 sample_vnf.resource_helper.collect_kpi.return_value = {}
1853 'collect_stats': {},
1855 result = sample_vnf.collect_kpi()
1856 self.assertDictEqual(result, expected)
1858 def test_collect_kpi_default(self):
1859 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1860 sample_vnf = SampleVNF('vnf1', vnfd)
1861 sample_vnf.APP_NAME = 'sample1'
1862 sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1863 sample_vnf.get_stats = mock.Mock(return_value='')
1868 'packets_dropped': 0,
1870 result = sample_vnf.collect_kpi()
1871 self.assertDictEqual(result, expected)
1873 def test_scale(self):
1874 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1875 sample_vnf = SampleVNF('vnf1', vnfd)
1876 self.assertRaises(y_exceptions.FunctionNotImplemented,
1879 def test__run(self):
1880 test_cmd = 'test cmd'
1881 run_kwargs = {'arg1': 'val1', 'arg2': 'val2'}
1882 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1883 sample_vnf = SampleVNF('vnf1', vnfd)
1884 sample_vnf.ssh_helper = mock.Mock()
1885 sample_vnf.setup_helper = mock.Mock()
1886 with mock.patch.object(sample_vnf, '_build_config',
1887 return_value=test_cmd), \
1888 mock.patch.object(sample_vnf, '_build_run_kwargs'):
1889 sample_vnf.run_kwargs = run_kwargs
1891 sample_vnf.ssh_helper.drop_connection.assert_called_once()
1892 sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd,
1894 sample_vnf.setup_helper.kill_vnf.assert_called_once()
1897 class TestSampleVNFTrafficGen(unittest.TestCase):
1900 'short-name': 'VpeVnf',
1905 'network': '152.16.100.20',
1906 'netmask': '255.255.255.0',
1907 'gateway': '152.16.100.20',
1911 'network': '152.16.40.20',
1912 'netmask': '255.255.255.0',
1913 'gateway': '152.16.40.20',
1917 'description': 'VPE approximation using DPDK',
1918 'name': 'vpevnf-baremetal',
1921 'network': '0064:ff9b:0:0:0:0:9810:6414',
1923 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1927 'network': '0064:ff9b:0:0:0:0:9810:2814',
1929 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1933 'id': 'vpevnf-baremetal',
1934 'external-interface': [
1936 'virtual-interface': {
1937 'dst_mac': '00:00:00:00:00:03',
1938 'vpci': '0000:05:00.0',
1940 'local_ip': '152.16.100.19',
1941 'type': 'PCI-PASSTHROUGH',
1942 'netmask': '255.255.255.0',
1944 'bandwidth': '10 Gbps',
1945 'dst_ip': '152.16.100.20',
1946 'local_mac': '00:00:00:00:00:01'
1948 'vnfd-connection-point-ref': 'xe0',
1952 'virtual-interface': {
1953 'dst_mac': '00:00:00:00:00:04',
1954 'vpci': '0000:05:00.1',
1956 'local_ip': '152.16.40.19',
1957 'type': 'PCI-PASSTHROUGH',
1958 'netmask': '255.255.255.0',
1960 'bandwidth': '10 Gbps',
1961 'dst_ip': '152.16.40.20',
1962 'local_mac': '00:00:00:00:00:02'
1964 'vnfd-connection-point-ref': 'xe1',
1970 'description': 'Vpe approximation using DPDK',
1972 'vdu-id': 'vpevnf-baremetal',
1985 'connection-point': [
1995 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1999 'vnfd:vnfd-catalog': {
2007 "schema": "isb:traffic_profile:0.1",
2009 "description": "Fixed traffic profile to run UDP traffic",
2010 "traffic_profile": {
2011 "traffic_type": "FixedTraffic",
2012 "frame_rate": 100, # pps
2018 def test__check_status(self):
2019 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2021 with self.assertRaises(NotImplementedError):
2022 sample_vnf_tg._check_status()
2024 def test_listen_traffic(self):
2025 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2027 sample_vnf_tg.listen_traffic(mock.Mock())
2029 def test_verify_traffic(self):
2030 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2032 sample_vnf_tg.verify_traffic(mock.Mock())
2034 def test_terminate(self):
2035 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2036 sample_vnf_tg._traffic_process = mock.Mock()
2037 sample_vnf_tg._tg_process = mock.Mock()
2039 sample_vnf_tg.terminate()
2041 def test__wait_for_process(self):
2042 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2043 with mock.patch.object(sample_vnf_tg, '_check_status',
2044 return_value=0) as mock_status, \
2045 mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2046 mock_proc.is_alive.return_value = True
2047 mock_proc.exitcode = 234
2048 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2049 mock_proc.is_alive.assert_called_once()
2050 mock_status.assert_called_once()
2052 def test__wait_for_process_not_alive(self):
2053 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2054 with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2055 mock_proc.is_alive.return_value = False
2056 self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process)
2057 mock_proc.is_alive.assert_called_once()
2059 def test__wait_for_process_delayed(self):
2060 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2061 with mock.patch.object(sample_vnf_tg, '_check_status',
2062 side_effect=[1, 0]) as mock_status, \
2063 mock.patch.object(sample_vnf_tg,
2064 '_tg_process') as mock_proc:
2065 mock_proc.is_alive.return_value = True
2066 mock_proc.exitcode = 234
2067 self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2068 mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()])
2069 mock_status.assert_has_calls([mock.call(), mock.call()])
2071 def test_scale(self):
2072 sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2073 self.assertRaises(y_exceptions.FunctionNotImplemented,
2074 sample_vnf_tg.scale)