Merge "Yardstick TC082: move sample test case perf.yaml"
[yardstick.git] / tests / unit / network_services / vnf_generic / vnf / test_tg_prox.py
1 # Copyright (c) 2017 Intel 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 #
15
16 from __future__ import absolute_import
17
18 import unittest
19 import mock
20
21 from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
22 from tests.unit import STL_MOCKS
23 from yardstick.network_services.nfvi.resource import ResourceProfile
24
25 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
26 NAME = 'vnf__1'
27
28 STLClient = mock.MagicMock()
29 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
30 stl_patch.start()
31
32 if stl_patch:
33     from yardstick.network_services.vnf_generic.vnf.tg_prox import ProxTrafficGen
34     from yardstick.network_services.traffic_profile.base import TrafficProfile
35
36
37 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
38 class TestProxTrafficGen(unittest.TestCase):
39     VNFD0 = {
40         'short-name': 'ProxVnf',
41         'vdu': [
42             {
43                 'routing_table': [
44                     {
45                         'network': '152.16.100.20',
46                         'netmask': '255.255.255.0',
47                         'gateway': '152.16.100.20',
48                         'if': 'xe0',
49                     },
50                     {
51                         'network': '152.16.40.20',
52                         'netmask': '255.255.255.0',
53                         'gateway': '152.16.40.20',
54                         'if': 'xe1',
55                     },
56                 ],
57                 'description': 'PROX approximation using DPDK',
58                 'name': 'proxvnf-baremetal',
59                 'nd_route_tbl': [
60                     {
61                         'network': '0064:ff9b:0:0:0:0:9810:6414',
62                         'netmask': '112',
63                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
64                         'if': 'xe0',
65                     },
66                     {
67                         'network': '0064:ff9b:0:0:0:0:9810:2814',
68                         'netmask': '112',
69                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
70                         'if': 'xe1',
71                     },
72                 ],
73                 'id': 'proxvnf-baremetal',
74                 'external-interface': [
75                     {
76                         'virtual-interface': {
77                             'dst_mac': '00:00:00:00:00:04',
78                             'vpci': '0000:05:00.0',
79                             'local_ip': '152.16.100.19',
80                             'type': 'PCI-PASSTHROUGH',
81                             'vld_id': '',
82                             'netmask': '255.255.255.0',
83                             'dpdk_port_num': '0',
84                             'bandwidth': '10 Gbps',
85                             'driver': "i40e",
86                             'dst_ip': '152.16.100.20',
87                             'local_iface_name': 'xe0',
88                             'local_mac': '00:00:00:00:00:02',
89                         },
90                         'vnfd-connection-point-ref': 'xe0',
91                         'name': 'xe0',
92                     },
93                     {
94                         'virtual-interface': {
95                             'dst_mac': '00:00:00:00:00:03',
96                             'vpci': '0000:05:00.1',
97                             'local_ip': '152.16.40.19',
98                             'type': 'PCI-PASSTHROUGH',
99                             'vld_id': '',
100                             'driver': "i40e",
101                             'netmask': '255.255.255.0',
102                             'dpdk_port_num': '1',
103                             'bandwidth': '10 Gbps',
104                             'dst_ip': '152.16.40.20',
105                             'local_iface_name': 'xe1',
106                             'local_mac': '00:00:00:00:00:01',
107                         },
108                         'vnfd-connection-point-ref': 'xe1',
109                         'name': 'xe1',
110                     },
111                 ],
112             },
113         ],
114         'description': 'PROX approximation using DPDK',
115         'mgmt-interface': {
116             'vdu-id': 'proxvnf-baremetal',
117             'host': '1.2.1.1',
118             'password': 'r00t',
119             'user': 'root',
120             'ip': '1.2.1.1',
121         },
122         'benchmark': {
123             'kpi': [
124                 'packets_in',
125                 'packets_fwd',
126                 'packets_dropped',
127             ],
128         },
129         'connection-point': [
130             {
131                 'type': 'VPORT',
132                 'name': 'xe0',
133             },
134             {
135                 'type': 'VPORT',
136                 'name': 'xe1',
137             },
138         ],
139         'id': 'ProxApproxVnf',
140         'name': 'ProxVnf',
141     }
142
143     VNFD = {
144         'vnfd:vnfd-catalog': {
145             'vnfd': [
146                 VNFD0,
147             ],
148         },
149     }
150
151     SCENARIO_CFG = {
152         'task_path': "",
153         'nodes': {
154             'tg__1': 'trafficgen_1.yardstick',
155             'vnf__1': 'vnf.yardstick'},
156         'runner': {
157             'duration': 600, 'type': 'Duration'},
158         'topology': 'prox-tg-topology-2.yaml',
159         'traffic_profile': '../../traffic_profiles/prox_binsearch.yaml',
160         'type': 'NSPerf',
161         'options': {
162             'tg__1': {'prox_args': {'-e': '',
163                                     '-t': ''},
164                       'prox_config': 'configs/l3-gen-2.cfg',
165                       'prox_path':
166                           '/root/dppd-PROX-v035/build/prox'},
167             'vnf__1': {
168                 'prox_args': {'-t': ''},
169                 'prox_config': 'configs/l3-swap-2.cfg',
170                 'prox_path': '/root/dppd-PROX-v035/build/prox'}}}
171
172     CONTEXT_CFG = {
173         'nodes': {
174             'tg__2': {
175                 'member-vnf-index': '3',
176                 'role': 'TrafficGen',
177                 'name': 'trafficgen_2.yardstick',
178                 'vnfd-id-ref': 'tg__2',
179                 'ip': '1.2.1.1',
180                 'interfaces': {
181                     'xe0': {
182                         'local_iface_name': 'ens513f0',
183                         'vld_id': 'public',
184                         'netmask': '255.255.255.0',
185                         'local_ip': '152.16.40.20',
186                         'dst_mac': '00:00:00:00:00:01',
187                         'local_mac': '00:00:00:00:00:03',
188                         'dst_ip': '152.16.40.19',
189                         'driver': 'ixgbe',
190                         'vpci': '0000:02:00.0',
191                         'dpdk_port_num': 0,
192                     },
193                     'xe1': {
194                         'local_iface_name': 'ens513f1',
195                         'netmask': '255.255.255.0',
196                         'network': '202.16.100.0',
197                         'local_ip': '202.16.100.20',
198                         'local_mac': '00:1e:67:d0:60:5d',
199                         'driver': 'ixgbe',
200                         'vpci': '0000:02:00.1',
201                         'dpdk_port_num': 1,
202                     },
203                 },
204                 'password': 'r00t',
205                 'VNF model': 'l3fwd_vnf.yaml',
206                 'user': 'root',
207             },
208             'tg__1': {
209                 'member-vnf-index': '1',
210                 'role': 'TrafficGen',
211                 'name': 'trafficgen_1.yardstick',
212                 'vnfd-id-ref': 'tg__1',
213                 'ip': '1.2.1.1',
214                 'interfaces': {
215                     'xe0': {
216                         'local_iface_name': 'ens785f0',
217                         'vld_id': 'private',
218                         'netmask': '255.255.255.0',
219                         'local_ip': '152.16.100.20',
220                         'dst_mac': '00:00:00:00:00:02',
221                         'local_mac': '00:00:00:00:00:04',
222                         'dst_ip': '152.16.100.19',
223                         'driver': 'i40e',
224                         'vpci': '0000:05:00.0',
225                         'dpdk_port_num': 0,
226                     },
227                     'xe1': {
228                         'local_iface_name': 'ens785f1',
229                         'netmask': '255.255.255.0',
230                         'local_ip': '152.16.100.21',
231                         'local_mac': '00:00:00:00:00:01',
232                         'driver': 'i40e',
233                         'vpci': '0000:05:00.1',
234                         'dpdk_port_num': 1,
235                     },
236                 },
237                 'password': 'r00t',
238                 'VNF model': 'tg_rfc2544_tpl.yaml',
239                 'user': 'root',
240             },
241             'vnf__1': {
242                 'name': 'vnf.yardstick',
243                 'vnfd-id-ref': 'vnf__1',
244                 'ip': '1.2.1.1',
245                 'interfaces': {
246                     'xe0': {
247                         'local_iface_name': 'ens786f0',
248                         'vld_id': 'private',
249                         'netmask': '255.255.255.0',
250                         'local_ip': '152.16.100.19',
251                         'dst_mac': '00:00:00:00:00:04',
252                         'local_mac': '00:00:00:00:00:02',
253                         'dst_ip': '152.16.100.20',
254                         'driver': 'i40e',
255                         'vpci': '0000:05:00.0',
256                         'dpdk_port_num': 0,
257                     },
258                     'xe1': {
259                         'local_iface_name': 'ens786f1',
260                         'vld_id': 'public',
261                         'netmask': '255.255.255.0',
262                         'local_ip': '152.16.40.19',
263                         'dst_mac': '00:00:00:00:00:03',
264                         'local_mac': '00:00:00:00:00:01',
265                         'dst_ip': '152.16.40.20',
266                         'driver': 'i40e',
267                         'vpci': '0000:05:00.1',
268                         'dpdk_port_num': 1,
269                     },
270                 },
271                 'routing_table': [
272                     {
273                         'netmask': '255.255.255.0',
274                         'gateway': '152.16.100.20',
275                         'network': '152.16.100.20',
276                         'if': 'xe0',
277                     },
278                     {
279                         'netmask': '255.255.255.0',
280                         'gateway': '152.16.40.20',
281                         'network': '152.16.40.20',
282                         'if': 'xe1',
283                     },
284                 ],
285                 'member-vnf-index': '2',
286                 'host': '1.2.1.1',
287                 'role': 'vnf',
288                 'user': 'root',
289                 'nd_route_tbl': [
290                     {
291                         'netmask': '112',
292                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
293                         'network': '0064:ff9b:0:0:0:0:9810:6414',
294                         'if': 'xe0',
295                     },
296                     {
297                         'netmask': '112',
298                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
299                         'network': '0064:ff9b:0:0:0:0:9810:2814',
300                         'if': 'xe1',
301                     },
302                 ],
303                 'password': 'r00t',
304                 'VNF model': 'prox_vnf.yaml',
305             },
306         },
307     }
308
309     TRAFFIC_PROFILE = {
310         'description': 'Binary search for max no-drop throughput over given packet sizes',
311         'name': 'prox_binsearch',
312         'schema': 'nsb:traffic_profile:0.1',
313         'traffic_profile': {
314             'duration': 5,
315             'lower_bound': 0.0,
316             'packet_sizes': [64, 65],
317             'test_precision': 1.0,
318             'tolerated_loss': 0.0,
319             'traffic_type': 'ProxBinSearchProfile',
320             'upper_bound': 100.0}}
321
322     @mock.patch(SSH_HELPER)
323     def test___init__(self, ssh, mock_time):
324         mock_ssh(ssh)
325         prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0)
326         self.assertIsNone(prox_traffic_gen._tg_process)
327         self.assertIsNone(prox_traffic_gen._traffic_process)
328
329     @mock.patch(SSH_HELPER)
330     def test_collect_kpi(self, ssh, mock_time):
331         mock_ssh(ssh)
332
333         prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0)
334         prox_traffic_gen._vnf_wrapper.resource = mock.Mock(autospec=ResourceProfile)
335         prox_traffic_gen._vnf_wrapper.vnf_execute = mock.Mock(return_value="")
336         self.assertEqual({}, prox_traffic_gen.collect_kpi())
337
338     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores')
339     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
340     @mock.patch(SSH_HELPER)
341     def bad_test_instantiate(self, ssh, mock_find, mock_cpu_sys_cores, mock_time):
342         mock_ssh(ssh)
343
344         mock_cpu_sys_cores.get_core_socket.return_value = {'0': '01234'}
345
346         mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
347         mock_traffic_profile.get_traffic_definition.return_value = "64"
348         mock_traffic_profile.params = self.TRAFFIC_PROFILE
349
350         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
351         prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
352         prox_traffic_gen.ssh_helper = mock.MagicMock(
353             **{"execute.return_value": (0, "", ""), "bin_path": ""})
354         prox_traffic_gen.setup_helper._setup_resources = mock.MagicMock()
355         prox_traffic_gen.setup_hugepages = mock.MagicMock()
356         prox_traffic_gen.generate_prox_config_file = mock.MagicMock()
357         prox_traffic_gen.upload_prox_config = mock.MagicMock()
358         prox_traffic_gen.setup_helper._find_used_drivers = mock.MagicMock()
359         prox_traffic_gen.setup_helper.used_drivers = {}
360         prox_traffic_gen.setup_helper.bound_pci = []
361         prox_traffic_gen._start_server = mock.Mock(return_value=0)
362         prox_traffic_gen._tg_process = mock.MagicMock()
363         prox_traffic_gen._tg_process.start = mock.Mock()
364         prox_traffic_gen._tg_process.exitcode = 0
365         prox_traffic_gen._tg_process._is_alive = mock.Mock(return_value=1)
366         prox_traffic_gen.ssh_helper = mock.MagicMock()
367         prox_traffic_gen.resource_helper.ssh_helper = mock.MagicMock()
368         scenario_cfg = {
369             'task_path': '',
370             'options': {'tg__1': {'prox_args': {'-e': '',
371                                                 '-t': ''},
372                                       'prox_config': 'configs/l3-gen-2.cfg',
373                                       'prox_path': '/root/dppd-PROX-v035/build/prox'},
374                             'vnf__1': {'prox_args': {'-t': ''},
375                                        'prox_config': 'configs/l3-swap-2.cfg',
376                                        'prox_path': '/root/dppd-PROX-v035/build/prox'}
377                             }
378         }
379         prox_traffic_gen.instantiate(scenario_cfg, {})
380
381     @mock.patch(SSH_HELPER)
382     def test__traffic_runner(self, ssh, mock_time):
383         mock_ssh(ssh)
384
385         mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
386         mock_traffic_profile.get_traffic_definition.return_value = "64"
387         mock_traffic_profile.execute.return_value = "64"
388         mock_traffic_profile.params = self.TRAFFIC_PROFILE
389
390         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
391         sut = ProxTrafficGen(NAME, vnfd)
392         sut.prox_config_dict = {}
393         sut._get_socket = mock.MagicMock()
394         sut.ssh_helper = mock.Mock()
395         sut.ssh_helper.run = mock.Mock()
396         sut._vpci_ascending = ["0000:05:00.0", "0000:05:00.1"]
397         sut._connect_client = mock.Mock(autospec=STLClient)
398         sut._connect_client.get_stats = mock.Mock(return_value="0")
399         sut._traffic_runner(mock_traffic_profile)
400
401     @mock.patch(SSH_HELPER)
402     def test_scale(self, ssh, mock_time):
403         mock_ssh(ssh, exec_result=(1, "", ""))
404         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
405         prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
406         with self.assertRaises(NotImplementedError):
407             prox_traffic_gen.scale('')
408
409     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
410     @mock.patch(SSH_HELPER)
411     def test_listen_traffic(self, ssh, mock_socket, mock_time):
412         mock_ssh(ssh)
413         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
414         prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
415         self.assertIsNone(prox_traffic_gen.listen_traffic(mock.Mock()))
416
417     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
418     @mock.patch(SSH_HELPER)
419     def test_terminate(self, ssh, mock_socket, mock_time):
420         mock_ssh(ssh)
421         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
422         prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
423         prox_traffic_gen._terminated = mock.MagicMock()
424         prox_traffic_gen._traffic_process = mock.MagicMock()
425         prox_traffic_gen._traffic_process.terminate = mock.Mock()
426         prox_traffic_gen.ssh_helper = mock.MagicMock()
427         prox_traffic_gen.setup_helper = mock.MagicMock()
428         prox_traffic_gen._vnf_wrapper.setup_helper = mock.MagicMock()
429         prox_traffic_gen.resource_helper = mock.MagicMock()
430         self.assertEqual(None, prox_traffic_gen.terminate())