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