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