Merge "Yardstick verify job could base on the filetype to run the test"
[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_vpp_create_ipsec_tunnels(self):
841         vnfd_helper = VnfdHelper(self.VNFD_0)
842         ssh_helper = mock.Mock()
843         ssh_helper.execute.return_value = 0, '', ''
844
845         scenario_helper = mock.Mock()
846         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
847                                                  scenario_helper)
848
849         self.assertIsNone(
850             vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
851                                                           '10.10.10.1', 'xe0',
852                                                           1, 1, mock.Mock(),
853                                                           'crypto_key',
854                                                           mock.Mock(),
855                                                           'integ_key',
856                                                           '20.20.20.0'))
857         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
858
859     def test_vpp_create_ipsec_1000_tunnels(self):
860         vnfd_helper = VnfdHelper(self.VNFD_0)
861         ssh_helper = mock.Mock()
862         ssh_helper.execute.return_value = 0, '', ''
863
864         scenario_helper = mock.Mock()
865         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
866                                                  scenario_helper)
867
868         self.assertIsNone(
869             vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
870                                                           '10.10.10.1', 'xe0',
871                                                           1000, 128000,
872                                                           mock.Mock(),
873                                                           'crypto_key',
874                                                           mock.Mock(),
875                                                           'integ_key',
876                                                           '20.20.20.0'))
877         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
878
879     def test_apply_config(self):
880         vnfd_helper = VnfdHelper(self.VNFD_0)
881         ssh_helper = mock.Mock()
882         ssh_helper.execute.return_value = 0, '', ''
883
884         scenario_helper = mock.Mock()
885         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
886                                                  scenario_helper)
887         self.assertIsNone(vpp_setup_env_helper.apply_config(mock.Mock()))
888         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
889
890     def test_apply_config_error(self):
891         vnfd_helper = VnfdHelper(self.VNFD_0)
892         ssh_helper = mock.Mock()
893         ssh_helper.execute.return_value = 1, '', ''
894
895         scenario_helper = mock.Mock()
896         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
897                                                  scenario_helper)
898         with self.assertRaises(RuntimeError) as raised:
899             vpp_setup_env_helper.apply_config(mock.Mock())
900
901         self.assertIn('Writing config file failed', str(raised.exception))
902
903     def test_vpp_route_add(self):
904         vnfd_helper = VnfdHelper(self.VNFD_0)
905         ssh_helper = mock.Mock()
906         scenario_helper = mock.Mock()
907         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
908                                                  scenario_helper)
909
910         with mock.patch.object(vpp_helpers.VatTerminal,
911                                'vat_terminal_exec_cmd_from_template') as \
912                 mock_vat_terminal_exec_cmd_from_template:
913             mock_vat_terminal_exec_cmd_from_template.return_value = ''
914             self.assertIsNone(
915                 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24))
916
917     def test_vpp_route_add_without_index(self):
918         vnfd_helper = VnfdHelper(self.VNFD_0)
919         ssh_helper = mock.Mock()
920         scenario_helper = mock.Mock()
921         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
922                                                  scenario_helper)
923
924         with mock.patch.object(vpp_helpers.VatTerminal,
925                                'vat_terminal_exec_cmd_from_template') as \
926                 mock_vat_terminal_exec_cmd_from_template:
927             mock_vat_terminal_exec_cmd_from_template.return_value = ''
928             self.assertIsNone(
929                 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24,
930                                                    interface='xe0',
931                                                    use_sw_index=False))
932
933     def test_add_arp_on_dut(self):
934         vnfd_helper = VnfdHelper(self.VNFD_0)
935         ssh_helper = mock.Mock()
936         scenario_helper = mock.Mock()
937         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
938                                                  scenario_helper)
939
940         with mock.patch.object(vpp_helpers.VatTerminal,
941                                'vat_terminal_exec_cmd_from_template') as \
942                 mock_vat_terminal_exec_cmd_from_template:
943             mock_vat_terminal_exec_cmd_from_template.return_value = ''
944             self.assertEqual('', vpp_setup_env_helper.add_arp_on_dut('xe0',
945                                                                      '10.10.10.1',
946                                                                      '00:00:00:00:00:00'))
947
948     def test_set_ip(self):
949         vnfd_helper = VnfdHelper(self.VNFD_0)
950         ssh_helper = mock.Mock()
951         scenario_helper = mock.Mock()
952         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
953                                                  scenario_helper)
954
955         with mock.patch.object(vpp_helpers.VatTerminal,
956                                'vat_terminal_exec_cmd_from_template') as \
957                 mock_vat_terminal_exec_cmd_from_template:
958             mock_vat_terminal_exec_cmd_from_template.return_value = ''
959             self.assertEqual('',
960                              vpp_setup_env_helper.set_ip('xe0', '10.10.10.1',
961                                                          24))
962
963     def test_set_interface_state(self):
964         vnfd_helper = VnfdHelper(self.VNFD_0)
965         ssh_helper = mock.Mock()
966         scenario_helper = mock.Mock()
967         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
968                                                  scenario_helper)
969
970         with mock.patch.object(vpp_helpers.VatTerminal,
971                                'vat_terminal_exec_cmd_from_template') as \
972                 mock_vat_terminal_exec_cmd_from_template:
973             mock_vat_terminal_exec_cmd_from_template.return_value = ''
974             self.assertEqual('',
975                              vpp_setup_env_helper.set_interface_state('xe0',
976                                                                       'up'))
977
978     def test_set_interface_state_error(self):
979         vnfd_helper = VnfdHelper(self.VNFD_0)
980         ssh_helper = mock.Mock()
981         scenario_helper = mock.Mock()
982         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
983                                                  scenario_helper)
984
985         with mock.patch.object(vpp_helpers.VatTerminal,
986                                'vat_terminal_exec_cmd_from_template') as \
987                 mock_vat_terminal_exec_cmd_from_template:
988             mock_vat_terminal_exec_cmd_from_template.return_value = ''
989         with self.assertRaises(ValueError) as raised:
990             vpp_setup_env_helper.set_interface_state('xe0', 'error')
991         self.assertIn('Unexpected interface state: error',
992                       str(raised.exception))
993
994     def test_set_interface_down_state(self):
995         vnfd_helper = VnfdHelper(self.VNFD_0)
996         ssh_helper = mock.Mock()
997         scenario_helper = mock.Mock()
998         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
999                                                  scenario_helper)
1000
1001         with mock.patch.object(vpp_helpers.VatTerminal,
1002                                'vat_terminal_exec_cmd_from_template') as \
1003                 mock_vat_terminal_exec_cmd_from_template:
1004             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1005             self.assertEqual('',
1006                              vpp_setup_env_helper.set_interface_state('xe0',
1007                                                                       'down'))
1008
1009     def test_vpp_set_interface_mtu(self):
1010         vnfd_helper = VnfdHelper(self.VNFD_0)
1011         ssh_helper = mock.Mock()
1012         scenario_helper = mock.Mock()
1013         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1014                                                  scenario_helper)
1015
1016         with mock.patch.object(vpp_helpers.VatTerminal,
1017                                'vat_terminal_exec_cmd_from_template') as \
1018                 mock_vat_terminal_exec_cmd_from_template:
1019             mock_vat_terminal_exec_cmd_from_template.return_value = ''
1020             self.assertIsNone(
1021                 vpp_setup_env_helper.vpp_set_interface_mtu('xe0', 9200))
1022
1023     def test_vpp_interfaces_ready_wait(self):
1024         json_output = [self.VPP_INTERFACES_DUMP]
1025         vnfd_helper = VnfdHelper(self.VNFD_0)
1026         ssh_helper = mock.Mock()
1027         scenario_helper = mock.Mock()
1028         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1029                                                  scenario_helper)
1030
1031         with mock.patch.object(vpp_helpers.VatTerminal,
1032                                'vat_terminal_exec_cmd_from_template') as \
1033                 mock_vat_terminal_exec_cmd_from_template:
1034             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1035             self.assertIsNone(vpp_setup_env_helper.vpp_interfaces_ready_wait())
1036
1037     def test_vpp_interfaces_ready_wait_timeout(self):
1038         json_output = [[
1039             {
1040                 "sw_if_index": 0,
1041                 "sup_sw_if_index": 0,
1042                 "l2_address_length": 0,
1043                 "l2_address": [0, 0, 0, 0, 0, 0, 0, 0],
1044                 "interface_name": "xe0",
1045                 "admin_up_down": 1,
1046                 "link_up_down": 0,
1047                 "link_duplex": 0,
1048                 "link_speed": 0,
1049                 "mtu": 0,
1050                 "sub_id": 0,
1051                 "sub_dot1ad": 0,
1052                 "sub_number_of_tags": 0,
1053                 "sub_outer_vlan_id": 0,
1054                 "sub_inner_vlan_id": 0,
1055                 "sub_exact_match": 0,
1056                 "sub_default": 0,
1057                 "sub_outer_vlan_id_any": 0,
1058                 "sub_inner_vlan_id_any": 0,
1059                 "vtr_op": 0,
1060                 "vtr_push_dot1q": 0,
1061                 "vtr_tag1": 0,
1062                 "vtr_tag2": 0
1063             }]]
1064         vnfd_helper = VnfdHelper(self.VNFD_0)
1065         ssh_helper = mock.Mock()
1066         scenario_helper = mock.Mock()
1067         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1068                                                  scenario_helper)
1069
1070         with mock.patch.object(vpp_helpers.VatTerminal,
1071                                'vat_terminal_exec_cmd_from_template') as \
1072                 mock_vat_terminal_exec_cmd_from_template:
1073             mock_vat_terminal_exec_cmd_from_template.return_value = json_output
1074             with self.assertRaises(RuntimeError) as raised:
1075                 vpp_setup_env_helper.vpp_interfaces_ready_wait(5)
1076             self.assertIn('timeout, not up [\'xe0\']', str(raised.exception))
1077
1078     def test_vpp_get_interface_data(self):
1079         json_output = [self.VPP_INTERFACES_DUMP]
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 = json_output
1090             self.assertEqual(json_output[0],
1091                              vpp_setup_env_helper.vpp_get_interface_data())
1092
1093     def test_vpp_get_interface_data_ifname(self):
1094         json_output = [self.VPP_INTERFACES_DUMP]
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 = json_output
1105             self.assertEqual(json_output[0][2],
1106                              vpp_setup_env_helper.vpp_get_interface_data(
1107                                  'VirtualFunctionEthernetff/7/0'))
1108
1109     def test_vpp_get_interface_data_ifname_error(self):
1110         json_output = [self.VPP_INTERFACES_DUMP]
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 = json_output
1121             self.assertEqual({}, vpp_setup_env_helper.vpp_get_interface_data(
1122                 'error'))
1123
1124     def test_vpp_get_interface_data_ifindex(self):
1125         json_output = [self.VPP_INTERFACES_DUMP]
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 = json_output
1136             self.assertEqual(json_output[0][1],
1137                              vpp_setup_env_helper.vpp_get_interface_data(1))
1138
1139     def test_vpp_get_interface_data_error(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             with self.assertRaises(TypeError) as raised:
1152                 vpp_setup_env_helper.vpp_get_interface_data(1.0)
1153         self.assertEqual('', str(raised.exception))
1154
1155     def test_update_vpp_interface_data(self):
1156         output = '{}\n{}'.format(self.VPP_INTERFACES_DUMP,
1157                                  'dump_interface_table:6019: JSON output ' \
1158                                  'supported only for VPE API calls and dump_stats_table\n' \
1159                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1160                                  'dump_interface_table error: Misc')
1161         vnfd_helper = VnfdHelper(self.VNFD_0)
1162         ssh_helper = mock.Mock()
1163         ssh_helper.execute.return_value = 0, output.replace("\'", "\""), ''
1164         ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/vpp/templates'
1165
1166         scenario_helper = mock.Mock()
1167         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1168                                                  scenario_helper)
1169         self.assertIsNone(vpp_setup_env_helper.update_vpp_interface_data())
1170         self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
1171         self.assertEqual('TenGigabitEthernetff/6/0',
1172                          vpp_setup_env_helper.get_value_by_interface_key(
1173                              'xe0', 'vpp_name'))
1174         self.assertEqual(1, vpp_setup_env_helper.get_value_by_interface_key(
1175             'xe0', 'vpp_sw_index'))
1176         self.assertEqual('VirtualFunctionEthernetff/7/0',
1177                          vpp_setup_env_helper.get_value_by_interface_key(
1178                              'xe1', 'vpp_name'))
1179         self.assertEqual(2, vpp_setup_env_helper.get_value_by_interface_key(
1180             'xe1', 'vpp_sw_index'))
1181
1182     def test_update_vpp_interface_data_error(self):
1183         output = '{}\n{}'.format(self.VPP_INTERFACES_DUMP_MAC_ERR,
1184                                  'dump_interface_table:6019: JSON output ' \
1185                                  'supported only for VPE API calls and dump_stats_table\n' \
1186                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1187                                  'dump_interface_table error: Misc')
1188         vnfd_helper = VnfdHelper(self.VNFD_0)
1189         ssh_helper = mock.Mock()
1190         ssh_helper.execute.return_value = 0, output.replace("\'", "\""), ''
1191         ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/vpp/templates'
1192
1193         scenario_helper = mock.Mock()
1194         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1195                                                  scenario_helper)
1196         self.assertIsNone(vpp_setup_env_helper.update_vpp_interface_data())
1197         self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
1198
1199     def test_iface_update_numa(self):
1200         vnfd_helper = VnfdHelper(self.VNFD_0)
1201         ssh_helper = mock.Mock()
1202         ssh_helper.execute.return_value = 0, '0', ''
1203
1204         scenario_helper = mock.Mock()
1205         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1206                                                  scenario_helper)
1207         self.assertIsNone(vpp_setup_env_helper.iface_update_numa())
1208         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
1209         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1210             'xe0', 'numa_node'))
1211         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1212             'xe1', 'numa_node'))
1213
1214     def test_iface_update_numa_error(self):
1215         vnfd_helper = VnfdHelper(self.VNFD_1)
1216         ssh_helper = mock.Mock()
1217         ssh_helper.execute.return_value = 0, '-1', ''
1218
1219         scenario_helper = mock.Mock()
1220         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1221                                                  scenario_helper)
1222         with mock.patch.object(cpu.CpuSysCores, 'get_cpu_layout') as \
1223                 mock_get_cpu_layout:
1224             mock_get_cpu_layout.return_value = self.CPU_LAYOUT
1225             sys_cores = cpu.CpuSysCores(ssh_helper)
1226             vpp_setup_env_helper._update_vnfd_helper(
1227                 sys_cores.get_cpu_layout())
1228         self.assertIsNone(vpp_setup_env_helper.iface_update_numa())
1229         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
1230         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1231             'xe0', 'numa_node'))
1232         self.assertEqual(0, vpp_setup_env_helper.get_value_by_interface_key(
1233             'xe1', 'numa_node'))
1234
1235     def test_iface_update_without_numa(self):
1236         vnfd_helper = VnfdHelper(self.VNFD_2)
1237         ssh_helper = mock.Mock()
1238         ssh_helper.execute.return_value = 0, '-1', ''
1239
1240         scenario_helper = mock.Mock()
1241         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1242                                                  scenario_helper)
1243         with mock.patch.object(cpu.CpuSysCores, 'get_cpu_layout') as \
1244                 mock_get_cpu_layout:
1245             mock_get_cpu_layout.return_value = self.CPU_SMT
1246             sys_cores = cpu.CpuSysCores(ssh_helper)
1247             vpp_setup_env_helper._update_vnfd_helper(
1248                 sys_cores.get_cpu_layout())
1249         self.assertIsNone(vpp_setup_env_helper.iface_update_numa())
1250         self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
1251         self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(
1252             'xe0', 'numa_node'))
1253         self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(
1254             'xe1', 'numa_node'))
1255
1256     def test_execute_script(self):
1257         vnfd_helper = VnfdHelper(self.VNFD_0)
1258         ssh_helper = mock.Mock()
1259
1260         scenario_helper = mock.Mock()
1261         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1262                                                  scenario_helper)
1263         vpp_setup_env_helper.execute_script('dump_interfaces.vat', True, True)
1264         self.assertGreaterEqual(ssh_helper.put_file.call_count, 1)
1265         self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
1266
1267     def test_execute_script_error(self):
1268         vnfd_helper = VnfdHelper(self.VNFD_0)
1269         ssh_helper = mock.Mock()
1270         ssh_helper.execute.side_effect = Exception
1271
1272         scenario_helper = mock.Mock()
1273         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1274                                                  scenario_helper)
1275         with self.assertRaises(Exception) as raised:
1276             vpp_setup_env_helper.execute_script('dump_interfaces.vat', True,
1277                                                 True)
1278         self.assertIn(
1279             'VAT script execution failed: vpp_api_test json in dump_interfaces.vat script',
1280             str(raised.exception))
1281         self.assertGreaterEqual(ssh_helper.put_file.call_count, 1)
1282
1283     def test_execute_script_json_out(self):
1284         json_output = [
1285             {
1286                 "sw_if_index": 0,
1287                 "sup_sw_if_index": 0
1288             },
1289             {
1290                 "l2_address_length": 6,
1291                 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1292             },
1293             {
1294                 "interface_name": "VirtualFunctionEthernetff/7/0",
1295                 "admin_up_down": 0
1296             }
1297         ]
1298         output = '{}\n{}'.format(json_output,
1299                                  'dump_interface_table:6019: JSON output ' \
1300                                  'supported only for VPE API calls and dump_stats_table\n' \
1301                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1302                                  'dump_interface_table error: Misc')
1303         vnfd_helper = VnfdHelper(self.VNFD_0)
1304         ssh_helper = mock.Mock()
1305         ssh_helper.execute.return_value = 0, output, ''
1306         ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/vpp/templates'
1307         scenario_helper = mock.Mock()
1308         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1309                                                  scenario_helper)
1310         self.assertEqual(str(json_output),
1311                          vpp_setup_env_helper.execute_script_json_out(
1312                              'dump_interfaces.vat'))
1313
1314     def test_self_cleanup_vat_json_output(self):
1315         json_output = [
1316             {
1317                 "sw_if_index": 0,
1318                 "sup_sw_if_index": 0
1319             },
1320             {
1321                 "l2_address_length": 6,
1322                 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1323             },
1324             {
1325                 "interface_name": "VirtualFunctionEthernetff/7/0",
1326                 "admin_up_down": 0
1327             }
1328         ]
1329
1330         output = '{}\n{}'.format(json_output,
1331                                  'dump_interface_table:6019: JSON output ' \
1332                                  'supported only for VPE API calls and dump_stats_table\n' \
1333                                  '/opt/nsb_bin/vpp/templates/dump_interfaces.vat(2): \n' \
1334                                  'dump_interface_table error: Misc')
1335         self.assertEqual(str(json_output),
1336                          VppSetupEnvHelper.cleanup_vat_json_output(output,
1337                              '/opt/nsb_bin/vpp/templates/dump_interfaces.vat'))
1338
1339     def test__convert_mac_to_number_list(self):
1340         self.assertEqual([144, 226, 186, 124, 65, 168],
1341                          VppSetupEnvHelper._convert_mac_to_number_list(
1342                              '90:e2:ba:7c:41:a8'))
1343
1344     def test_get_vpp_interface_by_mac(self):
1345         mac_address = '90:e2:ba:7c:41:a8'
1346         self.assertEqual({'admin_up_down': 0,
1347                           'interface_name': 'TenGigabitEthernetff/6/0',
1348                           'l2_address': [144, 226, 186, 124, 65, 168, 0, 0],
1349                           'l2_address_length': 6,
1350                           'link_duplex': 2,
1351                           'link_speed': 32,
1352                           'link_up_down': 0,
1353                           'mtu': 9202,
1354                           'sub_default': 0,
1355                           'sub_dot1ad': 0,
1356                           'sub_exact_match': 0,
1357                           'sub_id': 0,
1358                           'sub_inner_vlan_id': 0,
1359                           'sub_inner_vlan_id_any': 0,
1360                           'sub_number_of_tags': 0,
1361                           'sub_outer_vlan_id': 0,
1362                           'sub_outer_vlan_id_any': 0,
1363                           'sup_sw_if_index': 1,
1364                           'sw_if_index': 1,
1365                           'vtr_op': 0,
1366                           'vtr_push_dot1q': 0,
1367                           'vtr_tag1': 0,
1368                           'vtr_tag2': 0},
1369                          VppSetupEnvHelper.get_vpp_interface_by_mac(
1370                              self.VPP_INTERFACES_DUMP, mac_address))
1371
1372     def test_get_vpp_interface_by_mac_error(self):
1373         mac_address = '90:e2:ba:7c:41:a9'
1374         with self.assertRaises(ValueError) as raised:
1375             VppSetupEnvHelper.get_vpp_interface_by_mac(
1376                 [{
1377                     "sw_if_index": 1,
1378                     "sup_sw_if_index": 1,
1379                     "l2_address_length": 7,
1380                     "l2_address": [144, 226, 186, 124, 65, 169, 0, 0],
1381                     "interface_name": "TenGigabitEthernetff/6/0",
1382                     "admin_up_down": 0,
1383                     "link_up_down": 0,
1384                     "link_duplex": 2,
1385                     "link_speed": 32,
1386                     "mtu": 9202,
1387                     "sub_id": 0,
1388                     "sub_dot1ad": 0,
1389                     "sub_number_of_tags": 0,
1390                     "sub_outer_vlan_id": 0,
1391                     "sub_inner_vlan_id": 0,
1392                     "sub_exact_match": 0,
1393                     "sub_default": 0,
1394                     "sub_outer_vlan_id_any": 0,
1395                     "sub_inner_vlan_id_any": 0,
1396                     "vtr_op": 0,
1397                     "vtr_push_dot1q": 0,
1398                     "vtr_tag1": 0,
1399                     "vtr_tag2": 0
1400                 }], mac_address)
1401
1402         self.assertIn('l2_address_length value is not 6.',
1403                       str(raised.exception))
1404
1405     def test_get_vpp_interface_by_mac_l2_error(self):
1406         mac_address = '90:e2:ba:7c:41:a7'
1407         with self.assertRaises(KeyError) as raised:
1408             VppSetupEnvHelper.get_vpp_interface_by_mac(
1409                 [{
1410                     "sw_if_index": 1,
1411                     "sup_sw_if_index": 1,
1412                     "l2_address_length": 6,
1413                     "l2_address_err": [144, 226, 186, 124, 65, 167, 0, 0],
1414                     "interface_name": "TenGigabitEthernetff/6/0",
1415                     "admin_up_down": 0,
1416                     "link_up_down": 0,
1417                     "link_duplex": 2,
1418                     "link_speed": 32,
1419                     "mtu": 9202,
1420                     "sub_id": 0,
1421                     "sub_dot1ad": 0,
1422                     "sub_number_of_tags": 0,
1423                     "sub_outer_vlan_id": 0,
1424                     "sub_inner_vlan_id": 0,
1425                     "sub_exact_match": 0,
1426                     "sub_default": 0,
1427                     "sub_outer_vlan_id_any": 0,
1428                     "sub_inner_vlan_id_any": 0,
1429                     "vtr_op": 0,
1430                     "vtr_push_dot1q": 0,
1431                     "vtr_tag1": 0,
1432                     "vtr_tag2": 0
1433                 }], mac_address)
1434
1435         self.assertIn(
1436             'key l2_address not found in interface dict.Probably input list ' \
1437             'is not parsed from correct VAT json output.',
1438             str(raised.exception))
1439
1440     def test_get_vpp_interface_by_mac_l2_length_error(self):
1441         mac_address = '90:e2:ba:7c:41:a6'
1442         with self.assertRaises(KeyError) as raised:
1443             VppSetupEnvHelper.get_vpp_interface_by_mac(
1444                 [{
1445                     "sw_if_index": 1,
1446                     "sup_sw_if_index": 1,
1447                     "l2_address_length_err": 6,
1448                     "l2_address": [144, 226, 186, 124, 65, 166, 0, 0],
1449                     "interface_name": "TenGigabitEthernetff/6/0",
1450                     "admin_up_down": 0,
1451                     "link_up_down": 0,
1452                     "link_duplex": 2,
1453                     "link_speed": 32,
1454                     "mtu": 9202,
1455                     "sub_id": 0,
1456                     "sub_dot1ad": 0,
1457                     "sub_number_of_tags": 0,
1458                     "sub_outer_vlan_id": 0,
1459                     "sub_inner_vlan_id": 0,
1460                     "sub_exact_match": 0,
1461                     "sub_default": 0,
1462                     "sub_outer_vlan_id_any": 0,
1463                     "sub_inner_vlan_id_any": 0,
1464                     "vtr_op": 0,
1465                     "vtr_push_dot1q": 0,
1466                     "vtr_tag1": 0,
1467                     "vtr_tag2": 0
1468                 }], mac_address)
1469
1470         self.assertIn(
1471             'key l2_address_length not found in interface dict. Probably ' \
1472             'input list is not parsed from correct VAT json output.',
1473             str(raised.exception))
1474
1475     def test_get_prefix_length(self):
1476         start_ip = '10.10.10.0'
1477         end_ip = '10.10.10.127'
1478         ips = [ipaddress.ip_address(ip) for ip in
1479                [str(ipaddress.ip_address(start_ip)), str(end_ip)]]
1480         lowest_ip, highest_ip = min(ips), max(ips)
1481
1482         self.assertEqual(25,
1483                          VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1484                                                              int(highest_ip),
1485                                                              lowest_ip.max_prefixlen))
1486
1487     def test_get_prefix_length_zero_prefix(self):
1488         start_ip = '10.0.0.0'
1489         end_ip = '10.0.0.0'
1490         ips = [ipaddress.ip_address(ip) for ip in
1491                [str(ipaddress.ip_address(start_ip)), str(end_ip)]]
1492         lowest_ip, highest_ip = min(ips), max(ips)
1493
1494         self.assertEqual(0,
1495                          VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1496                                                              int(highest_ip),
1497                                                              0))
1498
1499
1500 class TestVatTerminal(unittest.TestCase):
1501
1502     def test___init___error(self):
1503         ssh_helper = mock.Mock()
1504         ssh_helper.interactive_terminal_open.side_effect = exceptions.SSHTimeout
1505
1506         with self.assertRaises(RuntimeError) as raised:
1507             VatTerminal(ssh_helper, json_param=True)
1508         self.assertIn('Cannot open interactive terminal',
1509                       str(raised.exception))
1510
1511     def test___init___exec_error(self):
1512         ssh_helper = mock.Mock()
1513         ssh_helper.interactive_terminal_exec_command.side_effect = exceptions.SSHTimeout
1514         VatTerminal(ssh_helper, json_param=True)
1515
1516     def test_vat_terminal_exec_cmd(self):
1517         ssh_helper = mock.Mock()
1518         ssh_helper.interactive_terminal_exec_command.return_value = str(
1519             {'empty': 'value'}).replace("\'", "\"")
1520         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1521
1522         self.assertEqual({'empty': 'value'},
1523                          vat_terminal.vat_terminal_exec_cmd(
1524                              "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
1525
1526     def test_vat_terminal_exec_cmd_array(self):
1527         ssh_helper = mock.Mock()
1528         ssh_helper.interactive_terminal_exec_command.return_value = str(
1529             [{'empty': 'value'}]).replace("\'", "\"")
1530         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1531
1532         self.assertEqual([{'empty': 'value'}],
1533                          vat_terminal.vat_terminal_exec_cmd(
1534                              "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
1535
1536     def test_vat_terminal_exec_cmd_without_output(self):
1537         ssh_helper = mock.Mock()
1538         ssh_helper.interactive_terminal_exec_command.return_value = str(
1539             {'empty': 'value'}).replace("\'", "\"")
1540         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1541
1542         self.assertIsNone(vat_terminal.vat_terminal_exec_cmd(
1543             "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
1544
1545     def test_vat_terminal_exec_cmd_error(self):
1546         ssh_helper = mock.Mock()
1547         ssh_helper.interactive_terminal_exec_command.return_value = str(
1548             {'empty': 'value'}).replace("\'", "\"")
1549         ssh_helper.interactive_terminal_exec_command.side_effect = exceptions.SSHTimeout
1550
1551         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1552
1553         with self.assertRaises(RuntimeError) as raised:
1554             vat_terminal.vat_terminal_exec_cmd(
1555                 "hw_interface_set_mtu sw_if_index 1 mtu 9200")
1556         self.assertIn(
1557             'VPP is not running on node. VAT command hw_interface_set_mtu ' \
1558             'sw_if_index 1 mtu 9200 execution failed',
1559             str(raised.exception))
1560
1561     def test_vat_terminal_exec_cmd_output_error(self):
1562         ssh_helper = mock.Mock()
1563         ssh_helper.interactive_terminal_exec_command.return_value = str(
1564             'empty: value').replace("\'", "\"")
1565
1566         vat_terminal = VatTerminal(ssh_helper, json_param=True)
1567
1568         with self.assertRaises(RuntimeError) as raised:
1569             vat_terminal.vat_terminal_exec_cmd(
1570                 "hw_interface_set_mtu sw_if_index 1 mtu 9200")
1571         self.assertIn(
1572             'VAT command hw_interface_set_mtu sw_if_index 1 mtu 9200: no JSON data.',
1573             str(raised.exception))
1574
1575     def test_vat_terminal_close(self):
1576         ssh_helper = mock.Mock()
1577         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1578         self.assertIsNone(vat_terminal.vat_terminal_close())
1579
1580     def test_vat_terminal_close_error(self):
1581         ssh_helper = mock.Mock()
1582         ssh_helper.interactive_terminal_exec_command.side_effect = exceptions.SSHTimeout
1583         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1584         with self.assertRaises(RuntimeError) as raised:
1585             vat_terminal.vat_terminal_close()
1586         self.assertIn('Failed to close VAT console', str(raised.exception))
1587
1588     def test_vat_terminal_close_vat_error(self):
1589         ssh_helper = mock.Mock()
1590         ssh_helper.interactive_terminal_close.side_effect = exceptions.SSHTimeout
1591         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1592         with self.assertRaises(RuntimeError) as raised:
1593             vat_terminal.vat_terminal_close()
1594         self.assertIn('Cannot close interactive terminal',
1595                       str(raised.exception))
1596
1597     def test_vat_terminal_exec_cmd_from_template(self):
1598         ssh_helper = mock.Mock()
1599         vat_terminal = VatTerminal(ssh_helper, json_param=False)
1600
1601         with mock.patch.object(vat_terminal, 'vat_terminal_exec_cmd') as \
1602                 mock_vat_terminal_exec_cmd:
1603             mock_vat_terminal_exec_cmd.return_value = 'empty'
1604             self.assertEqual(['empty'],
1605                              vat_terminal.vat_terminal_exec_cmd_from_template(
1606                                  "hw_interface_set_mtu.vat", sw_if_index=1,
1607                                  mtu=9200))