Merge "Add "securityContext" parameter in Kubernetes context"
[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 from six.moves import configparser
20 import unittest
21
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
28
29
30 TEST_FILE_YAML = 'nsb_test_case.yaml'
31
32 NAME = 'vnf_1'
33
34 PING_OUTPUT_1 = "Pkts in: 101\r\n\tPkts dropped by AH: 100\r\n\tPkts dropped by other: 100"
35
36 MODULE_PATH = test_base.FileAbsPath(__file__)
37 get_file_abspath = MODULE_PATH.get_path
38
39
40 class TestConfigCreate(unittest.TestCase):
41
42     VNFD_0 = {
43         'short-name': 'VpeVnf',
44         'vdu': [
45             {
46                 'routing_table': [
47                     {
48                         'network': '152.16.100.20',
49                         'netmask': '255.255.255.0',
50                         'gateway': '152.16.100.20',
51                         'if': 'xe0'
52                     },
53                     {
54                         'network': '152.16.40.20',
55                         'netmask': '255.255.255.0',
56                         'gateway': '152.16.40.20',
57                         'if': 'xe1'
58                     },
59                 ],
60                 'description': 'VPE approximation using DPDK',
61                 'name': 'vpevnf-baremetal',
62                 'nd_route_tbl': [
63                     {
64                         'network': '0064:ff9b:0:0:0:0:9810:6414',
65                         'netmask': '112',
66                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
67                         'if': 'xe0'
68                     },
69                     {
70                         'network': '0064:ff9b:0:0:0:0:9810:2814',
71                         'netmask': '112',
72                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
73                         'if': 'xe1'
74                     },
75                 ],
76                 'id': 'vpevnf-baremetal',
77                 'external-interface': [
78                     {
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',
85                             'dpdk_port_num': 0,
86                             'bandwidth': '10 Gbps',
87                             'dst_ip': '152.16.100.20',
88                             'local_mac': '00:00:00:00:00:01',
89                             'vld_id': 'uplink_0',
90                             'ifname': 'xe0',
91                         },
92                         'vnfd-connection-point-ref': 'xe0',
93                         'name': 'xe0'
94                     },
95                     {
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',
102                             'dpdk_port_num': 1,
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',
107                             'ifname': 'xe1',
108                         },
109                         'vnfd-connection-point-ref': 'xe1',
110                         'name': 'xe1'
111                     },
112                 ],
113             },
114         ],
115         'description': 'Vpe approximation using DPDK',
116         'mgmt-interface': {
117             'vdu-id': 'vpevnf-baremetal',
118             'host': '1.1.1.1',
119             'password': 'r00t',
120             'user': 'root',
121             'ip': '1.1.1.1'
122         },
123         'benchmark': {
124             'kpi': [
125                 'packets_in',
126                 'packets_fwd',
127                 'packets_dropped',
128             ],
129         },
130         'connection-point': [
131             {
132                 'type': 'VPORT',
133                 'name': 'xe0',
134             },
135             {
136                 'type': 'VPORT',
137                 'name': 'xe1',
138             },
139         ],
140         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
141     }
142
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)
149
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})
154
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')
165
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')
173
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')
184
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')
191
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)
195         intf = [
196             {
197                 "name": 'xe1',
198                 "virtual-interface": {
199                     "dst_ip": "1.1.1.1",
200                     "dst_mac": "00:00:00:00:00:00:02",
201                 },
202             },
203             {
204                 "name": 'xe2',
205                 "virtual-interface": {
206                     "dst_ip": "1.1.1.1",
207                     "dst_mac": "00:00:00:00:00:00:02",
208                 },
209             },
210         ]
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, '')
216
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 \
223                 mock_down, \
224                 mock.patch.object(config_create, 'vpe_tmq') as mock_tmq, \
225                 mock.patch.object(config_create, 'vpe_initialize') as \
226                 mock_ini, \
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')
239
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()
246
247
248 class TestVpeApproxVnf(unittest.TestCase):
249
250     VNFD_0 = {
251         'short-name': 'VpeVnf',
252         'vdu': [
253             {
254                 'routing_table': [
255                     {
256                         'network': '152.16.100.20',
257                         'netmask': '255.255.255.0',
258                         'gateway': '152.16.100.20',
259                         'if': 'xe0',
260                     },
261                     {
262                         'network': '152.16.40.20',
263                         'netmask': '255.255.255.0',
264                         'gateway': '152.16.40.20',
265                         'if': 'xe1',
266                     },
267                 ],
268                 'description': 'VPE approximation using DPDK',
269                 'name': 'vpevnf-baremetal',
270                 'nd_route_tbl': [
271                     {
272                         'network': '0064:ff9b:0:0:0:0:9810:6414',
273                         'netmask': '112',
274                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
275                         'if': 'xe0',
276                     },
277                     {
278                         'network': '0064:ff9b:0:0:0:0:9810:2814',
279                         'netmask': '112',
280                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
281                         'if': 'xe1',
282                     },
283                 ],
284                 'id': 'vpevnf-baremetal',
285                 'external-interface': [
286                     {
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',
293                             'dpdk_port_num': 0,
294                             'bandwidth': '10 Gbps',
295                             'driver': "i40e",
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',
300                             'ifname': 'xe0',
301                         },
302                         'vnfd-connection-point-ref': 'xe0',
303                         'name': 'xe0',
304                     },
305                     {
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',
311                             'driver': "i40e",
312                             'netmask': '255.255.255.0',
313                             'dpdk_port_num': 1,
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',
319                             'ifname': 'xe1',
320                         },
321                         'vnfd-connection-point-ref': 'xe1',
322                         'name': 'xe1',
323                     },
324                 ],
325             },
326         ],
327         'description': 'Vpe approximation using DPDK',
328         'mgmt-interface': {
329             'vdu-id': 'vpevnf-baremetal',
330             'host': '1.2.1.1',
331             'password': 'r00t',
332             'user': 'root',
333             'ip': '1.2.1.1',
334         },
335         'benchmark': {
336             'kpi': [
337                 'packets_in',
338                 'packets_fwd',
339                 'packets_dropped',
340             ],
341         },
342         'connection-point': [
343             {
344                 'type': 'VPORT',
345                 'name': 'xe0',
346             },
347             {
348                 'type': 'VPORT',
349                 'name': 'xe1',
350             },
351         ],
352         'id': 'VpeApproxVnf',
353         'name': 'VPEVnfSsh',
354     }
355
356     VNFD = {
357         'vnfd:vnfd-catalog': {
358             'vnfd': [
359                 VNFD_0,
360             ],
361         },
362     }
363
364     SCENARIO_CFG = {
365         'options': {
366             'packetsize': 64,
367             'traffic_type': 4,
368             'rfc2544': {
369                 'allowed_drop_rate': '0.8 - 1',
370             },
371             'vnf__1': {
372                 'cfg': 'acl_1rule.yaml',
373                 'vnf_config': {
374                     'lb_config': 'SW',
375                     'lb_count': 1,
376                     'worker_config':
377                     '1C/1T',
378                     'worker_threads': 1,
379                 },
380             }
381         },
382         'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7',
383         'tc': 'tc_ipv4_1Mflow_64B_packetsize',
384         'runner': {
385             'object': 'NetworkServiceTestCase',
386             'interval': 35,
387             'output_filename': '/tmp/yardstick.out',
388             'runner_id': 74476,
389             'duration': 400,
390             'type': 'Duration',
391         },
392         'traffic_profile': 'ipv4_throughput_vpe.yaml',
393         'traffic_options': {
394             'flow': 'ipv4_Packets_vpe.yaml',
395             'imix': 'imix_voice.yaml',
396         },
397         'type': 'ISB',
398         'nodes': {
399             'tg__2': 'trafficgen_2.yardstick',
400             'tg__1': 'trafficgen_1.yardstick',
401             'vnf__1': 'vnf.yardstick',
402         },
403         'topology': 'vpe-tg-topology-baremetal.yaml',
404     }
405
406     CONTEXT_CFG = {
407         'nodes': {
408             'tg__2': {
409                 'member-vnf-index': '3',
410                 'role': 'TrafficGen',
411                 'name': 'trafficgen_2.yardstick',
412                 'vnfd-id-ref': 'tg__2',
413                 'ip': '1.2.1.1',
414                 'interfaces': {
415                     'xe0': {
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',
423                         'driver': 'ixgbe',
424                         'vpci': '0000:02:00.0',
425                         'dpdk_port_num': 0,
426                     },
427                     'xe1': {
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',
433                         'driver': 'ixgbe',
434                         'vpci': '0000:02:00.1',
435                         'dpdk_port_num': 1,
436                     },
437                 },
438                 'password': 'r00t',
439                 'VNF model': 'l3fwd_vnf.yaml',
440                 'user': 'root',
441             },
442             'tg__1': {
443                 'member-vnf-index': '1',
444                 'role': 'TrafficGen',
445                 'name': 'trafficgen_1.yardstick',
446                 'vnfd-id-ref': 'tg__1',
447                 'ip': '1.2.1.1',
448                 'interfaces': {
449                     'xe0': {
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',
457                         'driver': 'i40e',
458                         'vpci': '0000:05:00.0',
459                         'dpdk_port_num': 0,
460                     },
461                     'xe1': {
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',
466                         'driver': 'i40e',
467                         'vpci': '0000:05:00.1',
468                         'dpdk_port_num': 1,
469                     },
470                 },
471                 'password': 'r00t',
472                 'VNF model': 'tg_rfc2544_tpl.yaml',
473                 'user': 'root',
474             },
475             'vnf__1': {
476                 'name': 'vnf.yardstick',
477                 'vnfd-id-ref': 'vnf__1',
478                 'ip': '1.2.1.1',
479                 'interfaces': {
480                     'xe0': {
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',
488                         'driver': 'i40e',
489                         'vpci': '0000:05:00.0',
490                         'dpdk_port_num': 0,
491                     },
492                     'xe1': {
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',
500                         'driver': 'i40e',
501                         'vpci': '0000:05:00.1',
502                         'dpdk_port_num': 1,
503                     },
504                 },
505                 'routing_table': [
506                     {
507                         'netmask': '255.255.255.0',
508                         'gateway': '152.16.100.20',
509                         'network': '152.16.100.20',
510                         'if': 'xe0',
511                     },
512                     {
513                         'netmask': '255.255.255.0',
514                         'gateway': '152.16.40.20',
515                         'network': '152.16.40.20',
516                         'if': 'xe1',
517                     },
518                 ],
519                 'member-vnf-index': '2',
520                 'host': '1.2.1.1',
521                 'role': 'vnf',
522                 'user': 'root',
523                 'nd_route_tbl': [
524                     {
525                         'netmask': '112',
526                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
527                         'network': '0064:ff9b:0:0:0:0:9810:6414',
528                         'if': 'xe0',
529                     },
530                     {
531                         'netmask': '112',
532                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
533                         'network': '0064:ff9b:0:0:0:0:9810:2814',
534                         'if': 'xe1',
535                     },
536                 ],
537                 'password': 'r00t',
538                 'VNF model': 'vpe_vnf.yaml',
539             },
540         },
541     }
542
543     def setUp(self):
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)
547
548     def _stop_mocks(self):
549         self._mock_time_sleep.stop()
550
551     def test___init__(self):
552         vpe_approx_vnf = vpe_vnf.VpeApproxVnf(NAME, self.VNFD_0)
553         self.assertIsNone(vpe_approx_vnf._vnf_process)
554
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)
560
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)
565
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"}
569         }
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
574
575         expected = {
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': {}},
582         }
583         self.assertEqual(vpe_approx_vnf.collect_kpi(), expected)
584
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)
590
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}
594
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"}
598         }
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
603
604         expected = {
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}},
611         }
612         self.assertEqual(vpe_approx_vnf.collect_kpi(), expected)
613
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), '')
622
623     @mock.patch.object(sample_vnf, 'VnfSshHelper')
624     def test_run_vpe(self, ssh):
625         test_base.mock_ssh(ssh)
626
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 = {
630             'lb_config': 'SW',
631             'lb_count': 1,
632             'worker_config': '1C/1T',
633             'worker_threads': 1,
634         }
635         vpe_approx_vnf.scenario_helper.scenario_cfg = {
636             'options': {
637                 NAME: {
638                     'traffic_type': '4',
639                     'topology': 'nsb_test_case.yaml',
640                     'vnf_config': 'vpe_config',
641                 }
642             }
643         }
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()
648
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())
652
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 = {
664             'lb_config': 'SW',
665             'lb_count': 1,
666             'worker_config': '1C/1T',
667             'worker_threads': 1,
668         }
669         vpe_approx_vnf.scenario_helper.scenario_cfg = {
670             'options': {
671                 NAME: {
672                     'traffic_type': '4',
673                     'topology': 'nsb_test_case.yaml',
674                     'vnf_config': 'vpe_config',
675                 }
676             }
677         }
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()
681
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())
687
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'}
692
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)
695
696     @mock.patch.object(sample_vnf, 'VnfSshHelper')
697     def test_wait_for_instantiate(self, ssh):
698         test_base.mock_ssh(ssh)
699
700         mock_process = mock.Mock(autospec=Process)
701         mock_process.is_alive.return_value = True
702         mock_process.exitcode = 432
703
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)
707
708         mock_resource = mock.MagicMock()
709
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
716
717         vpe_approx_vnf.q_out.put("pipeline>")
718         self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432)
719
720     @mock.patch.object(sample_vnf, 'VnfSshHelper')
721     def test_wait_for_instantiate_fragmented(self, ssh):
722         test_base.mock_ssh(ssh)
723
724         mock_process = mock.Mock(autospec=Process)
725         mock_process.is_alive.return_value = True
726         mock_process.exitcode = 432
727
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)
732
733         mock_resource = mock.MagicMock()
734
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
741
742         self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432)
743
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, "", ""))
747
748         mock_process = mock.Mock(autospec=Process)
749         mock_process.is_alive.return_value = False
750         mock_process.exitcode = 432
751
752         mock_resource = mock.MagicMock()
753
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
757
758         with self.assertRaises(RuntimeError) as raised:
759             vpe_approx_vnf.wait_for_instantiate()
760
761         self.assertIn('VNF process died', str(raised.exception))
762
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, "", ""))
766
767         mock_process = mock.Mock(autospec=Process)
768         mock_process.is_alive.return_value = True
769         mock_process.exitcode = 432
770
771         mock_resource = mock.MagicMock()
772
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
776
777         vpe_approx_vnf.q_out.put("PANIC")
778         with self.assertRaises(RuntimeError) as raised:
779             vpe_approx_vnf.wait_for_instantiate()
780
781         self.assertIn('Error starting', str(raised.exception))
782
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, "", ""))
786
787         mock_process = mock.Mock(autospec=Process)
788         mock_process.is_alive.return_value = True
789         mock_process.exitcode = 432
790
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)
795
796         mock_resource = mock.MagicMock()
797
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
802
803         with self.assertRaises(RuntimeError) as raised:
804             vpe_approx_vnf.wait_for_instantiate()
805
806         self.assertIn('Error starting', str(raised.exception))
807
808     @mock.patch.object(sample_vnf, 'VnfSshHelper')
809     def test_terminate(self, ssh):
810         test_base.mock_ssh(ssh)
811
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()
816
817         self.assertIsNone(vpe_approx_vnf.terminate())