1 # Copyright (c) 2016-2017 Intel Corporation
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 from multiprocessing import Process, Queue
19 from six.moves import configparser
22 from yardstick.benchmark.contexts import base as ctx_base
23 from yardstick.network_services.nfvi.resource import ResourceProfile
24 from yardstick.network_services.vnf_generic.vnf import base as vnf_base
25 from yardstick.network_services.vnf_generic.vnf import sample_vnf
26 from yardstick.network_services.vnf_generic.vnf import vpe_vnf
27 from yardstick.tests.unit.network_services.vnf_generic.vnf import test_base
30 TEST_FILE_YAML = 'nsb_test_case.yaml'
34 PING_OUTPUT_1 = "Pkts in: 101\r\n\tPkts dropped by AH: 100\r\n\tPkts dropped by other: 100"
36 MODULE_PATH = test_base.FileAbsPath(__file__)
37 get_file_abspath = MODULE_PATH.get_path
40 class TestConfigCreate(unittest.TestCase):
43 'short-name': 'VpeVnf',
48 'network': '152.16.100.20',
49 'netmask': '255.255.255.0',
50 'gateway': '152.16.100.20',
54 'network': '152.16.40.20',
55 'netmask': '255.255.255.0',
56 'gateway': '152.16.40.20',
60 'description': 'VPE approximation using DPDK',
61 'name': 'vpevnf-baremetal',
64 'network': '0064:ff9b:0:0:0:0:9810:6414',
66 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
70 'network': '0064:ff9b:0:0:0:0:9810:2814',
72 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
76 'id': 'vpevnf-baremetal',
77 'external-interface': [
79 'virtual-interface': {
80 'dst_mac': '00:00:00:00:00:03',
81 'vpci': '0000:05:00.0',
82 'local_ip': '152.16.100.19',
83 'type': 'PCI-PASSTHROUGH',
84 'netmask': '255.255.255.0',
86 'bandwidth': '10 Gbps',
87 'dst_ip': '152.16.100.20',
88 'local_mac': '00:00:00:00:00:01',
92 'vnfd-connection-point-ref': 'xe0',
96 'virtual-interface': {
97 'dst_mac': '00:00:00:00:00:04',
98 'vpci': '0000:05:00.1',
99 'local_ip': '152.16.40.19',
100 'type': 'PCI-PASSTHROUGH',
101 'netmask': '255.255.255.0',
103 'bandwidth': '10 Gbps',
104 'dst_ip': '152.16.40.20',
105 'local_mac': '00:00:00:00:00:02',
106 'vld_id': 'downlink_0',
109 'vnfd-connection-point-ref': 'xe1',
115 'description': 'Vpe approximation using DPDK',
117 'vdu-id': 'vpevnf-baremetal',
130 'connection-point': [
140 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
143 def test___init__(self):
144 vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
145 config_create = vpe_vnf.ConfigCreate(vnfd_helper, 2)
146 self.assertEqual(config_create.uplink_ports, ['xe0'])
147 self.assertEqual(config_create.downlink_ports, ['xe1'])
148 self.assertEqual(config_create.socket, 2)
150 def test_dpdk_port_to_link_id(self):
151 vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
152 config_create = vpe_vnf.ConfigCreate(vnfd_helper, 2)
153 self.assertEqual(config_create.dpdk_port_to_link_id_map, {'xe0': 0, 'xe1': 1})
155 def test_vpe_initialize(self):
156 vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
157 config_create = vpe_vnf.ConfigCreate(vnfd_helper, 2)
158 config = configparser.ConfigParser()
159 config_create.vpe_initialize(config)
160 self.assertEqual(config.get('EAL', 'log_level'), '0')
161 self.assertEqual(config.get('PIPELINE0', 'type'), 'MASTER')
162 self.assertEqual(config.get('PIPELINE0', 'core'), 's2C0')
163 self.assertEqual(config.get('MEMPOOL0', 'pool_size'), '256K')
164 self.assertEqual(config.get('MEMPOOL1', 'pool_size'), '2M')
166 def test_vpe_rxq(self):
167 vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
168 config_create = vpe_vnf.ConfigCreate(vnfd_helper, 2)
169 config = configparser.ConfigParser()
170 config_create.downlink_ports = ['xe0']
171 config_create.vpe_rxq(config)
172 self.assertEqual(config.get('RXQ0.0', 'mempool'), 'MEMPOOL1')
174 def test_get_sink_swq(self):
175 vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
176 config_create = vpe_vnf.ConfigCreate(vnfd_helper, 2)
177 config = configparser.ConfigParser()
178 config.add_section('PIPELINE0')
179 config.set('PIPELINE0', 'key1', 'value1')
180 config.set('PIPELINE0', 'key2', 'value2 SINK')
181 config.set('PIPELINE0', 'key3', 'TM value3')
182 config.set('PIPELINE0', 'key4', 'value4')
183 config.set('PIPELINE0', 'key5', 'the SINK value5')
185 self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key1', 5), 'SWQ-1')
186 self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key2', 5), 'SWQ-1 SINK0')
187 self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key3', 5), 'SWQ-1 TM5')
188 config_create.sw_q += 1
189 self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key4', 5), 'SWQ0')
190 self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key5', 5), 'SWQ0 SINK1')
192 def test_generate_vpe_script(self):
193 vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
194 vpe_config_vnf = vpe_vnf.ConfigCreate(vnfd_helper, 2)
198 "virtual-interface": {
200 "dst_mac": "00:00:00:00:00:00:02",
205 "virtual-interface": {
207 "dst_mac": "00:00:00:00:00:00:02",
211 vpe_config_vnf.downlink_ports = ['xe1']
212 vpe_config_vnf.uplink_ports = ['xe2']
213 result = vpe_config_vnf.generate_vpe_script(intf)
214 self.assertIsInstance(result, str)
215 self.assertNotEqual(result, '')
217 def test_create_vpe_config(self):
218 vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
219 config_create = vpe_vnf.ConfigCreate(vnfd_helper, 23)
220 config_create.uplink_ports = ['xe1']
221 with mock.patch.object(config_create, 'vpe_upstream') as mock_up, \
222 mock.patch.object(config_create, 'vpe_downstream') as \
224 mock.patch.object(config_create, 'vpe_tmq') as mock_tmq, \
225 mock.patch.object(config_create, 'vpe_initialize') as \
227 mock.patch.object(config_create, 'vpe_rxq') as mock_rxq:
228 mock_ini_obj = mock.Mock()
229 mock_rxq_obj = mock.Mock()
230 mock_up_obj = mock.Mock()
231 mock_down_obj = mock.Mock()
232 mock_tmq_obj = mock.Mock()
233 mock_ini.return_value = mock_ini_obj
234 mock_rxq.return_value = mock_rxq_obj
235 mock_up.return_value = mock_up_obj
236 mock_down.return_value = mock_down_obj
237 mock_tmq.return_value = mock_tmq_obj
238 config_create.create_vpe_config('fake_config_file')
240 mock_rxq.assert_called_once_with(mock_ini_obj)
241 mock_up.assert_called_once_with('fake_config_file', 0)
242 mock_down.assert_called_once_with('fake_config_file', 0)
243 mock_tmq.assert_called_once_with(mock_down_obj, 0)
244 mock_up_obj.write.assert_called_once()
245 mock_tmq_obj.write.assert_called_once()
248 class TestVpeApproxVnf(unittest.TestCase):
251 'short-name': 'VpeVnf',
256 'network': '152.16.100.20',
257 'netmask': '255.255.255.0',
258 'gateway': '152.16.100.20',
262 'network': '152.16.40.20',
263 'netmask': '255.255.255.0',
264 'gateway': '152.16.40.20',
268 'description': 'VPE approximation using DPDK',
269 'name': 'vpevnf-baremetal',
272 'network': '0064:ff9b:0:0:0:0:9810:6414',
274 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
278 'network': '0064:ff9b:0:0:0:0:9810:2814',
280 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
284 'id': 'vpevnf-baremetal',
285 'external-interface': [
287 'virtual-interface': {
288 'dst_mac': '00:00:00:00:00:04',
289 'vpci': '0000:05:00.0',
290 'local_ip': '152.16.100.19',
291 'type': 'PCI-PASSTHROUGH',
292 'netmask': '255.255.255.0',
294 'bandwidth': '10 Gbps',
296 'dst_ip': '152.16.100.20',
297 'local_iface_name': 'xe0',
298 'local_mac': '00:00:00:00:00:02',
299 'vld_id': 'uplink_0',
302 'vnfd-connection-point-ref': 'xe0',
306 'virtual-interface': {
307 'dst_mac': '00:00:00:00:00:03',
308 'vpci': '0000:05:00.1',
309 'local_ip': '152.16.40.19',
310 'type': 'PCI-PASSTHROUGH',
312 'netmask': '255.255.255.0',
314 'bandwidth': '10 Gbps',
315 'dst_ip': '152.16.40.20',
316 'local_iface_name': 'xe1',
317 'local_mac': '00:00:00:00:00:01',
318 'vld_id': 'downlink_0',
321 'vnfd-connection-point-ref': 'xe1',
327 'description': 'Vpe approximation using DPDK',
329 'vdu-id': 'vpevnf-baremetal',
342 'connection-point': [
352 'id': 'VpeApproxVnf',
357 'vnfd:vnfd-catalog': {
369 'allowed_drop_rate': '0.8 - 1',
372 'cfg': 'acl_1rule.yaml',
382 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7',
383 'tc': 'tc_ipv4_1Mflow_64B_packetsize',
385 'object': 'NetworkServiceTestCase',
387 'output_filename': '/tmp/yardstick.out',
392 'traffic_profile': 'ipv4_throughput_vpe.yaml',
394 'flow': 'ipv4_Packets_vpe.yaml',
395 'imix': 'imix_voice.yaml',
399 'tg__2': 'trafficgen_2.yardstick',
400 'tg__1': 'trafficgen_1.yardstick',
401 'vnf__1': 'vnf.yardstick',
403 'topology': 'vpe-tg-topology-baremetal.yaml',
409 'member-vnf-index': '3',
410 'role': 'TrafficGen',
411 'name': 'trafficgen_2.yardstick',
412 'vnfd-id-ref': 'tg__2',
416 'local_iface_name': 'ens513f0',
417 'vld_id': vpe_vnf.VpeApproxVnf.DOWNLINK,
418 'netmask': '255.255.255.0',
419 'local_ip': '152.16.40.20',
420 'dst_mac': '00:00:00:00:00:01',
421 'local_mac': '00:00:00:00:00:03',
422 'dst_ip': '152.16.40.19',
424 'vpci': '0000:02:00.0',
428 'local_iface_name': 'ens513f1',
429 'netmask': '255.255.255.0',
430 'network': '202.16.100.0',
431 'local_ip': '202.16.100.20',
432 'local_mac': '00:1e:67:d0:60:5d',
434 'vpci': '0000:02:00.1',
439 'VNF model': 'l3fwd_vnf.yaml',
443 'member-vnf-index': '1',
444 'role': 'TrafficGen',
445 'name': 'trafficgen_1.yardstick',
446 'vnfd-id-ref': 'tg__1',
450 'local_iface_name': 'ens785f0',
451 'vld_id': vpe_vnf.VpeApproxVnf.UPLINK,
452 'netmask': '255.255.255.0',
453 'local_ip': '152.16.100.20',
454 'dst_mac': '00:00:00:00:00:02',
455 'local_mac': '00:00:00:00:00:04',
456 'dst_ip': '152.16.100.19',
458 'vpci': '0000:05:00.0',
462 'local_iface_name': 'ens785f1',
463 'netmask': '255.255.255.0',
464 'local_ip': '152.16.100.21',
465 'local_mac': '00:00:00:00:00:01',
467 'vpci': '0000:05:00.1',
472 'VNF model': 'tg_rfc2544_tpl.yaml',
476 'name': 'vnf.yardstick',
477 'vnfd-id-ref': 'vnf__1',
481 'local_iface_name': 'ens786f0',
482 'vld_id': vpe_vnf.VpeApproxVnf.UPLINK,
483 'netmask': '255.255.255.0',
484 'local_ip': '152.16.100.19',
485 'dst_mac': '00:00:00:00:00:04',
486 'local_mac': '00:00:00:00:00:02',
487 'dst_ip': '152.16.100.20',
489 'vpci': '0000:05:00.0',
493 'local_iface_name': 'ens786f1',
494 'vld_id': vpe_vnf.VpeApproxVnf.DOWNLINK,
495 'netmask': '255.255.255.0',
496 'local_ip': '152.16.40.19',
497 'dst_mac': '00:00:00:00:00:03',
498 'local_mac': '00:00:00:00:00:01',
499 'dst_ip': '152.16.40.20',
501 'vpci': '0000:05:00.1',
507 'netmask': '255.255.255.0',
508 'gateway': '152.16.100.20',
509 'network': '152.16.100.20',
513 'netmask': '255.255.255.0',
514 'gateway': '152.16.40.20',
515 'network': '152.16.40.20',
519 'member-vnf-index': '2',
526 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
527 'network': '0064:ff9b:0:0:0:0:9810:6414',
532 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
533 'network': '0064:ff9b:0:0:0:0:9810:2814',
538 'VNF model': 'vpe_vnf.yaml',
544 self._mock_time_sleep = mock.patch.object(time, 'sleep')
545 self.mock_time_sleep = self._mock_time_sleep.start()
546 self.addCleanup(self._stop_mocks)
548 def _stop_mocks(self):
549 self._mock_time_sleep.stop()
551 def test___init__(self):
552 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
553 self.assertIsNone(vpe_approx_vnf._vnf_process)
555 @mock.patch.object(ctx_base.Context, 'get_physical_node_from_server',
556 return_value='mock_node')
557 @mock.patch.object(sample_vnf, 'VnfSshHelper')
558 def test_collect_kpi_sa_not_running(self, ssh, *args):
559 test_base.mock_ssh(ssh)
561 resource = mock.Mock(autospec=ResourceProfile)
562 resource.check_if_system_agent_running.return_value = 1, ''
563 resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234}
564 resource.check_if_system_agent_running.return_value = (1, None)
566 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
567 vpe_approx_vnf.scenario_helper.scenario_cfg = {
568 'nodes': {vpe_approx_vnf.name: "mock"}
570 vpe_approx_vnf.q_in = mock.MagicMock()
571 vpe_approx_vnf.q_out = mock.MagicMock()
572 vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
573 vpe_approx_vnf.resource_helper.resource = resource
576 'physical_node': 'mock_node',
577 'pkt_in_down_stream': 0,
578 'pkt_in_up_stream': 0,
579 'pkt_drop_down_stream': 0,
580 'pkt_drop_up_stream': 0,
581 'collect_stats': {'core': {}},
583 self.assertEqual(vpe_approx_vnf.collect_kpi(), expected)
585 @mock.patch.object(ctx_base.Context, 'get_physical_node_from_server',
586 return_value='mock_node')
587 @mock.patch.object(sample_vnf, 'VnfSshHelper')
588 def test_collect_kpi_sa_running(self, ssh, *args):
589 test_base.mock_ssh(ssh)
591 resource = mock.Mock(autospec=ResourceProfile)
592 resource.check_if_system_agent_running.return_value = 0, '1234'
593 resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234}
595 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
596 vpe_approx_vnf.scenario_helper.scenario_cfg = {
597 'nodes': {vpe_approx_vnf.name: "mock"}
599 vpe_approx_vnf.q_in = mock.MagicMock()
600 vpe_approx_vnf.q_out = mock.MagicMock()
601 vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
602 vpe_approx_vnf.resource_helper.resource = resource
605 'physical_node': 'mock_node',
606 'pkt_in_down_stream': 0,
607 'pkt_in_up_stream': 0,
608 'pkt_drop_down_stream': 0,
609 'pkt_drop_up_stream': 0,
610 'collect_stats': {'core': {'foo': 234}},
612 self.assertEqual(vpe_approx_vnf.collect_kpi(), expected)
614 @mock.patch.object(sample_vnf, 'VnfSshHelper')
615 def test_vnf_execute(self, ssh):
616 test_base.mock_ssh(ssh)
617 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
618 vpe_approx_vnf.q_in = mock.MagicMock()
619 vpe_approx_vnf.q_out = mock.MagicMock()
620 vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
621 self.assertEqual(vpe_approx_vnf.vnf_execute("quit", 0), '')
623 @mock.patch.object(sample_vnf, 'VnfSshHelper')
624 def test_run_vpe(self, ssh):
625 test_base.mock_ssh(ssh)
627 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
628 vpe_approx_vnf.tc_file_name = get_file_abspath(TEST_FILE_YAML)
629 vpe_approx_vnf.vnf_cfg = {
632 'worker_config': '1C/1T',
635 vpe_approx_vnf.scenario_helper.scenario_cfg = {
639 'topology': 'nsb_test_case.yaml',
640 'vnf_config': 'vpe_config',
644 vpe_approx_vnf.topology = "nsb_test_case.yaml"
645 vpe_approx_vnf.nfvi_type = "baremetal"
646 vpe_approx_vnf._provide_config_file = mock.Mock()
647 vpe_approx_vnf._build_config = mock.MagicMock()
649 self.assertIsInstance(vpe_approx_vnf.ssh_helper, mock.Mock)
650 self.assertIsInstance(vpe_approx_vnf.ssh_helper, mock.Mock)
651 self.assertIsNone(vpe_approx_vnf._run())
653 @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig")
654 @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.ConfigCreate")
655 @mock.patch("six.moves.builtins.open")
656 @mock.patch.object(sample_vnf, 'VnfSshHelper')
657 def test_build_config(self, ssh, *args):
658 test_base.mock_ssh(ssh)
659 vpe_approx_vnf = vpe_vnf.VpeApproxSetupEnvHelper(
660 mock.MagicMock(), mock.MagicMock(), mock.MagicMock())
661 vpe_approx_vnf.tc_file_name = get_file_abspath(TEST_FILE_YAML)
662 vpe_approx_vnf.generate_port_pairs = mock.Mock()
663 vpe_approx_vnf.vnf_cfg = {
666 'worker_config': '1C/1T',
669 vpe_approx_vnf.scenario_helper.scenario_cfg = {
673 'topology': 'nsb_test_case.yaml',
674 'vnf_config': 'vpe_config',
678 vpe_approx_vnf.topology = "nsb_test_case.yaml"
679 vpe_approx_vnf.nfvi_type = "baremetal"
680 vpe_approx_vnf._provide_config_file = mock.Mock()
682 vpe_approx_vnf.ssh_helper = mock.MagicMock()
683 vpe_approx_vnf.scenario_helper = mock.MagicMock()
684 vpe_approx_vnf.ssh_helper.bin_path = mock.Mock()
685 vpe_approx_vnf.ssh_helper.upload_config_file = mock.MagicMock()
686 self.assertIsNone(vpe_approx_vnf._build_vnf_ports())
688 vpe_approx_vnf.ssh_helper.provision_tool = mock.Mock(return_value='tool_path')
689 vpe_approx_vnf.ssh_helper.all_ports = mock.Mock()
690 vpe_approx_vnf.vnfd_helper.port_nums = mock.Mock(return_value=[0, 1])
691 vpe_approx_vnf.scenario_helper.vnf_cfg = {'lb_config': 'HW'}
693 expected = 'sudo tool_path -p 0x3 -f /tmp/vpe_config -s /tmp/vpe_script --hwlb 3'
694 self.assertEqual(vpe_approx_vnf.build_config(), expected)
696 @mock.patch.object(sample_vnf, 'VnfSshHelper')
697 def test_wait_for_instantiate(self, ssh):
698 test_base.mock_ssh(ssh)
700 mock_process = mock.Mock(autospec=Process)
701 mock_process.is_alive.return_value = True
702 mock_process.exitcode = 432
704 mock_q_out = mock.Mock(autospec=Queue)
705 mock_q_out.get.side_effect = iter(["pipeline>"])
706 mock_q_out.qsize.side_effect = range(1, -1, -1)
708 mock_resource = mock.MagicMock()
710 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
711 vpe_approx_vnf._vnf_process = mock_process
712 vpe_approx_vnf.q_out = mock_q_out
713 vpe_approx_vnf.queue_wrapper = mock.Mock(
714 autospec=vnf_base.QueueFileWrapper)
715 vpe_approx_vnf.resource_helper.resource = mock_resource
717 vpe_approx_vnf.q_out.put("pipeline>")
718 self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432)
720 @mock.patch.object(sample_vnf, 'VnfSshHelper')
721 def test_wait_for_instantiate_fragmented(self, ssh):
722 test_base.mock_ssh(ssh)
724 mock_process = mock.Mock(autospec=Process)
725 mock_process.is_alive.return_value = True
726 mock_process.exitcode = 432
728 # test that fragmented pipeline prompt is recognized
729 mock_q_out = mock.Mock(autospec=Queue)
730 mock_q_out.get.side_effect = iter(["wow pipel", "ine>"])
731 mock_q_out.qsize.side_effect = range(2, -1, -1)
733 mock_resource = mock.MagicMock()
735 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
736 vpe_approx_vnf._vnf_process = mock_process
737 vpe_approx_vnf.q_out = mock_q_out
738 vpe_approx_vnf.queue_wrapper = mock.Mock(
739 autospec=vnf_base.QueueFileWrapper)
740 vpe_approx_vnf.resource_helper.resource = mock_resource
742 self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432)
744 @mock.patch.object(sample_vnf, 'VnfSshHelper')
745 def test_wait_for_instantiate_crash(self, ssh):
746 test_base.mock_ssh(ssh, exec_result=(1, "", ""))
748 mock_process = mock.Mock(autospec=Process)
749 mock_process.is_alive.return_value = False
750 mock_process.exitcode = 432
752 mock_resource = mock.MagicMock()
754 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
755 vpe_approx_vnf._vnf_process = mock_process
756 vpe_approx_vnf.resource_helper.resource = mock_resource
758 with self.assertRaises(RuntimeError) as raised:
759 vpe_approx_vnf.wait_for_instantiate()
761 self.assertIn('VNF process died', str(raised.exception))
763 @mock.patch.object(sample_vnf, 'VnfSshHelper')
764 def test_wait_for_instantiate_panic(self, ssh):
765 test_base.mock_ssh(ssh, exec_result=(1, "", ""))
767 mock_process = mock.Mock(autospec=Process)
768 mock_process.is_alive.return_value = True
769 mock_process.exitcode = 432
771 mock_resource = mock.MagicMock()
773 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
774 vpe_approx_vnf._vnf_process = mock_process
775 vpe_approx_vnf.resource_helper.resource = mock_resource
777 vpe_approx_vnf.q_out.put("PANIC")
778 with self.assertRaises(RuntimeError) as raised:
779 vpe_approx_vnf.wait_for_instantiate()
781 self.assertIn('Error starting', str(raised.exception))
783 @mock.patch.object(sample_vnf, 'VnfSshHelper')
784 def test_wait_for_instantiate_panic_fragmented(self, ssh):
785 test_base.mock_ssh(ssh, exec_result=(1, "", ""))
787 mock_process = mock.Mock(autospec=Process)
788 mock_process.is_alive.return_value = True
789 mock_process.exitcode = 432
791 # test that fragmented PANIC is recognized
792 mock_q_out = mock.Mock(autospec=Queue)
793 mock_q_out.get.side_effect = iter(["omg PA", "NIC this is bad"])
794 mock_q_out.qsize.side_effect = range(2, -1, -1)
796 mock_resource = mock.MagicMock()
798 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
799 vpe_approx_vnf._vnf_process = mock_process
800 vpe_approx_vnf.q_out = mock_q_out
801 vpe_approx_vnf.resource_helper.resource = mock_resource
803 with self.assertRaises(RuntimeError) as raised:
804 vpe_approx_vnf.wait_for_instantiate()
806 self.assertIn('Error starting', str(raised.exception))
808 @mock.patch.object(sample_vnf, 'VnfSshHelper')
809 def test_terminate(self, ssh):
810 test_base.mock_ssh(ssh)
812 vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
813 vpe_approx_vnf._vnf_process = mock.MagicMock()
814 vpe_approx_vnf._resource_collect_stop = mock.Mock()
815 vpe_approx_vnf.resource_helper = mock.MagicMock()
817 self.assertIsNone(vpe_approx_vnf.terminate())