1 # Copyright (c) 2019 Viosoft Corporation
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
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
27 class TestVppConfigGenerator(unittest.TestCase):
29 def test_add_config_item(self):
31 vpp_config_generator = VppConfigGenerator()
32 vpp_config_generator.add_config_item(test_item, '/tmp/vpe.log',
34 self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
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',
41 self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
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())
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())
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())
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())
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())
73 def test_add_dpdk_cryptodev(self):
74 vpp_config_generator = VppConfigGenerator()
75 vpp_config_generator.add_dpdk_cryptodev(2, '0000:00:00.0')
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())
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)
84 'dpdk\n{\n vdev cryptodev_aesni_gcm_pmd,socket_id=0 \n}\n',
85 vpp_config_generator.dump_config())
87 def test_add_dpdk_dev_default_rxq(self):
88 vpp_config_generator = VppConfigGenerator()
89 vpp_config_generator.add_dpdk_dev_default_rxq(1)
91 'dpdk\n{\n dev default\n {\n num-rx-queues 1\n }\n}\n',
92 vpp_config_generator.dump_config())
94 def test_add_dpdk_dev_default_rxd(self):
95 vpp_config_generator = VppConfigGenerator()
96 vpp_config_generator.add_dpdk_dev_default_rxd(2048)
98 'dpdk\n{\n dev default\n {\n num-rx-desc 2048\n }\n}\n',
99 vpp_config_generator.dump_config())
101 def test_add_dpdk_dev_default_txd(self):
102 vpp_config_generator = VppConfigGenerator()
103 vpp_config_generator.add_dpdk_dev_default_txd(2048)
105 'dpdk\n{\n dev default\n {\n num-tx-desc 2048\n }\n}\n',
106 vpp_config_generator.dump_config())
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())
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())
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())
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())
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())
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())
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())
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())
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())
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())
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())
173 def test_add_plugin(self):
174 vpp_config_generator = VppConfigGenerator()
175 vpp_config_generator.add_plugin('enable', ['dpdk_plugin.so'])
177 'plugins\n{\n plugin [\'dpdk_plugin.so\']\n {\n enable \n }\n}\n',
178 vpp_config_generator.dump_config())
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())
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())
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())
198 def test_pci_dev_check(self):
199 self.assertTrue(VppConfigGenerator.pci_dev_check('0000:00:00.0'))
201 def test_pci_dev_check_error(self):
202 with self.assertRaises(ValueError) as raised:
203 VppConfigGenerator.pci_dev_check('0000:00:0.0')
205 'PCI address 0000:00:0.0 is not in valid format xxxx:xx:xx.x',
206 str(raised.exception))
209 class TestVppSetupEnvHelper(unittest.TestCase):
218 "connection-point": [
228 "description": "VPP IPsec",
229 "id": "VipsecApproxVnf",
231 "ip": "10.10.10.101",
234 "vdu-id": "ipsecvnf-baremetal"
237 "short-name": "IpsecVnf",
240 "description": "VPP Ipsec",
241 "external-interface": [
244 "virtual-interface": {
246 "dst_ip": "192.168.100.1",
247 "dst_mac": "90:e2:ba:7c:30:e8",
249 "local_ip": "192.168.100.2",
250 "local_mac": "90:e2:ba:7c:41:a8",
251 "netmask": "255.255.255.0",
253 "node_name": "vnf__0",
254 "peer_ifname": "xe0",
258 "dst_ip": "192.168.100.2",
259 "dst_mac": "90:e2:ba:7c:41:a8",
261 "local_ip": "192.168.100.1",
262 "local_mac": "90:e2:ba:7c:30:e8",
263 "netmask": "255.255.255.0",
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"
271 "peer_name": "tg__0",
272 "vld_id": "uplink_0",
273 "vpci": "0000:ff:06.0"
275 "vnfd-connection-point-ref": "xe0"
279 "virtual-interface": {
282 "dst_mac": "0a:b1:ec:fd:a2:66",
284 "local_ip": "1.1.1.1",
285 "local_mac": "4e:90:85:d3:c5:13",
286 "netmask": "255.255.255.0",
288 "node_name": "vnf__0",
289 "peer_ifname": "xe1",
293 "dst_mac": "4e:90:85:d3:c5:13",
295 "local_ip": "1.1.1.2",
296 "local_mac": "0a:b1:ec:fd:a2:66",
297 "netmask": "255.255.255.0",
299 "node_name": "vnf__1",
300 "peer_ifname": "xe1",
301 "peer_name": "vnf__0",
302 "vld_id": "ciphertext",
303 "vpci": "0000:00:07.0"
305 "peer_name": "vnf__1",
306 "vld_id": "ciphertext",
307 "vpci": "0000:ff:07.0"
309 "vnfd-connection-point-ref": "xe1"
312 "id": "ipsecvnf-baremetal",
313 "name": "ipsecvnf-baremetal",
327 "connection-point": [
337 "description": "VPP IPsec",
338 "id": "VipsecApproxVnf",
340 "ip": "10.10.10.101",
343 "vdu-id": "ipsecvnf-baremetal"
346 "short-name": "IpsecVnf",
349 "description": "VPP Ipsec",
350 "external-interface": [
353 "virtual-interface": {
355 "dst_ip": "192.168.100.1",
356 "dst_mac": "90:e2:ba:7c:30:e8",
358 "local_ip": "192.168.100.2",
359 "local_mac": "90:e2:ba:7c:41:a8",
360 "netmask": "255.255.255.0",
362 "node_name": "vnf__0",
363 "peer_ifname": "xe0",
367 "dst_ip": "192.168.100.2",
368 "dst_mac": "90:e2:ba:7c:41:a8",
370 "local_ip": "192.168.100.1",
371 "local_mac": "90:e2:ba:7c:30:e8",
372 "netmask": "255.255.255.0",
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"
380 "peer_name": "tg__0",
381 "vld_id": "uplink_0",
382 "vpci": "0000:ff:06.0"
384 "vnfd-connection-point-ref": "xe0"
388 "virtual-interface": {
391 "dst_mac": "0a:b1:ec:fd:a2:66",
393 "local_ip": "1.1.1.1",
394 "local_mac": "4e:90:85:d3:c5:13",
395 "netmask": "255.255.255.0",
397 "node_name": "vnf__0",
398 "peer_ifname": "xe1",
402 "dst_mac": "4e:90:85:d3:c5:13",
404 "local_ip": "1.1.1.2",
405 "local_mac": "0a:b1:ec:fd:a2:66",
406 "netmask": "255.255.255.0",
408 "node_name": "vnf__1",
409 "peer_ifname": "xe1",
410 "peer_name": "vnf__0",
411 "vld_id": "ciphertext",
412 "vpci": "0000:00:07.0"
414 "peer_name": "vnf__1",
415 "vld_id": "ciphertext",
416 "vpci": "0000:ff:07.0"
418 "vnfd-connection-point-ref": "xe1"
421 "id": "ipsecvnf-baremetal",
422 "name": "ipsecvnf-baremetal",
436 "connection-point": [
446 "description": "VPP IPsec",
447 "id": "VipsecApproxVnf",
449 "ip": "10.10.10.101",
452 "vdu-id": "ipsecvnf-baremetal"
455 "short-name": "IpsecVnf",
458 "description": "VPP Ipsec",
459 "external-interface": [
462 "virtual-interface": {
464 "dst_ip": "192.168.100.1",
465 "dst_mac": "90:e2:ba:7c:30:e8",
467 "local_ip": "192.168.100.2",
468 "local_mac": "90:e2:ba:7c:41:a8",
469 "netmask": "255.255.255.0",
471 "node_name": "vnf__0",
472 "peer_ifname": "xe0",
476 "dst_ip": "192.168.100.2",
477 "dst_mac": "90:e2:ba:7c:41:a8",
479 "local_ip": "192.168.100.1",
480 "local_mac": "90:e2:ba:7c:30:e8",
481 "netmask": "255.255.255.0",
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"
489 "peer_name": "tg__0",
490 "vld_id": "uplink_0",
491 "vpci": "0000:ff:06.0"
493 "vnfd-connection-point-ref": "xe0"
497 "virtual-interface": {
500 "dst_mac": "0a:b1:ec:fd:a2:66",
502 "local_ip": "1.1.1.1",
503 "local_mac": "4e:90:85:d3:c5:13",
504 "netmask": "255.255.255.0",
506 "node_name": "vnf__0",
507 "peer_ifname": "xe1",
511 "dst_mac": "4e:90:85:d3:c5:13",
513 "local_ip": "1.1.1.2",
514 "local_mac": "0a:b1:ec:fd:a2:66",
515 "netmask": "255.255.255.0",
517 "node_name": "vnf__1",
518 "peer_ifname": "xe1",
519 "peer_name": "vnf__0",
520 "vld_id": "ciphertext",
521 "vpci": "0000:00:07.0"
523 "peer_name": "vnf__1",
524 "vld_id": "ciphertext",
525 "vpci": "0000:ff:07.0"
527 "vnfd-connection-point-ref": "xe1"
530 "id": "ipsecvnf-baremetal",
531 "name": "ipsecvnf-baremetal",
538 'vnfd:vnfd-catalog': {
545 VPP_INTERFACES_DUMP = [
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",
559 "sub_number_of_tags": 0,
560 "sub_outer_vlan_id": 0,
561 "sub_inner_vlan_id": 0,
562 "sub_exact_match": 0,
564 "sub_outer_vlan_id_any": 0,
565 "sub_inner_vlan_id_any": 0,
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",
584 "sub_number_of_tags": 0,
585 "sub_outer_vlan_id": 0,
586 "sub_inner_vlan_id": 0,
587 "sub_exact_match": 0,
589 "sub_outer_vlan_id_any": 0,
590 "sub_inner_vlan_id_any": 0,
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",
609 "sub_number_of_tags": 0,
610 "sub_outer_vlan_id": 0,
611 "sub_inner_vlan_id": 0,
612 "sub_exact_match": 0,
614 "sub_outer_vlan_id_any": 0,
615 "sub_inner_vlan_id_any": 0,
623 VPP_INTERFACES_DUMP_MAC_ERR = [
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",
637 "sub_number_of_tags": 0,
638 "sub_outer_vlan_id": 0,
639 "sub_inner_vlan_id": 0,
640 "sub_exact_match": 0,
642 "sub_outer_vlan_id_any": 0,
643 "sub_inner_vlan_id_any": 0,
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",
662 "sub_number_of_tags": 0,
663 "sub_outer_vlan_id": 0,
664 "sub_inner_vlan_id": 0,
665 "sub_exact_match": 0,
667 "sub_outer_vlan_id_any": 0,
668 "sub_inner_vlan_id_any": 0,
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",
687 "sub_number_of_tags": 0,
688 "sub_outer_vlan_id": 0,
689 "sub_inner_vlan_id": 0,
690 "sub_exact_match": 0,
692 "sub_outer_vlan_id_any": 0,
693 "sub_inner_vlan_id_any": 0,
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]]}
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,
729 vpp_setup_env_helper.kill_vnf()
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,
738 with self.assertRaises(RuntimeError) as raised:
739 vpp_setup_env_helper.kill_vnf()
741 self.assertIn('Failed to stop service vpp', str(raised.exception))
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,
749 vpp_setup_env_helper.tear_down()
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,
758 vpp_setup_env_helper.start_vpp_service()
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,
767 with self.assertRaises(RuntimeError) as raised:
768 vpp_setup_env_helper.start_vpp_service()
770 self.assertIn('Failed to start service vpp', str(raised.exception))
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,
778 vpp_setup_env_helper._update_vnfd_helper(
779 {'vpp-data': {'vpp-key': 'vpp-value'}})
781 self.assertEqual({'vpp-key': 'vpp-value'},
782 vpp_setup_env_helper.vnfd_helper.get('vpp-data', {}))
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,
790 vpp_setup_env_helper._update_vnfd_helper({'driver': 'qat'}, 'xe0')
792 self.assertEqual('qat',
793 vpp_setup_env_helper.get_value_by_interface_key(
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,
802 vpp_setup_env_helper._update_vnfd_helper(
803 {'mgmt-interface': {'name': 'net'}})
805 self.assertEqual({'ip': '10.10.10.101',
809 'vdu-id': 'ipsecvnf-baremetal'},
810 vpp_setup_env_helper.vnfd_helper.get('mgmt-interface',
813 def test_get_value_by_interface_key(self):
814 vnfd_helper = VnfdHelper(self.VNFD_0)
815 ssh_helper = mock.Mock()
817 scenario_helper = mock.Mock()
818 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
820 vpp_setup_env_helper._update_vnfd_helper(
821 {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
823 self.assertEqual({'vpp-key': 'vpp-value'},
824 vpp_setup_env_helper.get_value_by_interface_key(
827 def test_get_value_by_interface_key_error(self):
828 vnfd_helper = VnfdHelper(self.VNFD_0)
829 ssh_helper = mock.Mock()
831 scenario_helper = mock.Mock()
832 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
834 vpp_setup_env_helper._update_vnfd_helper(
835 {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
837 self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(
840 def test_crypto_device_init(self):
841 vnfd_helper = VnfdHelper(self.VNFD_0)
842 ssh_helper = mock.Mock()
844 scenario_helper = mock.Mock()
845 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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()
850 vpp_setup_env_helper.kill_vnf = mock.Mock()
851 vpp_setup_env_helper.pci_driver_unbind = mock.Mock()
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'
859 vpp_setup_env_helper.crypto_device_init('0000:ff:06.0', 32))
860 mock_set_sriov_numvfs.assert_called()
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', ''
867 scenario_helper = mock.Mock()
868 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
871 vpp_setup_env_helper.get_sriov_numvfs('0000:ff:06.0'))
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', ''
878 scenario_helper = mock.Mock()
879 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
882 vpp_setup_env_helper.get_sriov_numvfs('0000:ff:06.0'))
884 def test_set_sriov_numvfs(self):
885 vnfd_helper = VnfdHelper(self.VNFD_0)
886 ssh_helper = mock.Mock()
888 scenario_helper = mock.Mock()
889 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
891 vpp_setup_env_helper.set_sriov_numvfs('0000:ff:06.0')
892 self.assertEqual(ssh_helper.execute.call_count, 1)
894 def test_pci_driver_unbind(self):
895 vnfd_helper = VnfdHelper(self.VNFD_0)
896 ssh_helper = mock.Mock()
898 scenario_helper = mock.Mock()
899 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
901 vpp_setup_env_helper.pci_driver_unbind('0000:ff:06.0')
902 self.assertEqual(ssh_helper.execute.call_count, 1)
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' \
915 'Driver: igb_uio\n' \
916 'Module: ixgbevf', ''
917 scenario_helper = mock.Mock()
918 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
920 self.assertEqual('igb_uio', vpp_setup_env_helper.get_pci_dev_driver(
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,
930 with self.assertRaises(RuntimeError) as raised:
931 vpp_setup_env_helper.get_pci_dev_driver(
934 self.assertIn("'lspci -vmmks 0000:ff:06.0' failed",
935 str(raised.exception))
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' \
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' \
948 'Driver_err: igb_uio\n' \
949 'Module: ixgbevf', ''
950 scenario_helper = mock.Mock()
951 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
954 vpp_setup_env_helper.get_pci_dev_driver('0000:ff:06.0'))
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, '', ''
961 scenario_helper = mock.Mock()
962 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
966 vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
973 self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
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, '', ''
980 scenario_helper = mock.Mock()
981 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
985 vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
993 self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
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, '', ''
1000 scenario_helper = mock.Mock()
1001 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1003 self.assertIsNone(vpp_setup_env_helper.apply_config(mock.Mock()))
1004 self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
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, '', ''
1011 scenario_helper = mock.Mock()
1012 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1014 with self.assertRaises(RuntimeError) as raised:
1015 vpp_setup_env_helper.apply_config(mock.Mock())
1017 self.assertIn('Writing config file failed', str(raised.exception))
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,
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 = ''
1031 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24))
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,
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 = ''
1045 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24,
1047 use_sw_index=False))
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,
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',
1062 '00:00:00:00:00:00'))
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,
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',
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,
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',
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,
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))
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,
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',
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,
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 = ''
1137 vpp_setup_env_helper.vpp_set_interface_mtu('xe0', 9200))
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,
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())
1153 def test_vpp_interfaces_ready_wait_timeout(self):
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",
1168 "sub_number_of_tags": 0,
1169 "sub_outer_vlan_id": 0,
1170 "sub_inner_vlan_id": 0,
1171 "sub_exact_match": 0,
1173 "sub_outer_vlan_id_any": 0,
1174 "sub_inner_vlan_id_any": 0,
1176 "vtr_push_dot1q": 0,
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,
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))
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,
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())
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,
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'))
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,
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(
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,
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))
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,
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))
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'
1282 scenario_helper = mock.Mock()
1283 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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(
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(
1295 self.assertEqual(2, vpp_setup_env_helper.get_value_by_interface_key(
1296 'xe1', 'vpp_sw_index'))
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'
1309 scenario_helper = mock.Mock()
1310 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1312 self.assertIsNone(vpp_setup_env_helper.update_vpp_interface_data())
1313 self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
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', ''
1320 scenario_helper = mock.Mock()
1321 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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'))
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', ''
1335 scenario_helper = mock.Mock()
1336 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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'))
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', ''
1356 scenario_helper = mock.Mock()
1357 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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'))
1372 def test_execute_script(self):
1373 vnfd_helper = VnfdHelper(self.VNFD_0)
1374 ssh_helper = mock.Mock()
1376 scenario_helper = mock.Mock()
1377 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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)
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
1388 scenario_helper = mock.Mock()
1389 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1391 with self.assertRaises(Exception) as raised:
1392 vpp_setup_env_helper.execute_script('dump_interfaces.vat', True,
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)
1399 def test_execute_script_json_out(self):
1403 "sup_sw_if_index": 0
1406 "l2_address_length": 6,
1407 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1410 "interface_name": "VirtualFunctionEthernetff/7/0",
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,
1426 self.assertEqual(str(json_output),
1427 vpp_setup_env_helper.execute_script_json_out(
1428 'dump_interfaces.vat'))
1430 def test_self_cleanup_vat_json_output(self):
1434 "sup_sw_if_index": 0
1437 "l2_address_length": 6,
1438 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1441 "interface_name": "VirtualFunctionEthernetff/7/0",
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'))
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'))
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,
1472 'sub_exact_match': 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,
1482 'vtr_push_dot1q': 0,
1485 VppSetupEnvHelper.get_vpp_interface_by_mac(
1486 self.VPP_INTERFACES_DUMP, mac_address))
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(
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",
1505 "sub_number_of_tags": 0,
1506 "sub_outer_vlan_id": 0,
1507 "sub_inner_vlan_id": 0,
1508 "sub_exact_match": 0,
1510 "sub_outer_vlan_id_any": 0,
1511 "sub_inner_vlan_id_any": 0,
1513 "vtr_push_dot1q": 0,
1518 self.assertIn('l2_address_length value is not 6.',
1519 str(raised.exception))
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(
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",
1538 "sub_number_of_tags": 0,
1539 "sub_outer_vlan_id": 0,
1540 "sub_inner_vlan_id": 0,
1541 "sub_exact_match": 0,
1543 "sub_outer_vlan_id_any": 0,
1544 "sub_inner_vlan_id_any": 0,
1546 "vtr_push_dot1q": 0,
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))
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(
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",
1573 "sub_number_of_tags": 0,
1574 "sub_outer_vlan_id": 0,
1575 "sub_inner_vlan_id": 0,
1576 "sub_exact_match": 0,
1578 "sub_outer_vlan_id_any": 0,
1579 "sub_inner_vlan_id_any": 0,
1581 "vtr_push_dot1q": 0,
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))
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)
1598 self.assertEqual(25,
1599 VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1601 lowest_ip.max_prefixlen))
1603 def test_get_prefix_length_zero_prefix(self):
1604 start_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)
1611 VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1616 class TestVatTerminal(unittest.TestCase):
1618 def test___init___error(self):
1619 ssh_helper = mock.Mock()
1620 ssh_helper.interactive_terminal_open.side_effect = exceptions.SSHTimeout
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))
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)
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)
1638 self.assertEqual({'empty': 'value'},
1639 vat_terminal.vat_terminal_exec_cmd(
1640 "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
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)
1648 self.assertEqual([{'empty': 'value'}],
1649 vat_terminal.vat_terminal_exec_cmd(
1650 "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
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)
1658 self.assertIsNone(vat_terminal.vat_terminal_exec_cmd(
1659 "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
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
1667 vat_terminal = VatTerminal(ssh_helper, json_param=True)
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")
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))
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("\'", "\"")
1682 vat_terminal = VatTerminal(ssh_helper, json_param=True)
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")
1688 'VAT command hw_interface_set_mtu sw_if_index 1 mtu 9200: no JSON data.',
1689 str(raised.exception))
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())
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))
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))
1713 def test_vat_terminal_exec_cmd_from_template(self):
1714 ssh_helper = mock.Mock()
1715 vat_terminal = VatTerminal(ssh_helper, json_param=False)
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,