Merge "Add test case file and document of Tardstick TC056(HA_TC013)"
[yardstick.git] / tests / unit / network_services / vnf_generic / vnf / test_sample_vnf.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2017 Intel Corporation
4 #
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
8 #
9 #      http://www.apache.org/licenses/LICENSE-2.0
10 #
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.
16 #
17
18 # Unittest for yardstick.network_services.vnf_generic.vnf.sample_vnf
19
20 from __future__ import absolute_import
21 import unittest
22 import mock
23 from copy import deepcopy
24
25 from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
26 from yardstick.benchmark.contexts.base import Context
27 from yardstick.network_services.nfvi.resource import ResourceProfile
28 from yardstick.network_services.traffic_profile.base import TrafficProfile
29 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
30 from yardstick.ssh import SSHError
31
32
33 class MockError(BaseException):
34     pass
35
36
37 STL_MOCKS = {
38     'stl': mock.MagicMock(),
39     'stl.trex_stl_lib': mock.MagicMock(),
40     'stl.trex_stl_lib.base64': mock.MagicMock(),
41     'stl.trex_stl_lib.binascii': mock.MagicMock(),
42     'stl.trex_stl_lib.collections': mock.MagicMock(),
43     'stl.trex_stl_lib.copy': mock.MagicMock(),
44     'stl.trex_stl_lib.datetime': mock.MagicMock(),
45     'stl.trex_stl_lib.functools': mock.MagicMock(),
46     'stl.trex_stl_lib.imp': mock.MagicMock(),
47     'stl.trex_stl_lib.inspect': mock.MagicMock(),
48     'stl.trex_stl_lib.json': mock.MagicMock(),
49     'stl.trex_stl_lib.linecache': mock.MagicMock(),
50     'stl.trex_stl_lib.math': mock.MagicMock(),
51     'stl.trex_stl_lib.os': mock.MagicMock(),
52     'stl.trex_stl_lib.platform': mock.MagicMock(),
53     'stl.trex_stl_lib.pprint': mock.MagicMock(),
54     'stl.trex_stl_lib.random': mock.MagicMock(),
55     'stl.trex_stl_lib.re': mock.MagicMock(),
56     'stl.trex_stl_lib.scapy': mock.MagicMock(),
57     'stl.trex_stl_lib.socket': mock.MagicMock(),
58     'stl.trex_stl_lib.string': mock.MagicMock(),
59     'stl.trex_stl_lib.struct': mock.MagicMock(),
60     'stl.trex_stl_lib.sys': mock.MagicMock(),
61     'stl.trex_stl_lib.threading': mock.MagicMock(),
62     'stl.trex_stl_lib.time': mock.MagicMock(),
63     'stl.trex_stl_lib.traceback': mock.MagicMock(),
64     'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
65     'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
66     'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
67     'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
68     'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
69     'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
70     'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
71     'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
72     'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
73     'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
74     'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
75     'stl.trex_stl_lib.types': mock.MagicMock(),
76     'stl.trex_stl_lib.utils': mock.MagicMock(),
77     'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
78     'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
79     'stl.trex_stl_lib.utils.common': mock.MagicMock(),
80     'stl.trex_stl_lib.utils.json': mock.MagicMock(),
81     'stl.trex_stl_lib.utils.os': mock.MagicMock(),
82     'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
83     'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
84     'stl.trex_stl_lib.utils.random': mock.MagicMock(),
85     'stl.trex_stl_lib.utils.re': mock.MagicMock(),
86     'stl.trex_stl_lib.utils.string': mock.MagicMock(),
87     'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
88     'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
89     'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
90     'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
91     'stl.trex_stl_lib.warnings': mock.MagicMock(),
92     'stl.trex_stl_lib.yaml': mock.MagicMock(),
93     'stl.trex_stl_lib.zlib': mock.MagicMock(),
94     'stl.trex_stl_lib.zmq': mock.MagicMock(),
95 }
96
97 STLClient = mock.MagicMock()
98 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
99 stl_patch.start()
100
101 if stl_patch:
102     from yardstick.network_services.vnf_generic.vnf.sample_vnf import VnfSshHelper
103     from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper
104     from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
105     from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper
106     from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
107     from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
108     from yardstick.network_services.vnf_generic.vnf.sample_vnf import SetupEnvHelper
109     from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF
110     from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
111     from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
112
113
114 class TestVnfSshHelper(unittest.TestCase):
115
116     VNFD_0 = {
117         'short-name': 'VpeVnf',
118         'vdu': [
119             {
120                 'routing_table': [
121                     {
122                         'network': '152.16.100.20',
123                         'netmask': '255.255.255.0',
124                         'gateway': '152.16.100.20',
125                         'if': 'xe0'
126                     },
127                     {
128                         'network': '152.16.40.20',
129                         'netmask': '255.255.255.0',
130                         'gateway': '152.16.40.20',
131                         'if': 'xe1'
132                     },
133                 ],
134                 'description': 'VPE approximation using DPDK',
135                 'name': 'vpevnf-baremetal',
136                 'nd_route_tbl': [
137                     {
138                         'network': '0064:ff9b:0:0:0:0:9810:6414',
139                         'netmask': '112',
140                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
141                         'if': 'xe0'
142                     },
143                     {
144                         'network': '0064:ff9b:0:0:0:0:9810:2814',
145                         'netmask': '112',
146                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
147                         'if': 'xe1'
148                     },
149                 ],
150                 'id': 'vpevnf-baremetal',
151                 'external-interface': [
152                     {
153                         'virtual-interface': {
154                             'dst_mac': '00:00:00:00:00:03',
155                             'vpci': '0000:05:00.0',
156                             'local_ip': '152.16.100.19',
157                             'type': 'PCI-PASSTHROUGH',
158                             'netmask': '255.255.255.0',
159                             'dpdk_port_num': '0',
160                             'bandwidth': '10 Gbps',
161                             'dst_ip': '152.16.100.20',
162                             'local_mac': '00:00:00:00:00:01'
163                         },
164                         'vnfd-connection-point-ref': 'xe0',
165                         'name': 'xe0'
166                     },
167                     {
168                         'virtual-interface': {
169                             'dst_mac': '00:00:00:00:00:04',
170                             'vpci': '0000:05:00.1',
171                             'local_ip': '152.16.40.19',
172                             'type': 'PCI-PASSTHROUGH',
173                             'netmask': '255.255.255.0',
174                             'dpdk_port_num': '1',
175                             'bandwidth': '10 Gbps',
176                             'dst_ip': '152.16.40.20',
177                             'local_mac': '00:00:00:00:00:02'
178                         },
179                         'vnfd-connection-point-ref': 'xe1',
180                         'name': 'xe1'
181                     },
182                 ],
183             },
184         ],
185         'description': 'Vpe approximation using DPDK',
186         'mgmt-interface': {
187             'vdu-id': 'vpevnf-baremetal',
188             'host': '1.1.1.1',
189             'password': 'r00t',
190             'user': 'root',
191             'ip': '1.1.1.1'
192         },
193         'benchmark': {
194             'kpi': [
195                 'packets_in',
196                 'packets_fwd',
197                 'packets_dropped',
198             ],
199         },
200         'connection-point': [
201             {
202                 'type': 'VPORT',
203                 'name': 'xe0',
204             },
205             {
206                 'type': 'VPORT',
207                 'name': 'xe1',
208             },
209         ],
210         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
211     }
212
213     VNFD = {
214         'vnfd:vnfd-catalog': {
215             'vnfd': [
216                 VNFD_0,
217             ]
218         }
219     }
220
221     def assertAll(self, iterable, message=None):
222         self.assertTrue(all(iterable), message)
223
224     def test_get_class(self):
225         self.assertIs(VnfSshHelper.get_class(), VnfSshHelper)
226
227     @mock.patch('yardstick.ssh.paramiko')
228     def test_copy(self, _):
229         ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
230         ssh_helper._run = mock.Mock()
231
232         ssh_helper.execute('ls')
233         self.assertTrue(ssh_helper.is_connected)
234         result = ssh_helper.copy()
235         self.assertIsInstance(result, VnfSshHelper)
236         self.assertFalse(result.is_connected)
237         self.assertEqual(result.bin_path, ssh_helper.bin_path)
238         self.assertEqual(result.host, ssh_helper.host)
239         self.assertEqual(result.port, ssh_helper.port)
240         self.assertEqual(result.user, ssh_helper.user)
241         self.assertEqual(result.password, ssh_helper.password)
242         self.assertEqual(result.key_filename, ssh_helper.key_filename)
243
244     @mock.patch('yardstick.ssh.paramiko')
245     def test_upload_config_file(self, mock_paramiko):
246         ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
247
248         self.assertFalse(ssh_helper.is_connected)
249         cfg_file = ssh_helper.upload_config_file('my/prefix', 'my content')
250         self.assertTrue(ssh_helper.is_connected)
251         self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
252         self.assertTrue(cfg_file.startswith('/tmp'))
253
254         cfg_file = ssh_helper.upload_config_file('/my/prefix', 'my content')
255         self.assertTrue(ssh_helper.is_connected)
256         self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
257         self.assertEqual(cfg_file, '/my/prefix')
258
259     def test_join_bin_path(self):
260         ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
261
262         expected_start = 'my'
263         expected_middle_list = ['bin']
264         expected_end = 'path'
265         result = ssh_helper.join_bin_path()
266         self.assertTrue(result.startswith(expected_start))
267         self.assertAll(middle in result for middle in expected_middle_list)
268         self.assertTrue(result.endswith(expected_end))
269
270         expected_middle_list.append(expected_end)
271         expected_end = 'some_file.sh'
272         result = ssh_helper.join_bin_path('some_file.sh')
273         self.assertTrue(result.startswith(expected_start))
274         self.assertAll(middle in result for middle in expected_middle_list)
275         self.assertTrue(result.endswith(expected_end))
276
277         expected_middle_list.append('some_dir')
278         expected_end = 'some_file.sh'
279         result = ssh_helper.join_bin_path('some_dir', 'some_file.sh')
280         self.assertTrue(result.startswith(expected_start))
281         self.assertAll(middle in result for middle in expected_middle_list)
282         self.assertTrue(result.endswith(expected_end))
283
284     @mock.patch('yardstick.ssh.paramiko')
285     @mock.patch('yardstick.ssh.provision_tool')
286     def test_provision_tool(self, mock_provision_tool, mock_paramiko):
287         ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
288
289         self.assertFalse(ssh_helper.is_connected)
290         ssh_helper.provision_tool()
291         self.assertTrue(ssh_helper.is_connected)
292         self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
293         self.assertEqual(mock_provision_tool.call_count, 1)
294
295         ssh_helper.provision_tool(tool_file='my_tool.sh')
296         self.assertTrue(ssh_helper.is_connected)
297         self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
298         self.assertEqual(mock_provision_tool.call_count, 2)
299
300         ssh_helper.provision_tool('tool_path', 'my_tool.sh')
301         self.assertTrue(ssh_helper.is_connected)
302         self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
303         self.assertEqual(mock_provision_tool.call_count, 3)
304
305
306 class TestSetupEnvHelper(unittest.TestCase):
307
308     VNFD_0 = {
309         'short-name': 'VpeVnf',
310         'vdu': [
311             {
312                 'routing_table': [
313                     {
314                         'network': '152.16.100.20',
315                         'netmask': '255.255.255.0',
316                         'gateway': '152.16.100.20',
317                         'if': 'xe0'
318                     },
319                     {
320                         'network': '152.16.40.20',
321                         'netmask': '255.255.255.0',
322                         'gateway': '152.16.40.20',
323                         'if': 'xe1'
324                     },
325                 ],
326                 'description': 'VPE approximation using DPDK',
327                 'name': 'vpevnf-baremetal',
328                 'nd_route_tbl': [
329                     {
330                         'network': '0064:ff9b:0:0:0:0:9810:6414',
331                         'netmask': '112',
332                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
333                         'if': 'xe0'
334                     },
335                     {
336                         'network': '0064:ff9b:0:0:0:0:9810:2814',
337                         'netmask': '112',
338                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
339                         'if': 'xe1'
340                     },
341                 ],
342                 'id': 'vpevnf-baremetal',
343                 'external-interface': [
344                     {
345                         'virtual-interface': {
346                             'dst_mac': '00:00:00:00:00:03',
347                             'vpci': '0000:05:00.0',
348                             'local_ip': '152.16.100.19',
349                             'type': 'PCI-PASSTHROUGH',
350                             'netmask': '255.255.255.0',
351                             'dpdk_port_num': '0',
352                             'bandwidth': '10 Gbps',
353                             'dst_ip': '152.16.100.20',
354                             'local_mac': '00:00:00:00:00:01'
355                         },
356                         'vnfd-connection-point-ref': 'xe0',
357                         'name': 'xe0'
358                     },
359                     {
360                         'virtual-interface': {
361                             'dst_mac': '00:00:00:00:00:04',
362                             'vpci': '0000:05:00.1',
363                             'local_ip': '152.16.40.19',
364                             'type': 'PCI-PASSTHROUGH',
365                             'netmask': '255.255.255.0',
366                             'dpdk_port_num': '1',
367                             'bandwidth': '10 Gbps',
368                             'dst_ip': '152.16.40.20',
369                             'local_mac': '00:00:00:00:00:02'
370                         },
371                         'vnfd-connection-point-ref': 'xe1',
372                         'name': 'xe1'
373                     },
374                 ],
375             },
376         ],
377         'description': 'Vpe approximation using DPDK',
378         'mgmt-interface': {
379             'vdu-id': 'vpevnf-baremetal',
380             'host': '1.1.1.1',
381             'password': 'r00t',
382             'user': 'root',
383             'ip': '1.1.1.1'
384         },
385         'benchmark': {
386             'kpi': [
387                 'packets_in',
388                 'packets_fwd',
389                 'packets_dropped',
390             ],
391         },
392         'connection-point': [
393             {
394                 'type': 'VPORT',
395                 'name': 'xe0',
396             },
397             {
398                 'type': 'VPORT',
399                 'name': 'xe1',
400             },
401         ],
402         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
403     }
404
405     def test_build_config(self):
406         setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
407
408         with self.assertRaises(NotImplementedError):
409             setup_env_helper.build_config()
410
411     def test__get_ports_gateway(self):
412         vnfd_helper = VnfdHelper(self.VNFD_0)
413         setup_env_helper = SetupEnvHelper(vnfd_helper, mock.Mock(), mock.Mock())
414         result = setup_env_helper._get_ports_gateway("xe0")
415         self.assertEqual(result, "152.16.100.20")
416
417         result = setup_env_helper._get_ports_gateway("xe123")
418         self.assertIsNone(result)
419
420     def test_setup_vnf_environment(self):
421         setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
422         self.assertIsNone(setup_env_helper.setup_vnf_environment())
423
424     def test_tear_down(self):
425         setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock())
426
427         with self.assertRaises(NotImplementedError):
428             setup_env_helper.tear_down()
429
430
431 class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
432
433     VNFD_0 = {
434         'short-name': 'VpeVnf',
435         'vdu': [
436             {
437                 'routing_table': [
438                     {
439                         'network': '152.16.100.20',
440                         'netmask': '255.255.255.0',
441                         'gateway': '152.16.100.20',
442                         'if': 'xe0'
443                     },
444                     {
445                         'network': '152.16.40.20',
446                         'netmask': '255.255.255.0',
447                         'gateway': '152.16.40.20',
448                         'if': 'xe1'
449                     },
450                 ],
451                 'description': 'VPE approximation using DPDK',
452                 'name': 'vpevnf-baremetal',
453                 'nd_route_tbl': [
454                     {
455                         'network': '0064:ff9b:0:0:0:0:9810:6414',
456                         'netmask': '112',
457                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
458                         'if': 'xe0'
459                     },
460                     {
461                         'network': '0064:ff9b:0:0:0:0:9810:2814',
462                         'netmask': '112',
463                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
464                         'if': 'xe1'
465                     },
466                 ],
467                 'id': 'vpevnf-baremetal',
468                 'external-interface': [
469                     {
470                         'virtual-interface': {
471                             'dst_mac': '00:00:00:00:00:03',
472                             'vpci': '0000:05:00.0',
473                             'driver': 'i40e',
474                             'local_ip': '152.16.100.19',
475                             'type': 'PCI-PASSTHROUGH',
476                             'netmask': '255.255.255.0',
477                             'dpdk_port_num': '0',
478                             'bandwidth': '10 Gbps',
479                             'dst_ip': '152.16.100.20',
480                             'local_mac': '00:00:00:00:00:01'
481                         },
482                         'vnfd-connection-point-ref': 'xe0',
483                         'name': 'xe0'
484                     },
485                     {
486                         'virtual-interface': {
487                             'dst_mac': '00:00:00:00:00:04',
488                             'vpci': '0000:05:00.1',
489                             'driver': 'ixgbe',
490                             'local_ip': '152.16.40.19',
491                             'type': 'PCI-PASSTHROUGH',
492                             'netmask': '255.255.255.0',
493                             'dpdk_port_num': '1',
494                             'bandwidth': '10 Gbps',
495                             'dst_ip': '152.16.40.20',
496                             'local_mac': '00:00:00:00:00:02'
497                         },
498                         'vnfd-connection-point-ref': 'xe1',
499                         'name': 'xe1'
500                     },
501                 ],
502             },
503         ],
504         'description': 'Vpe approximation using DPDK',
505         'mgmt-interface': {
506             'vdu-id': 'vpevnf-baremetal',
507             'host': '1.1.1.1',
508             'password': 'r00t',
509             'user': 'root',
510             'ip': '1.1.1.1'
511         },
512         'benchmark': {
513             'kpi': [
514                 'packets_in',
515                 'packets_fwd',
516                 'packets_dropped',
517             ],
518         },
519         'connection-point': [
520             {
521                 'type': 'VPORT',
522                 'name': 'xe0',
523             },
524             {
525                 'type': 'VPORT',
526                 'name': 'xe1',
527             },
528         ],
529         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
530     }
531
532     VNFD = {
533         'vnfd:vnfd-catalog': {
534             'vnfd': [
535                 VNFD_0,
536             ]
537         }
538     }
539
540     def test__update_packet_type(self):
541         ip_pipeline_cfg = 'pkt_type = ipv4'
542         pkt_type = {'pkt_type': '1'}
543
544         expected = "pkt_type = 1"
545         result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
546         self.assertEqual(result, expected)
547
548     def test__update_packet_type_no_op(self):
549         ip_pipeline_cfg = 'pkt_type = ipv6'
550         pkt_type = {'pkt_type': '1'}
551
552         expected = "pkt_type = ipv6"
553         result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
554         self.assertEqual(result, expected)
555
556     def test__update_packet_type_multi_op(self):
557         ip_pipeline_cfg = 'pkt_type = ipv4\npkt_type = 1\npkt_type = ipv4'
558         pkt_type = {'pkt_type': '1'}
559
560         expected = 'pkt_type = 1\npkt_type = 1\npkt_type = 1'
561         result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type)
562         self.assertEqual(result, expected)
563
564     def test__update_traffic_type(self):
565         ip_pipeline_cfg = 'pkt_type = ipv4'
566
567         traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 4}
568         expected = "pkt_type = ipv4"
569         result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
570         self.assertEqual(result, expected)
571
572     def test__update_traffic_type_ipv6(self):
573         ip_pipeline_cfg = 'pkt_type = ipv4'
574
575         traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 6}
576         expected = "pkt_type = ipv6"
577         result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
578         self.assertEqual(result, expected)
579
580     def test__update_traffic_type_not_app_name(self):
581         ip_pipeline_cfg = 'traffic_type = 4'
582
583         vnf_type = ''.join(["Not", DpdkVnfSetupEnvHelper.APP_NAME])
584         traffic_options = {"vnf_type": vnf_type, 'traffic_type': 8}
585         expected = "traffic_type = 8"
586         result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
587         self.assertEqual(result, expected)
588
589     def test__setup_hugepages(self):
590         vnfd_helper = VnfdHelper(self.VNFD_0)
591         ssh_helper = mock.Mock()
592         ssh_helper.execute.return_value = 0, '', ''
593         scenario_helper = mock.Mock()
594         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
595
596         result = dpdk_setup_helper._setup_hugepages()
597         expect_start_list = ['awk', 'awk', 'echo']
598         expect_in_list = ['meminfo', 'nr_hugepages', '16']
599         call_args_iter = (args[0][0] for args in ssh_helper.execute.call_args_list)
600         self.assertIsNone(result)
601         self.assertEqual(ssh_helper.execute.call_count, 3)
602         for expect_start, expect_in, arg0 in zip(expect_start_list, expect_in_list, call_args_iter):
603             self.assertTrue(arg0.startswith(expect_start))
604             self.assertIn(expect_in, arg0)
605
606     def test__setup_hugepages_2_mb(self):
607         vnfd_helper = VnfdHelper(self.VNFD_0)
608         ssh_helper = mock.Mock()
609         ssh_helper.execute.return_value = 0, '2048kB  ', ''
610         scenario_helper = mock.Mock()
611         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
612
613         result = dpdk_setup_helper._setup_hugepages()
614         expect_start_list = ['awk', 'awk', 'echo']
615         expect_in_list = ['meminfo', 'nr_hugepages', '16384']
616         call_args_iter = (args[0][0] for args in ssh_helper.execute.call_args_list)
617         self.assertIsNone(result)
618         self.assertEqual(ssh_helper.execute.call_count, 3)
619         for expect_start, expect_in, arg0 in zip(expect_start_list, expect_in_list, call_args_iter):
620             self.assertTrue(arg0.startswith(expect_start))
621             self.assertIn(expect_in, arg0)
622
623     def test__get_dpdk_port_num(self):
624         vnfd_helper = VnfdHelper(self.VNFD_0)
625         ssh_helper = mock.Mock()
626         scenario_helper = mock.Mock()
627         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
628         expected = '0'
629         result = dpdk_setup_helper._get_dpdk_port_num('xe0')
630         self.assertEqual(result, expected)
631
632     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open')
633     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.find_relative_file')
634     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
635     def test_build_config(self, mock_multi_port_config_class, mock_find, _):
636         mock_multi_port_config = mock_multi_port_config_class()
637         vnfd_helper = VnfdHelper(self.VNFD_0)
638         ssh_helper = mock.Mock()
639         scenario_helper = mock.Mock()
640         scenario_helper.vnf_cfg = {}
641         scenario_helper.all_options = {}
642         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
643         dpdk_setup_helper.all_ports = []
644
645         dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
646         result = dpdk_setup_helper.build_config()
647         self.assertEqual(result, expected)
648         self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
649         self.assertGreaterEqual(mock_find.call_count, 1)
650         self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
651         self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
652
653     def test__build_pipeline_kwargs(self):
654         vnfd_helper = VnfdHelper(self.VNFD_0)
655         ssh_helper = mock.Mock()
656         ssh_helper.provision_tool.return_value = 'tool_path'
657         scenario_helper = mock.Mock()
658         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
659         dpdk_setup_helper.CFG_CONFIG = 'config'
660         dpdk_setup_helper.CFG_SCRIPT = 'script'
661         dpdk_setup_helper.all_ports = [3, 4, 5]
662         dpdk_setup_helper.pipeline_kwargs = {}
663
664         expected = {
665             'cfg_file': 'config',
666             'script': 'script',
667             'ports_len_hex': '0xf',
668             'tool_path': 'tool_path',
669         }
670         dpdk_setup_helper._build_pipeline_kwargs()
671         self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected)
672
673     def test__get_app_cpu(self):
674         vnfd_helper = VnfdHelper(self.VNFD_0)
675         ssh_helper = mock.Mock()
676         ssh_helper.provision_tool.return_value = 'tool_path'
677         scenario_helper = mock.Mock()
678         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
679
680         dpdk_setup_helper.CORES = expected = [5, 4, 3]
681         result = dpdk_setup_helper._get_app_cpu()
682         self.assertEqual(result, expected)
683
684     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores')
685     def test__get_app_cpu_no_cores_sw(self, mock_cpu_sys_cores_class):
686         mock_cpu_sys_cores = mock_cpu_sys_cores_class()
687         mock_cpu_sys_cores.get_core_socket.return_value = {
688             'socket': [2, 4, 8, 10, 12],
689         }
690         vnfd_helper = VnfdHelper(self.VNFD_0)
691         ssh_helper = mock.Mock()
692         ssh_helper.provision_tool.return_value = 'tool_path'
693         scenario_helper = mock.Mock()
694         scenario_helper.vnf_cfg = {
695             'worker_threads': '2',
696         }
697         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
698         dpdk_setup_helper.CORES = []
699         dpdk_setup_helper.SW_DEFAULT_CORE = 1
700         dpdk_setup_helper.HW_DEFAULT_CORE = 2
701         dpdk_setup_helper.socket = 'socket'
702
703         expected = [2, 4, 8]
704         result = dpdk_setup_helper._get_app_cpu()
705         self.assertEqual(result, expected)
706
707     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores')
708     def test__get_app_cpu_no_cores_hw(self, mock_cpu_sys_cores_class):
709         mock_cpu_sys_cores = mock_cpu_sys_cores_class()
710         mock_cpu_sys_cores.get_core_socket.return_value = {
711             'socket': [2, 4, 8, 10, 12],
712         }
713         vnfd_helper = VnfdHelper(self.VNFD_0)
714         ssh_helper = mock.Mock()
715         scenario_helper = mock.Mock()
716         scenario_helper.vnf_cfg = {
717             'worker_threads': '2',
718             'lb_config': 'HW',
719         }
720         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
721         dpdk_setup_helper.CORES = []
722         dpdk_setup_helper.SW_DEFAULT_CORE = 1
723         dpdk_setup_helper.HW_DEFAULT_CORE = 2
724         dpdk_setup_helper.socket = 'socket'
725
726         expected = [2, 4, 8, 10]
727         result = dpdk_setup_helper._get_app_cpu()
728         self.assertEqual(result, expected)
729
730     def test__get_cpu_sibling_list(self):
731         vnfd_helper = VnfdHelper(self.VNFD_0)
732         ssh_helper = mock.Mock()
733         ssh_helper.execute.side_effect = iter([(0, '5', ''), (0, '3,4', ''), (0, '10', '')])
734         scenario_helper = mock.Mock()
735         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
736         dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[])
737
738         expected = ['5', '3', '4', '10']
739         result = dpdk_setup_helper._get_cpu_sibling_list([1, 3, 7])
740         self.assertEqual(result, expected)
741
742     def test__get_cpu_sibling_list_no_core_arg(self):
743         vnfd_helper = VnfdHelper(self.VNFD_0)
744         ssh_helper = mock.Mock()
745         ssh_helper.execute.side_effect = iter([(0, '5', ''), (0, '3,4', ''), (0, '10', '')])
746         scenario_helper = mock.Mock()
747         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
748         dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[1, 7])
749
750         expected = ['5', '3', '4']
751         result = dpdk_setup_helper._get_cpu_sibling_list()
752         self.assertEqual(result, expected)
753
754     def test__get_cpu_sibling_list_ssh_failure(self):
755         vnfd_helper = VnfdHelper(self.VNFD_0)
756         ssh_helper = mock.Mock()
757         ssh_helper.execute.side_effect = iter([(0, '5', ''), SSHError, (0, '10', '')])
758         scenario_helper = mock.Mock()
759         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
760         dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[])
761
762         expected = []
763         result = dpdk_setup_helper._get_cpu_sibling_list([1, 3, 7])
764         self.assertEqual(result, expected)
765
766     def test__validate_cpu_cfg(self):
767         vnfd_helper = VnfdHelper(self.VNFD_0)
768         ssh_helper = mock.Mock()
769         ssh_helper.execute.side_effect = iter([(0, '5', ''), (0, '3,4', ''), (0, '10', '')])
770         scenario_helper = mock.Mock()
771         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
772         dpdk_setup_helper._get_app_cpu = mock.Mock(return_value=[1, 3, 7])
773
774         expected = ['5', '3', '4', '10']
775         result = dpdk_setup_helper._validate_cpu_cfg()
776         self.assertEqual(result, expected)
777
778     def test__find_used_drivers(self):
779         vnfd_helper = VnfdHelper(self.VNFD_0)
780         ssh_helper = mock.Mock()
781         stdout = '''
782 00:01.2 foo drv=name1
783 00:01.4 drv foo=name2
784 00:02.2 drv=name3
785 00:02.3 drv=name4
786 '''
787         ssh_helper.execute.return_value = 0, stdout, ''
788         scenario_helper = mock.Mock()
789         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
790         dpdk_setup_helper.used_drivers = None
791         dpdk_setup_helper._dpdk_nic_bind = ''
792         dpdk_setup_helper.bound_pci = [
793             'pci 00:01.2',
794             'pci 00:02.3',
795         ]
796
797         expected = {
798             '00:01.2': (0, 'name1'),
799             '00:02.3': (2, 'name4'),
800         }
801         dpdk_setup_helper._find_used_drivers()
802         self.assertEqual(dpdk_setup_helper.used_drivers, expected)
803
804     def test_dpdk_nic_bind(self):
805         vnfd_helper = VnfdHelper(self.VNFD_0)
806         ssh_helper = mock.Mock()
807         ssh_helper.provision_tool.return_value = nic_bind = object()
808         scenario_helper = mock.Mock()
809         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
810
811         self.assertIsNone(dpdk_setup_helper._dpdk_nic_bind)
812         self.assertIs(dpdk_setup_helper.dpdk_nic_bind, nic_bind)
813         self.assertIs(dpdk_setup_helper.dpdk_nic_bind, nic_bind)
814         self.assertEqual(ssh_helper.provision_tool.call_count, 1)
815
816         # ensure provision tool is not called a second time
817         self.assertIs(dpdk_setup_helper.dpdk_nic_bind, nic_bind)
818         self.assertEqual(ssh_helper.provision_tool.call_count, 1)
819
820     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
821     @mock.patch('yardstick.ssh.SSH')
822     def test_setup_vnf_environment(self, _, mock_time):
823         cores = ['3', '4']
824
825         vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
826         ssh_helper = mock.Mock()
827         ssh_helper.execute.return_value = 1, 'bad output', 'error output'
828         ssh_helper.join_bin_path.return_value = 'joined_path'
829         ssh_helper.provision_tool.return_value = 'provision string'
830         scenario_helper = mock.Mock()
831         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
832         dpdk_setup_helper._setup_hugepages = mock.Mock()
833         dpdk_setup_helper._validate_cpu_cfg = mock.Mock(return_value=cores)
834         dpdk_setup_helper._find_used_drivers = mock.Mock()
835         dpdk_setup_helper.used_drivers = {
836             '0000:05:00.0': (1, ''),
837             '0000:05:01.0': (3, ''),
838         }
839
840         result = dpdk_setup_helper.setup_vnf_environment()
841         self.assertIsInstance(result, ResourceProfile)
842         self.assertEqual(result.cores, cores)
843         self.assertEqual(vnfd_helper.interfaces[0]['dpdk_port_num'], 1)
844         self.assertNotIn('dpdk_port_num', vnfd_helper.interfaces[1])
845
846     def test__setup_dpdk_early_success(self):
847         vnfd_helper = VnfdHelper(self.VNFD_0)
848         ssh_helper = mock.Mock()
849         ssh_helper.execute.return_value = 0, 'output', ''
850         ssh_helper.join_bin_path.return_value = 'joined_path'
851         ssh_helper.provision_tool.return_value = 'provision string'
852         scenario_helper = mock.Mock()
853         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
854         dpdk_setup_helper._setup_hugepages = mock.Mock()
855
856         self.assertIsNone(dpdk_setup_helper._setup_dpdk())
857         self.assertEqual(dpdk_setup_helper.ssh_helper.execute.call_count, 2)
858
859     @mock.patch('yardstick.ssh.SSH')
860     def test__setup_dpdk_short(self, _):
861         def execute_side(cmd, *args, **kwargs):
862             if 'joined_path' in cmd:
863                 return 0, 'output', ''
864             return 1, 'bad output', 'error output'
865
866         vnfd_helper = VnfdHelper(self.VNFD_0)
867         ssh_helper = mock.Mock()
868         ssh_helper.execute.side_effect = execute_side
869         ssh_helper.join_bin_path.return_value = 'joined_path'
870         ssh_helper.provision_tool.return_value = 'provision string'
871         scenario_helper = mock.Mock()
872         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
873         dpdk_setup_helper._setup_hugepages = mock.Mock()
874
875         self.assertIsNone(dpdk_setup_helper._setup_dpdk())
876         self.assertEqual(dpdk_setup_helper.ssh_helper.execute.call_count, 3)
877
878     @mock.patch('yardstick.ssh.SSH')
879     def test__setup_resources(self, _):
880         vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
881         ssh_helper = mock.Mock()
882         scenario_helper = mock.Mock()
883         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
884         dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
885
886         result = dpdk_setup_helper._setup_resources()
887         self.assertIsInstance(result, ResourceProfile)
888         self.assertEqual(dpdk_setup_helper.socket, 0)
889
890     @mock.patch('yardstick.ssh.SSH')
891     def test__setup_resources_socket_1(self, _):
892         vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
893         vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0'
894         vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0'
895         ssh_helper = mock.Mock()
896         scenario_helper = mock.Mock()
897         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
898         dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
899
900         result = dpdk_setup_helper._setup_resources()
901         self.assertIsInstance(result, ResourceProfile)
902         self.assertEqual(dpdk_setup_helper.socket, 1)
903
904     def test__bind_dpdk_unforced(self):
905         vnfd_helper = VnfdHelper(self.VNFD_0)
906         ssh_helper = mock.Mock()
907         scenario_helper = mock.Mock()
908         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
909
910         dpdk_setup_helper._bind_dpdk('x', 'y', force=False)
911         self.assertNotIn('--force', ssh_helper.execute.call_args_list[0][0][0])
912
913     def test__detect_and_bind_dpdk_short(self):
914         vnfd_helper = VnfdHelper(self.VNFD_0)
915         ssh_helper = mock.Mock()
916         ssh_helper.execute.return_value = 0, 'output', ''
917         scenario_helper = mock.Mock()
918         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
919
920         self.assertIsNone(dpdk_setup_helper._detect_and_bind_dpdk('a', 'b'))
921         self.assertEqual(ssh_helper.execute.call_count, 1)
922
923     def test__detect_and_bind_dpdk_fail_to_bind(self):
924         vnfd_helper = VnfdHelper(self.VNFD_0)
925         ssh_helper = mock.Mock()
926         ssh_helper.execute.return_value = 1, 'bad output', 'error output'
927         scenario_helper = mock.Mock()
928         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
929         dpdk_setup_helper._bind_dpdk = mock.Mock()
930
931         self.assertIsNone(dpdk_setup_helper._detect_and_bind_dpdk('a', 'b'))
932         self.assertEqual(ssh_helper.execute.call_count, 2)
933
934     def test__detect_and_bind_dpdk(self):
935         vnfd_helper = VnfdHelper(self.VNFD_0)
936         ssh_helper = mock.Mock()
937         ssh_helper.execute.side_effect = iter([
938             (1, 'bad output', 'error output'),
939             (0, 'output', ''),
940         ])
941         scenario_helper = mock.Mock()
942         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
943         dpdk_setup_helper._bind_dpdk = mock.Mock()
944
945         self.assertEqual(dpdk_setup_helper._detect_and_bind_dpdk('a', 'b'), 'output')
946         self.assertEqual(ssh_helper.execute.call_count, 2)
947
948     def test__bind_kernel_devices(self):
949         bind_iter = iter([
950             None,
951             'output',
952         ])
953
954         vnfd_helper = VnfdHelper(self.VNFD_0)
955         ssh_helper = mock.Mock()
956         scenario_helper = mock.Mock()
957         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
958         dpdk_setup_helper._detect_and_bind_dpdk = mock.Mock(side_effect=bind_iter)
959
960         self.assertIsNone(dpdk_setup_helper._bind_kernel_devices())
961
962     def test_tear_down(self):
963         vnfd_helper = VnfdHelper(self.VNFD_0)
964         ssh_helper = mock.Mock()
965         scenario_helper = mock.Mock()
966         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
967         dpdk_setup_helper._dpdk_nic_bind = 'a'
968         dpdk_setup_helper.used_drivers = {
969             '0000:05:00.0': (1, 'd1'),
970             '0000:05:01.0': (3, 'd3'),
971         }
972
973         self.assertIsNone(dpdk_setup_helper.tear_down())
974
975
976 class TestResourceHelper(unittest.TestCase):
977
978     def test_setup(self):
979         resource = object()
980         vnfd_helper = VnfdHelper({})
981         ssh_helper = mock.Mock()
982         scenario_helper = mock.Mock()
983         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
984         dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
985         resource_helper = ResourceHelper(dpdk_setup_helper)
986
987         self.assertIsNone(resource_helper.setup())
988         self.assertIs(resource_helper.resource, resource)
989
990     def test_generate_cfg(self):
991         vnfd_helper = VnfdHelper({})
992         ssh_helper = mock.Mock()
993         scenario_helper = mock.Mock()
994         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
995         resource_helper = ResourceHelper(dpdk_setup_helper)
996
997         self.assertIsNone(resource_helper.generate_cfg())
998
999     def test_stop_collect(self):
1000         vnfd_helper = VnfdHelper({})
1001         ssh_helper = mock.Mock()
1002         scenario_helper = mock.Mock()
1003         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1004         resource_helper = ResourceHelper(dpdk_setup_helper)
1005         resource_helper.resource = mock.Mock()
1006
1007         self.assertIsNone(resource_helper.stop_collect())
1008
1009     def test_stop_collect_none(self):
1010         vnfd_helper = VnfdHelper({})
1011         ssh_helper = mock.Mock()
1012         scenario_helper = mock.Mock()
1013         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1014         resource_helper = ResourceHelper(dpdk_setup_helper)
1015         resource_helper.resource = None
1016
1017         self.assertIsNone(resource_helper.stop_collect())
1018
1019 class TestClientResourceHelper(unittest.TestCase):
1020
1021     VNFD_0 = {
1022         'short-name': 'VpeVnf',
1023         'vdu': [
1024             {
1025                 'routing_table': [
1026                     {
1027                         'network': '152.16.100.20',
1028                         'netmask': '255.255.255.0',
1029                         'gateway': '152.16.100.20',
1030                         'if': 'xe0'
1031                     },
1032                     {
1033                         'network': '152.16.40.20',
1034                         'netmask': '255.255.255.0',
1035                         'gateway': '152.16.40.20',
1036                         'if': 'xe1'
1037                     },
1038                 ],
1039                 'description': 'VPE approximation using DPDK',
1040                 'name': 'vpevnf-baremetal',
1041                 'nd_route_tbl': [
1042                     {
1043                         'network': '0064:ff9b:0:0:0:0:9810:6414',
1044                         'netmask': '112',
1045                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1046                         'if': 'xe0'
1047                     },
1048                     {
1049                         'network': '0064:ff9b:0:0:0:0:9810:2814',
1050                         'netmask': '112',
1051                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1052                         'if': 'xe1'
1053                     },
1054                 ],
1055                 'id': 'vpevnf-baremetal',
1056                 'external-interface': [
1057                     {
1058                         'virtual-interface': {
1059                             'dst_mac': '00:00:00:00:00:03',
1060                             'vpci': '0000:05:00.0',
1061                             'driver': 'i40e',
1062                             'local_ip': '152.16.100.19',
1063                             'type': 'PCI-PASSTHROUGH',
1064                             'netmask': '255.255.255.0',
1065                             'dpdk_port_num': '0',
1066                             'bandwidth': '10 Gbps',
1067                             'dst_ip': '152.16.100.20',
1068                             'local_mac': '00:00:00:00:00:01'
1069                         },
1070                         'vnfd-connection-point-ref': 'xe0',
1071                         'name': 'xe0'
1072                     },
1073                     {
1074                         'virtual-interface': {
1075                             'dst_mac': '00:00:00:00:00:04',
1076                             'vpci': '0000:05:00.1',
1077                             'driver': 'ixgbe',
1078                             'local_ip': '152.16.40.19',
1079                             'type': 'PCI-PASSTHROUGH',
1080                             'netmask': '255.255.255.0',
1081                             'dpdk_port_num': '1',
1082                             'bandwidth': '10 Gbps',
1083                             'dst_ip': '152.16.40.20',
1084                             'local_mac': '00:00:00:00:00:02'
1085                         },
1086                         'vnfd-connection-point-ref': 'xe1',
1087                         'name': 'xe1'
1088                     },
1089                     {
1090                         'virtual-interface': {
1091                             'dst_mac': '00:00:00:00:00:13',
1092                             'vpci': '0000:05:00.2',
1093                             'driver': 'ixgbe',
1094                             'local_ip': '152.16.40.19',
1095                             'type': 'PCI-PASSTHROUGH',
1096                             'netmask': '255.255.255.0',
1097                             'dpdk_port_num': '1',
1098                             'bandwidth': '10 Gbps',
1099                             'dst_ip': '152.16.40.30',
1100                             'local_mac': '00:00:00:00:00:11'
1101                         },
1102                         'vnfd-connection-point-ref': 'xe2',
1103                         'name': 'xe2'
1104                     },
1105                 ],
1106             },
1107         ],
1108         'description': 'Vpe approximation using DPDK',
1109         'mgmt-interface': {
1110             'vdu-id': 'vpevnf-baremetal',
1111             'host': '1.1.1.1',
1112             'password': 'r00t',
1113             'user': 'root',
1114             'ip': '1.1.1.1'
1115         },
1116         'benchmark': {
1117             'kpi': [
1118                 'packets_in',
1119                 'packets_fwd',
1120                 'packets_dropped',
1121             ],
1122         },
1123         'connection-point': [
1124             {
1125                 'type': 'VPORT',
1126                 'name': 'xe0',
1127             },
1128             {
1129                 'type': 'VPORT',
1130                 'name': 'xe1',
1131             },
1132         ],
1133         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1134     }
1135
1136     VNFD = {
1137         'vnfd:vnfd-catalog': {
1138             'vnfd': [
1139                 VNFD_0,
1140             ],
1141         },
1142     }
1143
1144     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1145     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1146                 new_callable=lambda: MockError)
1147     def test_get_stats_not_connected(self, mock_state_error, mock_logger):
1148         vnfd_helper = VnfdHelper({})
1149         ssh_helper = mock.Mock()
1150         scenario_helper = mock.Mock()
1151         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1152         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1153         client_resource_helper.client = mock.MagicMock()
1154         client_resource_helper.client.get_stats.side_effect = mock_state_error
1155
1156         self.assertEqual(client_resource_helper.get_stats(), {})
1157         self.assertEqual(client_resource_helper.client.get_stats.call_count, 1)
1158
1159     def test_generate_samples(self):
1160         vnfd_helper = VnfdHelper(self.VNFD_0)
1161         ssh_helper = mock.Mock()
1162         scenario_helper = mock.Mock()
1163         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1164         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1165         client_resource_helper.client = mock.MagicMock()
1166         client_resource_helper._vpci_ascending = [
1167             '0000:05:00.0',
1168             '0000:05:00.1',
1169             '0000:05:00.2',
1170         ]
1171         client_resource_helper.client.get_stats.return_value = {
1172             0: {
1173                 'rx_pps': 5.5,
1174                 'tx_pps': 4.9,
1175                 'rx_bps': 234.78,
1176                 'tx_bps': 243.11,
1177                 'ipackets': 34251,
1178                 'opackets': 52342,
1179             },
1180             1: {
1181                 'tx_pps': 5.9,
1182                 'rx_bps': 434.78,
1183                 'opackets': 48791,
1184             },
1185         }
1186
1187         expected = {
1188             'xe0': {
1189                 "rx_throughput_fps": 5.5,
1190                 "tx_throughput_fps": 4.9,
1191                 "rx_throughput_mbps": 234.78,
1192                 "tx_throughput_mbps": 243.11,
1193                 "in_packets": 34251,
1194                 "out_packets": 52342,
1195             },
1196             'xe1': {
1197                 "rx_throughput_fps": 0.0,
1198                 "tx_throughput_fps": 5.9,
1199                 "rx_throughput_mbps": 434.78,
1200                 "tx_throughput_mbps": 0.0,
1201                 "in_packets": 0,
1202                 "out_packets": 48791,
1203             },
1204             'xe2': {
1205                 "rx_throughput_fps": 0.0,
1206                 "tx_throughput_fps": 0.0,
1207                 "rx_throughput_mbps": 0.0,
1208                 "tx_throughput_mbps": 0.0,
1209                 "in_packets": 0,
1210                 "out_packets": 0,
1211             },
1212         }
1213         result = client_resource_helper.generate_samples()
1214         self.assertDictEqual(result, expected)
1215
1216     def test_generate_samples_with_key(self):
1217         vnfd_helper = VnfdHelper(self.VNFD_0)
1218         ssh_helper = mock.Mock()
1219         scenario_helper = mock.Mock()
1220         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1221         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1222         client_resource_helper.client = mock.MagicMock()
1223         client_resource_helper._vpci_ascending = [
1224             '0000:05:00.0',
1225             '0000:05:00.1',
1226         ]
1227         client_resource_helper.client.get_stats.return_value = {
1228             'key_name': 'key_value',
1229             0: {
1230                 'rx_pps': 5.5,
1231                 'tx_pps': 4.9,
1232                 'rx_bps': 234.78,
1233                 'tx_bps': 243.11,
1234                 'ipackets': 34251,
1235                 'opackets': 52342,
1236             },
1237             1: {
1238                 'tx_pps': 5.9,
1239                 'rx_bps': 434.78,
1240                 'opackets': 48791,
1241             },
1242         }
1243
1244         expected = {
1245             'xe0': {
1246                 'key_name': 'key_value',
1247                 "rx_throughput_fps": 5.5,
1248                 "tx_throughput_fps": 4.9,
1249                 "rx_throughput_mbps": 234.78,
1250                 "tx_throughput_mbps": 243.11,
1251                 "in_packets": 34251,
1252                 "out_packets": 52342,
1253             },
1254             'xe1': {
1255                 'key_name': 'key_value',
1256                 "rx_throughput_fps": 0.0,
1257                 "tx_throughput_fps": 5.9,
1258                 "rx_throughput_mbps": 434.78,
1259                 "tx_throughput_mbps": 0.0,
1260                 "in_packets": 0,
1261                 "out_packets": 48791,
1262             },
1263         }
1264         result = client_resource_helper.generate_samples('key_name')
1265         self.assertDictEqual(result, expected)
1266
1267     def test_generate_samples_with_key_and_default(self):
1268         vnfd_helper = VnfdHelper(self.VNFD_0)
1269         ssh_helper = mock.Mock()
1270         scenario_helper = mock.Mock()
1271         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1272         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1273         client_resource_helper.client = mock.MagicMock()
1274         client_resource_helper._vpci_ascending = [
1275             '0000:05:00.0',
1276             '0000:05:00.1',
1277         ]
1278         client_resource_helper.client.get_stats.return_value = {
1279             0: {
1280                 'rx_pps': 5.5,
1281                 'tx_pps': 4.9,
1282                 'rx_bps': 234.78,
1283                 'tx_bps': 243.11,
1284                 'ipackets': 34251,
1285                 'opackets': 52342,
1286             },
1287             1: {
1288                 'tx_pps': 5.9,
1289                 'rx_bps': 434.78,
1290                 'opackets': 48791,
1291             },
1292         }
1293
1294         expected = {
1295             'xe0': {
1296                 'key_name': 'default',
1297                 "rx_throughput_fps": 5.5,
1298                 "tx_throughput_fps": 4.9,
1299                 "rx_throughput_mbps": 234.78,
1300                 "tx_throughput_mbps": 243.11,
1301                 "in_packets": 34251,
1302                 "out_packets": 52342,
1303             },
1304             'xe1': {
1305                 'key_name': 'default',
1306                 "rx_throughput_fps": 0.0,
1307                 "tx_throughput_fps": 5.9,
1308                 "rx_throughput_mbps": 434.78,
1309                 "tx_throughput_mbps": 0.0,
1310                 "in_packets": 0,
1311                 "out_packets": 48791,
1312             },
1313         }
1314         result = client_resource_helper.generate_samples('key_name', 'default')
1315         self.assertDictEqual(result, expected)
1316
1317     def test_clear_stats(self):
1318         vnfd_helper = VnfdHelper({})
1319         ssh_helper = mock.Mock()
1320         scenario_helper = mock.Mock()
1321         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1322         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1323         client_resource_helper.client = mock.Mock()
1324
1325         self.assertIsNone(client_resource_helper.clear_stats())
1326         self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1327
1328     def test_clear_stats_of_ports(self):
1329         vnfd_helper = VnfdHelper({})
1330         ssh_helper = mock.Mock()
1331         scenario_helper = mock.Mock()
1332         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1333         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1334         client_resource_helper.client = mock.Mock()
1335
1336         self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
1337         self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1338
1339     def test_start(self):
1340         vnfd_helper = VnfdHelper({})
1341         ssh_helper = mock.Mock()
1342         scenario_helper = mock.Mock()
1343         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1344         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1345         client_resource_helper.client = mock.Mock()
1346
1347         self.assertIsNone(client_resource_helper.start())
1348         self.assertEqual(client_resource_helper.client.start.call_count, 1)
1349
1350     def test_start_ports(self):
1351         vnfd_helper = VnfdHelper({})
1352         ssh_helper = mock.Mock()
1353         scenario_helper = mock.Mock()
1354         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1355         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1356         client_resource_helper.client = mock.Mock()
1357
1358         self.assertIsNone(client_resource_helper.start([3, 4]))
1359         self.assertEqual(client_resource_helper.client.start.call_count, 1)
1360
1361     def test_collect_kpi_with_queue(self):
1362         vnfd_helper = VnfdHelper({})
1363         ssh_helper = mock.Mock()
1364         scenario_helper = mock.Mock()
1365         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1366         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1367         client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1368         client_resource_helper._queue = mock.Mock()
1369         client_resource_helper._queue.empty.return_value = False
1370         client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1371
1372         expected = {
1373             'existing': 43,
1374             'incoming': 34,
1375             'replaceable': 99,
1376         }
1377         result = client_resource_helper.collect_kpi()
1378         self.assertDictEqual(result, expected)
1379
1380     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1381     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1382     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1383                 new_callable=lambda: MockError)
1384     def test__connect_with_failures(self, mock_error, mock_logger, mock_time):
1385         vnfd_helper = VnfdHelper({})
1386         ssh_helper = mock.Mock()
1387         scenario_helper = mock.Mock()
1388         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1389         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1390         client = mock.MagicMock()
1391         client.connect.side_effect = mock_error
1392
1393         self.assertIs(client_resource_helper._connect(client), client)
1394
1395
1396 class TestRfc2544ResourceHelper(unittest.TestCase):
1397
1398     RFC2544_CFG_1 = {
1399         'latency': True,
1400         'correlated_traffic': True,
1401         'allowed_drop_rate': '0.1 - 0.15',
1402     }
1403
1404     RFC2544_CFG_2 = {
1405         'allowed_drop_rate': '  0.25    -   0.05  ',
1406     }
1407
1408     RFC2544_CFG_3 = {
1409         'allowed_drop_rate': '0.2',
1410     }
1411
1412     RFC2544_CFG_4 = {
1413         'latency': True,
1414     }
1415
1416     SCENARIO_CFG_1 = {
1417         'options': {
1418             'rfc2544': RFC2544_CFG_1,
1419         }
1420     }
1421
1422     SCENARIO_CFG_2 = {
1423         'options': {
1424             'rfc2544': RFC2544_CFG_2,
1425         }
1426     }
1427
1428     SCENARIO_CFG_3 = {
1429         'options': {
1430             'rfc2544': RFC2544_CFG_3,
1431         }
1432     }
1433
1434     SCENARIO_CFG_4 = {
1435         'options': {
1436             'rfc2544': RFC2544_CFG_4,
1437         }
1438     }
1439
1440     def test_property_rfc2544(self):
1441         scenario_helper = ScenarioHelper('name1')
1442         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1443         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1444
1445         self.assertIsNone(rfc2544_resource_helper._rfc2544)
1446         self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1447         self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1448         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1449         self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1450
1451     def test_property_tolerance_high(self):
1452         scenario_helper = ScenarioHelper('name1')
1453         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1454         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1455
1456         self.assertIsNone(rfc2544_resource_helper._tolerance_high)
1457         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1458         self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1459         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1460         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1461
1462     def test_property_tolerance_low(self):
1463         scenario_helper = ScenarioHelper('name1')
1464         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1465         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1466
1467         self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1468         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1469         self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1470         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1471         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1472
1473     def test_property_tolerance_high_range_swap(self):
1474         scenario_helper = ScenarioHelper('name1')
1475         scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1476         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1477
1478         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1479
1480     def test_property_tolerance_low_range_swap(self):
1481         scenario_helper = ScenarioHelper('name1')
1482         scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1483         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1484
1485         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1486
1487     def test_property_tolerance_high_not_range(self):
1488         scenario_helper = ScenarioHelper('name1')
1489         scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1490         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1491
1492         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1493
1494     def test_property_tolerance_low_not_range(self):
1495         scenario_helper = ScenarioHelper('name1')
1496         scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1497         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1498
1499         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1500
1501     def test_property_tolerance_high_default(self):
1502         scenario_helper = ScenarioHelper('name1')
1503         scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1504         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1505
1506         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1507
1508     def test_property_tolerance_low_default(self):
1509         scenario_helper = ScenarioHelper('name1')
1510         scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1511         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1512
1513         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1514
1515     def test_property_latency(self):
1516         scenario_helper = ScenarioHelper('name1')
1517         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1518         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1519
1520         self.assertIsNone(rfc2544_resource_helper._latency)
1521         self.assertTrue(rfc2544_resource_helper.latency)
1522         self.assertTrue(rfc2544_resource_helper._latency)
1523         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1524         self.assertTrue(rfc2544_resource_helper.latency)
1525
1526     def test_property_latency_default(self):
1527         scenario_helper = ScenarioHelper('name1')
1528         scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1529         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1530
1531         self.assertFalse(rfc2544_resource_helper.latency)
1532
1533     def test_property_correlated_traffic(self):
1534         scenario_helper = ScenarioHelper('name1')
1535         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1536         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1537
1538         self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1539         self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1540         self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1541         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1542         self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1543
1544     def test_property_correlated_traffic_default(self):
1545         scenario_helper = ScenarioHelper('name1')
1546         scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1547         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1548
1549         self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1550
1551
1552 class TestSampleVNFDeployHelper(unittest.TestCase):
1553
1554     @mock.patch('subprocess.check_output')
1555     def test_deploy_vnfs_disabled(self, mock_check_output):
1556         vnfd_helper = mock.Mock()
1557         ssh_helper = mock.Mock()
1558         ssh_helper.join_bin_path.return_value = 'joined_path'
1559         ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1560         ssh_helper.put.return_value = None
1561         sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1562
1563         self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1564         self.assertEqual(ssh_helper.execute.call_count, 0)
1565         self.assertEqual(ssh_helper.put.call_count, 0)
1566
1567     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1568     @mock.patch('subprocess.check_output')
1569     def test_deploy_vnfs(self, mock_check_output, mock_time):
1570         vnfd_helper = mock.Mock()
1571         ssh_helper = mock.Mock()
1572         ssh_helper.join_bin_path.return_value = 'joined_path'
1573         ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1574         ssh_helper.put.return_value = None
1575         sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1576         sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1577
1578         self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1579         self.assertEqual(ssh_helper.execute.call_count, 5)
1580         self.assertEqual(ssh_helper.put.call_count, 1)
1581
1582     @mock.patch('subprocess.check_output')
1583     def test_deploy_vnfs_early_success(self, mock_check_output):
1584         vnfd_helper = mock.Mock()
1585         ssh_helper = mock.Mock()
1586         ssh_helper.join_bin_path.return_value = 'joined_path'
1587         ssh_helper.execute.return_value = 0, 'output', ''
1588         ssh_helper.put.return_value = None
1589         sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1590         sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1591
1592         self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1593         self.assertEqual(ssh_helper.execute.call_count, 1)
1594         self.assertEqual(ssh_helper.put.call_count, 0)
1595
1596
1597 class TestScenarioHelper(unittest.TestCase):
1598
1599     def test_property_task_path(self):
1600         scenario_helper = ScenarioHelper('name1')
1601         scenario_helper.scenario_cfg = {
1602             'task_path': 'my_path',
1603         }
1604
1605         self.assertEqual(scenario_helper.task_path, 'my_path')
1606
1607     def test_property_nodes(self):
1608         nodes = ['node1', 'node2']
1609         scenario_helper = ScenarioHelper('name1')
1610         scenario_helper.scenario_cfg = {
1611             'nodes': nodes,
1612         }
1613
1614         self.assertEqual(scenario_helper.nodes, nodes)
1615
1616     def test_property_all_options(self):
1617         data = {
1618             'name1': {
1619                 'key3': 'value3',
1620             },
1621             'name2': {}
1622         }
1623         scenario_helper = ScenarioHelper('name1')
1624         scenario_helper.scenario_cfg = {
1625             'options': data,
1626         }
1627
1628         self.assertDictEqual(scenario_helper.all_options, data)
1629
1630     def test_property_options(self):
1631         data = {
1632             'key1': 'value1',
1633             'key2': 'value2',
1634         }
1635         scenario_helper = ScenarioHelper('name1')
1636         scenario_helper.scenario_cfg = {
1637             'options': {
1638                 'name1': data,
1639             },
1640         }
1641
1642         self.assertDictEqual(scenario_helper.options, data)
1643
1644     def test_property_vnf_cfg(self):
1645         scenario_helper = ScenarioHelper('name1')
1646         scenario_helper.scenario_cfg = {
1647             'options': {
1648                 'name1': {
1649                     'vnf_config': 'my_config',
1650                 },
1651             },
1652         }
1653
1654         self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1655
1656     def test_property_vnf_cfg_default(self):
1657         scenario_helper = ScenarioHelper('name1')
1658         scenario_helper.scenario_cfg = {
1659             'options': {
1660                 'name1': {},
1661             },
1662         }
1663
1664         self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1665
1666     def test_property_topology(self):
1667         scenario_helper = ScenarioHelper('name1')
1668         scenario_helper.scenario_cfg = {
1669             'topology': 'my_topology',
1670         }
1671
1672         self.assertEqual(scenario_helper.topology, 'my_topology')
1673
1674
1675 class TestSampleVnf(unittest.TestCase):
1676
1677     VNFD_0 = {
1678         'short-name': 'VpeVnf',
1679         'vdu': [
1680             {
1681                 'routing_table': [
1682                     {
1683                         'network': '152.16.100.20',
1684                         'netmask': '255.255.255.0',
1685                         'gateway': '152.16.100.20',
1686                         'if': 'xe0'
1687                     },
1688                     {
1689                         'network': '152.16.40.20',
1690                         'netmask': '255.255.255.0',
1691                         'gateway': '152.16.40.20',
1692                         'if': 'xe1'
1693                     },
1694                 ],
1695                 'description': 'VPE approximation using DPDK',
1696                 'name': 'vpevnf-baremetal',
1697                 'nd_route_tbl': [
1698                     {
1699                         'network': '0064:ff9b:0:0:0:0:9810:6414',
1700                         'netmask': '112',
1701                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1702                         'if': 'xe0'
1703                     },
1704                     {
1705                         'network': '0064:ff9b:0:0:0:0:9810:2814',
1706                         'netmask': '112',
1707                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1708                         'if': 'xe1'
1709                     },
1710                 ],
1711                 'id': 'vpevnf-baremetal',
1712                 'external-interface': [
1713                     {
1714                         'virtual-interface': {
1715                             'dst_mac': '00:00:00:00:00:03',
1716                             'vpci': '0000:05:00.0',
1717                             'local_ip': '152.16.100.19',
1718                             'type': 'PCI-PASSTHROUGH',
1719                             'netmask': '255.255.255.0',
1720                             'dpdk_port_num': '0',
1721                             'bandwidth': '10 Gbps',
1722                             'dst_ip': '152.16.100.20',
1723                             'local_mac': '00:00:00:00:00:01'
1724                         },
1725                         'vnfd-connection-point-ref': 'xe0',
1726                         'name': 'xe0'
1727                     },
1728                     {
1729                         'virtual-interface': {
1730                             'dst_mac': '00:00:00:00:00:04',
1731                             'vpci': '0000:05:00.1',
1732                             'local_ip': '152.16.40.19',
1733                             'type': 'PCI-PASSTHROUGH',
1734                             'netmask': '255.255.255.0',
1735                             'dpdk_port_num': '1',
1736                             'bandwidth': '10 Gbps',
1737                             'dst_ip': '152.16.40.20',
1738                             'local_mac': '00:00:00:00:00:02'
1739                         },
1740                         'vnfd-connection-point-ref': 'xe1',
1741                         'name': 'xe1'
1742                     },
1743                 ],
1744             },
1745         ],
1746         'description': 'Vpe approximation using DPDK',
1747         'mgmt-interface': {
1748             'vdu-id': 'vpevnf-baremetal',
1749             'host': '1.1.1.1',
1750             'password': 'r00t',
1751             'user': 'root',
1752             'ip': '1.1.1.1'
1753         },
1754         'benchmark': {
1755             'kpi': [
1756                 'packets_in',
1757                 'packets_fwd',
1758                 'packets_dropped',
1759             ],
1760         },
1761         'connection-point': [
1762             {
1763                 'type': 'VPORT',
1764                 'name': 'xe0',
1765             },
1766             {
1767                 'type': 'VPORT',
1768                 'name': 'xe1',
1769             },
1770         ],
1771         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1772     }
1773
1774     VNFD = {
1775         'vnfd:vnfd-catalog': {
1776             'vnfd': [
1777                 VNFD_0,
1778             ]
1779         }
1780     }
1781
1782     TRAFFIC_PROFILE = {
1783         "schema": "isb:traffic_profile:0.1",
1784         "name": "fixed",
1785         "description": "Fixed traffic profile to run UDP traffic",
1786         "traffic_profile": {
1787             "traffic_type": "FixedTraffic",
1788             "frame_rate": 100,  # pps
1789             "flow_number": 10,
1790             "frame_size": 64,
1791         },
1792     }
1793
1794     def test___init__(self):
1795         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1796
1797         self.assertEqual(sample_vnf.name, 'vnf1')
1798         self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1799
1800         # test the default setup helper is SetupEnvHelper, not subclass
1801         self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1802
1803         # test the default resource helper is ResourceHelper, not subclass
1804         self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1805
1806     def test___init___alt_types(self):
1807         class MySetupEnvHelper(SetupEnvHelper):
1808             pass
1809
1810
1811         class MyResourceHelper(ResourceHelper):
1812             pass
1813
1814         sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1815
1816         self.assertEqual(sample_vnf.name, 'vnf1')
1817         self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1818
1819         # test the default setup helper is MySetupEnvHelper, not subclass
1820         self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1821
1822         # test the default resource helper is MyResourceHelper, not subclass
1823         self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1824
1825     def test__get_port0localip6(self):
1826         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1827         expected = '0064:ff9b:0:0:0:0:9810:6414'
1828         result = sample_vnf._get_port0localip6()
1829         self.assertEqual(result, expected)
1830
1831     def test__get_port1localip6(self):
1832         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1833         expected = '0064:ff9b:0:0:0:0:9810:2814'
1834         result = sample_vnf._get_port1localip6()
1835         self.assertEqual(result, expected)
1836
1837     def test__get_port0prefixip6(self):
1838         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1839         expected = '112'
1840         result = sample_vnf._get_port0prefixlen6()
1841         self.assertEqual(result, expected)
1842
1843     def test__get_port1prefixip6(self):
1844         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1845         expected = '112'
1846         result = sample_vnf._get_port1prefixlen6()
1847         self.assertEqual(result, expected)
1848
1849     def test__get_port0gateway6(self):
1850         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1851         expected = '0064:ff9b:0:0:0:0:9810:6414'
1852         result = sample_vnf._get_port0gateway6()
1853         self.assertEqual(result, expected)
1854
1855     def test__get_port1gateway6(self):
1856         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1857         expected = '0064:ff9b:0:0:0:0:9810:2814'
1858         result = sample_vnf._get_port1gateway6()
1859         self.assertEqual(result, expected)
1860
1861     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1862     def test__start_vnf(self, mock_process_type):
1863         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1864         sample_vnf = SampleVNF('vnf1', vnfd)
1865         sample_vnf._run = mock.Mock()
1866
1867         self.assertIsNone(sample_vnf.queue_wrapper)
1868         self.assertIsNone(sample_vnf._vnf_process)
1869         self.assertIsNone(sample_vnf._start_vnf())
1870         self.assertIsNotNone(sample_vnf.queue_wrapper)
1871         self.assertIsNotNone(sample_vnf._vnf_process)
1872
1873     @mock.patch("yardstick.ssh.SSH")
1874     def test_instantiate(self, ssh):
1875         mock_ssh(ssh)
1876
1877         nodes = {
1878             'vnf1': 'name1',
1879             'vnf2': 'name2',
1880         }
1881
1882         context1 = mock.Mock()
1883         context1._get_server.return_value = None
1884         context2 = mock.Mock()
1885         context2._get_server.return_value = context2
1886
1887         try:
1888             Context.list.clear()
1889         except AttributeError:
1890             # clear() but works in Py2.7
1891             Context.list[:] = []
1892
1893         Context.list.extend([
1894             context1,
1895             context2,
1896         ])
1897
1898         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1899         sample_vnf = SampleVNF('vnf1', vnfd)
1900         sample_vnf.APP_NAME = 'sample1'
1901         sample_vnf._start_server = mock.Mock(return_value=0)
1902         sample_vnf._vnf_process = mock.MagicMock()
1903         sample_vnf._vnf_process._is_alive.return_value = 1
1904         sample_vnf.ssh_helper = mock.MagicMock()
1905         sample_vnf.deploy_helper = mock.MagicMock()
1906         sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1907         scenario_cfg = {
1908             'nodes': nodes,
1909         }
1910
1911         self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1912         self.assertEqual(sample_vnf.nfvi_context, context2)
1913
1914     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1915     @mock.patch("yardstick.ssh.SSH")
1916     def test_wait_for_instantiate_empty_queue(self, ssh, mock_time):
1917         mock_ssh(ssh, exec_result=(1, "", ""))
1918
1919         queue_size_list = [
1920             0,
1921             1,
1922             0,
1923             1,
1924         ]
1925
1926         queue_get_list = [
1927             'some output',
1928             'pipeline> ',
1929         ]
1930
1931         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1932         sample_vnf = SampleVNF('vnf1', vnfd)
1933         sample_vnf.APP_NAME = 'sample1'
1934         sample_vnf._start_server = mock.Mock(return_value=0)
1935         sample_vnf._vnf_process = mock.MagicMock()
1936         sample_vnf._vnf_process.exitcode = 0
1937         sample_vnf._vnf_process._is_alive.return_value = 1
1938         sample_vnf.queue_wrapper = mock.Mock()
1939         sample_vnf.q_out = mock.Mock()
1940         sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1941         sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1942         sample_vnf.ssh_helper = mock.MagicMock()
1943         sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1944         sample_vnf.resource_helper.start_collect = mock.MagicMock()
1945
1946         self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1947
1948     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1949     def test_vnf_execute_with_queue_data(self, mock_time):
1950         queue_size_list = [
1951             1,
1952             1,
1953             0,
1954         ]
1955
1956         queue_get_list = [
1957             'hello ',
1958             'world'
1959         ]
1960
1961         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1962         sample_vnf = SampleVNF('vnf1', vnfd)
1963         sample_vnf.APP_NAME = 'sample1'
1964         sample_vnf.q_out = mock.Mock()
1965         sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1966         sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1967
1968         self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1969
1970     def test_terminate_without_vnf_process(self):
1971         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1972         sample_vnf = SampleVNF('vnf1', vnfd)
1973         sample_vnf.APP_NAME = 'sample1'
1974         sample_vnf.vnf_execute = mock.Mock()
1975         sample_vnf.ssh_helper = mock.Mock()
1976         sample_vnf._tear_down = mock.Mock()
1977         sample_vnf.resource_helper = mock.Mock()
1978
1979         self.assertIsNone(sample_vnf.terminate())
1980
1981     def test_get_stats(self):
1982         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1983         sample_vnf = SampleVNF('vnf1', vnfd)
1984         sample_vnf.APP_NAME = 'sample1'
1985         sample_vnf.APP_WORD = 'sample1'
1986         sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1987
1988         self.assertEqual(sample_vnf.get_stats(), 'the stats')
1989
1990     def test_collect_kpi(self):
1991         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1992         sample_vnf = SampleVNF('vnf1', vnfd)
1993         sample_vnf.APP_NAME = 'sample1'
1994         sample_vnf.COLLECT_KPI = '\s(\d+)\D*(\d+)\D*(\d+)'
1995         sample_vnf.COLLECT_MAP = {
1996             'k1': 3,
1997             'k2': 1,
1998             'k3': 2,
1999         }
2000         sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
2001         sample_vnf.resource_helper = mock.Mock()
2002         sample_vnf.resource_helper.collect_kpi.return_value = {}
2003
2004         expected = {
2005             'k1': 27,
2006             'k2': 34,
2007             'k3': 91,
2008             'collect_stats': {},
2009         }
2010         result = sample_vnf.collect_kpi()
2011         self.assertDictEqual(result, expected)
2012
2013     def test_collect_kpi_default(self):
2014         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
2015         sample_vnf = SampleVNF('vnf1', vnfd)
2016         sample_vnf.APP_NAME = 'sample1'
2017         sample_vnf.COLLECT_KPI = '\s(\d+)\D*(\d+)\D*(\d+)'
2018         sample_vnf.get_stats = mock.Mock(return_value='')
2019
2020         expected = {
2021             'packets_in': 0,
2022             'packets_fwd': 0,
2023             'packets_dropped': 0,
2024         }
2025         result = sample_vnf.collect_kpi()
2026         self.assertDictEqual(result, expected)
2027
2028
2029 class TestSampleVNFTrafficGen(unittest.TestCase):
2030
2031     VNFD_0 = {
2032         'short-name': 'VpeVnf',
2033         'vdu': [
2034             {
2035                 'routing_table': [
2036                     {
2037                         'network': '152.16.100.20',
2038                         'netmask': '255.255.255.0',
2039                         'gateway': '152.16.100.20',
2040                         'if': 'xe0'
2041                     },
2042                     {
2043                         'network': '152.16.40.20',
2044                         'netmask': '255.255.255.0',
2045                         'gateway': '152.16.40.20',
2046                         'if': 'xe1'
2047                     },
2048                 ],
2049                 'description': 'VPE approximation using DPDK',
2050                 'name': 'vpevnf-baremetal',
2051                 'nd_route_tbl': [
2052                     {
2053                         'network': '0064:ff9b:0:0:0:0:9810:6414',
2054                         'netmask': '112',
2055                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
2056                         'if': 'xe0'
2057                     },
2058                     {
2059                         'network': '0064:ff9b:0:0:0:0:9810:2814',
2060                         'netmask': '112',
2061                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
2062                         'if': 'xe1'
2063                     },
2064                 ],
2065                 'id': 'vpevnf-baremetal',
2066                 'external-interface': [
2067                     {
2068                         'virtual-interface': {
2069                             'dst_mac': '00:00:00:00:00:03',
2070                             'vpci': '0000:05:00.0',
2071                             'driver': 'i40e',
2072                             'local_ip': '152.16.100.19',
2073                             'type': 'PCI-PASSTHROUGH',
2074                             'netmask': '255.255.255.0',
2075                             'dpdk_port_num': '0',
2076                             'bandwidth': '10 Gbps',
2077                             'dst_ip': '152.16.100.20',
2078                             'local_mac': '00:00:00:00:00:01'
2079                         },
2080                         'vnfd-connection-point-ref': 'xe0',
2081                         'name': 'xe0'
2082                     },
2083                     {
2084                         'virtual-interface': {
2085                             'dst_mac': '00:00:00:00:00:04',
2086                             'vpci': '0000:05:00.1',
2087                             'driver': 'ixgbe',
2088                             'local_ip': '152.16.40.19',
2089                             'type': 'PCI-PASSTHROUGH',
2090                             'netmask': '255.255.255.0',
2091                             'dpdk_port_num': '1',
2092                             'bandwidth': '10 Gbps',
2093                             'dst_ip': '152.16.40.20',
2094                             'local_mac': '00:00:00:00:00:02'
2095                         },
2096                         'vnfd-connection-point-ref': 'xe1',
2097                         'name': 'xe1'
2098                     },
2099                     {
2100                         'virtual-interface': {
2101                             'dst_mac': '00:00:00:00:00:13',
2102                             'vpci': '0000:05:00.2',
2103                             'driver': 'ixgbe',
2104                             'local_ip': '152.16.40.19',
2105                             'type': 'PCI-PASSTHROUGH',
2106                             'netmask': '255.255.255.0',
2107                             'dpdk_port_num': '1',
2108                             'bandwidth': '10 Gbps',
2109                             'dst_ip': '152.16.40.30',
2110                             'local_mac': '00:00:00:00:00:11'
2111                         },
2112                         'vnfd-connection-point-ref': 'xe2',
2113                         'name': 'xe2'
2114                     },
2115                 ],
2116             },
2117         ],
2118         'description': 'Vpe approximation using DPDK',
2119         'mgmt-interface': {
2120             'vdu-id': 'vpevnf-baremetal',
2121             'host': '1.1.1.1',
2122             'password': 'r00t',
2123             'user': 'root',
2124             'ip': '1.1.1.1'
2125         },
2126         'benchmark': {
2127             'kpi': [
2128                 'packets_in',
2129                 'packets_fwd',
2130                 'packets_dropped',
2131             ],
2132         },
2133         'connection-point': [
2134             {
2135                 'type': 'VPORT',
2136                 'name': 'xe0',
2137             },
2138             {
2139                 'type': 'VPORT',
2140                 'name': 'xe1',
2141             },
2142         ],
2143         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
2144     }
2145
2146     VNFD = {
2147         'vnfd:vnfd-catalog': {
2148             'vnfd': [
2149                 VNFD_0,
2150             ],
2151         },
2152     }
2153
2154     TRAFFIC_PROFILE = {
2155         "schema": "isb:traffic_profile:0.1",
2156         "name": "fixed",
2157         "description": "Fixed traffic profile to run UDP traffic",
2158         "traffic_profile": {
2159             "traffic_type": "FixedTraffic",
2160             "frame_rate": 100,  # pps
2161             "flow_number": 10,
2162             "frame_size": 64,
2163         },
2164     }
2165
2166     def test__check_status(self):
2167         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2168
2169         with self.assertRaises(NotImplementedError):
2170             sample_vnf_tg._check_status()
2171
2172     def test_listen_traffic(self):
2173         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2174
2175         sample_vnf_tg.listen_traffic(mock.Mock())
2176
2177     def test_verify_traffic(self):
2178         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2179
2180         sample_vnf_tg.verify_traffic(mock.Mock())
2181
2182     def test_terminate(self):
2183         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2184         sample_vnf_tg._traffic_process = mock.Mock()
2185
2186         sample_vnf_tg.terminate()
2187
2188     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
2189     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
2190     def test_wait_for_instantiate(self, mock_logger, mock_time):
2191         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2192         sample_vnf_tg._check_status = mock.Mock(side_effect=iter([1, 0]))
2193         sample_vnf_tg._tg_process = mock.Mock()
2194         sample_vnf_tg._tg_process.is_alive.return_value = True
2195         sample_vnf_tg._tg_process.exitcode = 234
2196
2197         self.assertEqual(sample_vnf_tg.wait_for_instantiate(), 234)
2198
2199     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
2200     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
2201     def test_wait_for_instantiate_not_alive(self, mock_logger, mock_time):
2202         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2203         sample_vnf_tg._check_status = mock.Mock(return_value=1)
2204         sample_vnf_tg._tg_process = mock.Mock()
2205         sample_vnf_tg._tg_process.is_alive.side_effect = iter([True, False])
2206         sample_vnf_tg._tg_process.exitcode = 234
2207
2208         with self.assertRaises(RuntimeError):
2209             sample_vnf_tg.wait_for_instantiate()
2210
2211     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
2212     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
2213     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
2214     def test_wait_for_instantiate_delayed(self, mock_process, mock_logger, mock_time):
2215         class MockClientStarted(mock.Mock):
2216
2217             def __init__(self, *args, **kwargs):
2218                 super(MockClientStarted, self).__init__(*args, **kwargs)
2219                 self.iter = iter([0, 0, 1])
2220
2221             @property
2222             def value(self):
2223                 return next(self.iter)
2224
2225         mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
2226         mock_traffic_profile.get_traffic_definition.return_value = "64"
2227         mock_traffic_profile.execute.return_value = "64"
2228         mock_traffic_profile.params = self.TRAFFIC_PROFILE
2229
2230         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2231         sample_vnf_tg._check_status = mock.Mock(side_effect=iter([1, 0]))
2232         sample_vnf_tg._tg_process = mock.Mock()
2233         sample_vnf_tg._tg_process.is_alive.return_value = True
2234         sample_vnf_tg._tg_process.exitcode = 234
2235         sample_vnf_tg.resource_helper = mock.Mock()
2236         sample_vnf_tg.resource_helper.client_started = MockClientStarted()
2237
2238         self.assertTrue(sample_vnf_tg.run_traffic(mock_traffic_profile))
2239         self.assertEqual(mock_time.sleep.call_count, 2)