Merge "Extend vBNG PPPoE test cases functionality"
[yardstick.git] / yardstick / tests / unit / network_services / vnf_generic / vnf / test_vpe_vnf.py
1 # Copyright (c) 2016-2017 Intel Corporation
2 #
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
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 from multiprocessing import Process, Queue
16 import time
17
18 import mock
19 import unittest
20
21 from yardstick.benchmark.contexts import base as ctx_base
22 from yardstick.network_services.nfvi.resource import ResourceProfile
23 from yardstick.network_services.vnf_generic.vnf import base as vnf_base
24 from yardstick.network_services.vnf_generic.vnf import sample_vnf
25 from yardstick.network_services.vnf_generic.vnf import vpe_vnf
26 from yardstick.tests.unit.network_services.vnf_generic.vnf import test_base
27
28
29 TEST_FILE_YAML = 'nsb_test_case.yaml'
30
31 NAME = 'vnf_1'
32
33 PING_OUTPUT_1 = "Pkts in: 101\r\n\tPkts dropped by AH: 100\r\n\tPkts dropped by other: 100"
34
35 MODULE_PATH = test_base.FileAbsPath(__file__)
36 get_file_abspath = MODULE_PATH.get_path
37
38
39 class TestConfigCreate(unittest.TestCase):
40
41     VNFD_0 = {
42         'short-name': 'VpeVnf',
43         'vdu': [
44             {
45                 'routing_table': [
46                     {
47                         'network': '152.16.100.20',
48                         'netmask': '255.255.255.0',
49                         'gateway': '152.16.100.20',
50                         'if': 'xe0'
51                     },
52                     {
53                         'network': '152.16.40.20',
54                         'netmask': '255.255.255.0',
55                         'gateway': '152.16.40.20',
56                         'if': 'xe1'
57                     },
58                 ],
59                 'description': 'VPE approximation using DPDK',
60                 'name': 'vpevnf-baremetal',
61                 'nd_route_tbl': [
62                     {
63                         'network': '0064:ff9b:0:0:0:0:9810:6414',
64                         'netmask': '112',
65                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
66                         'if': 'xe0'
67                     },
68                     {
69                         'network': '0064:ff9b:0:0:0:0:9810:2814',
70                         'netmask': '112',
71                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
72                         'if': 'xe1'
73                     },
74                 ],
75                 'id': 'vpevnf-baremetal',
76                 'external-interface': [
77                     {
78                         'virtual-interface': {
79                             'dst_mac': '00:00:00:00:00:03',
80                             'vpci': '0000:05:00.0',
81                             'local_ip': '152.16.100.19',
82                             'type': 'PCI-PASSTHROUGH',
83                             'netmask': '255.255.255.0',
84                             'dpdk_port_num': 0,
85                             'bandwidth': '10 Gbps',
86                             'dst_ip': '152.16.100.20',
87                             'local_mac': '00:00:00:00:00:01',
88                             'vld_id': 'uplink_0',
89                             'ifname': 'xe0',
90                         },
91                         'vnfd-connection-point-ref': 'xe0',
92                         'name': 'xe0'
93                     },
94                     {
95                         'virtual-interface': {
96                             'dst_mac': '00:00:00:00:00:04',
97                             'vpci': '0000:05:00.1',
98                             'local_ip': '152.16.40.19',
99                             'type': 'PCI-PASSTHROUGH',
100                             'netmask': '255.255.255.0',
101                             'dpdk_port_num': 1,
102                             'bandwidth': '10 Gbps',
103                             'dst_ip': '152.16.40.20',
104                             'local_mac': '00:00:00:00:00:02',
105                             'vld_id': 'downlink_0',
106                             'ifname': 'xe1',
107                         },
108                         'vnfd-connection-point-ref': 'xe1',
109                         'name': 'xe1'
110                     },
111                 ],
112             },
113         ],
114         'description': 'Vpe approximation using DPDK',
115         'mgmt-interface': {
116             'vdu-id': 'vpevnf-baremetal',
117             'host': '1.1.1.1',
118             'password': 'r00t',
119             'user': 'root',
120             'ip': '1.1.1.1'
121         },
122         'benchmark': {
123             'kpi': [
124                 'packets_in',
125                 'packets_fwd',
126                 'packets_dropped',
127             ],
128         },
129         'connection-point': [
130             {
131                 'type': 'VPORT',
132                 'name': 'xe0',
133             },
134             {
135                 'type': 'VPORT',
136                 'name': 'xe1',
137             },
138         ],
139         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
140     }
141
142     def test___init__(self):
143         vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
144         config_create = vpe_vnf.ConfigCreate(vnfd_helper, 2)
145         self.assertEqual(config_create.uplink_ports, ['xe0'])
146         self.assertEqual(config_create.downlink_ports, ['xe1'])
147         self.assertEqual(config_create.socket, 2)
148
149     def test_generate_vpe_script(self):
150         vnfd_helper = vnf_base.VnfdHelper(self.VNFD_0)
151         vpe_config_vnf = vpe_vnf.ConfigCreate(vnfd_helper, 2)
152         intf = [
153             {
154                 "name": 'xe1',
155                 "virtual-interface": {
156                     "dst_ip": "1.1.1.1",
157                     "dst_mac": "00:00:00:00:00:00:02",
158                 },
159             },
160             {
161                 "name": 'xe2',
162                 "virtual-interface": {
163                     "dst_ip": "1.1.1.1",
164                     "dst_mac": "00:00:00:00:00:00:02",
165                 },
166             },
167         ]
168         vpe_config_vnf.downlink_ports = ['xe1']
169         vpe_config_vnf.uplink_ports = ['xe2']
170         result = vpe_config_vnf.generate_vpe_script(intf)
171         self.assertIsInstance(result, str)
172         self.assertNotEqual(result, '')
173
174
175 class TestVpeApproxVnf(unittest.TestCase):
176
177     VNFD_0 = {
178         'short-name': 'VpeVnf',
179         'vdu': [
180             {
181                 'routing_table': [
182                     {
183                         'network': '152.16.100.20',
184                         'netmask': '255.255.255.0',
185                         'gateway': '152.16.100.20',
186                         'if': 'xe0',
187                     },
188                     {
189                         'network': '152.16.40.20',
190                         'netmask': '255.255.255.0',
191                         'gateway': '152.16.40.20',
192                         'if': 'xe1',
193                     },
194                 ],
195                 'description': 'VPE approximation using DPDK',
196                 'name': 'vpevnf-baremetal',
197                 'nd_route_tbl': [
198                     {
199                         'network': '0064:ff9b:0:0:0:0:9810:6414',
200                         'netmask': '112',
201                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
202                         'if': 'xe0',
203                     },
204                     {
205                         'network': '0064:ff9b:0:0:0:0:9810:2814',
206                         'netmask': '112',
207                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
208                         'if': 'xe1',
209                     },
210                 ],
211                 'id': 'vpevnf-baremetal',
212                 'external-interface': [
213                     {
214                         'virtual-interface': {
215                             'dst_mac': '00:00:00:00:00:04',
216                             'vpci': '0000:05:00.0',
217                             'local_ip': '152.16.100.19',
218                             'type': 'PCI-PASSTHROUGH',
219                             'netmask': '255.255.255.0',
220                             'dpdk_port_num': 0,
221                             'bandwidth': '10 Gbps',
222                             'driver': "i40e",
223                             'dst_ip': '152.16.100.20',
224                             'local_iface_name': 'xe0',
225                             'local_mac': '00:00:00:00:00:02',
226                             'vld_id': 'uplink_0',
227                             'ifname': 'xe0',
228                         },
229                         'vnfd-connection-point-ref': 'xe0',
230                         'name': 'xe0',
231                     },
232                     {
233                         'virtual-interface': {
234                             'dst_mac': '00:00:00:00:00:03',
235                             'vpci': '0000:05:00.1',
236                             'local_ip': '152.16.40.19',
237                             'type': 'PCI-PASSTHROUGH',
238                             'driver': "i40e",
239                             'netmask': '255.255.255.0',
240                             'dpdk_port_num': 1,
241                             'bandwidth': '10 Gbps',
242                             'dst_ip': '152.16.40.20',
243                             'local_iface_name': 'xe1',
244                             'local_mac': '00:00:00:00:00:01',
245                             'vld_id': 'downlink_0',
246                             'ifname': 'xe1',
247                         },
248                         'vnfd-connection-point-ref': 'xe1',
249                         'name': 'xe1',
250                     },
251                 ],
252             },
253         ],
254         'description': 'Vpe approximation using DPDK',
255         'mgmt-interface': {
256             'vdu-id': 'vpevnf-baremetal',
257             'host': '1.2.1.1',
258             'password': 'r00t',
259             'user': 'root',
260             'ip': '1.2.1.1',
261         },
262         'benchmark': {
263             'kpi': [
264                 'packets_in',
265                 'packets_fwd',
266                 'packets_dropped',
267             ],
268         },
269         'connection-point': [
270             {
271                 'type': 'VPORT',
272                 'name': 'xe0',
273             },
274             {
275                 'type': 'VPORT',
276                 'name': 'xe1',
277             },
278         ],
279         'id': 'VpeApproxVnf',
280         'name': 'VPEVnfSsh',
281     }
282
283     VNFD = {
284         'vnfd:vnfd-catalog': {
285             'vnfd': [
286                 VNFD_0,
287             ],
288         },
289     }
290
291     SCENARIO_CFG = {
292         'options': {
293             'packetsize': 64,
294             'traffic_type': 4,
295             'rfc2544': {
296                 'allowed_drop_rate': '0.8 - 1',
297             },
298             'vnf__1': {
299                 'cfg': 'acl_1rule.yaml',
300                 'vnf_config': {
301                     'lb_config': 'SW',
302                     'lb_count': 1,
303                     'worker_config':
304                     '1C/1T',
305                     'worker_threads': 1,
306                 },
307             }
308         },
309         'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7',
310         'tc': 'tc_ipv4_1Mflow_64B_packetsize',
311         'runner': {
312             'object': 'NetworkServiceTestCase',
313             'interval': 35,
314             'output_filename': '/tmp/yardstick.out',
315             'runner_id': 74476,
316             'duration': 400,
317             'type': 'Duration',
318         },
319         'traffic_profile': 'ipv4_throughput_vpe.yaml',
320         'traffic_options': {
321             'flow': 'ipv4_Packets_vpe.yaml',
322             'imix': 'imix_voice.yaml',
323         },
324         'type': 'ISB',
325         'nodes': {
326             'tg__2': 'trafficgen_2.yardstick',
327             'tg__1': 'trafficgen_1.yardstick',
328             'vnf__1': 'vnf.yardstick',
329         },
330         'topology': 'vpe-tg-topology-baremetal.yaml',
331     }
332
333     CONTEXT_CFG = {
334         'nodes': {
335             'tg__2': {
336                 'member-vnf-index': '3',
337                 'role': 'TrafficGen',
338                 'name': 'trafficgen_2.yardstick',
339                 'vnfd-id-ref': 'tg__2',
340                 'ip': '1.2.1.1',
341                 'interfaces': {
342                     'xe0': {
343                         'local_iface_name': 'ens513f0',
344                         'vld_id': vpe_vnf.VpeApproxVnf.DOWNLINK,
345                         'netmask': '255.255.255.0',
346                         'local_ip': '152.16.40.20',
347                         'dst_mac': '00:00:00:00:00:01',
348                         'local_mac': '00:00:00:00:00:03',
349                         'dst_ip': '152.16.40.19',
350                         'driver': 'ixgbe',
351                         'vpci': '0000:02:00.0',
352                         'dpdk_port_num': 0,
353                     },
354                     'xe1': {
355                         'local_iface_name': 'ens513f1',
356                         'netmask': '255.255.255.0',
357                         'network': '202.16.100.0',
358                         'local_ip': '202.16.100.20',
359                         'local_mac': '00:1e:67:d0:60:5d',
360                         'driver': 'ixgbe',
361                         'vpci': '0000:02:00.1',
362                         'dpdk_port_num': 1,
363                     },
364                 },
365                 'password': 'r00t',
366                 'VNF model': 'l3fwd_vnf.yaml',
367                 'user': 'root',
368             },
369             'tg__1': {
370                 'member-vnf-index': '1',
371                 'role': 'TrafficGen',
372                 'name': 'trafficgen_1.yardstick',
373                 'vnfd-id-ref': 'tg__1',
374                 'ip': '1.2.1.1',
375                 'interfaces': {
376                     'xe0': {
377                         'local_iface_name': 'ens785f0',
378                         'vld_id': vpe_vnf.VpeApproxVnf.UPLINK,
379                         'netmask': '255.255.255.0',
380                         'local_ip': '152.16.100.20',
381                         'dst_mac': '00:00:00:00:00:02',
382                         'local_mac': '00:00:00:00:00:04',
383                         'dst_ip': '152.16.100.19',
384                         'driver': 'i40e',
385                         'vpci': '0000:05:00.0',
386                         'dpdk_port_num': 0,
387                     },
388                     'xe1': {
389                         'local_iface_name': 'ens785f1',
390                         'netmask': '255.255.255.0',
391                         'local_ip': '152.16.100.21',
392                         'local_mac': '00:00:00:00:00:01',
393                         'driver': 'i40e',
394                         'vpci': '0000:05:00.1',
395                         'dpdk_port_num': 1,
396                     },
397                 },
398                 'password': 'r00t',
399                 'VNF model': 'tg_rfc2544_tpl.yaml',
400                 'user': 'root',
401             },
402             'vnf__1': {
403                 'name': 'vnf.yardstick',
404                 'vnfd-id-ref': 'vnf__1',
405                 'ip': '1.2.1.1',
406                 'interfaces': {
407                     'xe0': {
408                         'local_iface_name': 'ens786f0',
409                         'vld_id': vpe_vnf.VpeApproxVnf.UPLINK,
410                         'netmask': '255.255.255.0',
411                         'local_ip': '152.16.100.19',
412                         'dst_mac': '00:00:00:00:00:04',
413                         'local_mac': '00:00:00:00:00:02',
414                         'dst_ip': '152.16.100.20',
415                         'driver': 'i40e',
416                         'vpci': '0000:05:00.0',
417                         'dpdk_port_num': 0,
418                     },
419                     'xe1': {
420                         'local_iface_name': 'ens786f1',
421                         'vld_id': vpe_vnf.VpeApproxVnf.DOWNLINK,
422                         'netmask': '255.255.255.0',
423                         'local_ip': '152.16.40.19',
424                         'dst_mac': '00:00:00:00:00:03',
425                         'local_mac': '00:00:00:00:00:01',
426                         'dst_ip': '152.16.40.20',
427                         'driver': 'i40e',
428                         'vpci': '0000:05:00.1',
429                         'dpdk_port_num': 1,
430                     },
431                 },
432                 'routing_table': [
433                     {
434                         'netmask': '255.255.255.0',
435                         'gateway': '152.16.100.20',
436                         'network': '152.16.100.20',
437                         'if': 'xe0',
438                     },
439                     {
440                         'netmask': '255.255.255.0',
441                         'gateway': '152.16.40.20',
442                         'network': '152.16.40.20',
443                         'if': 'xe1',
444                     },
445                 ],
446                 'member-vnf-index': '2',
447                 'host': '1.2.1.1',
448                 'role': 'vnf',
449                 'user': 'root',
450                 'nd_route_tbl': [
451                     {
452                         'netmask': '112',
453                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
454                         'network': '0064:ff9b:0:0:0:0:9810:6414',
455                         'if': 'xe0',
456                     },
457                     {
458                         'netmask': '112',
459                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
460                         'network': '0064:ff9b:0:0:0:0:9810:2814',
461                         'if': 'xe1',
462                     },
463                 ],
464                 'password': 'r00t',
465                 'VNF model': 'vpe_vnf.yaml',
466             },
467         },
468     }
469
470     def setUp(self):
471         self._mock_time_sleep = mock.patch.object(time, 'sleep')
472         self.mock_time_sleep = self._mock_time_sleep.start()
473         self.addCleanup(self._stop_mocks)
474
475     def _stop_mocks(self):
476         self._mock_time_sleep.stop()
477
478     def test___init__(self):
479         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
480         self.assertIsNone(vpe_approx_vnf._vnf_process)
481
482     @mock.patch.object(ctx_base.Context, 'get_physical_node_from_server',
483                        return_value='mock_node')
484     @mock.patch.object(sample_vnf, 'VnfSshHelper')
485     def test_collect_kpi_sa_not_running(self, ssh, *args):
486         test_base.mock_ssh(ssh)
487
488         resource = mock.Mock(autospec=ResourceProfile)
489         resource.check_if_system_agent_running.return_value = 1, ''
490         resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234}
491         resource.check_if_system_agent_running.return_value = (1, None)
492
493         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
494         vpe_approx_vnf.scenario_helper.scenario_cfg = {
495             'nodes': {vpe_approx_vnf.name: "mock"}
496         }
497         vpe_approx_vnf.q_in = mock.MagicMock()
498         vpe_approx_vnf.q_out = mock.MagicMock()
499         vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
500         vpe_approx_vnf.resource_helper.resource = resource
501
502         expected = {
503             'physical_node': 'mock_node',
504             'pkt_in_down_stream': 0,
505             'pkt_in_up_stream': 0,
506             'pkt_drop_down_stream': 0,
507             'pkt_drop_up_stream': 0,
508             'collect_stats': {'core': {}},
509         }
510         self.assertEqual(vpe_approx_vnf.collect_kpi(), expected)
511
512     @mock.patch.object(ctx_base.Context, 'get_physical_node_from_server',
513                        return_value='mock_node')
514     @mock.patch.object(sample_vnf, 'VnfSshHelper')
515     def test_collect_kpi_sa_running(self, ssh, *args):
516         test_base.mock_ssh(ssh)
517
518         resource = mock.Mock(autospec=ResourceProfile)
519         resource.check_if_system_agent_running.return_value = 0, '1234'
520         resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234}
521
522         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
523         vpe_approx_vnf.scenario_helper.scenario_cfg = {
524             'nodes': {vpe_approx_vnf.name: "mock"}
525         }
526         vpe_approx_vnf.q_in = mock.MagicMock()
527         vpe_approx_vnf.q_out = mock.MagicMock()
528         vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
529         vpe_approx_vnf.resource_helper.resource = resource
530
531         expected = {
532             'physical_node': 'mock_node',
533             'pkt_in_down_stream': 0,
534             'pkt_in_up_stream': 0,
535             'pkt_drop_down_stream': 0,
536             'pkt_drop_up_stream': 0,
537             'collect_stats': {'core': {'foo': 234}},
538         }
539         self.assertEqual(vpe_approx_vnf.collect_kpi(), expected)
540
541     @mock.patch.object(sample_vnf, 'VnfSshHelper')
542     def test_vnf_execute(self, ssh):
543         test_base.mock_ssh(ssh)
544         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
545         vpe_approx_vnf.q_in = mock.MagicMock()
546         vpe_approx_vnf.q_out = mock.MagicMock()
547         vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
548         self.assertEqual(vpe_approx_vnf.vnf_execute("quit", 0), '')
549
550     @mock.patch.object(sample_vnf, 'VnfSshHelper')
551     def test_run_vpe(self, ssh):
552         test_base.mock_ssh(ssh)
553
554         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
555         vpe_approx_vnf.tc_file_name = get_file_abspath(TEST_FILE_YAML)
556         vpe_approx_vnf.vnf_cfg = {
557             'lb_config': 'SW',
558             'lb_count': 1,
559             'worker_config': '1C/1T',
560             'worker_threads': 1,
561         }
562         vpe_approx_vnf.scenario_helper.scenario_cfg = {
563             'options': {
564                 NAME: {
565                     'traffic_type': '4',
566                     'topology': 'nsb_test_case.yaml',
567                     'vnf_config': 'vpe_config',
568                 }
569             }
570         }
571         vpe_approx_vnf.topology = "nsb_test_case.yaml"
572         vpe_approx_vnf.nfvi_type = "baremetal"
573         vpe_approx_vnf._provide_config_file = mock.Mock()
574         vpe_approx_vnf._build_config = mock.MagicMock()
575
576         self.assertIsInstance(vpe_approx_vnf.ssh_helper, mock.Mock)
577         self.assertIsInstance(vpe_approx_vnf.ssh_helper, mock.Mock)
578         self.assertIsNone(vpe_approx_vnf._run())
579
580     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig")
581     @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.ConfigCreate")
582     @mock.patch("six.moves.builtins.open")
583     @mock.patch.object(sample_vnf, 'VnfSshHelper')
584     def test_build_config(self, ssh, *args):
585         test_base.mock_ssh(ssh)
586         vpe_approx_vnf = vpe_vnf.VpeApproxSetupEnvHelper(
587             mock.MagicMock(), mock.MagicMock(), mock.MagicMock())
588         vpe_approx_vnf.tc_file_name = get_file_abspath(TEST_FILE_YAML)
589         vpe_approx_vnf.generate_port_pairs = mock.Mock()
590         vpe_approx_vnf.vnf_cfg = {
591             'lb_config': 'SW',
592             'lb_count': 1,
593             'worker_config': '1C/1T',
594             'worker_threads': 1,
595         }
596         vpe_approx_vnf.scenario_helper.scenario_cfg = {
597             'options': {
598                 NAME: {
599                     'traffic_type': '4',
600                     'topology': 'nsb_test_case.yaml',
601                     'vnf_config': 'vpe_config',
602                 }
603             }
604         }
605         vpe_approx_vnf.topology = "nsb_test_case.yaml"
606         vpe_approx_vnf.nfvi_type = "baremetal"
607         vpe_approx_vnf._provide_config_file = mock.Mock()
608
609         vpe_approx_vnf.ssh_helper = mock.MagicMock()
610         vpe_approx_vnf.scenario_helper = mock.MagicMock()
611         vpe_approx_vnf.ssh_helper.bin_path = mock.Mock()
612         vpe_approx_vnf.ssh_helper.upload_config_file = mock.MagicMock()
613         self.assertIsNone(vpe_approx_vnf._build_vnf_ports())
614
615         vpe_approx_vnf.ssh_helper.provision_tool = mock.Mock(return_value='tool_path')
616         vpe_approx_vnf.ssh_helper.all_ports = mock.Mock()
617         vpe_approx_vnf.vnfd_helper.port_nums = mock.Mock(return_value=[0, 1])
618         vpe_approx_vnf.scenario_helper.vnf_cfg = {'lb_config': 'HW'}
619
620         expected = 'sudo tool_path -p 0x3 -f /tmp/vpe_config -s /tmp/vpe_script  --hwlb 3'
621         self.assertEqual(vpe_approx_vnf.build_config(), expected)
622
623     @mock.patch.object(sample_vnf, 'VnfSshHelper')
624     def test_wait_for_instantiate(self, ssh):
625         test_base.mock_ssh(ssh)
626
627         mock_process = mock.Mock(autospec=Process)
628         mock_process.is_alive.return_value = True
629         mock_process.exitcode = 432
630
631         mock_q_out = mock.Mock(autospec=Queue)
632         mock_q_out.get.side_effect = iter(["pipeline>"])
633         mock_q_out.qsize.side_effect = range(1, -1, -1)
634
635         mock_resource = mock.MagicMock()
636
637         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
638         vpe_approx_vnf._vnf_process = mock_process
639         vpe_approx_vnf.q_out = mock_q_out
640         vpe_approx_vnf.queue_wrapper = mock.Mock(
641             autospec=vnf_base.QueueFileWrapper)
642         vpe_approx_vnf.resource_helper.resource = mock_resource
643
644         vpe_approx_vnf.q_out.put("pipeline>")
645         self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432)
646
647     @mock.patch.object(sample_vnf, 'VnfSshHelper')
648     def test_wait_for_instantiate_fragmented(self, ssh):
649         test_base.mock_ssh(ssh)
650
651         mock_process = mock.Mock(autospec=Process)
652         mock_process.is_alive.return_value = True
653         mock_process.exitcode = 432
654
655         # test that fragmented pipeline prompt is recognized
656         mock_q_out = mock.Mock(autospec=Queue)
657         mock_q_out.get.side_effect = iter(["wow pipel", "ine>"])
658         mock_q_out.qsize.side_effect = range(2, -1, -1)
659
660         mock_resource = mock.MagicMock()
661
662         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
663         vpe_approx_vnf._vnf_process = mock_process
664         vpe_approx_vnf.q_out = mock_q_out
665         vpe_approx_vnf.queue_wrapper = mock.Mock(
666             autospec=vnf_base.QueueFileWrapper)
667         vpe_approx_vnf.resource_helper.resource = mock_resource
668
669         self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432)
670
671     @mock.patch.object(sample_vnf, 'VnfSshHelper')
672     def test_wait_for_instantiate_crash(self, ssh):
673         test_base.mock_ssh(ssh, exec_result=(1, "", ""))
674
675         mock_process = mock.Mock(autospec=Process)
676         mock_process.is_alive.return_value = False
677         mock_process.exitcode = 432
678
679         mock_resource = mock.MagicMock()
680
681         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
682         vpe_approx_vnf._vnf_process = mock_process
683         vpe_approx_vnf.resource_helper.resource = mock_resource
684
685         with self.assertRaises(RuntimeError) as raised:
686             vpe_approx_vnf.wait_for_instantiate()
687
688         self.assertIn('VNF process died', str(raised.exception))
689
690     @mock.patch.object(sample_vnf, 'VnfSshHelper')
691     def test_wait_for_instantiate_panic(self, ssh):
692         test_base.mock_ssh(ssh, exec_result=(1, "", ""))
693
694         mock_process = mock.Mock(autospec=Process)
695         mock_process.is_alive.return_value = True
696         mock_process.exitcode = 432
697
698         mock_resource = mock.MagicMock()
699
700         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
701         vpe_approx_vnf._vnf_process = mock_process
702         vpe_approx_vnf.resource_helper.resource = mock_resource
703
704         vpe_approx_vnf.q_out.put("PANIC")
705         with self.assertRaises(RuntimeError) as raised:
706             vpe_approx_vnf.wait_for_instantiate()
707
708         self.assertIn('Error starting', str(raised.exception))
709
710     @mock.patch.object(sample_vnf, 'VnfSshHelper')
711     def test_wait_for_instantiate_panic_fragmented(self, ssh):
712         test_base.mock_ssh(ssh, exec_result=(1, "", ""))
713
714         mock_process = mock.Mock(autospec=Process)
715         mock_process.is_alive.return_value = True
716         mock_process.exitcode = 432
717
718         # test that fragmented PANIC is recognized
719         mock_q_out = mock.Mock(autospec=Queue)
720         mock_q_out.get.side_effect = iter(["omg PA", "NIC this is bad"])
721         mock_q_out.qsize.side_effect = range(2, -1, -1)
722
723         mock_resource = mock.MagicMock()
724
725         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
726         vpe_approx_vnf._vnf_process = mock_process
727         vpe_approx_vnf.q_out = mock_q_out
728         vpe_approx_vnf.resource_helper.resource = mock_resource
729
730         with self.assertRaises(RuntimeError) as raised:
731             vpe_approx_vnf.wait_for_instantiate()
732
733         self.assertIn('Error starting', str(raised.exception))
734
735     @mock.patch.object(sample_vnf, 'VnfSshHelper')
736     def test_terminate(self, ssh):
737         test_base.mock_ssh(ssh)
738
739         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0, 'task_id')
740         vpe_approx_vnf._vnf_process = mock.MagicMock()
741         vpe_approx_vnf._resource_collect_stop = mock.Mock()
742         vpe_approx_vnf.resource_helper = mock.MagicMock()
743
744         self.assertIsNone(vpe_approx_vnf.terminate())