Merge "Build VPP startup configuration file"
[yardstick.git] / yardstick / tests / unit / network_services / vnf_generic / vnf / test_vpp_helpers.py
1 # Copyright (c) 2019 Viosoft Corporation
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 import unittest
15
16 import mock
17
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
21
22
23 class TestVppConfigGenerator(unittest.TestCase):
24
25     def test_add_config_item(self):
26         test_item = {}
27         vpp_config_generator = VppConfigGenerator()
28         vpp_config_generator.add_config_item(test_item, '/tmp/vpe.log',
29                                              ['unix', 'log'])
30         self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
31
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',
36                                              ['unix', 'log'])
37         self.assertEqual({'unix': {'log': '/tmp/vpe.log'}}, test_item)
38
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())
44
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())
50
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())
56
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())
62
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())
68
69     def test_add_dpdk_cryptodev(self):
70         vpp_config_generator = VppConfigGenerator()
71         vpp_config_generator.add_dpdk_cryptodev(2, '0000:00:00.0')
72         self.assertEqual(
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())
75
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)
79         self.assertEqual(
80             'dpdk\n{\n  vdev cryptodev_aesni_gcm_pmd,socket_id=0 \n}\n',
81             vpp_config_generator.dump_config())
82
83     def test_add_dpdk_dev_default_rxq(self):
84         vpp_config_generator = VppConfigGenerator()
85         vpp_config_generator.add_dpdk_dev_default_rxq(1)
86         self.assertEqual(
87             'dpdk\n{\n  dev default\n  {\n    num-rx-queues 1\n  }\n}\n',
88             vpp_config_generator.dump_config())
89
90     def test_add_dpdk_dev_default_rxd(self):
91         vpp_config_generator = VppConfigGenerator()
92         vpp_config_generator.add_dpdk_dev_default_rxd(2048)
93         self.assertEqual(
94             'dpdk\n{\n  dev default\n  {\n    num-rx-desc 2048\n  }\n}\n',
95             vpp_config_generator.dump_config())
96
97     def test_add_dpdk_dev_default_txd(self):
98         vpp_config_generator = VppConfigGenerator()
99         vpp_config_generator.add_dpdk_dev_default_txd(2048)
100         self.assertEqual(
101             'dpdk\n{\n  dev default\n  {\n    num-tx-desc 2048\n  }\n}\n',
102             vpp_config_generator.dump_config())
103
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())
109
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())
115
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())
121
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())
127
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())
133
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())
139
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())
144
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())
150
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())
156
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())
162
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())
168
169     def test_add_plugin(self):
170         vpp_config_generator = VppConfigGenerator()
171         vpp_config_generator.add_plugin('enable', ['dpdk_plugin.so'])
172         self.assertEqual(
173             'plugins\n{\n  plugin [\'dpdk_plugin.so\']\n  {\n    enable  \n  }\n}\n',
174             vpp_config_generator.dump_config())
175
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())
181
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())
187
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())
193
194     def test_pci_dev_check(self):
195         self.assertTrue(VppConfigGenerator.pci_dev_check('0000:00:00.0'))
196
197     def test_pci_dev_check_error(self):
198         with self.assertRaises(ValueError) as raised:
199             VppConfigGenerator.pci_dev_check('0000:00:0.0')
200         self.assertIn(
201             'PCI address 0000:00:0.0 is not in valid format xxxx:xx:xx.x',
202             str(raised.exception))
203
204
205 class TestVppSetupEnvHelper(unittest.TestCase):
206     VNFD_0 = {
207         "benchmark": {
208             "kpi": [
209                 "packets_in",
210                 "packets_fwd",
211                 "packets_dropped"
212             ]
213         },
214         "connection-point": [
215             {
216                 "name": "xe0",
217                 "type": "VPORT"
218             },
219             {
220                 "name": "xe1",
221                 "type": "VPORT"
222             }
223         ],
224         "description": "VPP IPsec",
225         "id": "VipsecApproxVnf",
226         "mgmt-interface": {
227             "ip": "10.10.10.101",
228             "password": "r00t",
229             "user": "root",
230             "vdu-id": "ipsecvnf-baremetal"
231         },
232         "name": "IpsecVnf",
233         "short-name": "IpsecVnf",
234         "vdu": [
235             {
236                 "description": "VPP Ipsec",
237                 "external-interface": [
238                     {
239                         "name": "xe0",
240                         "virtual-interface": {
241                             "driver": "igb_uio",
242                             "dst_ip": "192.168.100.1",
243                             "dst_mac": "90:e2:ba:7c:30:e8",
244                             "ifname": "xe0",
245                             "local_ip": "192.168.100.2",
246                             "local_mac": "90:e2:ba:7c:41:a8",
247                             "netmask": "255.255.255.0",
248                             "network": {},
249                             "node_name": "vnf__0",
250                             "peer_ifname": "xe0",
251                             "peer_intf": {
252                                 "dpdk_port_num": 0,
253                                 "driver": "igb_uio",
254                                 "dst_ip": "192.168.100.2",
255                                 "dst_mac": "90:e2:ba:7c:41:a8",
256                                 "ifname": "xe0",
257                                 "local_ip": "192.168.100.1",
258                                 "local_mac": "90:e2:ba:7c:30:e8",
259                                 "netmask": "255.255.255.0",
260                                 "network": {},
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"
266                             },
267                             "peer_name": "tg__0",
268                             "vld_id": "uplink_0",
269                             "vpci": "0000:ff:06.0"
270                         },
271                         "vnfd-connection-point-ref": "xe0"
272                     },
273                     {
274                         "name": "xe1",
275                         "virtual-interface": {
276                             "driver": "igb_uio",
277                             "dst_ip": "1.1.1.2",
278                             "dst_mac": "0a:b1:ec:fd:a2:66",
279                             "ifname": "xe1",
280                             "local_ip": "1.1.1.1",
281                             "local_mac": "4e:90:85:d3:c5:13",
282                             "netmask": "255.255.255.0",
283                             "network": {},
284                             "node_name": "vnf__0",
285                             "peer_ifname": "xe1",
286                             "peer_intf": {
287                                 "driver": "igb_uio",
288                                 "dst_ip": "1.1.1.1",
289                                 "dst_mac": "4e:90:85:d3:c5:13",
290                                 "ifname": "xe1",
291                                 "local_ip": "1.1.1.2",
292                                 "local_mac": "0a:b1:ec:fd:a2:66",
293                                 "netmask": "255.255.255.0",
294                                 "network": {},
295                                 "node_name": "vnf__1",
296                                 "peer_ifname": "xe1",
297                                 "peer_name": "vnf__0",
298                                 "vld_id": "ciphertext",
299                                 "vpci": "0000:00:07.0"
300                             },
301                             "peer_name": "vnf__1",
302                             "vld_id": "ciphertext",
303                             "vpci": "0000:ff:07.0"
304                         },
305                         "vnfd-connection-point-ref": "xe1"
306                     }
307                 ],
308                 "id": "ipsecvnf-baremetal",
309                 "name": "ipsecvnf-baremetal",
310                 "routing_table": []
311             }
312         ]
313     }
314
315     VNFD = {
316         'vnfd:vnfd-catalog': {
317             'vnfd': [
318                 VNFD_0,
319             ],
320         },
321     }
322
323     VPP_INTERFACES_DUMP = [
324         {
325             "sw_if_index": 0,
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",
330             "admin_up_down": 0,
331             "link_up_down": 0,
332             "link_duplex": 0,
333             "link_speed": 0,
334             "mtu": 0,
335             "sub_id": 0,
336             "sub_dot1ad": 0,
337             "sub_number_of_tags": 0,
338             "sub_outer_vlan_id": 0,
339             "sub_inner_vlan_id": 0,
340             "sub_exact_match": 0,
341             "sub_default": 0,
342             "sub_outer_vlan_id_any": 0,
343             "sub_inner_vlan_id_any": 0,
344             "vtr_op": 0,
345             "vtr_push_dot1q": 0,
346             "vtr_tag1": 0,
347             "vtr_tag2": 0
348         },
349         {
350             "sw_if_index": 1,
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",
355             "admin_up_down": 0,
356             "link_up_down": 0,
357             "link_duplex": 2,
358             "link_speed": 32,
359             "mtu": 9202,
360             "sub_id": 0,
361             "sub_dot1ad": 0,
362             "sub_number_of_tags": 0,
363             "sub_outer_vlan_id": 0,
364             "sub_inner_vlan_id": 0,
365             "sub_exact_match": 0,
366             "sub_default": 0,
367             "sub_outer_vlan_id_any": 0,
368             "sub_inner_vlan_id_any": 0,
369             "vtr_op": 0,
370             "vtr_push_dot1q": 0,
371             "vtr_tag1": 0,
372             "vtr_tag2": 0
373         },
374         {
375             "sw_if_index": 2,
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",
380             "admin_up_down": 0,
381             "link_up_down": 0,
382             "link_duplex": 2,
383             "link_speed": 32,
384             "mtu": 9206,
385             "sub_id": 0,
386             "sub_dot1ad": 0,
387             "sub_number_of_tags": 0,
388             "sub_outer_vlan_id": 0,
389             "sub_inner_vlan_id": 0,
390             "sub_exact_match": 0,
391             "sub_default": 0,
392             "sub_outer_vlan_id_any": 0,
393             "sub_inner_vlan_id_any": 0,
394             "vtr_op": 0,
395             "vtr_push_dot1q": 0,
396             "vtr_tag1": 0,
397             "vtr_tag2": 0
398         }
399     ]
400
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,
407                                                  scenario_helper)
408         vpp_setup_env_helper.kill_vnf()
409
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,
416                                                  scenario_helper)
417         with self.assertRaises(RuntimeError) as raised:
418             vpp_setup_env_helper.kill_vnf()
419
420         self.assertIn('Failed to stop service vpp', str(raised.exception))
421
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,
427                                                  scenario_helper)
428         vpp_setup_env_helper.tear_down()
429
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,
436                                                  scenario_helper)
437         vpp_setup_env_helper.start_vpp_service()
438
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,
445                                                  scenario_helper)
446         with self.assertRaises(RuntimeError) as raised:
447             vpp_setup_env_helper.start_vpp_service()
448
449         self.assertIn('Failed to start service vpp', str(raised.exception))
450
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,
456                                                  scenario_helper)
457         vpp_setup_env_helper._update_vnfd_helper(
458             {'vpp-data': {'vpp-key': 'vpp-value'}})
459
460         self.assertEqual({'vpp-key': 'vpp-value'},
461                          vpp_setup_env_helper.vnfd_helper.get('vpp-data', {}))
462
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,
468                                                  scenario_helper)
469         vpp_setup_env_helper._update_vnfd_helper({'driver': 'qat'}, 'xe0')
470
471         self.assertEqual('qat',
472                          vpp_setup_env_helper.get_value_by_interface_key(
473                              'xe0', 'driver'))
474
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,
480                                                  scenario_helper)
481         vpp_setup_env_helper._update_vnfd_helper(
482             {'mgmt-interface': {'name': 'net'}})
483
484         self.assertEqual({'ip': '10.10.10.101',
485                           'name': 'net',
486                           'password': 'r00t',
487                           'user': 'root',
488                           'vdu-id': 'ipsecvnf-baremetal'},
489                          vpp_setup_env_helper.vnfd_helper.get('mgmt-interface',
490                                                               {}))
491
492     def test_get_value_by_interface_key(self):
493         vnfd_helper = VnfdHelper(self.VNFD_0)
494         ssh_helper = mock.Mock()
495
496         scenario_helper = mock.Mock()
497         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
498                                                  scenario_helper)
499         vpp_setup_env_helper._update_vnfd_helper(
500             {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
501
502         self.assertEqual({'vpp-key': 'vpp-value'},
503                          vpp_setup_env_helper.get_value_by_interface_key(
504                              'xe0', 'vpp-data'))
505
506     def test_get_value_by_interface_key_error(self):
507         vnfd_helper = VnfdHelper(self.VNFD_0)
508         ssh_helper = mock.Mock()
509
510         scenario_helper = mock.Mock()
511         vpp_setup_env_helper = VppSetupEnvHelper(vnfd_helper, ssh_helper,
512                                                  scenario_helper)
513         vpp_setup_env_helper._update_vnfd_helper(
514             {'vpp-data': {'vpp-key': 'vpp-value'}}, 'xe0')
515
516         self.assertIsNone(vpp_setup_env_helper.get_value_by_interface_key(
517             'xe2', 'vpp-err'))