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.
18 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
19 from yardstick.network_services.vnf_generic.vnf.vpp_helpers import \
20 VppSetupEnvHelper, VppConfigGenerator
23 class TestVppConfigGenerator(unittest.TestCase):
25 def test_add_config_item(self):
27 vpp_config_generator = VppConfigGenerator()
28 vpp_config_generator.add_config_item(test_item, '/tmp/vpe.log',
30 self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
32 def test_add_config_item_str(self):
33 test_item = {'unix': ''}
34 vpp_config_generator = VppConfigGenerator()
35 vpp_config_generator.add_config_item(test_item, '/tmp/vpe.log',
37 self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
39 def test_add_unix_log(self):
40 vpp_config_generator = VppConfigGenerator()
41 vpp_config_generator.add_unix_log()
42 self.assertEqual('unix\n{\n log /tmp/vpe.log\n}\n',
43 vpp_config_generator.dump_config())
45 def test_add_unix_cli_listen(self):
46 vpp_config_generator = VppConfigGenerator()
47 vpp_config_generator.add_unix_cli_listen()
48 self.assertEqual('unix\n{\n cli-listen /run/vpp/cli.sock\n}\n',
49 vpp_config_generator.dump_config())
51 def test_add_unix_nodaemon(self):
52 vpp_config_generator = VppConfigGenerator()
53 vpp_config_generator.add_unix_nodaemon()
54 self.assertEqual('unix\n{\n nodaemon \n}\n',
55 vpp_config_generator.dump_config())
57 def test_add_unix_coredump(self):
58 vpp_config_generator = VppConfigGenerator()
59 vpp_config_generator.add_unix_coredump()
60 self.assertEqual('unix\n{\n full-coredump \n}\n',
61 vpp_config_generator.dump_config())
63 def test_add_dpdk_dev(self):
64 vpp_config_generator = VppConfigGenerator()
65 vpp_config_generator.add_dpdk_dev('0000:00:00.0')
66 self.assertEqual('dpdk\n{\n dev 0000:00:00.0 \n}\n',
67 vpp_config_generator.dump_config())
69 def test_add_dpdk_cryptodev(self):
70 vpp_config_generator = VppConfigGenerator()
71 vpp_config_generator.add_dpdk_cryptodev(2, '0000:00:00.0')
73 'dpdk\n{\n dev 0000:00:01.0 \n dev 0000:00:01.1 \n uio-driver igb_uio\n}\n',
74 vpp_config_generator.dump_config())
76 def test_add_dpdk_sw_cryptodev(self):
77 vpp_config_generator = VppConfigGenerator()
78 vpp_config_generator.add_dpdk_sw_cryptodev('aesni_gcm', 0, 2)
80 'dpdk\n{\n vdev cryptodev_aesni_gcm_pmd,socket_id=0 \n}\n',
81 vpp_config_generator.dump_config())
83 def test_add_dpdk_dev_default_rxq(self):
84 vpp_config_generator = VppConfigGenerator()
85 vpp_config_generator.add_dpdk_dev_default_rxq(1)
87 'dpdk\n{\n dev default\n {\n num-rx-queues 1\n }\n}\n',
88 vpp_config_generator.dump_config())
90 def test_add_dpdk_dev_default_rxd(self):
91 vpp_config_generator = VppConfigGenerator()
92 vpp_config_generator.add_dpdk_dev_default_rxd(2048)
94 'dpdk\n{\n dev default\n {\n num-rx-desc 2048\n }\n}\n',
95 vpp_config_generator.dump_config())
97 def test_add_dpdk_dev_default_txd(self):
98 vpp_config_generator = VppConfigGenerator()
99 vpp_config_generator.add_dpdk_dev_default_txd(2048)
101 'dpdk\n{\n dev default\n {\n num-tx-desc 2048\n }\n}\n',
102 vpp_config_generator.dump_config())
104 def test_add_dpdk_log_level(self):
105 vpp_config_generator = VppConfigGenerator()
106 vpp_config_generator.add_dpdk_log_level('debug')
107 self.assertEqual('dpdk\n{\n log-level debug\n}\n',
108 vpp_config_generator.dump_config())
110 def test_add_dpdk_socketmem(self):
111 vpp_config_generator = VppConfigGenerator()
112 vpp_config_generator.add_dpdk_socketmem('1024,1024')
113 self.assertEqual('dpdk\n{\n socket-mem 1024,1024\n}\n',
114 vpp_config_generator.dump_config())
116 def test_add_dpdk_num_mbufs(self):
117 vpp_config_generator = VppConfigGenerator()
118 vpp_config_generator.add_dpdk_num_mbufs(32768)
119 self.assertEqual('dpdk\n{\n num-mbufs 32768\n}\n',
120 vpp_config_generator.dump_config())
122 def test_add_dpdk_uio_driver(self):
123 vpp_config_generator = VppConfigGenerator()
124 vpp_config_generator.add_dpdk_uio_driver('igb_uio')
125 self.assertEqual('dpdk\n{\n uio-driver igb_uio\n}\n',
126 vpp_config_generator.dump_config())
128 def test_add_cpu_main_core(self):
129 vpp_config_generator = VppConfigGenerator()
130 vpp_config_generator.add_cpu_main_core('1,2')
131 self.assertEqual('cpu\n{\n main-core 1,2\n}\n',
132 vpp_config_generator.dump_config())
134 def test_add_cpu_corelist_workers(self):
135 vpp_config_generator = VppConfigGenerator()
136 vpp_config_generator.add_cpu_corelist_workers('1,2')
137 self.assertEqual('cpu\n{\n corelist-workers 1,2\n}\n',
138 vpp_config_generator.dump_config())
140 def test_add_heapsize(self):
141 vpp_config_generator = VppConfigGenerator()
142 vpp_config_generator.add_heapsize('4G')
143 self.assertEqual('heapsize 4G\n', vpp_config_generator.dump_config())
145 def test_add_ip6_hash_buckets(self):
146 vpp_config_generator = VppConfigGenerator()
147 vpp_config_generator.add_ip6_hash_buckets(2000000)
148 self.assertEqual('ip6\n{\n hash-buckets 2000000\n}\n',
149 vpp_config_generator.dump_config())
151 def test_add_ip6_heap_size(self):
152 vpp_config_generator = VppConfigGenerator()
153 vpp_config_generator.add_ip6_heap_size('4G')
154 self.assertEqual('ip6\n{\n heap-size 4G\n}\n',
155 vpp_config_generator.dump_config())
157 def test_add_ip_heap_size(self):
158 vpp_config_generator = VppConfigGenerator()
159 vpp_config_generator.add_ip_heap_size('4G')
160 self.assertEqual('ip\n{\n heap-size 4G\n}\n',
161 vpp_config_generator.dump_config())
163 def test_add_statseg_size(self):
164 vpp_config_generator = VppConfigGenerator()
165 vpp_config_generator.add_statseg_size('4G')
166 self.assertEqual('statseg\n{\n size 4G\n}\n',
167 vpp_config_generator.dump_config())
169 def test_add_plugin(self):
170 vpp_config_generator = VppConfigGenerator()
171 vpp_config_generator.add_plugin('enable', ['dpdk_plugin.so'])
173 'plugins\n{\n plugin [\'dpdk_plugin.so\']\n {\n enable \n }\n}\n',
174 vpp_config_generator.dump_config())
176 def test_add_dpdk_no_multi_seg(self):
177 vpp_config_generator = VppConfigGenerator()
178 vpp_config_generator.add_dpdk_no_multi_seg()
179 self.assertEqual('dpdk\n{\n no-multi-seg \n}\n',
180 vpp_config_generator.dump_config())
182 def test_add_dpdk_no_tx_checksum_offload(self):
183 vpp_config_generator = VppConfigGenerator()
184 vpp_config_generator.add_dpdk_no_tx_checksum_offload()
185 self.assertEqual('dpdk\n{\n no-tx-checksum-offload \n}\n',
186 vpp_config_generator.dump_config())
188 def test_dump_config(self):
189 vpp_config_generator = VppConfigGenerator()
190 vpp_config_generator.add_unix_log()
191 self.assertEqual('unix\n{\n log /tmp/vpe.log\n}\n',
192 vpp_config_generator.dump_config())
194 def test_pci_dev_check(self):
195 self.assertTrue(VppConfigGenerator.pci_dev_check('0000:00:00.0'))
197 def test_pci_dev_check_error(self):
198 with self.assertRaises(ValueError) as raised:
199 VppConfigGenerator.pci_dev_check('0000:00:0.0')
201 'PCI address 0000:00:0.0 is not in valid format xxxx:xx:xx.x',
202 str(raised.exception))
205 class TestVppSetupEnvHelper(unittest.TestCase):
214 "connection-point": [
224 "description": "VPP IPsec",
225 "id": "VipsecApproxVnf",
227 "ip": "10.10.10.101",
230 "vdu-id": "ipsecvnf-baremetal"
233 "short-name": "IpsecVnf",
236 "description": "VPP Ipsec",
237 "external-interface": [
240 "virtual-interface": {
242 "dst_ip": "192.168.100.1",
243 "dst_mac": "90:e2:ba:7c:30:e8",
245 "local_ip": "192.168.100.2",
246 "local_mac": "90:e2:ba:7c:41:a8",
247 "netmask": "255.255.255.0",
249 "node_name": "vnf__0",
250 "peer_ifname": "xe0",
254 "dst_ip": "192.168.100.2",
255 "dst_mac": "90:e2:ba:7c:41:a8",
257 "local_ip": "192.168.100.1",
258 "local_mac": "90:e2:ba:7c:30:e8",
259 "netmask": "255.255.255.0",
261 "node_name": "tg__0",
262 "peer_ifname": "xe0",
263 "peer_name": "vnf__0",
264 "vld_id": "uplink_0",
265 "vpci": "0000:81:00.0"
267 "peer_name": "tg__0",
268 "vld_id": "uplink_0",
269 "vpci": "0000:ff:06.0"
271 "vnfd-connection-point-ref": "xe0"
275 "virtual-interface": {
278 "dst_mac": "0a:b1:ec:fd:a2:66",
280 "local_ip": "1.1.1.1",
281 "local_mac": "4e:90:85:d3:c5:13",
282 "netmask": "255.255.255.0",
284 "node_name": "vnf__0",
285 "peer_ifname": "xe1",
289 "dst_mac": "4e:90:85:d3:c5:13",
291 "local_ip": "1.1.1.2",
292 "local_mac": "0a:b1:ec:fd:a2:66",
293 "netmask": "255.255.255.0",
295 "node_name": "vnf__1",
296 "peer_ifname": "xe1",
297 "peer_name": "vnf__0",
298 "vld_id": "ciphertext",
299 "vpci": "0000:00:07.0"
301 "peer_name": "vnf__1",
302 "vld_id": "ciphertext",
303 "vpci": "0000:ff:07.0"
305 "vnfd-connection-point-ref": "xe1"
308 "id": "ipsecvnf-baremetal",
309 "name": "ipsecvnf-baremetal",
316 'vnfd:vnfd-catalog': {
323 VPP_INTERFACES_DUMP = [
326 "sup_sw_if_index": 0,
327 "l2_address_length": 0,
328 "l2_address": [0, 0, 0, 0, 0, 0, 0, 0],
329 "interface_name": "local0",
337 "sub_number_of_tags": 0,
338 "sub_outer_vlan_id": 0,
339 "sub_inner_vlan_id": 0,
340 "sub_exact_match": 0,
342 "sub_outer_vlan_id_any": 0,
343 "sub_inner_vlan_id_any": 0,
351 "sup_sw_if_index": 1,
352 "l2_address_length": 6,
353 "l2_address": [144, 226, 186, 124, 65, 168, 0, 0],
354 "interface_name": "TenGigabitEthernetff/6/0",
362 "sub_number_of_tags": 0,
363 "sub_outer_vlan_id": 0,
364 "sub_inner_vlan_id": 0,
365 "sub_exact_match": 0,
367 "sub_outer_vlan_id_any": 0,
368 "sub_inner_vlan_id_any": 0,
376 "sup_sw_if_index": 2,
377 "l2_address_length": 6,
378 "l2_address": [78, 144, 133, 211, 197, 19, 0, 0],
379 "interface_name": "VirtualFunctionEthernetff/7/0",
387 "sub_number_of_tags": 0,
388 "sub_outer_vlan_id": 0,
389 "sub_inner_vlan_id": 0,
390 "sub_exact_match": 0,
392 "sub_outer_vlan_id_any": 0,
393 "sub_inner_vlan_id_any": 0,
401 def test_kill_vnf(self):
402 vnfd_helper = VnfdHelper(self.VNFD_0)
403 ssh_helper = mock.Mock()
404 ssh_helper.execute.return_value = 0, 0, 0
405 scenario_helper = mock.Mock()
406 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
408 vpp_setup_env_helper.kill_vnf()
410 def test_kill_vnf_error(self):
411 vnfd_helper = VnfdHelper(self.VNFD_0)
412 ssh_helper = mock.Mock()
413 ssh_helper.execute.return_value = 1, 0, 0
414 scenario_helper = mock.Mock()
415 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
417 with self.assertRaises(RuntimeError) as raised:
418 vpp_setup_env_helper.kill_vnf()
420 self.assertIn('Failed to stop service vpp', str(raised.exception))
422 def test_tear_down(self):
423 vnfd_helper = VnfdHelper(self.VNFD_0)
424 ssh_helper = mock.Mock()
425 scenario_helper = mock.Mock()
426 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
428 vpp_setup_env_helper.tear_down()
430 def test_start_vpp_service(self):
431 vnfd_helper = VnfdHelper(self.VNFD_0)
432 ssh_helper = mock.Mock()
433 ssh_helper.execute.return_value = 0, 0, 0
434 scenario_helper = mock.Mock()
435 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
437 vpp_setup_env_helper.start_vpp_service()
439 def test_start_vpp_service_error(self):
440 vnfd_helper = VnfdHelper(self.VNFD_0)
441 ssh_helper = mock.Mock()
442 ssh_helper.execute.return_value = 1, 0, 0
443 scenario_helper = mock.Mock()
444 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
446 with self.assertRaises(RuntimeError) as raised:
447 vpp_setup_env_helper.start_vpp_service()
449 self.assertIn('Failed to start service vpp', str(raised.exception))
451 def test__update_vnfd_helper(self):
452 vnfd_helper = VnfdHelper(self.VNFD_0)
453 ssh_helper = mock.Mock()
454 scenario_helper = mock.Mock()
455 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
457 vpp_setup_env_helper._update_vnfd_helper(
458 {'vpp-data': {'vpp-key': 'vpp-value'}})
460 self.assertEqual({'vpp-key': 'vpp-value'},
461 vpp_setup_env_helper.vnfd_helper.get('vpp-data', {}))
463 def test__update_vnfd_helper_with_key(self):
464 vnfd_helper = VnfdHelper(self.VNFD_0)
465 ssh_helper = mock.Mock()
466 scenario_helper = mock.Mock()
467 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
469 vpp_setup_env_helper._update_vnfd_helper({'driver': 'qat'}, 'xe0')
471 self.assertEqual('qat',
472 vpp_setup_env_helper.get_value_by_interface_key(
475 def test__update_vnfd_helper_dict_without_key(self):
476 vnfd_helper = VnfdHelper(self.VNFD_0)
477 ssh_helper = mock.Mock()
478 scenario_helper = mock.Mock()
479 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
481 vpp_setup_env_helper._update_vnfd_helper(
482 {'mgmt-interface': {'name': 'net'}})
484 self.assertEqual({'ip': '10.10.10.101',
488 'vdu-id': 'ipsecvnf-baremetal'},
489 vpp_setup_env_helper.vnfd_helper.get('mgmt-interface',
492 def test_get_value_by_interface_key(self):
493 vnfd_helper = VnfdHelper(self.VNFD_0)
494 ssh_helper = mock.Mock()
496 scenario_helper = mock.Mock()
497 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
499 vpp_setup_env_helper._update_vnfd_helper(
500 {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
502 self.assertEqual({'vpp-key': 'vpp-value'},
503 vpp_setup_env_helper.get_value_by_interface_key(
506 def test_get_value_by_interface_key_error(self):
507 vnfd_helper = VnfdHelper(self.VNFD_0)
508 ssh_helper = mock.Mock()
510 scenario_helper = mock.Mock()
511 vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
513 vpp_setup_env_helper._update_vnfd_helper(
514 {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
516 self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(