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