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_vpp_create_ipsec_tunnels(self):
841 vnfd_helper = VnfdHelper(self.VNFD_0)
842 ssh_helper = mock.Mock()
843 ssh_helper.execute.return_value = 0, '', ''
845 scenario_helper = mock.Mock()
846 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
850 vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
857 self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
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, '', ''
864 scenario_helper = mock.Mock()
865 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
869 vpp_setup_env_helper.vpp_create_ipsec_tunnels('10.10.10.2',
877 self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
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, '', ''
884 scenario_helper = mock.Mock()
885 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
887 self.assertIsNone(vpp_setup_env_helper.apply_config(mock.Mock()))
888 self.assertGreaterEqual(ssh_helper.execute.call_count, 2)
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, '', ''
895 scenario_helper = mock.Mock()
896 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
898 with self.assertRaises(RuntimeError) as raised:
899 vpp_setup_env_helper.apply_config(mock.Mock())
901 self.assertIn('Writing config file failed', str(raised.exception))
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,
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 = ''
915 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24))
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,
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 = ''
929 vpp_setup_env_helper.vpp_route_add('xe0', '10.10.10.1', 24,
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,
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',
946 '00:00:00:00:00:00'))
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,
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 = ''
960 vpp_setup_env_helper.set_ip('xe0', '10.10.10.1',
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,
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 = ''
975 vpp_setup_env_helper.set_interface_state('xe0',
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,
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))
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,
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',
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,
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 = ''
1021 vpp_setup_env_helper.vpp_set_interface_mtu('xe0', 9200))
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,
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())
1037 def test_vpp_interfaces_ready_wait_timeout(self):
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",
1052 "sub_number_of_tags": 0,
1053 "sub_outer_vlan_id": 0,
1054 "sub_inner_vlan_id": 0,
1055 "sub_exact_match": 0,
1057 "sub_outer_vlan_id_any": 0,
1058 "sub_inner_vlan_id_any": 0,
1060 "vtr_push_dot1q": 0,
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,
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))
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,
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())
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,
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'))
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,
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(
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,
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))
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,
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))
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'
1166 scenario_helper = mock.Mock()
1167 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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(
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(
1179 self.assertEqual(2, vpp_setup_env_helper.get_value_by_interface_key(
1180 'xe1', 'vpp_sw_index'))
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'
1193 scenario_helper = mock.Mock()
1194 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1196 self.assertIsNone(vpp_setup_env_helper.update_vpp_interface_data())
1197 self.assertGreaterEqual(ssh_helper.execute.call_count, 1)
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', ''
1204 scenario_helper = mock.Mock()
1205 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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'))
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', ''
1219 scenario_helper = mock.Mock()
1220 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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'))
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', ''
1240 scenario_helper = mock.Mock()
1241 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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'))
1256 def test_execute_script(self):
1257 vnfd_helper = VnfdHelper(self.VNFD_0)
1258 ssh_helper = mock.Mock()
1260 scenario_helper = mock.Mock()
1261 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_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)
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
1272 scenario_helper = mock.Mock()
1273 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
1275 with self.assertRaises(Exception) as raised:
1276 vpp_setup_env_helper.execute_script('dump_interfaces.vat', True,
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)
1283 def test_execute_script_json_out(self):
1287 "sup_sw_if_index": 0
1290 "l2_address_length": 6,
1291 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1294 "interface_name": "VirtualFunctionEthernetff/7/0",
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,
1310 self.assertEqual(str(json_output),
1311 vpp_setup_env_helper.execute_script_json_out(
1312 'dump_interfaces.vat'))
1314 def test_self_cleanup_vat_json_output(self):
1318 "sup_sw_if_index": 0
1321 "l2_address_length": 6,
1322 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0]
1325 "interface_name": "VirtualFunctionEthernetff/7/0",
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'))
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'))
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,
1356 'sub_exact_match': 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,
1366 'vtr_push_dot1q': 0,
1369 VppSetupEnvHelper.get_vpp_interface_by_mac(
1370 self.VPP_INTERFACES_DUMP, mac_address))
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(
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",
1389 "sub_number_of_tags": 0,
1390 "sub_outer_vlan_id": 0,
1391 "sub_inner_vlan_id": 0,
1392 "sub_exact_match": 0,
1394 "sub_outer_vlan_id_any": 0,
1395 "sub_inner_vlan_id_any": 0,
1397 "vtr_push_dot1q": 0,
1402 self.assertIn('l2_address_length value is not 6.',
1403 str(raised.exception))
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(
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",
1422 "sub_number_of_tags": 0,
1423 "sub_outer_vlan_id": 0,
1424 "sub_inner_vlan_id": 0,
1425 "sub_exact_match": 0,
1427 "sub_outer_vlan_id_any": 0,
1428 "sub_inner_vlan_id_any": 0,
1430 "vtr_push_dot1q": 0,
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))
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(
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",
1457 "sub_number_of_tags": 0,
1458 "sub_outer_vlan_id": 0,
1459 "sub_inner_vlan_id": 0,
1460 "sub_exact_match": 0,
1462 "sub_outer_vlan_id_any": 0,
1463 "sub_inner_vlan_id_any": 0,
1465 "vtr_push_dot1q": 0,
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))
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)
1482 self.assertEqual(25,
1483 VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1485 lowest_ip.max_prefixlen))
1487 def test_get_prefix_length_zero_prefix(self):
1488 start_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)
1495 VppSetupEnvHelper.get_prefix_length(int(lowest_ip),
1500 class TestVatTerminal(unittest.TestCase):
1502 def test___init___error(self):
1503 ssh_helper = mock.Mock()
1504 ssh_helper.interactive_terminal_open.side_effect = exceptions.SSHTimeout
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))
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)
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)
1522 self.assertEqual({'empty': 'value'},
1523 vat_terminal.vat_terminal_exec_cmd(
1524 "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
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)
1532 self.assertEqual([{'empty': 'value'}],
1533 vat_terminal.vat_terminal_exec_cmd(
1534 "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
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)
1542 self.assertIsNone(vat_terminal.vat_terminal_exec_cmd(
1543 "hw_interface_set_mtu sw_if_index 1 mtu 9200"))
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
1551 vat_terminal = VatTerminal(ssh_helper, json_param=True)
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")
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))
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("\'", "\"")
1566 vat_terminal = VatTerminal(ssh_helper, json_param=True)
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")
1572 'VAT command hw_interface_set_mtu sw_if_index 1 mtu 9200: no JSON data.',
1573 str(raised.exception))
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())
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))
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))
1597 def test_vat_terminal_exec_cmd_from_template(self):
1598 ssh_helper = mock.Mock()
1599 vat_terminal = VatTerminal(ssh_helper, json_param=False)
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,