3 # Copyright (c) 2016-2017 Intel Corporation
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 from __future__ import absolute_import
24 'stl': mock.MagicMock(),
25 'stl.trex_stl_lib': mock.MagicMock(),
26 'stl.trex_stl_lib.base64': mock.MagicMock(),
27 'stl.trex_stl_lib.binascii': mock.MagicMock(),
28 'stl.trex_stl_lib.collections': mock.MagicMock(),
29 'stl.trex_stl_lib.copy': mock.MagicMock(),
30 'stl.trex_stl_lib.datetime': mock.MagicMock(),
31 'stl.trex_stl_lib.functools': mock.MagicMock(),
32 'stl.trex_stl_lib.imp': mock.MagicMock(),
33 'stl.trex_stl_lib.inspect': mock.MagicMock(),
34 'stl.trex_stl_lib.json': mock.MagicMock(),
35 'stl.trex_stl_lib.linecache': mock.MagicMock(),
36 'stl.trex_stl_lib.math': mock.MagicMock(),
37 'stl.trex_stl_lib.os': mock.MagicMock(),
38 'stl.trex_stl_lib.platform': mock.MagicMock(),
39 'stl.trex_stl_lib.pprint': mock.MagicMock(),
40 'stl.trex_stl_lib.random': mock.MagicMock(),
41 'stl.trex_stl_lib.re': mock.MagicMock(),
42 'stl.trex_stl_lib.scapy': mock.MagicMock(),
43 'stl.trex_stl_lib.socket': mock.MagicMock(),
44 'stl.trex_stl_lib.string': mock.MagicMock(),
45 'stl.trex_stl_lib.struct': mock.MagicMock(),
46 'stl.trex_stl_lib.sys': mock.MagicMock(),
47 'stl.trex_stl_lib.threading': mock.MagicMock(),
48 'stl.trex_stl_lib.time': mock.MagicMock(),
49 'stl.trex_stl_lib.traceback': mock.MagicMock(),
50 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
51 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
52 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
53 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
54 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
55 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
56 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
57 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
58 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
59 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
60 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
61 'stl.trex_stl_lib.types': mock.MagicMock(),
62 'stl.trex_stl_lib.utils': mock.MagicMock(),
63 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
64 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
65 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
66 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
67 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
68 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
69 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
70 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
71 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
72 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
73 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
74 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
75 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
76 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
77 'stl.trex_stl_lib.warnings': mock.MagicMock(),
78 'stl.trex_stl_lib.yaml': mock.MagicMock(),
79 'stl.trex_stl_lib.zlib': mock.MagicMock(),
80 'stl.trex_stl_lib.zmq': mock.MagicMock(),
83 STLClient = mock.MagicMock()
84 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
88 from yardstick.network_services.vnf_generic.vnf.tg_ixload import IxLoadTrafficGen
89 from yardstick.network_services.vnf_generic.vnf.tg_ixload import IxLoadResourceHelper
90 from yardstick.network_services.traffic_profile.base import TrafficProfile
96 class TestIxLoadTrafficGen(unittest.TestCase):
97 VNFD = {'vnfd:vnfd-catalog':
99 [{'short-name': 'VpeVnf',
102 [{'network': '152.16.100.20',
103 'netmask': '255.255.255.0',
104 'gateway': '152.16.100.20',
106 {'network': '152.16.40.20',
107 'netmask': '255.255.255.0',
108 'gateway': '152.16.40.20',
110 'description': 'VPE approximation using DPDK',
111 'name': 'vpevnf-baremetal',
113 [{'network': '0064:ff9b:0:0:0:0:9810:6414',
115 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
117 {'network': '0064:ff9b:0:0:0:0:9810:2814',
119 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
121 'id': 'vpevnf-baremetal',
122 'external-interface':
123 [{'virtual-interface':
124 {'dst_mac': '00:00:00:00:00:04',
125 'vpci': '0000:05:00.0',
126 'local_ip': '152.16.100.19',
127 'type': 'PCI-PASSTHROUGH',
128 'netmask': '255.255.255.0',
129 'dpdk_port_num': '0',
130 'bandwidth': '10 Gbps',
132 'dst_ip': '152.16.100.20',
133 'local_iface_name': 'xe0',
134 'local_mac': '00:00:00:00:00:02'},
135 'vnfd-connection-point-ref': 'xe0',
137 {'virtual-interface':
138 {'dst_mac': '00:00:00:00:00:03',
139 'vpci': '0000:05:00.1',
140 'local_ip': '152.16.40.19',
141 'type': 'PCI-PASSTHROUGH',
143 'netmask': '255.255.255.0',
144 'dpdk_port_num': '1',
145 'bandwidth': '10 Gbps',
146 'dst_ip': '152.16.40.20',
147 'local_iface_name': 'xe1',
148 'local_mac': '00:00:00:00:00:01'},
149 'vnfd-connection-point-ref': 'xe1',
151 'description': 'Vpe approximation using DPDK',
153 {'vdu-id': 'vpevnf-baremetal',
159 {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
160 'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
161 {'type': 'VPORT', 'name': 'xe1'}],
162 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
165 "schema": "isb:traffic_profile:0.1",
167 "description": "Fixed traffic profile to run UDP traffic",
169 "traffic_type": "FixedTraffic",
170 "frame_rate": 100, # pps
174 def test___init__(self):
175 with mock.patch("yardstick.ssh.SSH") as ssh:
176 ssh_mock = mock.Mock(autospec=ssh.SSH)
178 mock.Mock(return_value=(0, "", ""))
179 ssh.from_node.return_value = ssh_mock
180 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
181 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
182 self.assertIsNone(ixload_traffic_gen.data)
184 def test_collect_kpi(self):
185 with mock.patch("yardstick.ssh.SSH") as ssh:
186 ssh_mock = mock.Mock(autospec=ssh.SSH)
188 mock.Mock(return_value=(0, "", ""))
189 ssh.from_node.return_value = ssh_mock
190 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
191 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
192 ixload_traffic_gen.data = {}
193 restult = ixload_traffic_gen.collect_kpi()
194 self.assertEqual({}, restult)
196 def test_listen_traffic(self):
197 with mock.patch("yardstick.ssh.SSH") as ssh:
198 ssh_mock = mock.Mock(autospec=ssh.SSH)
200 mock.Mock(return_value=(0, "", ""))
201 ssh.from_node.return_value = ssh_mock
202 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
203 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
204 self.assertEqual(None, ixload_traffic_gen.listen_traffic({}))
206 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.makedirs")
207 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
208 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
209 def test_instantiate(self, call, shutil, mock_makedirs):
210 with mock.patch("yardstick.ssh.SSH") as ssh:
211 ssh_mock = mock.Mock(autospec=ssh.SSH)
213 mock.Mock(return_value=(0, "", ""))
215 mock.Mock(return_value=(0, "", ""))
216 ssh.from_node.return_value = ssh_mock
217 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
218 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
219 scenario_cfg = {'tc': "nsb_test_case",
220 'ixia_profile': "ixload.cfg"}
221 ixload_traffic_gen.RESULTS_MOUNT = "/tmp/result"
222 shutil.copy = mock.Mock()
223 scenario_cfg.update({'options': {'packetsize': 64, 'traffic_type': 4,
224 'rfc2544': {'allowed_drop_rate': '0.8 - 1'},
225 'vnf__1': {'rules': 'acl_1rule.yaml',
226 'vnf_config': {'lb_config': 'SW',
230 'worker_threads': 1}}
232 self.assertRaises(IOError,
233 ixload_traffic_gen.instantiate(scenario_cfg, {}))
235 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
236 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
237 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open")
238 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min")
239 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max")
240 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len")
241 def test_run_traffic(self, call, shutil, main_open, min, max, len):
242 mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
243 mock_traffic_profile.get_traffic_definition.return_value = "64"
244 mock_traffic_profile.params = self.TRAFFIC_PROFILE
245 with mock.patch("yardstick.ssh.SSH") as ssh:
246 ssh_mock = mock.Mock(autospec=ssh.SSH)
248 mock.Mock(return_value=(0, "", ""))
250 mock.Mock(return_value=(0, "", ""))
251 ssh.from_node.return_value = ssh_mock
252 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
253 vnfd["mgmt-interface"].update({"tg-config": {}})
254 vnfd["mgmt-interface"]["tg-config"].update({"ixchassis":
256 vnfd["mgmt-interface"]["tg-config"].update({"py_bin_path":
258 sut = IxLoadTrafficGen(NAME, vnfd)
259 sut.connection = mock.Mock()
260 sut.connection.run = mock.Mock()
261 sut._traffic_runner = mock.Mock(return_value=0)
262 shutil.copy = mock.Mock()
263 result = sut.run_traffic(mock_traffic_profile)
264 self.assertIsNone(result)
266 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
267 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
268 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open")
269 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min")
270 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max")
271 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len")
272 def test_run_traffic_csv(self, call, shutil, main_open, min, max, len):
273 mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
274 mock_traffic_profile.get_traffic_definition.return_value = "64"
275 mock_traffic_profile.params = self.TRAFFIC_PROFILE
276 with mock.patch("yardstick.ssh.SSH") as ssh:
277 ssh_mock = mock.Mock(autospec=ssh.SSH)
279 mock.Mock(return_value=(0, "", ""))
281 mock.Mock(return_value=(0, "", ""))
282 ssh.from_node.return_value = ssh_mock
283 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
284 vnfd["mgmt-interface"].update({"tg-config": {}})
285 vnfd["mgmt-interface"]["tg-config"].update({"ixchassis":
287 vnfd["mgmt-interface"]["tg-config"].update({"py_bin_path":
289 sut = IxLoadTrafficGen(NAME, vnfd)
290 sut.connection = mock.Mock()
291 sut.connection.run = mock.Mock()
292 sut._traffic_runner = mock.Mock(return_value=0)
293 shutil.copy = mock.Mock()
294 subprocess.call(["touch", "/tmp/1.csv"])
295 sut.rel_bin_path = mock.Mock(return_value="/tmp/*.csv")
296 result = sut.run_traffic(mock_traffic_profile)
297 self.assertIsNone(result)
299 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
300 def test_terminate(self, call):
301 with mock.patch("yardstick.ssh.SSH") as ssh:
302 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
303 ssh_mock = mock.Mock(autospec=ssh.SSH)
305 mock.Mock(return_value=(0, "", ""))
306 ssh.from_node.return_value = ssh_mock
307 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
308 self.assertEqual(None, ixload_traffic_gen.terminate())
310 @mock.patch("yardstick.ssh.SSH")
311 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
312 def test_parse_csv_read(self, mock_call, mock_ssh):
313 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
315 'HTTP Total Throughput (Kbps)': 1,
316 'HTTP Simulated Users': 2,
317 'HTTP Concurrent Connections': '3',
318 'HTTP Connection Rate': 4.3,
319 'HTTP Transaction Rate': True,
321 http_reader = [kpi_data]
323 mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH)
324 mock_ssh_type.execute.return_value = 0, "", ""
325 mock_ssh.from_node.return_value = mock_ssh_type
327 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
328 result = ixload_traffic_gen.resource_helper.result
330 ixload_traffic_gen.resource_helper.parse_csv_read(http_reader)
331 for key_left, key_right in IxLoadResourceHelper.KPI_LIST.items():
332 self.assertEqual(result[key_left][-1], int(kpi_data[key_right]))
334 @mock.patch("yardstick.ssh.SSH")
335 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
336 def test_parse_csv_read_value_error(self, mock_call, mock_ssh):
337 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
339 'HTTP Total Throughput (Kbps)': 1,
340 'HTTP Simulated Users': 2,
341 'HTTP Concurrent Connections': "not a number",
342 'HTTP Connection Rate': 4,
343 'HTTP Transaction Rate': 5,
346 mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH)
347 mock_ssh_type.execute.return_value = 0, "", ""
348 mock_ssh.from_node.return_value = mock_ssh_type
350 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
351 init_value = ixload_traffic_gen.resource_helper.result
353 ixload_traffic_gen.resource_helper.parse_csv_read(http_reader)
354 self.assertDictEqual(ixload_traffic_gen.resource_helper.result, init_value)
356 @mock.patch("yardstick.ssh.SSH")
357 @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
358 def test_parse_csv_read_error(self, mock_call, mock_ssh):
359 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
361 'HTTP Total Throughput (Kbps)': 1,
362 'HTTP Simulated Users': 2,
363 'HTTP Concurrent Connections': 3,
364 'HTTP Transaction Rate': 5,
367 mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH)
368 mock_ssh_type.execute.return_value = 0, "", ""
369 mock_ssh.from_node.return_value = mock_ssh_type
371 ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
373 with self.assertRaises(KeyError):
374 ixload_traffic_gen.resource_helper.parse_csv_read(http_reader)