Document for Euphrates test case results
[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_no_hugepages_defined(self, mock_meminfo, *args):
537         ssh_helper = mock.Mock()
538         scenario_helper = mock.Mock()
539         scenario_helper.all_options = {}
540         dpdk_setup_helper = DpdkVnfSetupEnvHelper(
541             mock.ANY, ssh_helper, scenario_helper)
542         with mock.patch.object(sample_vnf.LOG, 'info') as mock_info:
543             dpdk_setup_helper._setup_hugepages()
544             mock_info.assert_called_once_with(
545                 'Hugepages size (kB): %s, number claimed: %s, number set: '
546                 '%s', 2048, 8192, 100)
547         mock_meminfo.assert_called_once_with(ssh_helper)
548
549     @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n'))
550     @mock.patch.object(utils, 'read_meminfo',
551                        return_value={'Hugepagesize': '1048576'})
552     def test__setup_hugepages_8gb_hugepages_defined(self, mock_meminfo, *args):
553         ssh_helper = mock.Mock()
554         scenario_helper = mock.Mock()
555         scenario_helper.all_options = {'hugepages_gb': 8}
556         dpdk_setup_helper = DpdkVnfSetupEnvHelper(
557             mock.ANY, ssh_helper, scenario_helper)
558         with mock.patch.object(sample_vnf.LOG, 'info') as mock_info:
559             dpdk_setup_helper._setup_hugepages()
560             mock_info.assert_called_once_with(
561                 'Hugepages size (kB): %s, number claimed: %s, number set: '
562                 '%s', 1048576, 8, 100)
563         mock_meminfo.assert_called_once_with(ssh_helper)
564
565     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open')
566     @mock.patch.object(utils, 'find_relative_file')
567     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
568     @mock.patch.object(utils, 'open_relative_file')
569     def test_build_config(self, mock_open_rf, mock_multi_port_config_class, mock_find, *args):
570         mock_multi_port_config = mock_multi_port_config_class()
571         vnfd_helper = VnfdHelper(self.VNFD_0)
572         ssh_helper = mock.Mock()
573         scenario_helper = mock.Mock()
574         scenario_helper.vnf_cfg = {}
575         scenario_helper.all_options = {}
576         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
577
578         dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
579         result = dpdk_setup_helper.build_config()
580         self.assertEqual(result, expected)
581         self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
582         self.assertGreaterEqual(mock_find.call_count, 1)
583         self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
584         self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
585
586         scenario_helper.vnf_cfg = {'file': 'fake_file'}
587         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
588         mock_open_rf.side_effect = mock.mock_open(read_data='fake_data')
589         dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command'
590
591         result = dpdk_setup_helper.build_config()
592
593         mock_open_rf.assert_called_once()
594         self.assertEqual(result, expected)
595         self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
596         self.assertGreaterEqual(mock_find.call_count, 1)
597         self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1)
598         self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1)
599
600     def test__build_pipeline_kwargs(self):
601         vnfd_helper = VnfdHelper(self.VNFD_0)
602         ssh_helper = mock.Mock()
603         ssh_helper.provision_tool.return_value = 'tool_path'
604         scenario_helper = mock.Mock()
605         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
606         dpdk_setup_helper.CFG_CONFIG = 'config'
607         dpdk_setup_helper.CFG_SCRIPT = 'script'
608         dpdk_setup_helper.pipeline_kwargs = {}
609         dpdk_setup_helper.all_ports = [0, 1, 2]
610
611         expected = {
612             'cfg_file': 'config',
613             'script': 'script',
614             'port_mask_hex': '0x3',
615             'tool_path': 'tool_path',
616         }
617         dpdk_setup_helper._build_pipeline_kwargs()
618         self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected)
619
620     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
621     @mock.patch('yardstick.ssh.SSH')
622     def test_setup_vnf_environment(self, *args):
623         def execute(cmd):
624             if cmd.startswith('which '):
625                 return exec_failure
626             return exec_success
627
628         exec_success = (0, 'good output', '')
629         exec_failure = (1, 'bad output', 'error output')
630
631         vnfd_helper = VnfdHelper(self.VNFD_0)
632         ssh_helper = mock.Mock()
633         ssh_helper.execute = execute
634
635         scenario_helper = mock.Mock()
636         scenario_helper.nodes = [None, None]
637         dpdk_vnf_setup_env_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
638         dpdk_vnf_setup_env_helper._validate_cpu_cfg = mock.Mock(return_value=[])
639
640         with mock.patch.object(dpdk_vnf_setup_env_helper, '_setup_dpdk'):
641             self.assertIsInstance(
642                 dpdk_vnf_setup_env_helper.setup_vnf_environment(),
643                 ResourceProfile)
644
645     def test__setup_dpdk(self):
646         ssh_helper = mock.Mock()
647         ssh_helper.execute = mock.Mock()
648         ssh_helper.execute.return_value = (0, 0, 0)
649         dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
650         with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
651                 mock_setup_hp:
652             dpdk_setup_helper._setup_dpdk()
653         mock_setup_hp.assert_called_once()
654         ssh_helper.execute.assert_has_calls([
655             mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
656             mock.call('lsmod | grep -i igb_uio')
657         ])
658
659     @mock.patch('yardstick.ssh.SSH')
660     def test__setup_resources(self, _):
661         vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
662         ssh_helper = mock.Mock()
663         scenario_helper = mock.Mock()
664         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
665         dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
666
667         dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
668                                        vnfd_helper.interfaces]
669         result = dpdk_setup_helper._setup_resources()
670         self.assertIsInstance(result, ResourceProfile)
671         self.assertEqual(dpdk_setup_helper.socket, 0)
672
673     @mock.patch('yardstick.ssh.SSH')
674     def test__setup_resources_socket_1(self, _):
675         vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
676         vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0'
677         vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0'
678         ssh_helper = mock.Mock()
679         scenario_helper = mock.Mock()
680         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
681         dpdk_setup_helper._validate_cpu_cfg = mock.Mock()
682
683         dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in
684                                        vnfd_helper.interfaces]
685         result = dpdk_setup_helper._setup_resources()
686         self.assertIsInstance(result, ResourceProfile)
687         self.assertEqual(dpdk_setup_helper.socket, 1)
688
689     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
690     def test__detect_and_bind_drivers(self, *args):
691         vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0))
692         ssh_helper = mock.Mock()
693         # ssh_helper.execute = mock.Mock(return_value = (0, 'text', ''))
694         # ssh_helper.execute.return_value = 0, 'output', ''
695         scenario_helper = mock.Mock()
696         scenario_helper.nodes = [None, None]
697         rv = ['0000:05:00.1', '0000:05:00.0']
698
699         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
700         dpdk_setup_helper.dpdk_bind_helper._get_bound_pci_addresses = mock.Mock(return_value=rv)
701         dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
702         dpdk_setup_helper.dpdk_bind_helper.read_status = mock.Mock()
703
704         self.assertIsNone(dpdk_setup_helper._detect_and_bind_drivers())
705
706         intf_0 = vnfd_helper.vdu[0]['external-interface'][0]['virtual-interface']
707         intf_1 = vnfd_helper.vdu[0]['external-interface'][1]['virtual-interface']
708         self.assertEqual(0, intf_0['dpdk_port_num'])
709         self.assertEqual(1, intf_1['dpdk_port_num'])
710
711     def test_tear_down(self):
712         vnfd_helper = VnfdHelper(self.VNFD_0)
713         ssh_helper = mock.Mock()
714         scenario_helper = mock.Mock()
715         scenario_helper.nodes = [None, None]
716         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
717         dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock()
718         dpdk_setup_helper.dpdk_bind_helper.used_drivers = {
719             'd1': ['0000:05:00.0'],
720             'd3': ['0000:05:01.0'],
721         }
722
723         self.assertIsNone(dpdk_setup_helper.tear_down())
724         dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True)
725         dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0'], 'd3', True)
726
727
728 class TestResourceHelper(unittest.TestCase):
729
730     VNFD_0 = {
731         'short-name': 'VpeVnf',
732         'vdu': [
733             {
734                 'routing_table': [
735                     {
736                         'network': '152.16.100.20',
737                         'netmask': '255.255.255.0',
738                         'gateway': '152.16.100.20',
739                         'if': 'xe0'
740                     },
741                     {
742                         'network': '152.16.40.20',
743                         'netmask': '255.255.255.0',
744                         'gateway': '152.16.40.20',
745                         'if': 'xe1'
746                     },
747                 ],
748                 'description': 'VPE approximation using DPDK',
749                 'name': 'vpevnf-baremetal',
750                 'nd_route_tbl': [
751                     {
752                         'network': '0064:ff9b:0:0:0:0:9810:6414',
753                         'netmask': '112',
754                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
755                         'if': 'xe0'
756                     },
757                     {
758                         'network': '0064:ff9b:0:0:0:0:9810:2814',
759                         'netmask': '112',
760                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
761                         'if': 'xe1'
762                     },
763                 ],
764                 'id': 'vpevnf-baremetal',
765                 'external-interface': [
766                     {
767                         'virtual-interface': {
768                             'dst_mac': '00:00:00:00:00:03',
769                             'vpci': '0000:05:00.0',
770                             'driver': 'i40e',
771                             'local_ip': '152.16.100.19',
772                             'type': 'PCI-PASSTHROUGH',
773                             'netmask': '255.255.255.0',
774                             'dpdk_port_num': 0,
775                             'bandwidth': '10 Gbps',
776                             'dst_ip': '152.16.100.20',
777                             'local_mac': '00:00:00:00:00:01'
778                         },
779                         'vnfd-connection-point-ref': 'xe0',
780                         'name': 'xe0'
781                     },
782                     {
783                         'virtual-interface': {
784                             'dst_mac': '00:00:00:00:00:04',
785                             'vpci': '0000:05:00.1',
786                             'driver': 'ixgbe',
787                             'local_ip': '152.16.40.19',
788                             'type': 'PCI-PASSTHROUGH',
789                             'netmask': '255.255.255.0',
790                             'dpdk_port_num': 1,
791                             'bandwidth': '10 Gbps',
792                             'dst_ip': '152.16.40.20',
793                             'local_mac': '00:00:00:00:00:02'
794                         },
795                         'vnfd-connection-point-ref': 'xe1',
796                         'name': 'xe1'
797                     },
798                 ],
799             },
800         ],
801         'description': 'Vpe approximation using DPDK',
802         'mgmt-interface': {
803             'vdu-id': 'vpevnf-baremetal',
804             'host': '1.1.1.1',
805             'password': 'r00t',
806             'user': 'root',
807             'ip': '1.1.1.1'
808         },
809         'benchmark': {
810             'kpi': [
811                 'packets_in',
812                 'packets_fwd',
813                 'packets_dropped',
814             ],
815         },
816         'connection-point': [
817             {
818                 'type': 'VPORT',
819                 'name': 'xe0',
820             },
821             {
822                 'type': 'VPORT',
823                 'name': 'xe1',
824             },
825         ],
826         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
827     }
828
829     def test_setup(self):
830         resource = object()
831         vnfd_helper = VnfdHelper(self.VNFD_0)
832         ssh_helper = mock.Mock()
833         scenario_helper = mock.Mock()
834         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
835         dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource)
836         resource_helper = ResourceHelper(dpdk_setup_helper)
837
838         self.assertIsNone(resource_helper.setup())
839         self.assertIs(resource_helper.resource, resource)
840
841     def test_generate_cfg(self):
842         vnfd_helper = VnfdHelper(self.VNFD_0)
843         ssh_helper = mock.Mock()
844         scenario_helper = mock.Mock()
845         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
846         resource_helper = ResourceHelper(dpdk_setup_helper)
847
848         self.assertIsNone(resource_helper.generate_cfg())
849
850     def test_stop_collect(self):
851         vnfd_helper = VnfdHelper(self.VNFD_0)
852         ssh_helper = mock.Mock()
853         scenario_helper = mock.Mock()
854         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
855         resource_helper = ResourceHelper(dpdk_setup_helper)
856         resource_helper.resource = mock.Mock()
857
858         self.assertIsNone(resource_helper.stop_collect())
859
860     def test_stop_collect_none(self):
861         vnfd_helper = VnfdHelper(self.VNFD_0)
862         ssh_helper = mock.Mock()
863         scenario_helper = mock.Mock()
864         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
865         resource_helper = ResourceHelper(dpdk_setup_helper)
866         resource_helper.resource = None
867
868         self.assertIsNone(resource_helper.stop_collect())
869
870
871 class TestClientResourceHelper(unittest.TestCase):
872
873     VNFD_0 = {
874         'short-name': 'VpeVnf',
875         'vdu': [
876             {
877                 'routing_table': [
878                     {
879                         'network': '152.16.100.20',
880                         'netmask': '255.255.255.0',
881                         'gateway': '152.16.100.20',
882                         'if': 'xe0'
883                     },
884                     {
885                         'network': '152.16.40.20',
886                         'netmask': '255.255.255.0',
887                         'gateway': '152.16.40.20',
888                         'if': 'xe1'
889                     },
890                 ],
891                 'description': 'VPE approximation using DPDK',
892                 'name': 'vpevnf-baremetal',
893                 'nd_route_tbl': [
894                     {
895                         'network': '0064:ff9b:0:0:0:0:9810:6414',
896                         'netmask': '112',
897                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
898                         'if': 'xe0'
899                     },
900                     {
901                         'network': '0064:ff9b:0:0:0:0:9810:2814',
902                         'netmask': '112',
903                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
904                         'if': 'xe1'
905                     },
906                 ],
907                 'id': 'vpevnf-baremetal',
908                 'external-interface': [
909                     {
910                         'virtual-interface': {
911                             'dst_mac': '00:00:00:00:00:03',
912                             'vpci': '0000:05:00.0',
913                             'driver': 'i40e',
914                             'local_ip': '152.16.100.19',
915                             'type': 'PCI-PASSTHROUGH',
916                             'netmask': '255.255.255.0',
917                             'dpdk_port_num': 0,
918                             'bandwidth': '10 Gbps',
919                             'dst_ip': '152.16.100.20',
920                             'local_mac': '00:00:00:00:00:01',
921                             'vld_id': 'uplink_0',
922                             'ifname': 'xe0',
923                         },
924                         'vnfd-connection-point-ref': 'xe0',
925                         'name': 'xe0'
926                     },
927                     {
928                         'virtual-interface': {
929                             'dst_mac': '00:00:00:00:00:04',
930                             'vpci': '0000:05:00.1',
931                             'driver': 'ixgbe',
932                             'local_ip': '152.16.40.19',
933                             'type': 'PCI-PASSTHROUGH',
934                             'netmask': '255.255.255.0',
935                             'dpdk_port_num': 1,
936                             'bandwidth': '10 Gbps',
937                             'dst_ip': '152.16.40.20',
938                             'local_mac': '00:00:00:00:00:02',
939                             'vld_id': 'downlink_0',
940                             'ifname': 'xe1',
941                         },
942                         'vnfd-connection-point-ref': 'xe1',
943                         'name': 'xe1'
944                     },
945                     {
946                         'virtual-interface': {
947                             'dst_mac': '00:00:00:00:00:13',
948                             'vpci': '0000:05:00.2',
949                             'driver': 'ixgbe',
950                             'local_ip': '152.16.40.19',
951                             'type': 'PCI-PASSTHROUGH',
952                             'netmask': '255.255.255.0',
953                             'dpdk_port_num': 2,
954                             'bandwidth': '10 Gbps',
955                             'dst_ip': '152.16.40.30',
956                             'local_mac': '00:00:00:00:00:11'
957                         },
958                         'vnfd-connection-point-ref': 'xe2',
959                         'name': 'xe2'
960                     },
961                 ],
962             },
963         ],
964         'description': 'Vpe approximation using DPDK',
965         'mgmt-interface': {
966             'vdu-id': 'vpevnf-baremetal',
967             'host': '1.1.1.1',
968             'password': 'r00t',
969             'user': 'root',
970             'ip': '1.1.1.1'
971         },
972         'benchmark': {
973             'kpi': [
974                 'packets_in',
975                 'packets_fwd',
976                 'packets_dropped',
977             ],
978         },
979         'connection-point': [
980             {
981                 'type': 'VPORT',
982                 'name': 'xe0',
983             },
984             {
985                 'type': 'VPORT',
986                 'name': 'xe1',
987             },
988         ],
989         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
990     }
991
992     VNFD = {
993         'vnfd:vnfd-catalog': {
994             'vnfd': [
995                 VNFD_0,
996             ],
997         },
998     }
999
1000     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1001     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1002                 new_callable=lambda: MockError)
1003     def test_get_stats_not_connected(self, mock_state_error, *args):
1004         vnfd_helper = VnfdHelper(self.VNFD_0)
1005         ssh_helper = mock.Mock()
1006         scenario_helper = mock.Mock()
1007         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1008         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1009         client_resource_helper.client = mock.MagicMock()
1010         client_resource_helper.client.get_stats.side_effect = mock_state_error
1011
1012         self.assertEqual(client_resource_helper.get_stats(), {})
1013         self.assertEqual(client_resource_helper.client.get_stats.call_count, 1)
1014
1015     def test_generate_samples(self):
1016         vnfd_helper = VnfdHelper(self.VNFD_0)
1017         ssh_helper = mock.Mock()
1018         scenario_helper = mock.Mock()
1019         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1020         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1021         client_resource_helper.client = mock.MagicMock()
1022         client_resource_helper.client.get_stats.return_value = {
1023             0: {
1024                 'rx_pps': 5.5,
1025                 'tx_pps': 4.9,
1026                 'rx_bps': 234.78,
1027                 'tx_bps': 243.11,
1028                 'ipackets': 34251,
1029                 'opackets': 52342,
1030             },
1031             1: {
1032                 'tx_pps': 5.9,
1033                 'rx_bps': 434.78,
1034                 'opackets': 48791,
1035             },
1036         }
1037
1038         expected = {
1039             'xe0': {
1040                 "rx_throughput_fps": 5.5,
1041                 "tx_throughput_fps": 4.9,
1042                 "rx_throughput_mbps": 234.78,
1043                 "tx_throughput_mbps": 243.11,
1044                 "in_packets": 34251,
1045                 "out_packets": 52342,
1046             },
1047             'xe1': {
1048                 "rx_throughput_fps": 0.0,
1049                 "tx_throughput_fps": 5.9,
1050                 "rx_throughput_mbps": 434.78,
1051                 "tx_throughput_mbps": 0.0,
1052                 "in_packets": 0,
1053                 "out_packets": 48791,
1054             },
1055         }
1056         ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1057         result = client_resource_helper.generate_samples(ports)
1058         self.assertDictEqual(result, expected)
1059
1060     def test_generate_samples_with_key(self):
1061         vnfd_helper = VnfdHelper(self.VNFD_0)
1062         ssh_helper = mock.Mock()
1063         scenario_helper = mock.Mock()
1064         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1065         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1066         client_resource_helper.client = mock.MagicMock()
1067         client_resource_helper.client.get_stats.return_value = {
1068             'key_name': 'key_value',
1069             0: {
1070                 'rx_pps': 5.5,
1071                 'tx_pps': 4.9,
1072                 'rx_bps': 234.78,
1073                 'tx_bps': 243.11,
1074                 'ipackets': 34251,
1075                 'opackets': 52342,
1076             },
1077             1: {
1078                 'tx_pps': 5.9,
1079                 'rx_bps': 434.78,
1080                 'opackets': 48791,
1081             },
1082         }
1083
1084         expected = {
1085             'xe0': {
1086                 'key_name': 'key_value',
1087                 "rx_throughput_fps": 5.5,
1088                 "tx_throughput_fps": 4.9,
1089                 "rx_throughput_mbps": 234.78,
1090                 "tx_throughput_mbps": 243.11,
1091                 "in_packets": 34251,
1092                 "out_packets": 52342,
1093             },
1094             'xe1': {
1095                 'key_name': 'key_value',
1096                 "rx_throughput_fps": 0.0,
1097                 "tx_throughput_fps": 5.9,
1098                 "rx_throughput_mbps": 434.78,
1099                 "tx_throughput_mbps": 0.0,
1100                 "in_packets": 0,
1101                 "out_packets": 48791,
1102             },
1103         }
1104         ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1105         result = client_resource_helper.generate_samples(ports, 'key_name')
1106         self.assertDictEqual(result, expected)
1107
1108     def test_generate_samples_with_key_and_default(self):
1109         vnfd_helper = VnfdHelper(self.VNFD_0)
1110         ssh_helper = mock.Mock()
1111         scenario_helper = mock.Mock()
1112         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1113         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1114         client_resource_helper.client = mock.MagicMock()
1115         client_resource_helper.client.get_stats.return_value = {
1116             0: {
1117                 'rx_pps': 5.5,
1118                 'tx_pps': 4.9,
1119                 'rx_bps': 234.78,
1120                 'tx_bps': 243.11,
1121                 'ipackets': 34251,
1122                 'opackets': 52342,
1123             },
1124             1: {
1125                 'tx_pps': 5.9,
1126                 'rx_bps': 434.78,
1127                 'opackets': 48791,
1128             },
1129         }
1130
1131         expected = {
1132             'xe0': {
1133                 'key_name': 'default',
1134                 "rx_throughput_fps": 5.5,
1135                 "tx_throughput_fps": 4.9,
1136                 "rx_throughput_mbps": 234.78,
1137                 "tx_throughput_mbps": 243.11,
1138                 "in_packets": 34251,
1139                 "out_packets": 52342,
1140             },
1141             'xe1': {
1142                 'key_name': 'default',
1143                 "rx_throughput_fps": 0.0,
1144                 "tx_throughput_fps": 5.9,
1145                 "rx_throughput_mbps": 434.78,
1146                 "tx_throughput_mbps": 0.0,
1147                 "in_packets": 0,
1148                 "out_packets": 48791,
1149             },
1150         }
1151         ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
1152         result = client_resource_helper.generate_samples(ports, 'key_name', 'default')
1153         self.assertDictEqual(result, expected)
1154
1155     def test_clear_stats(self):
1156         vnfd_helper = VnfdHelper(self.VNFD_0)
1157         ssh_helper = mock.Mock()
1158         scenario_helper = mock.Mock()
1159         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1160         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1161         client_resource_helper.client = mock.Mock()
1162
1163         self.assertIsNone(client_resource_helper.clear_stats())
1164         self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1165
1166     def test_clear_stats_of_ports(self):
1167         vnfd_helper = VnfdHelper(self.VNFD_0)
1168         ssh_helper = mock.Mock()
1169         scenario_helper = mock.Mock()
1170         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1171         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1172         client_resource_helper.client = mock.Mock()
1173
1174         self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
1175         self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1)
1176
1177     def test_start(self):
1178         vnfd_helper = VnfdHelper(self.VNFD_0)
1179         ssh_helper = mock.Mock()
1180         scenario_helper = mock.Mock()
1181         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1182         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1183         client_resource_helper.client = mock.Mock()
1184
1185         self.assertIsNone(client_resource_helper.start())
1186         self.assertEqual(client_resource_helper.client.start.call_count, 1)
1187
1188     def test_start_ports(self):
1189         vnfd_helper = VnfdHelper(self.VNFD_0)
1190         ssh_helper = mock.Mock()
1191         scenario_helper = mock.Mock()
1192         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1193         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1194         client_resource_helper.client = mock.Mock()
1195
1196         self.assertIsNone(client_resource_helper.start([3, 4]))
1197         self.assertEqual(client_resource_helper.client.start.call_count, 1)
1198
1199     def test_collect_kpi_with_queue(self):
1200         vnfd_helper = VnfdHelper(self.VNFD_0)
1201         ssh_helper = mock.Mock()
1202         scenario_helper = mock.Mock()
1203         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1204         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1205         client_resource_helper._result = {'existing': 43, 'replaceable': 12}
1206         client_resource_helper._queue = mock.Mock()
1207         client_resource_helper._queue.empty.return_value = False
1208         client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99}
1209
1210         expected = {
1211             'existing': 43,
1212             'incoming': 34,
1213             'replaceable': 99,
1214         }
1215         result = client_resource_helper.collect_kpi()
1216         self.assertDictEqual(result, expected)
1217
1218     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1219     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
1220     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
1221                 new_callable=lambda: MockError)
1222     def test__connect_with_failures(self, mock_error, *args):
1223         vnfd_helper = VnfdHelper(self.VNFD_0)
1224         ssh_helper = mock.Mock()
1225         scenario_helper = mock.Mock()
1226         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1227         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
1228         client = mock.MagicMock()
1229         client.connect.side_effect = mock_error
1230
1231         self.assertIs(client_resource_helper._connect(client), client)
1232
1233
1234 class TestRfc2544ResourceHelper(unittest.TestCase):
1235
1236     RFC2544_CFG_1 = {
1237         'latency': True,
1238         'correlated_traffic': True,
1239         'allowed_drop_rate': '0.1 - 0.15',
1240     }
1241
1242     RFC2544_CFG_2 = {
1243         'allowed_drop_rate': '  0.25    -   0.05  ',
1244     }
1245
1246     RFC2544_CFG_3 = {
1247         'allowed_drop_rate': '0.2',
1248     }
1249
1250     RFC2544_CFG_4 = {
1251         'latency': True,
1252     }
1253
1254     SCENARIO_CFG_1 = {
1255         'options': {
1256             'rfc2544': RFC2544_CFG_1,
1257         }
1258     }
1259
1260     SCENARIO_CFG_2 = {
1261         'options': {
1262             'rfc2544': RFC2544_CFG_2,
1263         }
1264     }
1265
1266     SCENARIO_CFG_3 = {
1267         'options': {
1268             'rfc2544': RFC2544_CFG_3,
1269         }
1270     }
1271
1272     SCENARIO_CFG_4 = {
1273         'options': {
1274             'rfc2544': RFC2544_CFG_4,
1275         }
1276     }
1277
1278     def test_property_rfc2544(self):
1279         scenario_helper = ScenarioHelper('name1')
1280         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1281         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1282
1283         self.assertIsNone(rfc2544_resource_helper._rfc2544)
1284         self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1285         self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1)
1286         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1287         self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1)
1288
1289     def test_property_tolerance_high(self):
1290         scenario_helper = ScenarioHelper('name1')
1291         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1292         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1293
1294         self.assertIsNone(rfc2544_resource_helper._tolerance_high)
1295         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1296         self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
1297         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1298         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
1299
1300     def test_property_tolerance_low(self):
1301         scenario_helper = ScenarioHelper('name1')
1302         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1303         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1304
1305         self.assertIsNone(rfc2544_resource_helper._tolerance_low)
1306         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1307         self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1)
1308         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1309         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1)
1310
1311     def test_property_tolerance_high_range_swap(self):
1312         scenario_helper = ScenarioHelper('name1')
1313         scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1314         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1315
1316         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25)
1317
1318     def test_property_tolerance_low_range_swap(self):
1319         scenario_helper = ScenarioHelper('name1')
1320         scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1321         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1322
1323         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05)
1324
1325     def test_property_tolerance_high_not_range(self):
1326         scenario_helper = ScenarioHelper('name1')
1327         scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1328         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1329
1330         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
1331
1332     def test_property_tolerance_low_not_range(self):
1333         scenario_helper = ScenarioHelper('name1')
1334         scenario_helper.scenario_cfg = self.SCENARIO_CFG_3
1335         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1336
1337         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2)
1338
1339     def test_property_tolerance_high_default(self):
1340         scenario_helper = ScenarioHelper('name1')
1341         scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1342         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1343
1344         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001)
1345
1346     def test_property_tolerance_low_default(self):
1347         scenario_helper = ScenarioHelper('name1')
1348         scenario_helper.scenario_cfg = self.SCENARIO_CFG_4
1349         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1350
1351         self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001)
1352
1353     def test_property_latency(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._latency)
1359         self.assertTrue(rfc2544_resource_helper.latency)
1360         self.assertTrue(rfc2544_resource_helper._latency)
1361         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1362         self.assertTrue(rfc2544_resource_helper.latency)
1363
1364     def test_property_latency_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.latency)
1370
1371     def test_property_correlated_traffic(self):
1372         scenario_helper = ScenarioHelper('name1')
1373         scenario_helper.scenario_cfg = self.SCENARIO_CFG_1
1374         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1375
1376         self.assertIsNone(rfc2544_resource_helper._correlated_traffic)
1377         self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1378         self.assertTrue(rfc2544_resource_helper._correlated_traffic)
1379         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
1380         self.assertTrue(rfc2544_resource_helper.correlated_traffic)
1381
1382     def test_property_correlated_traffic_default(self):
1383         scenario_helper = ScenarioHelper('name1')
1384         scenario_helper.scenario_cfg = self.SCENARIO_CFG_2
1385         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
1386
1387         self.assertFalse(rfc2544_resource_helper.correlated_traffic)
1388
1389
1390 class TestSampleVNFDeployHelper(unittest.TestCase):
1391
1392     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1393     @mock.patch('subprocess.check_output')
1394     def test_deploy_vnfs_disabled(self, *_):
1395         vnfd_helper = mock.Mock()
1396         ssh_helper = mock.Mock()
1397         ssh_helper.join_bin_path.return_value = 'joined_path'
1398         ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1399         ssh_helper.put.return_value = None
1400         sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1401
1402         self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1403         sample_vnf_deploy_helper.DISABLE_DEPLOY = True
1404         self.assertEqual(ssh_helper.execute.call_count, 5)
1405         self.assertEqual(ssh_helper.put.call_count, 1)
1406
1407     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
1408     @mock.patch('subprocess.check_output')
1409     def test_deploy_vnfs(self, *args):
1410         vnfd_helper = mock.Mock()
1411         ssh_helper = mock.Mock()
1412         ssh_helper.join_bin_path.return_value = 'joined_path'
1413         ssh_helper.execute.return_value = 1, 'bad output', 'error output'
1414         ssh_helper.put.return_value = None
1415         sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1416         sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1417
1418         self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1419         self.assertEqual(ssh_helper.execute.call_count, 5)
1420         self.assertEqual(ssh_helper.put.call_count, 1)
1421
1422     @mock.patch('subprocess.check_output')
1423     def test_deploy_vnfs_early_success(self, *args):
1424         vnfd_helper = mock.Mock()
1425         ssh_helper = mock.Mock()
1426         ssh_helper.join_bin_path.return_value = 'joined_path'
1427         ssh_helper.execute.return_value = 0, 'output', ''
1428         ssh_helper.put.return_value = None
1429         sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper)
1430         sample_vnf_deploy_helper.DISABLE_DEPLOY = False
1431
1432         self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1'))
1433         self.assertEqual(ssh_helper.execute.call_count, 1)
1434         self.assertEqual(ssh_helper.put.call_count, 0)
1435
1436
1437 class TestScenarioHelper(unittest.TestCase):
1438
1439     def test_property_task_path(self):
1440         scenario_helper = ScenarioHelper('name1')
1441         scenario_helper.scenario_cfg = {
1442             'task_path': 'my_path',
1443         }
1444
1445         self.assertEqual(scenario_helper.task_path, 'my_path')
1446
1447     def test_property_nodes(self):
1448         nodes = ['node1', 'node2']
1449         scenario_helper = ScenarioHelper('name1')
1450         scenario_helper.scenario_cfg = {
1451             'nodes': nodes,
1452         }
1453
1454         self.assertEqual(scenario_helper.nodes, nodes)
1455
1456     def test_property_all_options(self):
1457         data = {
1458             'name1': {
1459                 'key3': 'value3',
1460             },
1461             'name2': {}
1462         }
1463         scenario_helper = ScenarioHelper('name1')
1464         scenario_helper.scenario_cfg = {
1465             'options': data,
1466         }
1467
1468         self.assertDictEqual(scenario_helper.all_options, data)
1469
1470     def test_property_options(self):
1471         data = {
1472             'key1': 'value1',
1473             'key2': 'value2',
1474         }
1475         scenario_helper = ScenarioHelper('name1')
1476         scenario_helper.scenario_cfg = {
1477             'options': {
1478                 'name1': data,
1479             },
1480         }
1481
1482         self.assertDictEqual(scenario_helper.options, data)
1483
1484     def test_property_vnf_cfg(self):
1485         scenario_helper = ScenarioHelper('name1')
1486         scenario_helper.scenario_cfg = {
1487             'options': {
1488                 'name1': {
1489                     'vnf_config': 'my_config',
1490                 },
1491             },
1492         }
1493
1494         self.assertEqual(scenario_helper.vnf_cfg, 'my_config')
1495
1496     def test_property_vnf_cfg_default(self):
1497         scenario_helper = ScenarioHelper('name1')
1498         scenario_helper.scenario_cfg = {
1499             'options': {
1500                 'name1': {},
1501             },
1502         }
1503
1504         self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG)
1505
1506     def test_property_topology(self):
1507         scenario_helper = ScenarioHelper('name1')
1508         scenario_helper.scenario_cfg = {
1509             'topology': 'my_topology',
1510         }
1511
1512         self.assertEqual(scenario_helper.topology, 'my_topology')
1513
1514
1515 class TestSampleVnf(unittest.TestCase):
1516
1517     VNFD_0 = {
1518         'short-name': 'VpeVnf',
1519         'vdu': [
1520             {
1521                 'routing_table': [
1522                     {
1523                         'network': '152.16.100.20',
1524                         'netmask': '255.255.255.0',
1525                         'gateway': '152.16.100.20',
1526                         'if': 'xe0'
1527                     },
1528                     {
1529                         'network': '152.16.40.20',
1530                         'netmask': '255.255.255.0',
1531                         'gateway': '152.16.40.20',
1532                         'if': 'xe1'
1533                     },
1534                 ],
1535                 'description': 'VPE approximation using DPDK',
1536                 'name': 'vpevnf-baremetal',
1537                 'nd_route_tbl': [
1538                     {
1539                         'network': '0064:ff9b:0:0:0:0:9810:6414',
1540                         'netmask': '112',
1541                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1542                         'if': 'xe0'
1543                     },
1544                     {
1545                         'network': '0064:ff9b:0:0:0:0:9810:2814',
1546                         'netmask': '112',
1547                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1548                         'if': 'xe1'
1549                     },
1550                 ],
1551                 'id': 'vpevnf-baremetal',
1552                 'external-interface': [
1553                     {
1554                         'virtual-interface': {
1555                             'dst_mac': '00:00:00:00:00:03',
1556                             'vpci': '0000:05:00.0',
1557                             'local_ip': '152.16.100.19',
1558                             'type': 'PCI-PASSTHROUGH',
1559                             'netmask': '255.255.255.0',
1560                             'dpdk_port_num': 0,
1561                             'bandwidth': '10 Gbps',
1562                             'dst_ip': '152.16.100.20',
1563                             'local_mac': '00:00:00:00:00:01'
1564                         },
1565                         'vnfd-connection-point-ref': 'xe0',
1566                         'name': 'xe0'
1567                     },
1568                     {
1569                         'virtual-interface': {
1570                             'dst_mac': '00:00:00:00:00:04',
1571                             'vpci': '0000:05:00.1',
1572                             'local_ip': '152.16.40.19',
1573                             'type': 'PCI-PASSTHROUGH',
1574                             'netmask': '255.255.255.0',
1575                             'dpdk_port_num': 1,
1576                             'bandwidth': '10 Gbps',
1577                             'dst_ip': '152.16.40.20',
1578                             'local_mac': '00:00:00:00:00:02'
1579                         },
1580                         'vnfd-connection-point-ref': 'xe1',
1581                         'name': 'xe1'
1582                     },
1583                 ],
1584             },
1585         ],
1586         'description': 'Vpe approximation using DPDK',
1587         'mgmt-interface': {
1588             'vdu-id': 'vpevnf-baremetal',
1589             'host': '1.1.1.1',
1590             'password': 'r00t',
1591             'user': 'root',
1592             'ip': '1.1.1.1'
1593         },
1594         'benchmark': {
1595             'kpi': [
1596                 'packets_in',
1597                 'packets_fwd',
1598                 'packets_dropped',
1599             ],
1600         },
1601         'connection-point': [
1602             {
1603                 'type': 'VPORT',
1604                 'name': 'xe0',
1605             },
1606             {
1607                 'type': 'VPORT',
1608                 'name': 'xe1',
1609             },
1610         ],
1611         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
1612     }
1613
1614     VNFD = {
1615         'vnfd:vnfd-catalog': {
1616             'vnfd': [
1617                 VNFD_0,
1618             ]
1619         }
1620     }
1621
1622     TRAFFIC_PROFILE = {
1623         "schema": "isb:traffic_profile:0.1",
1624         "name": "fixed",
1625         "description": "Fixed traffic profile to run UDP traffic",
1626         "traffic_profile": {
1627             "traffic_type": "FixedTraffic",
1628             "frame_rate": 100,  # pps
1629             "flow_number": 10,
1630             "frame_size": 64,
1631         },
1632     }
1633
1634     def test___init__(self):
1635         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
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 SetupEnvHelper, not subclass
1641         self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper)
1642
1643         # test the default resource helper is ResourceHelper, not subclass
1644         self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper)
1645
1646     def test___init___alt_types(self):
1647         class MySetupEnvHelper(SetupEnvHelper):
1648             pass
1649
1650         class MyResourceHelper(ResourceHelper):
1651             pass
1652
1653         sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
1654
1655         self.assertEqual(sample_vnf.name, 'vnf1')
1656         self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
1657
1658         # test the default setup helper is MySetupEnvHelper, not subclass
1659         self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper)
1660
1661         # test the default resource helper is MyResourceHelper, not subclass
1662         self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper)
1663
1664     def test__get_port0localip6(self):
1665         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1666         expected = '0064:ff9b:0:0:0:0:9810:6414'
1667         result = sample_vnf._get_port0localip6()
1668         self.assertEqual(result, expected)
1669
1670     def test__get_port1localip6(self):
1671         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1672         expected = '0064:ff9b:0:0:0:0:9810:2814'
1673         result = sample_vnf._get_port1localip6()
1674         self.assertEqual(result, expected)
1675
1676     def test__get_port0prefixip6(self):
1677         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1678         expected = '112'
1679         result = sample_vnf._get_port0prefixlen6()
1680         self.assertEqual(result, expected)
1681
1682     def test__get_port1prefixip6(self):
1683         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1684         expected = '112'
1685         result = sample_vnf._get_port1prefixlen6()
1686         self.assertEqual(result, expected)
1687
1688     def test__get_port0gateway6(self):
1689         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1690         expected = '0064:ff9b:0:0:0:0:9810:6414'
1691         result = sample_vnf._get_port0gateway6()
1692         self.assertEqual(result, expected)
1693
1694     def test__get_port1gateway6(self):
1695         sample_vnf = SampleVNF('vnf1', self.VNFD_0)
1696         expected = '0064:ff9b:0:0:0:0:9810:2814'
1697         result = sample_vnf._get_port1gateway6()
1698         self.assertEqual(result, expected)
1699
1700     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
1701     def test__start_vnf(self, *args):
1702         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1703         sample_vnf = SampleVNF('vnf1', vnfd)
1704         sample_vnf._run = mock.Mock()
1705
1706         self.assertIsNone(sample_vnf.queue_wrapper)
1707         self.assertIsNone(sample_vnf._vnf_process)
1708         self.assertIsNone(sample_vnf._start_vnf())
1709         self.assertIsNotNone(sample_vnf.queue_wrapper)
1710         self.assertIsNotNone(sample_vnf._vnf_process)
1711
1712     @mock.patch("yardstick.ssh.SSH")
1713     def test_instantiate(self, ssh):
1714         mock_ssh(ssh)
1715
1716         nodes = {
1717             'vnf1': 'name1',
1718             'vnf2': 'name2',
1719         }
1720
1721         context1 = mock.Mock()
1722         context1._get_server.return_value = None
1723         context2 = mock.Mock()
1724         context2._get_server.return_value = context2
1725
1726         try:
1727             Context.list.clear()
1728         except AttributeError:
1729             # clear() but works in Py2.7
1730             Context.list[:] = []
1731
1732         Context.list.extend([
1733             context1,
1734             context2,
1735         ])
1736
1737         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1738         sample_vnf = SampleVNF('vnf1', vnfd)
1739         sample_vnf.APP_NAME = 'sample1'
1740         sample_vnf._start_server = mock.Mock(return_value=0)
1741         sample_vnf._vnf_process = mock.MagicMock()
1742         sample_vnf._vnf_process._is_alive.return_value = 1
1743         sample_vnf.ssh_helper = mock.MagicMock()
1744         sample_vnf.deploy_helper = mock.MagicMock()
1745         sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1746         scenario_cfg = {
1747             'nodes': nodes,
1748         }
1749
1750         self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
1751         self.assertEqual(sample_vnf.nfvi_context, context2)
1752
1753     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1754     @mock.patch("yardstick.ssh.SSH")
1755     def test_wait_for_instantiate_empty_queue(self, ssh, *args):
1756         mock_ssh(ssh, exec_result=(1, "", ""))
1757
1758         queue_size_list = [
1759             0,
1760             1,
1761             0,
1762             1,
1763         ]
1764
1765         queue_get_list = [
1766             'some output',
1767             'pipeline> ',
1768         ]
1769
1770         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1771         sample_vnf = SampleVNF('vnf1', vnfd)
1772         sample_vnf.APP_NAME = 'sample1'
1773         sample_vnf.WAIT_TIME_FOR_SCRIPT = 0
1774         sample_vnf._start_server = mock.Mock(return_value=0)
1775         sample_vnf._vnf_process = mock.MagicMock()
1776         sample_vnf._vnf_process.exitcode = 0
1777         sample_vnf._vnf_process._is_alive.return_value = 1
1778         sample_vnf.queue_wrapper = mock.Mock()
1779         sample_vnf.q_out = mock.Mock()
1780         sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1781         sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1782         sample_vnf.ssh_helper = mock.MagicMock()
1783         sample_vnf.resource_helper.ssh_helper = mock.MagicMock()
1784         sample_vnf.resource_helper.start_collect = mock.MagicMock()
1785
1786         self.assertEqual(sample_vnf.wait_for_instantiate(), 0)
1787
1788     def test__build_ports(self):
1789         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1790         sample_vnf = SampleVNF('vnf1', vnfd)
1791
1792         self.assertIsNone(sample_vnf._build_ports())
1793         self.assertIsNotNone(sample_vnf.networks)
1794         self.assertIsNotNone(sample_vnf.uplink_ports)
1795         self.assertIsNotNone(sample_vnf.downlink_ports)
1796         self.assertIsNotNone(sample_vnf.my_ports)
1797
1798     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
1799     def test_vnf_execute_with_queue_data(self, *args):
1800         queue_size_list = [
1801             1,
1802             1,
1803             0,
1804         ]
1805
1806         queue_get_list = [
1807             'hello ',
1808             'world'
1809         ]
1810
1811         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1812         sample_vnf = SampleVNF('vnf1', vnfd)
1813         sample_vnf.APP_NAME = 'sample1'
1814         sample_vnf.q_out = mock.Mock()
1815         sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
1816         sample_vnf.q_out.get.side_effect = iter(queue_get_list)
1817
1818         self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world')
1819
1820     def test_terminate_without_vnf_process(self):
1821         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1822         sample_vnf = SampleVNF('vnf1', vnfd)
1823         sample_vnf.APP_NAME = 'sample1'
1824         sample_vnf.vnf_execute = mock.Mock()
1825         sample_vnf.ssh_helper = mock.Mock()
1826         sample_vnf._tear_down = mock.Mock()
1827         sample_vnf.resource_helper = mock.Mock()
1828
1829         self.assertIsNone(sample_vnf.terminate())
1830
1831     def test_get_stats(self):
1832         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1833         sample_vnf = SampleVNF('vnf1', vnfd)
1834         sample_vnf.APP_NAME = 'sample1'
1835         sample_vnf.APP_WORD = 'sample1'
1836         sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
1837
1838         self.assertEqual(sample_vnf.get_stats(), 'the stats')
1839
1840     def test_collect_kpi(self):
1841         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1842         sample_vnf = SampleVNF('vnf1', vnfd)
1843         sample_vnf.APP_NAME = 'sample1'
1844         sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1845         sample_vnf.COLLECT_MAP = {
1846             'k1': 3,
1847             'k2': 1,
1848             'k3': 2,
1849         }
1850         sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27')
1851         sample_vnf.resource_helper = mock.Mock()
1852         sample_vnf.resource_helper.collect_kpi.return_value = {}
1853
1854         expected = {
1855             'k1': 27,
1856             'k2': 34,
1857             'k3': 91,
1858             'collect_stats': {},
1859         }
1860         result = sample_vnf.collect_kpi()
1861         self.assertDictEqual(result, expected)
1862
1863     def test_collect_kpi_default(self):
1864         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1865         sample_vnf = SampleVNF('vnf1', vnfd)
1866         sample_vnf.APP_NAME = 'sample1'
1867         sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
1868         sample_vnf.get_stats = mock.Mock(return_value='')
1869
1870         expected = {
1871             'packets_in': 0,
1872             'packets_fwd': 0,
1873             'packets_dropped': 0,
1874         }
1875         result = sample_vnf.collect_kpi()
1876         self.assertDictEqual(result, expected)
1877
1878     def test_scale(self):
1879         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1880         sample_vnf = SampleVNF('vnf1', vnfd)
1881         self.assertRaises(y_exceptions.FunctionNotImplemented,
1882                           sample_vnf.scale)
1883
1884     def test__run(self):
1885         test_cmd = 'test cmd'
1886         run_kwargs = {'arg1': 'val1', 'arg2': 'val2'}
1887         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
1888         sample_vnf = SampleVNF('vnf1', vnfd)
1889         sample_vnf.ssh_helper = mock.Mock()
1890         sample_vnf.setup_helper = mock.Mock()
1891         with mock.patch.object(sample_vnf, '_build_config',
1892                                return_value=test_cmd), \
1893                 mock.patch.object(sample_vnf, '_build_run_kwargs'):
1894             sample_vnf.run_kwargs = run_kwargs
1895             sample_vnf._run()
1896         sample_vnf.ssh_helper.drop_connection.assert_called_once()
1897         sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd,
1898                                                           **run_kwargs)
1899         sample_vnf.setup_helper.kill_vnf.assert_called_once()
1900
1901
1902 class TestSampleVNFTrafficGen(unittest.TestCase):
1903
1904     VNFD_0 = {
1905         'short-name': 'VpeVnf',
1906         'vdu': [
1907             {
1908                 'routing_table': [
1909                     {
1910                         'network': '152.16.100.20',
1911                         'netmask': '255.255.255.0',
1912                         'gateway': '152.16.100.20',
1913                         'if': 'xe0'
1914                     },
1915                     {
1916                         'network': '152.16.40.20',
1917                         'netmask': '255.255.255.0',
1918                         'gateway': '152.16.40.20',
1919                         'if': 'xe1'
1920                     },
1921                 ],
1922                 'description': 'VPE approximation using DPDK',
1923                 'name': 'vpevnf-baremetal',
1924                 'nd_route_tbl': [
1925                     {
1926                         'network': '0064:ff9b:0:0:0:0:9810:6414',
1927                         'netmask': '112',
1928                         'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1929                         'if': 'xe0'
1930                     },
1931                     {
1932                         'network': '0064:ff9b:0:0:0:0:9810:2814',
1933                         'netmask': '112',
1934                         'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1935                         'if': 'xe1'
1936                     },
1937                 ],
1938                 'id': 'vpevnf-baremetal',
1939                 'external-interface': [
1940                     {
1941                         'virtual-interface': {
1942                             'dst_mac': '00:00:00:00:00:03',
1943                             'vpci': '0000:05:00.0',
1944                             'driver': 'i40e',
1945                             'local_ip': '152.16.100.19',
1946                             'type': 'PCI-PASSTHROUGH',
1947                             'netmask': '255.255.255.0',
1948                             'dpdk_port_num': 0,
1949                             'bandwidth': '10 Gbps',
1950                             'dst_ip': '152.16.100.20',
1951                             'local_mac': '00:00:00:00:00:01'
1952                         },
1953                         'vnfd-connection-point-ref': 'xe0',
1954                         'name': 'xe0'
1955                     },
1956                     {
1957                         'virtual-interface': {
1958                             'dst_mac': '00:00:00:00:00:04',
1959                             'vpci': '0000:05:00.1',
1960                             'driver': 'ixgbe',
1961                             'local_ip': '152.16.40.19',
1962                             'type': 'PCI-PASSTHROUGH',
1963                             'netmask': '255.255.255.0',
1964                             'dpdk_port_num': 1,
1965                             'bandwidth': '10 Gbps',
1966                             'dst_ip': '152.16.40.20',
1967                             'local_mac': '00:00:00:00:00:02'
1968                         },
1969                         'vnfd-connection-point-ref': 'xe1',
1970                         'name': 'xe1'
1971                     },
1972                 ],
1973             },
1974         ],
1975         'description': 'Vpe approximation using DPDK',
1976         'mgmt-interface': {
1977             'vdu-id': 'vpevnf-baremetal',
1978             'host': '1.1.1.1',
1979             'password': 'r00t',
1980             'user': 'root',
1981             'ip': '1.1.1.1'
1982         },
1983         'benchmark': {
1984             'kpi': [
1985                 'packets_in',
1986                 'packets_fwd',
1987                 'packets_dropped',
1988             ],
1989         },
1990         'connection-point': [
1991             {
1992                 'type': 'VPORT',
1993                 'name': 'xe0',
1994             },
1995             {
1996                 'type': 'VPORT',
1997                 'name': 'xe1',
1998             },
1999         ],
2000         'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'
2001     }
2002
2003     VNFD = {
2004         'vnfd:vnfd-catalog': {
2005             'vnfd': [
2006                 VNFD_0,
2007             ],
2008         },
2009     }
2010
2011     TRAFFIC_PROFILE = {
2012         "schema": "isb:traffic_profile:0.1",
2013         "name": "fixed",
2014         "description": "Fixed traffic profile to run UDP traffic",
2015         "traffic_profile": {
2016             "traffic_type": "FixedTraffic",
2017             "frame_rate": 100,  # pps
2018             "flow_number": 10,
2019             "frame_size": 64,
2020         },
2021     }
2022
2023     def test__check_status(self):
2024         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2025
2026         with self.assertRaises(NotImplementedError):
2027             sample_vnf_tg._check_status()
2028
2029     def test_listen_traffic(self):
2030         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2031
2032         sample_vnf_tg.listen_traffic(mock.Mock())
2033
2034     def test_verify_traffic(self):
2035         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2036
2037         sample_vnf_tg.verify_traffic(mock.Mock())
2038
2039     def test_terminate(self):
2040         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2041         sample_vnf_tg._traffic_process = mock.Mock()
2042         sample_vnf_tg._tg_process = mock.Mock()
2043
2044         sample_vnf_tg.terminate()
2045
2046     def test__wait_for_process(self):
2047         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2048         with mock.patch.object(sample_vnf_tg, '_check_status',
2049                                return_value=0) as mock_status, \
2050                 mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2051             mock_proc.is_alive.return_value = True
2052             mock_proc.exitcode = 234
2053             self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2054             mock_proc.is_alive.assert_called_once()
2055             mock_status.assert_called_once()
2056
2057     def test__wait_for_process_not_alive(self):
2058         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2059         with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
2060             mock_proc.is_alive.return_value = False
2061             self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process)
2062             mock_proc.is_alive.assert_called_once()
2063
2064     def test__wait_for_process_delayed(self):
2065         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2066         with mock.patch.object(sample_vnf_tg, '_check_status',
2067                                side_effect=[1, 0]) as mock_status, \
2068                 mock.patch.object(sample_vnf_tg,
2069                                   '_tg_process') as mock_proc:
2070             mock_proc.is_alive.return_value = True
2071             mock_proc.exitcode = 234
2072             self.assertEqual(sample_vnf_tg._wait_for_process(), 234)
2073             mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()])
2074             mock_status.assert_has_calls([mock.call(), mock.call()])
2075
2076     def test_scale(self):
2077         sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
2078         self.assertRaises(y_exceptions.FunctionNotImplemented,
2079                           sample_vnf_tg.scale)