Support bind driver for QAT HW cards
[yardstick.git] / yardstick / tests / unit / network_services / vnf_generic / vnf / test_vpp_helpers.py
1 # Copyright (c) 2019 Viosoft 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 import ipaddress
15 import unittest
16
17 import mock
18
19 from yardstick.common import exceptions
20 from yardstick.network_services.helpers import cpu
21 from yardstick.network_services.vnf_generic.vnf import vpp_helpers
22 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
23 from yardstick.network_services.vnf_generic.vnf.vpp_helpers import \
24     VppSetupEnvHelper, VppConfigGenerator, VatTerminal
25
26
27 class TestVppConfigGenerator(unittest.TestCase):
28
29     def test_add_config_item(self):
30         test_item = {}
31         vpp_config_generator = VppConfigGenerator()
32         vpp_config_generator.add_config_item(test_item, '/tmp/vpe.log',
33                                              ['unix', 'log'])
34         self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
35
36     def test_add_config_item_str(self):
37         test_item = {'unix': ''}
38         vpp_config_generator = VppConfigGenerator()
39         vpp_config_generator.add_config_item(test_item, '/tmp/vpe.log',
40                                              ['unix', 'log'])
41         self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
42
43     def test_add_unix_log(self):
44         vpp_config_generator = VppConfigGenerator()
45         vpp_config_generator.add_unix_log()
46         self.assertEqual('unix\n{\n  log /tmp/vpe.log\n}\n',
47                          vpp_config_generator.dump_config())
48
49     def test_add_unix_cli_listen(self):
50         vpp_config_generator = VppConfigGenerator()
51         vpp_config_generator.add_unix_cli_listen()
52         self.assertEqual('unix\n{\n  cli-listen /run/vpp/cli.sock\n}\n',
53                          vpp_config_generator.dump_config())
54
55     def test_add_unix_nodaemon(self):
56         vpp_config_generator = VppConfigGenerator()
57         vpp_config_generator.add_unix_nodaemon()
58         self.assertEqual('unix\n{\n  nodaemon \n}\n',
59                          vpp_config_generator.dump_config())
60
61     def test_add_unix_coredump(self):
62         vpp_config_generator = VppConfigGenerator()
63         vpp_config_generator.add_unix_coredump()
64         self.assertEqual('unix\n{\n  full-coredump \n}\n',
65                          vpp_config_generator.dump_config())
66
67     def test_add_dpdk_dev(self):
68         vpp_config_generator = VppConfigGenerator()
69         vpp_config_generator.add_dpdk_dev('0000:00:00.0')
70         self.assertEqual('dpdk\n{\n  dev 0000:00:00.0 \n}\n',
71                          vpp_config_generator.dump_config())
72
73     def test_add_dpdk_cryptodev(self):
74         vpp_config_generator = VppConfigGenerator()
75         vpp_config_generator.add_dpdk_cryptodev(2, '0000:00:00.0')
76         self.assertEqual(
77             'dpdk\n{\n  dev 0000:00:01.0 \n  dev 0000:00:01.1 \n  uio-driver igb_uio\n}\n',
78             vpp_config_generator.dump_config())
79
80     def test_add_dpdk_sw_cryptodev(self):
81         vpp_config_generator = VppConfigGenerator()
82         vpp_config_generator.add_dpdk_sw_cryptodev('aesni_gcm', 0, 2)
83         self.assertEqual(
84             'dpdk\n{\n  vdev cryptodev_aesni_gcm_pmd,socket_id=0 \n}\n',
85             vpp_config_generator.dump_config())
86
87     def test_add_dpdk_dev_default_rxq(self):
88         vpp_config_generator = VppConfigGenerator()
89         vpp_config_generator.add_dpdk_dev_default_rxq(1)
90         self.assertEqual(
91             'dpdk\n{\n  dev default\n  {\n    num-rx-queues 1\n  }\n}\n',
92             vpp_config_generator.dump_config())
93
94     def test_add_dpdk_dev_default_rxd(self):
95         vpp_config_generator = VppConfigGenerator()
96         vpp_config_generator.add_dpdk_dev_default_rxd(2048)
97         self.assertEqual(
98             'dpdk\n{\n  dev default\n  {\n    num-rx-desc 2048\n  }\n}\n',
99             vpp_config_generator.dump_config())
100
101     def test_add_dpdk_dev_default_txd(self):
102         vpp_config_generator = VppConfigGenerator()
103         vpp_config_generator.add_dpdk_dev_default_txd(2048)
104         self.assertEqual(
105             'dpdk\n{\n  dev default\n  {\n    num-tx-desc 2048\n  }\n}\n',
106             vpp_config_generator.dump_config())
107
108     def test_add_dpdk_log_level(self):
109         vpp_config_generator = VppConfigGenerator()
110         vpp_config_generator.add_dpdk_log_level('debug')
111         self.assertEqual('dpdk\n{\n  log-level debug\n}\n',
112                          vpp_config_generator.dump_config())
113
114     def test_add_dpdk_socketmem(self):
115         vpp_config_generator = VppConfigGenerator()
116         vpp_config_generator.add_dpdk_socketmem('1024,1024')
117         self.assertEqual('dpdk\n{\n  socket-mem 1024,1024\n}\n',
118                          vpp_config_generator.dump_config())
119
120     def test_add_dpdk_num_mbufs(self):
121         vpp_config_generator = VppConfigGenerator()
122         vpp_config_generator.add_dpdk_num_mbufs(32768)
123         self.assertEqual('dpdk\n{\n  num-mbufs 32768\n}\n',
124                          vpp_config_generator.dump_config())
125
126     def test_add_dpdk_uio_driver(self):
127         vpp_config_generator = VppConfigGenerator()
128         vpp_config_generator.add_dpdk_uio_driver('igb_uio')
129         self.assertEqual('dpdk\n{\n  uio-driver igb_uio\n}\n',
130                          vpp_config_generator.dump_config())
131
132     def test_add_cpu_main_core(self):
133         vpp_config_generator = VppConfigGenerator()
134         vpp_config_generator.add_cpu_main_core('1,2')
135         self.assertEqual('cpu\n{\n  main-core 1,2\n}\n',
136                          vpp_config_generator.dump_config())
137
138     def test_add_cpu_corelist_workers(self):
139         vpp_config_generator = VppConfigGenerator()
140         vpp_config_generator.add_cpu_corelist_workers('1,2')
141         self.assertEqual('cpu\n{\n  corelist-workers 1,2\n}\n',
142                          vpp_config_generator.dump_config())
143
144     def test_add_heapsize(self):
145         vpp_config_generator = VppConfigGenerator()
146         vpp_config_generator.add_heapsize('4G')
147         self.assertEqual('heapsize 4G\n', vpp_config_generator.dump_config())
148
149     def test_add_ip6_hash_buckets(self):
150         vpp_config_generator = VppConfigGenerator()
151         vpp_config_generator.add_ip6_hash_buckets(2000000)
152         self.assertEqual('ip6\n{\n  hash-buckets 2000000\n}\n',
153                          vpp_config_generator.dump_config())
154
155     def test_add_ip6_heap_size(self):
156         vpp_config_generator = VppConfigGenerator()
157         vpp_config_generator.add_ip6_heap_size('4G')
158         self.assertEqual('ip6\n{\n  heap-size 4G\n}\n',
159                          vpp_config_generator.dump_config())
160
161     def test_add_ip_heap_size(self):
162         vpp_config_generator = VppConfigGenerator()
163         vpp_config_generator.add_ip_heap_size('4G')
164         self.assertEqual('ip\n{\n  heap-size 4G\n}\n',
165                          vpp_config_generator.dump_config())
166
167     def test_add_statseg_size(self):
168         vpp_config_generator = VppConfigGenerator()
169         vpp_config_generator.add_statseg_size('4G')
170         self.assertEqual('statseg\n{\n  size 4G\n}\n',
171                          vpp_config_generator.dump_config())
172
173     def test_add_plugin(self):
174         vpp_config_generator = VppConfigGenerator()
175         vpp_config_generator.add_plugin('enable', ['dpdk_plugin.so'])
176         self.assertEqual(
177             'plugins\n{\n  plugin [\'dpdk_plugin.so\']\n  {\n    enable  \n  }\n}\n',
178             vpp_config_generator.dump_config())
179
180     def test_add_dpdk_no_multi_seg(self):
181         vpp_config_generator = VppConfigGenerator()
182         vpp_config_generator.add_dpdk_no_multi_seg()
183         self.assertEqual('dpdk\n{\n  no-multi-seg \n}\n',
184                          vpp_config_generator.dump_config())
185
186     def test_add_dpdk_no_tx_checksum_offload(self):
187         vpp_config_generator = VppConfigGenerator()
188         vpp_config_generator.add_dpdk_no_tx_checksum_offload()
189         self.assertEqual('dpdk\n{\n  no-tx-checksum-offload \n}\n',
190                          vpp_config_generator.dump_config())
191
192     def test_dump_config(self):
193         vpp_config_generator = VppConfigGenerator()
194         vpp_config_generator.add_unix_log()
195         self.assertEqual('unix\n{\n  log /tmp/vpe.log\n}\n',
196                          vpp_config_generator.dump_config())
197
198     def test_pci_dev_check(self):
199         self.assertTrue(VppConfigGenerator.pci_dev_check('0000:00:00.0'))
200
201     def test_pci_dev_check_error(self):
202         with self.assertRaises(ValueError) as raised:
203             VppConfigGenerator.pci_dev_check('0000:00:0.0')
204         self.assertIn(
205             'PCI address 0000:00:0.0 is not in valid format xxxx:xx:xx.x',
206             str(raised.exception))
207
208
209 class TestVppSetupEnvHelper(unittest.TestCase):
210     VNFD_0 = {
211         "benchmark": {
212             "kpi": [
213                 "packets_in",
214                 "packets_fwd",
215                 "packets_dropped"
216             ]
217         },
218         "connection-point": [
219             {
220                 "name": "xe0",
221                 "type": "VPORT"
222             },
223             {
224                 "name": "xe1",
225                 "type": "VPORT"
226             }
227         ],
228         "description": "VPP IPsec",
229         "id": "VipsecApproxVnf",
230         "mgmt-interface": {
231             "ip": "10.10.10.101",
232             "password": "r00t",
233             "user": "root",
234             "vdu-id": "ipsecvnf-baremetal"
235         },
236         "name": "IpsecVnf",
237         "short-name": "IpsecVnf",
238         "vdu": [
239             {
240                 "description": "VPP Ipsec",
241                 "external-interface": [
242                     {
243                         "name": "xe0",
244                         "virtual-interface": {
245                             "driver": "igb_uio",
246                             "dst_ip": "192.168.100.1",
247                             "dst_mac": "90:e2:ba:7c:30:e8",
248                             "ifname": "xe0",
249                             "local_ip": "192.168.100.2",
250                             "local_mac": "90:e2:ba:7c:41:a8",
251                             "netmask": "255.255.255.0",
252                             "network": {},
253                             "node_name": "vnf__0",
254                             "peer_ifname": "xe0",
255                             "peer_intf": {
256                                 "dpdk_port_num": 0,
257                                 "driver": "igb_uio",
258                                 "dst_ip": "192.168.100.2",
259                                 "dst_mac": "90:e2:ba:7c:41:a8",
260                                 "ifname": "xe0",
261                                 "local_ip": "192.168.100.1",
262                                 "local_mac": "90:e2:ba:7c:30:e8",
263                                 "netmask": "255.255.255.0",
264                                 "network": {},
265                                 "node_name": "tg__0",
266                                 "peer_ifname": "xe0",
267                                 "peer_name": "vnf__0",
268                                 "vld_id": "uplink_0",
269                                 "vpci": "0000:81:00.0"
270                             },
271                             "peer_name": "tg__0",
272                             "vld_id": "uplink_0",
273                             "vpci": "0000:ff:06.0"
274                         },
275                         "vnfd-connection-point-ref": "xe0"
276                     },
277                     {
278                         "name": "xe1",
279                         "virtual-interface": {
280                             "driver": "igb_uio",
281                             "dst_ip": "1.1.1.2",
282                             "dst_mac": "0a:b1:ec:fd:a2:66",
283                             "ifname": "xe1",
284                             "local_ip": "1.1.1.1",
285                             "local_mac": "4e:90:85:d3:c5:13",
286                             "netmask": "255.255.255.0",
287                             "network": {},
288                             "node_name": "vnf__0",
289                             "peer_ifname": "xe1",
290                             "peer_intf": {
291                                 "driver": "igb_uio",
292                                 "dst_ip": "1.1.1.1",
293                                 "dst_mac": "4e:90:85:d3:c5:13",
294                                 "ifname": "xe1",
295                                 "local_ip": "1.1.1.2",
296                                 "local_mac": "0a:b1:ec:fd:a2:66",
297                                 "netmask": "255.255.255.0",
298                                 "network": {},
299                                 "node_name": "vnf__1",
300                                 "peer_ifname": "xe1",
301                                 "peer_name": "vnf__0",
302                                 "vld_id": "ciphertext",
303                                 "vpci": "0000:00:07.0"
304                             },
305                             "peer_name": "vnf__1",
306                             "vld_id": "ciphertext",
307                             "vpci": "0000:ff:07.0"
308                         },
309                         "vnfd-connection-point-ref": "xe1"
310                     }
311                 ],
312                 "id": "ipsecvnf-baremetal",
313                 "name": "ipsecvnf-baremetal",
314                 "routing_table": []
315             }
316         ]
317     }
318
319     VNFD_1 = {
320         "benchmark": {
321             "kpi": [
322                 "packets_in",
323                 "packets_fwd",
324                 "packets_dropped"
325             ]
326         },
327         "connection-point": [
328             {
329                 "name": "xe0",
330                 "type": "VPORT"
331             },
332             {
333                 "name": "xe1",
334                 "type": "VPORT"
335             }
336         ],
337         "description": "VPP IPsec",
338         "id": "VipsecApproxVnf",
339         "mgmt-interface": {
340             "ip": "10.10.10.101",
341             "password": "r00t",
342             "user": "root",
343             "vdu-id": "ipsecvnf-baremetal"
344         },
345         "name": "IpsecVnf",
346         "short-name": "IpsecVnf",
347         "vdu": [
348             {
349                 "description": "VPP Ipsec",
350                 "external-interface": [
351                     {
352                         "name": "xe0",
353                         "virtual-interface": {
354                             "driver": "igb_uio",
355                             "dst_ip": "192.168.100.1",
356                             "dst_mac": "90:e2:ba:7c:30:e8",
357                             "ifname": "xe0",
358                             "local_ip": "192.168.100.2",
359                             "local_mac": "90:e2:ba:7c:41:a8",
360                             "netmask": "255.255.255.0",
361                             "network": {},
362                             "node_name": "vnf__0",
363                             "peer_ifname": "xe0",
364                             "peer_intf": {
365                                 "dpdk_port_num": 0,
366                                 "driver": "igb_uio",
367                                 "dst_ip": "192.168.100.2",
368                                 "dst_mac": "90:e2:ba:7c:41:a8",
369                                 "ifname": "xe0",
370                                 "local_ip": "192.168.100.1",
371                                 "local_mac": "90:e2:ba:7c:30:e8",
372                                 "netmask": "255.255.255.0",
373                                 "network": {},
374                                 "node_name": "tg__0",
375                                 "peer_ifname": "xe0",
376                                 "peer_name": "vnf__0",
377                                 "vld_id": "uplink_0",
378                                 "vpci": "0000:81:00.0"
379                             },
380                             "peer_name": "tg__0",
381                             "vld_id": "uplink_0",
382                             "vpci": "0000:ff:06.0"
383                         },
384                         "vnfd-connection-point-ref": "xe0"
385                     },
386                     {
387                         "name": "xe1",
388                         "virtual-interface": {
389                             "driver": "igb_uio",
390                             "dst_ip": "1.1.1.2",
391                             "dst_mac": "0a:b1:ec:fd:a2:66",
392                             "ifname": "xe1",
393                             "local_ip": "1.1.1.1",
394                             "local_mac": "4e:90:85:d3:c5:13",
395                             "netmask": "255.255.255.0",
396                             "network": {},
397                             "node_name": "vnf__0",
398                             "peer_ifname": "xe1",
399                             "peer_intf": {
400                                 "driver": "igb_uio",
401                                 "dst_ip": "1.1.1.1",
402                                 "dst_mac": "4e:90:85:d3:c5:13",
403                                 "ifname": "xe1",
404                                 "local_ip": "1.1.1.2",
405                                 "local_mac": "0a:b1:ec:fd:a2:66",
406                                 "netmask": "255.255.255.0",
407                                 "network": {},
408                                 "node_name": "vnf__1",
409                                 "peer_ifname": "xe1",
410                                 "peer_name": "vnf__0",
411                                 "vld_id": "ciphertext",
412                                 "vpci": "0000:00:07.0"
413                             },
414                             "peer_name": "vnf__1",
415                             "vld_id": "ciphertext",
416                             "vpci": "0000:ff:07.0"
417                         },
418                         "vnfd-connection-point-ref": "xe1"
419                     }
420                 ],
421                 "id": "ipsecvnf-baremetal",
422                 "name": "ipsecvnf-baremetal",
423                 "routing_table": []
424             }
425         ]
426     }
427
428     VNFD_2 = {
429         "benchmark": {
430             "kpi": [
431                 "packets_in",
432                 "packets_fwd",
433                 "packets_dropped"
434             ]
435         },
436         "connection-point": [
437             {
438                 "name": "xe0",
439                 "type": "VPORT"
440             },
441             {
442                 "name": "xe1",
443                 "type": "VPORT"
444             }
445         ],
446         "description": "VPP IPsec",
447         "id": "VipsecApproxVnf",
448         "mgmt-interface": {
449             "ip": "10.10.10.101",
450             "password": "r00t",
451             "user": "root",
452             "vdu-id": "ipsecvnf-baremetal"
453         },
454         "name": "IpsecVnf",
455         "short-name": "IpsecVnf",
456         "vdu": [
457             {
458                 "description": "VPP Ipsec",
459                 "external-interface": [
460                     {
461                         "name": "xe0",
462                         "virtual-interface": {
463                             "driver": "igb_uio",
464                             "dst_ip": "192.168.100.1",
465                             "dst_mac": "90:e2:ba:7c:30:e8",
466                             "ifname": "xe0",
467                             "local_ip": "192.168.100.2",
468                             "local_mac": "90:e2:ba:7c:41:a8",
469                             "netmask": "255.255.255.0",
470                             "network": {},
471                             "node_name": "vnf__0",
472                             "peer_ifname": "xe0",
473                             "peer_intf": {
474                                 "dpdk_port_num": 0,
475                                 "driver": "igb_uio",
476                                 "dst_ip": "192.168.100.2",
477                                 "dst_mac": "90:e2:ba:7c:41:a8",
478                                 "ifname": "xe0",
479                                 "local_ip": "192.168.100.1",
480                                 "local_mac": "90:e2:ba:7c:30:e8",
481                                 "netmask": "255.255.255.0",
482                                 "network": {},
483                                 "node_name": "tg__0",
484                                 "peer_ifname": "xe0",
485                                 "peer_name": "vnf__0",
486                                 "vld_id": "uplink_0",
487                                 "vpci": "0000:81:00.0"
488                             },
489                             "peer_name": "tg__0",
490                             "vld_id": "uplink_0",
491                             "vpci": "0000:ff:06.0"
492                         },
493                         "vnfd-connection-point-ref": "xe0"
494                     },
495                     {
496                         "name": "xe1",
497                         "virtual-interface": {
498                             "driver": "igb_uio",
499                             "dst_ip": "1.1.1.2",
500                             "dst_mac": "0a:b1:ec:fd:a2:66",
501                             "ifname": "xe1",
502                             "local_ip": "1.1.1.1",
503                             "local_mac": "4e:90:85:d3:c5:13",
504                             "netmask": "255.255.255.0",
505                             "network": {},
506                             "node_name": "vnf__0",
507                             "peer_ifname": "xe1",
508                             "peer_intf": {
509                                 "driver": "igb_uio",
510                                 "dst_ip": "1.1.1.1",
511                                 "dst_mac": "4e:90:85:d3:c5:13",
512                                 "ifname": "xe1",
513                                 "local_ip": "1.1.1.2",
514                                 "local_mac": "0a:b1:ec:fd:a2:66",
515                                 "netmask": "255.255.255.0",
516                                 "network": {},
517                                 "node_name": "vnf__1",
518                                 "peer_ifname": "xe1",
519                                 "peer_name": "vnf__0",
520                                 "vld_id": "ciphertext",
521                                 "vpci": "0000:00:07.0"
522                             },
523                             "peer_name": "vnf__1",
524                             "vld_id": "ciphertext",
525                             "vpci": "0000:ff:07.0"
526                         },
527                         "vnfd-connection-point-ref": "xe1"
528                     }
529                 ],
530                 "id": "ipsecvnf-baremetal",
531                 "name": "ipsecvnf-baremetal",
532                 "routing_table": []
533             }
534         ]
535     }
536
537     VNFD = {
538         'vnfd:vnfd-catalog': {
539             'vnfd': [
540                 VNFD_0,
541             ],
542         },
543     }
544
545     VPP_INTERFACES_DUMP = [
546         {
547             "sw_if_index": 0,
548             "sup_sw_if_index": 0,
549             "l2_address_length": 0,
550             "l2_address": [0, 0, 0, 0, 0, 0, 0, 0],
551             "interface_name": "local0",
552             "admin_up_down": 0,
553             "link_up_down": 0,
554             "link_duplex": 0,
555             "link_speed": 0,
556             "mtu": 0,
557             "sub_id": 0,
558             "sub_dot1ad": 0,
559             "sub_number_of_tags": 0,
560             "sub_outer_vlan_id": 0,
561             "sub_inner_vlan_id": 0,
562             "sub_exact_match": 0,
563             "sub_default": 0,
564             "sub_outer_vlan_id_any": 0,
565             "sub_inner_vlan_id_any": 0,
566             "vtr_op": 0,
567             "vtr_push_dot1q": 0,
568             "vtr_tag1": 0,
569             "vtr_tag2": 0
570         },
571         {
572             "sw_if_index": 1,
573             "sup_sw_if_index": 1,
574             "l2_address_length": 6,
575             "l2_address": [144, 226, 186, 124, 65, 168, 0, 0],
576             "interface_name": "TenGigabitEthernetff/6/0",
577             "admin_up_down": 0,
578             "link_up_down": 0,
579             "link_duplex": 2,
580             "link_speed": 32,
581             "mtu": 9202,
582             "sub_id": 0,
583             "sub_dot1ad": 0,
584             "sub_number_of_tags": 0,
585             "sub_outer_vlan_id": 0,
586             "sub_inner_vlan_id": 0,
587             "sub_exact_match": 0,
588             "sub_default": 0,
589             "sub_outer_vlan_id_any": 0,
590             "sub_inner_vlan_id_any": 0,
591             "vtr_op": 0,
592             "vtr_push_dot1q": 0,
593             "vtr_tag1": 0,
594             "vtr_tag2": 0
595         },
596         {
597             "sw_if_index": 2,
598             "sup_sw_if_index": 2,
599             "l2_address_length": 6,
600             "l2_address": [78, 144, 133, 211, 197, 19, 0, 0],
601             "interface_name": "VirtualFunctionEthernetff/7/0",
602             "admin_up_down": 0,
603             "link_up_down": 0,
604             "link_duplex": 2,
605             "link_speed": 32,
606             "mtu": 9206,
607             "sub_id": 0,
608             "sub_dot1ad": 0,
609             "sub_number_of_tags": 0,
610             "sub_outer_vlan_id": 0,
611             "sub_inner_vlan_id": 0,
612             "sub_exact_match": 0,
613             "sub_default": 0,
614             "sub_outer_vlan_id_any": 0,
615             "sub_inner_vlan_id_any": 0,
616             "vtr_op": 0,
617             "vtr_push_dot1q": 0,
618             "vtr_tag1": 0,
619             "vtr_tag2": 0
620         }
621     ]
622
623     VPP_INTERFACES_DUMP_MAC_ERR = [
624         {
625             "sw_if_index": 0,
626             "sup_sw_if_index": 0,
627             "l2_address_length": 0,
628             "l2_address": [0, 0, 0, 0, 0, 0, 0, 0],
629             "interface_name": "local0",
630             "admin_up_down": 0,
631             "link_up_down": 0,
632             "link_duplex": 0,
633             "link_speed": 0,
634             "mtu": 0,
635             "sub_id": 0,
636             "sub_dot1ad": 0,
637             "sub_number_of_tags": 0,
638             "sub_outer_vlan_id": 0,
639             "sub_inner_vlan_id": 0,
640             "sub_exact_match": 0,
641             "sub_default": 0,
642             "sub_outer_vlan_id_any": 0,
643             "sub_inner_vlan_id_any": 0,
644             "vtr_op": 0,
645             "vtr_push_dot1q": 0,
646             "vtr_tag1": 0,
647             "vtr_tag2": 0
648         },
649         {
650             "sw_if_index": 1,
651             "sup_sw_if_index": 1,
652             "l2_address_length": 6,
653             "l2_address": [144, 226, 186, 124, 65, 169, 0, 0],
654             "interface_name": "TenGigabitEthernetff/6/0",
655             "admin_up_down": 0,
656             "link_up_down": 0,
657             "link_duplex": 2,
658             "link_speed": 32,
659             "mtu": 9202,
660             "sub_id": 0,
661             "sub_dot1ad": 0,
662             "sub_number_of_tags": 0,
663             "sub_outer_vlan_id": 0,
664             "sub_inner_vlan_id": 0,
665             "sub_exact_match": 0,
666             "sub_default": 0,
667             "sub_outer_vlan_id_any": 0,
668             "sub_inner_vlan_id_any": 0,
669             "vtr_op": 0,
670             "vtr_push_dot1q": 0,
671             "vtr_tag1": 0,
672             "vtr_tag2": 0
673         },
674         {
675             "sw_if_index": 2,
676             "sup_sw_if_index": 2,
677             "l2_address_length": 6,
678             "l2_address": [78, 144, 133, 211, 197, 20, 0, 0],
679             "interface_name": "VirtualFunctionEthernetff/7/0",
680             "admin_up_down": 0,
681             "link_up_down": 0,
682             "link_duplex": 2,
683             "link_speed": 32,
684             "mtu": 9206,
685             "sub_id": 0,
686             "sub_dot1ad": 0,
687             "sub_number_of_tags": 0,
688             "sub_outer_vlan_id": 0,
689             "sub_inner_vlan_id": 0,
690             "sub_exact_match": 0,
691             "sub_default": 0,
692             "sub_outer_vlan_id_any": 0,
693             "sub_inner_vlan_id_any": 0,
694             "vtr_op": 0,
695             "vtr_push_dot1q": 0,
696             "vtr_tag1": 0,
697             "vtr_tag2": 0
698         }
699     ]
700
701     CPU_LAYOUT = {'cpuinfo': [[0, 0, 0, 0, 0, 0, 0, 0],
702                               [1, 0, 0, 0, 0, 1, 1, 0]]}
703     CPU_SMT = {'cpuinfo': [[0, 0, 0, 0, 0, 0, 0, 0],
704                            [1, 0, 0, 0, 0, 1, 1, 0],
705                            [2, 1, 0, 0, 0, 2, 2, 1],
706                            [3, 1, 0, 0, 0, 3, 3, 1],
707                            [4, 2, 0, 0, 0, 4, 4, 2],
708                            [5, 2, 0, 0, 0, 5, 5, 2],
709                            [6, 3, 0, 0, 0, 6, 6, 3],
710                            [7, 3, 0, 0, 0, 7, 7, 3],
711                            [8, 4, 0, 0, 0, 8, 8, 4],
712                            [9, 5, 0, 1, 0, 0, 0, 0],
713                            [10, 6, 0, 1, 0, 1, 1, 0],
714                            [11, 6, 0, 1, 0, 2, 2, 1],
715                            [12, 7, 0, 1, 0, 3, 3, 1],
716                            [13, 7, 0, 1, 0, 4, 4, 2],
717                            [14, 8, 0, 1, 0, 5, 5, 2],
718                            [15, 8, 0, 1, 0, 6, 6, 3],
719                            [16, 9, 0, 1, 0, 7, 7, 3],
720                            [17, 9, 0, 1, 0, 8, 8, 4]]}
721
722     def test_kill_vnf(self):
723         vnfd_helper = VnfdHelper(self.VNFD_0)
724         ssh_helper = mock.Mock()
725         ssh_helper.execute.return_value = 0, 0, 0
726         scenario_helper = mock.Mock()
727         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
728                                                  scenario_helper)
729         vpp_setup_env_helper.kill_vnf()
730
731     def test_kill_vnf_error(self):
732         vnfd_helper = VnfdHelper(self.VNFD_0)
733         ssh_helper = mock.Mock()
734         ssh_helper.execute.return_value = 1, 0, 0
735         scenario_helper = mock.Mock()
736         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
737                                                  scenario_helper)
738         with self.assertRaises(RuntimeError) as raised:
739             vpp_setup_env_helper.kill_vnf()
740
741         self.assertIn('Failed to stop service vpp', str(raised.exception))
742
743     def test_tear_down(self):
744         vnfd_helper = VnfdHelper(self.VNFD_0)
745         ssh_helper = mock.Mock()
746         scenario_helper = mock.Mock()
747         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
748                                                  scenario_helper)
749         vpp_setup_env_helper.tear_down()
750
751     def test_start_vpp_service(self):
752         vnfd_helper = VnfdHelper(self.VNFD_0)
753         ssh_helper = mock.Mock()
754         ssh_helper.execute.return_value = 0, 0, 0
755         scenario_helper = mock.Mock()
756         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
757                                                  scenario_helper)
758         vpp_setup_env_helper.start_vpp_service()
759
760     def test_start_vpp_service_error(self):
761         vnfd_helper = VnfdHelper(self.VNFD_0)
762         ssh_helper = mock.Mock()
763         ssh_helper.execute.return_value = 1, 0, 0
764         scenario_helper = mock.Mock()
765         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
766                                                  scenario_helper)
767         with self.assertRaises(RuntimeError) as raised:
768             vpp_setup_env_helper.start_vpp_service()
769
770         self.assertIn('Failed to start service vpp', str(raised.exception))
771
772     def test__update_vnfd_helper(self):
773         vnfd_helper = VnfdHelper(self.VNFD_0)
774         ssh_helper = mock.Mock()
775         scenario_helper = mock.Mock()
776         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
777                                                  scenario_helper)
778         vpp_setup_env_helper._update_vnfd_helper(
779             {'vpp-data': {'vpp-key': 'vpp-value'}})
780
781         self.assertEqual({'vpp-key': 'vpp-value'},
782                          vpp_setup_env_helper.vnfd_helper.get('vpp-data', {}))
783
784     def test__update_vnfd_helper_with_key(self):
785         vnfd_helper = VnfdHelper(self.VNFD_0)
786         ssh_helper = mock.Mock()
787         scenario_helper = mock.Mock()
788         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
789                                                  scenario_helper)
790         vpp_setup_env_helper._update_vnfd_helper({'driver': 'qat'}, 'xe0')
791
792         self.assertEqual('qat',
793                          vpp_setup_env_helper.get_value_by_interface_key(
794                              'xe0', 'driver'))
795
796     def test__update_vnfd_helper_dict_without_key(self):
797         vnfd_helper = VnfdHelper(self.VNFD_0)
798         ssh_helper = mock.Mock()
799         scenario_helper = mock.Mock()
800         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
801                                                  scenario_helper)
802         vpp_setup_env_helper._update_vnfd_helper(
803             {'mgmt-interface': {'name': 'net'}})
804
805         self.assertEqual({'ip': '10.10.10.101',
806                           'name': 'net',
807                           'password': 'r00t',
808                           'user': 'root',
809                           'vdu-id': 'ipsecvnf-baremetal'},
810                          vpp_setup_env_helper.vnfd_helper.get('mgmt-interface',
811                                                               {}))
812
813     def test_get_value_by_interface_key(self):
814         vnfd_helper = VnfdHelper(self.VNFD_0)
815         ssh_helper = mock.Mock()
816
817         scenario_helper = mock.Mock()
818         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
819                                                  scenario_helper)
820         vpp_setup_env_helper._update_vnfd_helper(
821             {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
822
823         self.assertEqual({'vpp-key': 'vpp-value'},
824                          vpp_setup_env_helper.get_value_by_interface_key(
825                              'xe0', 'vpp-data'))
826
827     def test_get_value_by_interface_key_error(self):
828         vnfd_helper = VnfdHelper(self.VNFD_0)
829         ssh_helper = mock.Mock()
830
831         scenario_helper = mock.Mock()
832         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
833                                                  scenario_helper)
834         vpp_setup_env_helper._update_vnfd_helper(
835             {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
836
837         self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(
838             'xe2', 'vpp-err'))
839
840     def test_crypto_device_init(self):
841         vnfd_helper = VnfdHelper(self.VNFD_0)
842         ssh_helper = mock.Mock()
843
844         scenario_helper = mock.Mock()
845         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
846                                                  scenario_helper)
847         vpp_setup_env_helper.dpdk_bind_helper.load_dpdk_driver = mock.Mock()
848         vpp_setup_env_helper.dpdk_bind_helper.bind = mock.Mock()
849
850         vpp_setup_env_helper.kill_vnf = mock.Mock()
851         vpp_setup_env_helper.pci_driver_unbind = mock.Mock()
852
853         with mock.patch.object(vpp_setup_env_helper, 'get_pci_dev_driver') as \
854                 mock_get_pci_dev_driver, \
855                 mock.patch.object(vpp_setup_env_helper, 'set_sriov_numvfs') as \
856                         mock_set_sriov_numvfs:
857             mock_get_pci_dev_driver.return_value = 'igb_uio'
858             self.assertIsNone(
859                 vpp_setup_env_helper.crypto_device_init('0000:ff:06.0', 32))
860             mock_set_sriov_numvfs.assert_called()
861
862     def test_get_sriov_numvfs(self):
863         vnfd_helper = VnfdHelper(self.VNFD_0)
864         ssh_helper = mock.Mock()
865         ssh_helper.execute.return_value = 0, '32', ''
866
867         scenario_helper = mock.Mock()
868         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
869                                                  scenario_helper)
870         self.assertEqual(32,
871                          vpp_setup_env_helper.get_sriov_numvfs('0000:ff:06.0'))
872
873     def test_get_sriov_numvfs_error(self):
874         vnfd_helper = VnfdHelper(self.VNFD_0)
875         ssh_helper = mock.Mock()
876         ssh_helper.execute.return_value = 0, 'err', ''
877
878         scenario_helper = mock.Mock()
879         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
880                                                  scenario_helper)
881         self.assertEqual(0,
882                          vpp_setup_env_helper.get_sriov_numvfs('0000:ff:06.0'))
883
884     def test_set_sriov_numvfs(self):
885         vnfd_helper = VnfdHelper(self.VNFD_0)
886         ssh_helper = mock.Mock()
887
888         scenario_helper = mock.Mock()
889         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
890                                                  scenario_helper)
891         vpp_setup_env_helper.set_sriov_numvfs('0000:ff:06.0')
892         self.assertEqual(ssh_helper.execute.call_count, 1)
893
894     def test_pci_driver_unbind(self):
895         vnfd_helper = VnfdHelper(self.VNFD_0)
896         ssh_helper = mock.Mock()
897
898         scenario_helper = mock.Mock()
899         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
900                                                  scenario_helper)
901         vpp_setup_env_helper.pci_driver_unbind('0000:ff:06.0')
902         self.assertEqual(ssh_helper.execute.call_count, 1)
903
904     def test_get_pci_dev_driver(self):
905         vnfd_helper = VnfdHelper(self.VNFD_0)
906         ssh_helper = mock.Mock()
907         ssh_helper.execute.return_value = \
908             0, 'Slot:   ff:07.0\n' \
909                'Class:  Ethernet controller\n' \
910                'Vendor: Intel Corporation\n' \
911                'Device: 82599 Ethernet Controller Virtual Function\n' \
912                'SVendor:        Intel Corporation\n' \
913                'SDevice:        82599 Ethernet Controller Virtual Function\n' \
914                'Rev:    01\n' \
915                'Driver: igb_uio\n' \
916                'Module: ixgbevf', ''
917         scenario_helper = mock.Mock()
918         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
919                                                  scenario_helper)
920         self.assertEqual('igb_uio', vpp_setup_env_helper.get_pci_dev_driver(
921             '0000:ff:06.0'))
922
923     def test_get_pci_dev_driver_error(self):
924         vnfd_helper = VnfdHelper(self.VNFD_0)
925         ssh_helper = mock.Mock()
926         ssh_helper.execute.return_value = 1, 'err', ''
927         scenario_helper = mock.Mock()
928         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
929                                                  scenario_helper)
930         with self.assertRaises(RuntimeError) as raised:
931             vpp_setup_env_helper.get_pci_dev_driver(
932                 '0000:ff:06.0')
933
934         self.assertIn("'lspci -vmmks 0000:ff:06.0' failed",
935                       str(raised.exception))
936
937     def test_get_pci_dev_driver_output_error(self):
938         vnfd_helper = VnfdHelper(self.VNFD_0)
939         ssh_helper = mock.Mock()
940         ssh_helper.execute.return_value = \
941             0, 'Slot:   ff:07.0\n' \
942                '\n\t' \
943                'Vendor: Intel Corporation\n' \
944                'Device: 82599 Ethernet Controller Virtual Function\n' \
945                'SVendor:        Intel Corporation\n' \
946                'SDevice:        82599 Ethernet Controller Virtual Function\n' \
947                'Rev:    01\n' \
948                'Driver_err:     igb_uio\n' \
949                'Module: ixgbevf', ''
950         scenario_helper = mock.Mock()
951         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
952                                                  scenario_helper)
953         self.assertIsNone(
954             vpp_setup_env_helper.get_pci_dev_driver('0000:ff:06.0'))
955
956     def test_vpp_create_ipsec_tunnels(self):
957         vnfd_helper = VnfdHelper(self.VNFD_0)
958         ssh_helper = mock.Mock()
959         ssh_helper.execute.return_value = 0, '', ''
960
961         scenario_helper = mock.Mock()
962         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
963                                                  scenario_helper)
964
965         self.assertIsNone(
966             vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
967                                                           '10.10.10.1', 'xe0',
968                                                           1, 1, mock.Mock(),
969                                                           'crypto_key',
970                                                           mock.Mock(),
971                                                           'integ_key',
972                                                           '20.20.20.0'))
973         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
974
975     def test_vpp_create_ipsec_1000_tunnels(self):
976         vnfd_helper = VnfdHelper(self.VNFD_0)
977         ssh_helper = mock.Mock()
978         ssh_helper.execute.return_value = 0, '', ''
979
980         scenario_helper = mock.Mock()
981         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
982                                                  scenario_helper)
983
984         self.assertIsNone(
985             vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
986                                                           '10.10.10.1', 'xe0',
987                                                           1000, 128000,
988                                                           mock.Mock(),
989                                                           'crypto_key',
990                                                           mock.Mock(),
991                                                           'integ_key',
992                                                           '20.20.20.0'))
993         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
994
995     def test_apply_config(self):
996         vnfd_helper = VnfdHelper(self.VNFD_0)
997         ssh_helper = mock.Mock()
998         ssh_helper.execute.return_value = 0, '', ''
999
1000         scenario_helper = mock.Mock()
1001         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1002                                                  scenario_helper)
1003         self.assertIsNone(vpp_setup_env_helper.apply_config(mock.Mock()))
1004         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
1005
1006     def test_apply_config_error(self):
1007         vnfd_helper = VnfdHelper(self.VNFD_0)
1008         ssh_helper = mock.Mock()
1009         ssh_helper.execute.return_value = 1, '', ''
1010
1011         scenario_helper = mock.Mock()
1012         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1013                                                  scenario_helper)
1014         with self.assertRaises(RuntimeError) as raised:
1015             vpp_setup_env_helper.apply_config(mock.Mock())
1016
1017         self.assertIn('Writing config file failed', str(raised.exception))
1018
1019     def test_vpp_route_add(self):
1020         vnfd_helper = VnfdHelper(self.VNFD_0)
1021         ssh_helper = mock.Mock()
1022         scenario_helper = mock.Mock()
1023         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1024                                                  scenario_helper)
1025
1026         with mock.patch.object(vpp_helpers.VatTerminal,
1027                                'vat_terminal_exec_cmd_from_template') as \
1028                 mock_vat_terminal_exec_cmd_from_template:
1029             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1030             self.assertIsNone(
1031                 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24))
1032
1033     def test_vpp_route_add_without_index(self):
1034         vnfd_helper = VnfdHelper(self.VNFD_0)
1035         ssh_helper = mock.Mock()
1036         scenario_helper = mock.Mock()
1037         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1038                                                  scenario_helper)
1039
1040         with mock.patch.object(vpp_helpers.VatTerminal,
1041                                'vat_terminal_exec_cmd_from_template') as \
1042                 mock_vat_terminal_exec_cmd_from_template:
1043             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1044             self.assertIsNone(
1045                 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24,
1046                                                    interface='xe0',
1047                                                    use_sw_index=False))
1048
1049     def test_add_arp_on_dut(self):
1050         vnfd_helper = VnfdHelper(self.VNFD_0)
1051         ssh_helper = mock.Mock()
1052         scenario_helper = mock.Mock()
1053         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1054                                                  scenario_helper)
1055
1056         with mock.patch.object(vpp_helpers.VatTerminal,
1057                                'vat_terminal_exec_cmd_from_template') as \
1058                 mock_vat_terminal_exec_cmd_from_template:
1059             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1060             self.assertEqual('', vpp_setup_env_helper.add_arp_on_dut('xe0',
1061                                                                      '10.10.10.1',
1062                                                                      '00:00:00:00:00:00'))
1063
1064     def test_set_ip(self):
1065         vnfd_helper = VnfdHelper(self.VNFD_0)
1066         ssh_helper = mock.Mock()
1067         scenario_helper = mock.Mock()
1068         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1069                                                  scenario_helper)
1070
1071         with mock.patch.object(vpp_helpers.VatTerminal,
1072                                'vat_terminal_exec_cmd_from_template') as \
1073                 mock_vat_terminal_exec_cmd_from_template:
1074             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1075             self.assertEqual('',
1076                              vpp_setup_env_helper.set_ip('xe0', '10.10.10.1',
1077                                                          24))
1078
1079     def test_set_interface_state(self):
1080         vnfd_helper = VnfdHelper(self.VNFD_0)
1081         ssh_helper = mock.Mock()
1082         scenario_helper = mock.Mock()
1083         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1084                                                  scenario_helper)
1085
1086         with mock.patch.object(vpp_helpers.VatTerminal,
1087                                'vat_terminal_exec_cmd_from_template') as \
1088                 mock_vat_terminal_exec_cmd_from_template:
1089             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1090             self.assertEqual('',
1091                              vpp_setup_env_helper.set_interface_state('xe0',
1092                                                                       'up'))
1093
1094     def test_set_interface_state_error(self):
1095         vnfd_helper = VnfdHelper(self.VNFD_0)
1096         ssh_helper = mock.Mock()
1097         scenario_helper = mock.Mock()
1098         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1099                                                  scenario_helper)
1100
1101         with mock.patch.object(vpp_helpers.VatTerminal,
1102                                'vat_terminal_exec_cmd_from_template') as \
1103                 mock_vat_terminal_exec_cmd_from_template:
1104             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1105         with self.assertRaises(ValueError) as raised:
1106             vpp_setup_env_helper.set_interface_state('xe0', 'error')
1107         self.assertIn('Unexpected interface state: error',
1108                       str(raised.exception))
1109
1110     def test_set_interface_down_state(self):
1111         vnfd_helper = VnfdHelper(self.VNFD_0)
1112         ssh_helper = mock.Mock()
1113         scenario_helper = mock.Mock()
1114         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1115                                                  scenario_helper)
1116
1117         with mock.patch.object(vpp_helpers.VatTerminal,
1118                                'vat_terminal_exec_cmd_from_template') as \
1119                 mock_vat_terminal_exec_cmd_from_template:
1120             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1121             self.assertEqual('',
1122                              vpp_setup_env_helper.set_interface_state('xe0',
1123                                                                       'down'))
1124
1125     def test_vpp_set_interface_mtu(self):
1126         vnfd_helper = VnfdHelper(self.VNFD_0)
1127         ssh_helper = mock.Mock()
1128         scenario_helper = mock.Mock()
1129         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1130                                                  scenario_helper)
1131
1132         with mock.patch.object(vpp_helpers.VatTerminal,
1133                                'vat_terminal_exec_cmd_from_template') as \
1134                 mock_vat_terminal_exec_cmd_from_template:
1135             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1136             self.assertIsNone(
1137                 vpp_setup_env_helper.vpp_set_interface_mtu('xe0', 9200))
1138
1139     def test_vpp_interfaces_ready_wait(self):
1140         json_output = [self.VPP_INTERFACES_DUMP]
1141         vnfd_helper = VnfdHelper(self.VNFD_0)
1142         ssh_helper = mock.Mock()
1143         scenario_helper = mock.Mock()
1144         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1145                                                  scenario_helper)
1146
1147         with mock.patch.object(vpp_helpers.VatTerminal,
1148                                'vat_terminal_exec_cmd_from_template') as \
1149                 mock_vat_terminal_exec_cmd_from_template:
1150             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1151             self.assertIsNone(vpp_setup_env_helper.vpp_interfaces_ready_wait())
1152
1153     def test_vpp_interfaces_ready_wait_timeout(self):
1154         json_output = [[
1155             {
1156                 "sw_if_index": 0,
1157                 "sup_sw_if_index": 0,
1158                 "l2_address_length": 0,
1159                 "l2_address": [0, 0, 0, 0, 0, 0, 0, 0],
1160                 "interface_name": "xe0",
1161                 "admin_up_down": 1,
1162                 "link_up_down": 0,
1163                 "link_duplex": 0,
1164                 "link_speed": 0,
1165                 "mtu": 0,
1166                 "sub_id": 0,
1167                 "sub_dot1ad": 0,
1168                 "sub_number_of_tags": 0,
1169                 "sub_outer_vlan_id": 0,
1170                 "sub_inner_vlan_id": 0,
1171                 "sub_exact_match": 0,
1172                 "sub_default": 0,
1173                 "sub_outer_vlan_id_any": 0,
1174                 "sub_inner_vlan_id_any": 0,
1175                 "vtr_op": 0,
1176                 "vtr_push_dot1q": 0,
1177                 "vtr_tag1": 0,
1178                 "vtr_tag2": 0
1179             }]]
1180         vnfd_helper = VnfdHelper(self.VNFD_0)
1181         ssh_helper = mock.Mock()
1182         scenario_helper = mock.Mock()
1183         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1184                                                  scenario_helper)
1185
1186         with mock.patch.object(vpp_helpers.VatTerminal,
1187                                'vat_terminal_exec_cmd_from_template') as \
1188                 mock_vat_terminal_exec_cmd_from_template:
1189             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1190             with self.assertRaises(RuntimeError) as raised:
1191                 vpp_setup_env_helper.vpp_interfaces_ready_wait(5)
1192             self.assertIn('timeout, not up [\'xe0\']', str(raised.exception))
1193
1194     def test_vpp_get_interface_data(self):
1195         json_output = [self.VPP_INTERFACES_DUMP]
1196         vnfd_helper = VnfdHelper(self.VNFD_0)
1197         ssh_helper = mock.Mock()
1198         scenario_helper = mock.Mock()
1199         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1200                                                  scenario_helper)
1201
1202         with mock.patch.object(vpp_helpers.VatTerminal,
1203                                'vat_terminal_exec_cmd_from_template') as \
1204                 mock_vat_terminal_exec_cmd_from_template:
1205             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1206             self.assertEqual(json_output[0],
1207                              vpp_setup_env_helper.vpp_get_interface_data())
1208
1209     def test_vpp_get_interface_data_ifname(self):
1210         json_output = [self.VPP_INTERFACES_DUMP]
1211         vnfd_helper = VnfdHelper(self.VNFD_0)
1212         ssh_helper = mock.Mock()
1213         scenario_helper = mock.Mock()
1214         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1215                                                  scenario_helper)
1216
1217         with mock.patch.object(vpp_helpers.VatTerminal,
1218                                'vat_terminal_exec_cmd_from_template') as \
1219                 mock_vat_terminal_exec_cmd_from_template:
1220             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1221             self.assertEqual(json_output[0][2],
1222                              vpp_setup_env_helper.vpp_get_interface_data(
1223                                  'VirtualFunctionEthernetff/7/0'))
1224
1225     def test_vpp_get_interface_data_ifname_error(self):
1226         json_output = [self.VPP_INTERFACES_DUMP]
1227         vnfd_helper = VnfdHelper(self.VNFD_0)
1228         ssh_helper = mock.Mock()
1229         scenario_helper = mock.Mock()
1230         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1231                                                  scenario_helper)
1232
1233         with mock.patch.object(vpp_helpers.VatTerminal,
1234                                'vat_terminal_exec_cmd_from_template') as \
1235                 mock_vat_terminal_exec_cmd_from_template:
1236             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1237             self.assertEqual({}, vpp_setup_env_helper.vpp_get_interface_data(
1238                 'error'))
1239
1240     def test_vpp_get_interface_data_ifindex(self):
1241         json_output = [self.VPP_INTERFACES_DUMP]
1242         vnfd_helper = VnfdHelper(self.VNFD_0)
1243         ssh_helper = mock.Mock()
1244         scenario_helper = mock.Mock()
1245         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1246                                                  scenario_helper)
1247
1248         with mock.patch.object(vpp_helpers.VatTerminal,
1249                                'vat_terminal_exec_cmd_from_template') as \
1250                 mock_vat_terminal_exec_cmd_from_template:
1251             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1252             self.assertEqual(json_output[0][1],
1253                              vpp_setup_env_helper.vpp_get_interface_data(1))
1254
1255     def test_vpp_get_interface_data_error(self):
1256         json_output = [self.VPP_INTERFACES_DUMP]
1257         vnfd_helper = VnfdHelper(self.VNFD_0)
1258         ssh_helper = mock.Mock()
1259         scenario_helper = mock.Mock()
1260         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1261                                                  scenario_helper)
1262
1263         with mock.patch.object(vpp_helpers.VatTerminal,
1264                                'vat_terminal_exec_cmd_from_template') as \
1265                 mock_vat_terminal_exec_cmd_from_template:
1266             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1267             with self.assertRaises(TypeError) as raised:
1268                 vpp_setup_env_helper.vpp_get_interface_data(1.0)
1269         self.assertEqual('', str(raised.exception))
1270
1271     def test_update_vpp_interface_data(self):
1272         output = '{}\n{}'.format(self.VPP_INTERFACES_DUMP,
1273                                  'dump_interface_table:6019: JSON output ' \
1274                                  'supported only for VPE API calls and dump_stats_table\n' \
1275                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1276                                  'dump_interface_table error: Misc')
1277         vnfd_helper = VnfdHelper(self.VNFD_0)
1278         ssh_helper = mock.Mock()
1279         ssh_helper.execute.return_value = 0, output.replace("\'", "\""), ''
1280         ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/vpp/templates'
1281
1282         scenario_helper = mock.Mock()
1283         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1284                                                  scenario_helper)
1285         self.assertIsNone(vpp_setup_env_helper.update_vpp_interface_data())
1286         self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
1287         self.assertEqual('TenGigabitEthernetff/6/0',
1288                          vpp_setup_env_helper.get_value_by_interface_key(
1289                              'xe0', 'vpp_name'))
1290         self.assertEqual(1, vpp_setup_env_helper.get_value_by_interface_key(
1291             'xe0', 'vpp_sw_index'))
1292         self.assertEqual('VirtualFunctionEthernetff/7/0',
1293                          vpp_setup_env_helper.get_value_by_interface_key(
1294                              'xe1', 'vpp_name'))
1295         self.assertEqual(2, vpp_setup_env_helper.get_value_by_interface_key(
1296             'xe1', 'vpp_sw_index'))
1297
1298     def test_update_vpp_interface_data_error(self):
1299         output = '{}\n{}'.format(self.VPP_INTERFACES_DUMP_MAC_ERR,
1300                                  'dump_interface_table:6019: JSON output ' \
1301                                  'supported only for VPE API calls and dump_stats_table\n' \
1302                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1303                                  'dump_interface_table error: Misc')
1304         vnfd_helper = VnfdHelper(self.VNFD_0)
1305         ssh_helper = mock.Mock()
1306         ssh_helper.execute.return_value = 0, output.replace("\'", "\""), ''
1307         ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/vpp/templates'
1308
1309         scenario_helper = mock.Mock()
1310         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1311                                                  scenario_helper)
1312         self.assertIsNone(vpp_setup_env_helper.update_vpp_interface_data())
1313         self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
1314
1315     def test_iface_update_numa(self):
1316         vnfd_helper = VnfdHelper(self.VNFD_0)
1317         ssh_helper = mock.Mock()
1318         ssh_helper.execute.return_value = 0, '0', ''
1319
1320         scenario_helper = mock.Mock()
1321         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1322                                                  scenario_helper)
1323         self.assertIsNone(vpp_setup_env_helper.iface_update_numa())
1324         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
1325         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1326             'xe0', 'numa_node'))
1327         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1328             'xe1', 'numa_node'))
1329
1330     def test_iface_update_numa_error(self):
1331         vnfd_helper = VnfdHelper(self.VNFD_1)
1332         ssh_helper = mock.Mock()
1333         ssh_helper.execute.return_value = 0, '-1', ''
1334
1335         scenario_helper = mock.Mock()
1336         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1337                                                  scenario_helper)
1338         with mock.patch.object(cpu.CpuSysCores, 'get_cpu_layout') as \
1339                 mock_get_cpu_layout:
1340             mock_get_cpu_layout.return_value = self.CPU_LAYOUT
1341             sys_cores = cpu.CpuSysCores(ssh_helper)
1342             vpp_setup_env_helper._update_vnfd_helper(
1343                 sys_cores.get_cpu_layout())
1344         self.assertIsNone(vpp_setup_env_helper.iface_update_numa())
1345         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
1346         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1347             'xe0', 'numa_node'))
1348         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1349             'xe1', 'numa_node'))
1350
1351     def test_iface_update_without_numa(self):
1352         vnfd_helper = VnfdHelper(self.VNFD_2)
1353         ssh_helper = mock.Mock()
1354         ssh_helper.execute.return_value = 0, '-1', ''
1355
1356         scenario_helper = mock.Mock()
1357         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1358                                                  scenario_helper)
1359         with mock.patch.object(cpu.CpuSysCores, 'get_cpu_layout') as \
1360                 mock_get_cpu_layout:
1361             mock_get_cpu_layout.return_value = self.CPU_SMT
1362             sys_cores = cpu.CpuSysCores(ssh_helper)
1363             vpp_setup_env_helper._update_vnfd_helper(
1364                 sys_cores.get_cpu_layout())
1365         self.assertIsNone(vpp_setup_env_helper.iface_update_numa())
1366         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
1367         self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(
1368             'xe0', 'numa_node'))
1369         self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(
1370             'xe1', 'numa_node'))
1371
1372     def test_execute_script(self):
1373         vnfd_helper = VnfdHelper(self.VNFD_0)
1374         ssh_helper = mock.Mock()
1375
1376         scenario_helper = mock.Mock()
1377         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1378                                                  scenario_helper)
1379         vpp_setup_env_helper.execute_script('dump_interfaces.vat', True, True)
1380         self.assertGreaterEqual(ssh_helper.put_file.call_count, 1)
1381         self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
1382
1383     def test_execute_script_error(self):
1384         vnfd_helper = VnfdHelper(self.VNFD_0)
1385         ssh_helper = mock.Mock()
1386         ssh_helper.execute.side_effect = Exception
1387
1388         scenario_helper = mock.Mock()
1389         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1390                                                  scenario_helper)
1391         with self.assertRaises(Exception) as raised:
1392             vpp_setup_env_helper.execute_script('dump_interfaces.vat', True,
1393                                                 True)
1394         self.assertIn(
1395             'VAT script execution failed: vpp_api_test json in dump_interfaces.vat script',
1396             str(raised.exception))
1397         self.assertGreaterEqual(ssh_helper.put_file.call_count, 1)
1398
1399     def test_execute_script_json_out(self):
1400         json_output = [
1401             {
1402                 "sw_if_index": 0,
1403                 "sup_sw_if_index": 0
1404             },
1405             {
1406                 "l2_address_length": 6,
1407                 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1408             },
1409             {
1410                 "interface_name": "VirtualFunctionEthernetff/7/0",
1411                 "admin_up_down": 0
1412             }
1413         ]
1414         output = '{}\n{}'.format(json_output,
1415                                  'dump_interface_table:6019: JSON output ' \
1416                                  'supported only for VPE API calls and dump_stats_table\n' \
1417                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1418                                  'dump_interface_table error: Misc')
1419         vnfd_helper = VnfdHelper(self.VNFD_0)
1420         ssh_helper = mock.Mock()
1421         ssh_helper.execute.return_value = 0, output, ''
1422         ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/vpp/templates'
1423         scenario_helper = mock.Mock()
1424         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1425                                                  scenario_helper)
1426         self.assertEqual(str(json_output),
1427                          vpp_setup_env_helper.execute_script_json_out(
1428                              'dump_interfaces.vat'))
1429
1430     def test_self_cleanup_vat_json_output(self):
1431         json_output = [
1432             {
1433                 "sw_if_index": 0,
1434                 "sup_sw_if_index": 0
1435             },
1436             {
1437                 "l2_address_length": 6,
1438                 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1439             },
1440             {
1441                 "interface_name": "VirtualFunctionEthernetff/7/0",
1442                 "admin_up_down": 0
1443             }
1444         ]
1445
1446         output = '{}\n{}'.format(json_output,
1447                                  'dump_interface_table:6019: JSON output ' \
1448                                  'supported only for VPE API calls and dump_stats_table\n' \
1449                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1450                                  'dump_interface_table error: Misc')
1451         self.assertEqual(str(json_output),
1452                          VppSetupEnvHelper.cleanup_vat_json_output(output,
1453                              '/opt/nsb_bin/vpp/templates/dump_interfaces.vat'))
1454
1455     def test__convert_mac_to_number_list(self):
1456         self.assertEqual([144, 226, 186, 124, 65, 168],
1457                          VppSetupEnvHelper._convert_mac_to_number_list(
1458                              '90:e2:ba:7c:41:a8'))
1459
1460     def test_get_vpp_interface_by_mac(self):
1461         mac_address = '90:e2:ba:7c:41:a8'
1462         self.assertEqual({'admin_up_down': 0,
1463                           'interface_name': 'TenGigabitEthernetff/6/0',
1464                           'l2_address': [144, 226, 186, 124, 65, 168, 0, 0],
1465                           'l2_address_length': 6,
1466                           'link_duplex': 2,
1467                           'link_speed': 32,
1468                           'link_up_down': 0,
1469                           'mtu': 9202,
1470                           'sub_default': 0,
1471                           'sub_dot1ad': 0,
1472                           'sub_exact_match': 0,
1473                           'sub_id': 0,
1474                           'sub_inner_vlan_id': 0,
1475                           'sub_inner_vlan_id_any': 0,
1476                           'sub_number_of_tags': 0,
1477                           'sub_outer_vlan_id': 0,
1478                           'sub_outer_vlan_id_any': 0,
1479                           'sup_sw_if_index': 1,
1480                           'sw_if_index': 1,
1481                           'vtr_op': 0,
1482                           'vtr_push_dot1q': 0,
1483                           'vtr_tag1': 0,
1484                           'vtr_tag2': 0},
1485                          VppSetupEnvHelper.get_vpp_interface_by_mac(
1486                              self.VPP_INTERFACES_DUMP, mac_address))
1487
1488     def test_get_vpp_interface_by_mac_error(self):
1489         mac_address = '90:e2:ba:7c:41:a9'
1490         with self.assertRaises(ValueError) as raised:
1491             VppSetupEnvHelper.get_vpp_interface_by_mac(
1492                 [{
1493                     "sw_if_index": 1,
1494                     "sup_sw_if_index": 1,
1495                     "l2_address_length": 7,
1496                     "l2_address": [144, 226, 186, 124, 65, 169, 0, 0],
1497                     "interface_name": "TenGigabitEthernetff/6/0",
1498                     "admin_up_down": 0,
1499                     "link_up_down": 0,
1500                     "link_duplex": 2,
1501                     "link_speed": 32,
1502                     "mtu": 9202,
1503                     "sub_id": 0,
1504                     "sub_dot1ad": 0,
1505                     "sub_number_of_tags": 0,
1506                     "sub_outer_vlan_id": 0,
1507                     "sub_inner_vlan_id": 0,
1508                     "sub_exact_match": 0,
1509                     "sub_default": 0,
1510                     "sub_outer_vlan_id_any": 0,
1511                     "sub_inner_vlan_id_any": 0,
1512                     "vtr_op": 0,
1513                     "vtr_push_dot1q": 0,
1514                     "vtr_tag1": 0,
1515                     "vtr_tag2": 0
1516                 }], mac_address)
1517
1518         self.assertIn('l2_address_length value is not 6.',
1519                       str(raised.exception))
1520
1521     def test_get_vpp_interface_by_mac_l2_error(self):
1522         mac_address = '90:e2:ba:7c:41:a7'
1523         with self.assertRaises(KeyError) as raised:
1524             VppSetupEnvHelper.get_vpp_interface_by_mac(
1525                 [{
1526                     "sw_if_index": 1,
1527                     "sup_sw_if_index": 1,
1528                     "l2_address_length": 6,
1529                     "l2_address_err": [144, 226, 186, 124, 65, 167, 0, 0],
1530                     "interface_name": "TenGigabitEthernetff/6/0",
1531                     "admin_up_down": 0,
1532                     "link_up_down": 0,
1533                     "link_duplex": 2,
1534                     "link_speed": 32,
1535                     "mtu": 9202,
1536                     "sub_id": 0,
1537                     "sub_dot1ad": 0,
1538                     "sub_number_of_tags": 0,
1539                     "sub_outer_vlan_id": 0,
1540                     "sub_inner_vlan_id": 0,
1541                     "sub_exact_match": 0,
1542                     "sub_default": 0,
1543                     "sub_outer_vlan_id_any": 0,
1544                     "sub_inner_vlan_id_any": 0,
1545                     "vtr_op": 0,
1546                     "vtr_push_dot1q": 0,
1547                     "vtr_tag1": 0,
1548                     "vtr_tag2": 0
1549                 }], mac_address)
1550
1551         self.assertIn(
1552             'key l2_address not found in interface dict.Probably input list ' \
1553             'is not parsed from correct VAT json output.',
1554             str(raised.exception))
1555
1556     def test_get_vpp_interface_by_mac_l2_length_error(self):
1557         mac_address = '90:e2:ba:7c:41:a6'
1558         with self.assertRaises(KeyError) as raised:
1559             VppSetupEnvHelper.get_vpp_interface_by_mac(
1560                 [{
1561                     "sw_if_index": 1,
1562                     "sup_sw_if_index": 1,
1563                     "l2_address_length_err": 6,
1564                     "l2_address": [144, 226, 186, 124, 65, 166, 0, 0],
1565                     "interface_name": "TenGigabitEthernetff/6/0",
1566                     "admin_up_down": 0,
1567                     "link_up_down": 0,
1568                     "link_duplex": 2,
1569                     "link_speed": 32,
1570                     "mtu": 9202,
1571                     "sub_id": 0,
1572                     "sub_dot1ad": 0,
1573                     "sub_number_of_tags": 0,
1574                     "sub_outer_vlan_id": 0,
1575                     "sub_inner_vlan_id": 0,
1576                     "sub_exact_match": 0,
1577                     "sub_default": 0,
1578                     "sub_outer_vlan_id_any": 0,
1579                     "sub_inner_vlan_id_any": 0,
1580                     "vtr_op": 0,
1581                     "vtr_push_dot1q": 0,
1582                     "vtr_tag1": 0,
1583                     "vtr_tag2": 0
1584                 }], mac_address)
1585
1586         self.assertIn(
1587             'key l2_address_length not found in interface dict. Probably ' \
1588             'input list is not parsed from correct VAT json output.',
1589             str(raised.exception))
1590
1591     def test_get_prefix_length(self):
1592         start_ip = '10.10.10.0'
1593         end_ip = '10.10.10.127'
1594         ips = [ipaddress.ip_address(ip) for ip in
1595                [str(ipaddress.ip_address(start_ip)), str(end_ip)]]
1596         lowest_ip, highest_ip = min(ips), max(ips)
1597
1598         self.assertEqual(25,
1599                          VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1600                                                              int(highest_ip),
1601                                                              lowest_ip.max_prefixlen))
1602
1603     def test_get_prefix_length_zero_prefix(self):
1604         start_ip = '10.0.0.0'
1605         end_ip = '10.0.0.0'
1606         ips = [ipaddress.ip_address(ip) for ip in
1607                [str(ipaddress.ip_address(start_ip)), str(end_ip)]]
1608         lowest_ip, highest_ip = min(ips), max(ips)
1609
1610         self.assertEqual(0,
1611                          VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1612                                                              int(highest_ip),
1613                                                              0))
1614
1615
1616 class TestVatTerminal(unittest.TestCase):
1617
1618     def test___init___error(self):
1619         ssh_helper = mock.Mock()
1620         ssh_helper.interactive_terminal_open.side_effect = exceptions.SSHTimeout
1621
1622         with self.assertRaises(RuntimeError) as raised:
1623             VatTerminal(ssh_helper, json_param=True)
1624         self.assertIn('Cannot open interactive terminal',
1625                       str(raised.exception))
1626
1627     def test___init___exec_error(self):
1628         ssh_helper = mock.Mock()
1629         ssh_helper.interactive_terminal_exec_command.side_effect = exceptions.SSHTimeout
1630         VatTerminal(ssh_helper, json_param=True)
1631
1632     def test_vat_terminal_exec_cmd(self):
1633         ssh_helper = mock.Mock()
1634         ssh_helper.interactive_terminal_exec_command.return_value = str(
1635             {'empty': 'value'}).replace("\'", "\"")
1636         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1637
1638         self.assertEqual({'empty': 'value'},
1639                          vat_terminal.vat_terminal_exec_cmd(
1640                              "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
1641
1642     def test_vat_terminal_exec_cmd_array(self):
1643         ssh_helper = mock.Mock()
1644         ssh_helper.interactive_terminal_exec_command.return_value = str(
1645             [{'empty': 'value'}]).replace("\'", "\"")
1646         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1647
1648         self.assertEqual([{'empty': 'value'}],
1649                          vat_terminal.vat_terminal_exec_cmd(
1650                              "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
1651
1652     def test_vat_terminal_exec_cmd_without_output(self):
1653         ssh_helper = mock.Mock()
1654         ssh_helper.interactive_terminal_exec_command.return_value = str(
1655             {'empty': 'value'}).replace("\'", "\"")
1656         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1657
1658         self.assertIsNone(vat_terminal.vat_terminal_exec_cmd(
1659             "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
1660
1661     def test_vat_terminal_exec_cmd_error(self):
1662         ssh_helper = mock.Mock()
1663         ssh_helper.interactive_terminal_exec_command.return_value = str(
1664             {'empty': 'value'}).replace("\'", "\"")
1665         ssh_helper.interactive_terminal_exec_command.side_effect = exceptions.SSHTimeout
1666
1667         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1668
1669         with self.assertRaises(RuntimeError) as raised:
1670             vat_terminal.vat_terminal_exec_cmd(
1671                 "hw_interface_set_mtu sw_if_index 1 mtu 9200")
1672         self.assertIn(
1673             'VPP is not running on node. VAT command hw_interface_set_mtu ' \
1674             'sw_if_index 1 mtu 9200 execution failed',
1675             str(raised.exception))
1676
1677     def test_vat_terminal_exec_cmd_output_error(self):
1678         ssh_helper = mock.Mock()
1679         ssh_helper.interactive_terminal_exec_command.return_value = str(
1680             'empty: value').replace("\'", "\"")
1681
1682         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1683
1684         with self.assertRaises(RuntimeError) as raised:
1685             vat_terminal.vat_terminal_exec_cmd(
1686                 "hw_interface_set_mtu sw_if_index 1 mtu 9200")
1687         self.assertIn(
1688             'VAT command hw_interface_set_mtu sw_if_index 1 mtu 9200: no JSON data.',
1689             str(raised.exception))
1690
1691     def test_vat_terminal_close(self):
1692         ssh_helper = mock.Mock()
1693         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1694         self.assertIsNone(vat_terminal.vat_terminal_close())
1695
1696     def test_vat_terminal_close_error(self):
1697         ssh_helper = mock.Mock()
1698         ssh_helper.interactive_terminal_exec_command.side_effect = exceptions.SSHTimeout
1699         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1700         with self.assertRaises(RuntimeError) as raised:
1701             vat_terminal.vat_terminal_close()
1702         self.assertIn('Failed to close VAT console', str(raised.exception))
1703
1704     def test_vat_terminal_close_vat_error(self):
1705         ssh_helper = mock.Mock()
1706         ssh_helper.interactive_terminal_close.side_effect = exceptions.SSHTimeout
1707         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1708         with self.assertRaises(RuntimeError) as raised:
1709             vat_terminal.vat_terminal_close()
1710         self.assertIn('Cannot close interactive terminal',
1711                       str(raised.exception))
1712
1713     def test_vat_terminal_exec_cmd_from_template(self):
1714         ssh_helper = mock.Mock()
1715         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1716
1717         with mock.patch.object(vat_terminal, 'vat_terminal_exec_cmd') as \
1718                 mock_vat_terminal_exec_cmd:
1719             mock_vat_terminal_exec_cmd.return_value = 'empty'
1720             self.assertEqual(['empty'],
1721                              vat_terminal.vat_terminal_exec_cmd_from_template(
1722                                  "hw_interface_set_mtu.vat", sw_if_index=1,
1723                                  mtu=9200))