1 # Copyright (c) 2017 Intel 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.
16 from __future__ import absolute_import
20 from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
23 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
28 'stl': mock.MagicMock(),
29 'stl.trex_stl_lib': mock.MagicMock(),
30 'stl.trex_stl_lib.base64': mock.MagicMock(),
31 'stl.trex_stl_lib.binascii': mock.MagicMock(),
32 'stl.trex_stl_lib.collections': mock.MagicMock(),
33 'stl.trex_stl_lib.copy': mock.MagicMock(),
34 'stl.trex_stl_lib.datetime': mock.MagicMock(),
35 'stl.trex_stl_lib.functools': mock.MagicMock(),
36 'stl.trex_stl_lib.imp': mock.MagicMock(),
37 'stl.trex_stl_lib.inspect': mock.MagicMock(),
38 'stl.trex_stl_lib.json': mock.MagicMock(),
39 'stl.trex_stl_lib.linecache': mock.MagicMock(),
40 'stl.trex_stl_lib.math': mock.MagicMock(),
41 'stl.trex_stl_lib.os': mock.MagicMock(),
42 'stl.trex_stl_lib.platform': mock.MagicMock(),
43 'stl.trex_stl_lib.pprint': mock.MagicMock(),
44 'stl.trex_stl_lib.random': mock.MagicMock(),
45 'stl.trex_stl_lib.re': mock.MagicMock(),
46 'stl.trex_stl_lib.scapy': mock.MagicMock(),
47 'stl.trex_stl_lib.socket': mock.MagicMock(),
48 'stl.trex_stl_lib.string': mock.MagicMock(),
49 'stl.trex_stl_lib.struct': mock.MagicMock(),
50 'stl.trex_stl_lib.sys': mock.MagicMock(),
51 'stl.trex_stl_lib.threading': mock.MagicMock(),
52 'stl.trex_stl_lib.time': mock.MagicMock(),
53 'stl.trex_stl_lib.traceback': mock.MagicMock(),
54 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
55 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
56 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
57 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
58 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
59 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
60 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
61 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
62 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
63 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
64 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
65 'stl.trex_stl_lib.types': mock.MagicMock(),
66 'stl.trex_stl_lib.utils': mock.MagicMock(),
67 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
68 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
69 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
70 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
71 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
72 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
73 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
74 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
75 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
76 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
77 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
78 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
79 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
80 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
81 'stl.trex_stl_lib.warnings': mock.MagicMock(),
82 'stl.trex_stl_lib.yaml': mock.MagicMock(),
83 'stl.trex_stl_lib.zlib': mock.MagicMock(),
84 'stl.trex_stl_lib.zmq': mock.MagicMock(),
87 STLClient = mock.MagicMock()
88 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
92 from yardstick.network_services.vnf_generic.vnf.tg_prox import ProxTrafficGen
93 from yardstick.network_services.traffic_profile.base import TrafficProfile
96 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
97 class TestProxTrafficGen(unittest.TestCase):
99 'short-name': 'ProxVnf',
104 'network': '152.16.100.20',
105 'netmask': '255.255.255.0',
106 'gateway': '152.16.100.20',
110 'network': '152.16.40.20',
111 'netmask': '255.255.255.0',
112 'gateway': '152.16.40.20',
116 'description': 'PROX approximation using DPDK',
117 'name': 'proxvnf-baremetal',
120 'network': '0064:ff9b:0:0:0:0:9810:6414',
122 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
126 'network': '0064:ff9b:0:0:0:0:9810:2814',
128 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
132 'id': 'proxvnf-baremetal',
133 'external-interface': [
135 'virtual-interface': {
136 'dst_mac': '00:00:00:00:00:04',
137 'vpci': '0000:05:00.0',
138 'local_ip': '152.16.100.19',
139 'type': 'PCI-PASSTHROUGH',
141 'netmask': '255.255.255.0',
142 'dpdk_port_num': '0',
143 'bandwidth': '10 Gbps',
145 'dst_ip': '152.16.100.20',
146 'local_iface_name': 'xe0',
147 'local_mac': '00:00:00:00:00:02',
149 'vnfd-connection-point-ref': 'xe0',
153 'virtual-interface': {
154 'dst_mac': '00:00:00:00:00:03',
155 'vpci': '0000:05:00.1',
156 'local_ip': '152.16.40.19',
157 'type': 'PCI-PASSTHROUGH',
160 'netmask': '255.255.255.0',
161 'dpdk_port_num': '1',
162 'bandwidth': '10 Gbps',
163 'dst_ip': '152.16.40.20',
164 'local_iface_name': 'xe1',
165 'local_mac': '00:00:00:00:00:01',
167 'vnfd-connection-point-ref': 'xe1',
173 'description': 'PROX approximation using DPDK',
175 'vdu-id': 'proxvnf-baremetal',
188 'connection-point': [
198 'id': 'ProxApproxVnf',
203 'vnfd:vnfd-catalog': {
213 'tg__1': 'trafficgen_1.yardstick',
214 'vnf__1': 'vnf.yardstick'},
216 'duration': 600, 'type': 'Duration'},
217 'topology': 'prox-tg-topology-2.yaml',
218 'traffic_profile': '../../traffic_profiles/prox_binsearch.yaml',
221 'tg__1': {'prox_args': {'-e': '',
223 'prox_config': 'configs/l3-gen-2.cfg',
225 '/root/dppd-PROX-v035/build/prox'},
227 'prox_args': {'-t': ''},
228 'prox_config': 'configs/l3-swap-2.cfg',
229 'prox_path': '/root/dppd-PROX-v035/build/prox'}}}
234 'member-vnf-index': '3',
235 'role': 'TrafficGen',
236 'name': 'trafficgen_2.yardstick',
237 'vnfd-id-ref': 'tg__2',
241 'local_iface_name': 'ens513f0',
243 'netmask': '255.255.255.0',
244 'local_ip': '152.16.40.20',
245 'dst_mac': '00:00:00:00:00:01',
246 'local_mac': '00:00:00:00:00:03',
247 'dst_ip': '152.16.40.19',
249 'vpci': '0000:02:00.0',
253 'local_iface_name': 'ens513f1',
254 'netmask': '255.255.255.0',
255 'network': '202.16.100.0',
256 'local_ip': '202.16.100.20',
257 'local_mac': '00:1e:67:d0:60:5d',
259 'vpci': '0000:02:00.1',
264 'VNF model': 'l3fwd_vnf.yaml',
268 'member-vnf-index': '1',
269 'role': 'TrafficGen',
270 'name': 'trafficgen_1.yardstick',
271 'vnfd-id-ref': 'tg__1',
275 'local_iface_name': 'ens785f0',
277 'netmask': '255.255.255.0',
278 'local_ip': '152.16.100.20',
279 'dst_mac': '00:00:00:00:00:02',
280 'local_mac': '00:00:00:00:00:04',
281 'dst_ip': '152.16.100.19',
283 'vpci': '0000:05:00.0',
287 'local_iface_name': 'ens785f1',
288 'netmask': '255.255.255.0',
289 'local_ip': '152.16.100.21',
290 'local_mac': '00:00:00:00:00:01',
292 'vpci': '0000:05:00.1',
297 'VNF model': 'tg_rfc2544_tpl.yaml',
301 'name': 'vnf.yardstick',
302 'vnfd-id-ref': 'vnf__1',
306 'local_iface_name': 'ens786f0',
308 'netmask': '255.255.255.0',
309 'local_ip': '152.16.100.19',
310 'dst_mac': '00:00:00:00:00:04',
311 'local_mac': '00:00:00:00:00:02',
312 'dst_ip': '152.16.100.20',
314 'vpci': '0000:05:00.0',
318 'local_iface_name': 'ens786f1',
320 'netmask': '255.255.255.0',
321 'local_ip': '152.16.40.19',
322 'dst_mac': '00:00:00:00:00:03',
323 'local_mac': '00:00:00:00:00:01',
324 'dst_ip': '152.16.40.20',
326 'vpci': '0000:05:00.1',
332 'netmask': '255.255.255.0',
333 'gateway': '152.16.100.20',
334 'network': '152.16.100.20',
338 'netmask': '255.255.255.0',
339 'gateway': '152.16.40.20',
340 'network': '152.16.40.20',
344 'member-vnf-index': '2',
351 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
352 'network': '0064:ff9b:0:0:0:0:9810:6414',
357 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
358 'network': '0064:ff9b:0:0:0:0:9810:2814',
363 'VNF model': 'prox_vnf.yaml',
369 'description': 'Binary search for max no-drop throughput over given packet sizes',
370 'name': 'prox_binsearch',
371 'schema': 'nsb:traffic_profile:0.1',
375 'packet_sizes': [64, 65],
376 'test_precision': 1.0,
377 'tolerated_loss': 0.0,
378 'traffic_type': 'ProxBinSearchProfile',
379 'upper_bound': 100.0}}
381 @mock.patch(SSH_HELPER)
382 def test___init__(self, ssh, mock_time):
384 prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0)
385 self.assertIsNone(prox_traffic_gen._tg_process)
386 self.assertIsNone(prox_traffic_gen._traffic_process)
388 @mock.patch(SSH_HELPER)
389 def test_collect_kpi(self, ssh, mock_time):
392 prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0)
393 prox_traffic_gen._queue = mock.MagicMock()
394 self.assertEqual({}, prox_traffic_gen.collect_kpi())
396 @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores')
397 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
398 @mock.patch(SSH_HELPER)
399 def test_instantiate(self, ssh, mock_find, mock_cpu_sys_cores, mock_time):
402 mock_cpu_sys_cores.get_core_socket.return_value = {'0': '01234'}
404 mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
405 mock_traffic_profile.get_traffic_definition.return_value = "64"
406 mock_traffic_profile.params = self.TRAFFIC_PROFILE
408 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
409 prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
410 prox_traffic_gen.ssh_helper = mock.MagicMock(
411 **{"execute.return_value": (0, "", ""), "bin_path": ""})
412 prox_traffic_gen.setup_helper._setup_resources = mock.MagicMock()
413 prox_traffic_gen.setup_hugepages = mock.MagicMock()
414 prox_traffic_gen.generate_prox_config_file = mock.MagicMock()
415 prox_traffic_gen.upload_prox_config = mock.MagicMock()
416 prox_traffic_gen.setup_helper._find_used_drivers = mock.MagicMock()
417 prox_traffic_gen.setup_helper.used_drivers = {}
418 prox_traffic_gen.setup_helper.bound_pci = []
419 prox_traffic_gen._start_server = mock.Mock(return_value=0)
420 prox_traffic_gen._tg_process = mock.MagicMock()
421 prox_traffic_gen._tg_process.start = mock.Mock()
422 prox_traffic_gen._tg_process.exitcode = 0
423 prox_traffic_gen._tg_process._is_alive = mock.Mock(return_value=1)
424 prox_traffic_gen.ssh_helper = mock.MagicMock()
425 prox_traffic_gen.resource_helper.ssh_helper = mock.MagicMock()
428 'options': {'tg__1': {'prox_args': {'-e': '',
430 'prox_config': 'configs/l3-gen-2.cfg',
431 'prox_path': '/root/dppd-PROX-v035/build/prox'},
432 'vnf__1': {'prox_args': {'-t': ''},
433 'prox_config': 'configs/l3-swap-2.cfg',
434 'prox_path': '/root/dppd-PROX-v035/build/prox'}
437 prox_traffic_gen.instantiate(scenario_cfg, {})
439 @mock.patch(SSH_HELPER)
440 def test__traffic_runner(self, ssh, mock_time):
443 mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
444 mock_traffic_profile.get_traffic_definition.return_value = "64"
445 mock_traffic_profile.execute.return_value = "64"
446 mock_traffic_profile.params = self.TRAFFIC_PROFILE
448 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
449 sut = ProxTrafficGen(NAME, vnfd)
450 sut.prox_config_dict = {}
451 sut._get_socket = mock.MagicMock()
452 sut.ssh_helper = mock.Mock()
453 sut.ssh_helper.run = mock.Mock()
454 sut._vpci_ascending = ["0000:05:00.0", "0000:05:00.1"]
455 sut._connect_client = mock.Mock(autospec=STLClient)
456 sut._connect_client.get_stats = mock.Mock(return_value="0")
457 sut._traffic_runner(mock_traffic_profile)
459 @mock.patch(SSH_HELPER)
460 def test_scale(self, ssh, mock_time):
461 mock_ssh(ssh, exec_result=(1, "", ""))
462 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
463 prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
464 with self.assertRaises(NotImplementedError):
465 prox_traffic_gen.scale('')
467 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
468 @mock.patch(SSH_HELPER)
469 def test_listen_traffic(self, ssh, mock_socket, mock_time):
471 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
472 prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
473 self.assertIsNone(prox_traffic_gen.listen_traffic(mock.Mock()))
475 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
476 @mock.patch(SSH_HELPER)
477 def test_terminate(self, ssh, mock_socket, mock_time):
479 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
480 prox_traffic_gen = ProxTrafficGen(NAME, vnfd)
481 prox_traffic_gen._terminated = mock.MagicMock()
482 prox_traffic_gen._traffic_process = mock.MagicMock()
483 prox_traffic_gen._traffic_process.terminate = mock.Mock()
484 prox_traffic_gen.ssh_helper = mock.MagicMock()
485 prox_traffic_gen.setup_helper = mock.MagicMock()
486 prox_traffic_gen.resource_helper = mock.MagicMock()
487 self.assertEqual(None, prox_traffic_gen.terminate())