Fixes Ceph PG calculation
[apex.git] / apex / tests / test_apex_overcloud_deploy.py
1 ##############################################################################
2 # Copyright (c) 2016 Dan Radez (dradez@redhat.com) (Red Hat)
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 import os
11 import sys
12 import unittest
13
14 from mock import patch
15 from mock import MagicMock
16 from mock import mock_open
17 from io import StringIO
18
19 from apex.common import constants as con
20 from apex.common.exceptions import ApexDeployException
21 from apex.overcloud.deploy import build_sdn_env_list
22 from apex.overcloud.deploy import create_deploy_cmd
23 from apex.overcloud.deploy import prep_image
24 from apex.overcloud.deploy import make_ssh_key
25 from apex.overcloud.deploy import prep_env
26 from apex.overcloud.deploy import generate_ceph_key
27 from apex.overcloud.deploy import prep_storage_env
28 from apex.overcloud.deploy import prep_sriov_env
29 from apex.overcloud.deploy import external_network_cmds
30 from apex.overcloud.deploy import create_congress_cmds
31 from apex.overcloud.deploy import SDN_FILE_MAP
32 from apex.overcloud.deploy import get_docker_sdn_file
33
34 from nose.tools import (
35     assert_regexp_matches,
36     assert_raises,
37     assert_in,
38     assert_not_in,
39     assert_greater,
40     assert_equal)
41
42
43 class TestOvercloudDeploy(unittest.TestCase):
44     @classmethod
45     def setup_class(cls):
46         """This method is run once for each class before any tests are run"""
47
48     @classmethod
49     def teardown_class(cls):
50         """This method is run once for each class _after_ all tests are run"""
51
52     def setup(self):
53         """This method is run once before _each_ test method is executed"""
54
55     def teardown(self):
56         """This method is run once after _each_ test method is executed"""
57
58     def test_build_sdn_env_list(self):
59         ds = {'sdn_controller': 'opendaylight'}
60         sdn_map = {'opendaylight': 'test'}
61         res = '/usr/share/openstack-tripleo-heat-templates/environments/test'
62         assert_equal(build_sdn_env_list(ds, sdn_map), [res])
63
64     def test_build_sdn_env_list_dict(self):
65         ds = {'opendaylight': True,
66               'sdn_controller': None}
67         sdn_map = {'opendaylight': {}}
68         assert_equal(build_sdn_env_list(ds, sdn_map), [])
69
70     def test_build_sdn_env_list_tuple(self):
71         ds = {'opendaylight': 'test',
72               'sdn_controller': None}
73         sdn_map = {'opendaylight': ('test', 'test')}
74         res = '/usr/share/openstack-tripleo-heat-templates/environments/test'
75         assert_equal(build_sdn_env_list(ds, sdn_map), [res])
76
77     def test_build_sdn_env_list_with_string(self):
78         ds = {'sdn_controller': 'opendaylight',
79               'sriov': 'xxx'}
80         prefix = '/usr/share/openstack-tripleo-heat-templates/environments'
81         res = [os.path.join(prefix, 'neutron-opendaylight.yaml'),
82                os.path.join(prefix, 'neutron-opendaylight-sriov.yaml')]
83         assert_equal(build_sdn_env_list(ds, SDN_FILE_MAP), res)
84
85     def test_build_sdn_env_list_with_default(self):
86         ds = {'sdn_controller': 'opendaylight',
87               'vpn': True}
88         prefix = '/usr/share/openstack-tripleo-heat-templates/environments'
89         res = [os.path.join(prefix, 'neutron-opendaylight.yaml'),
90                os.path.join(prefix, 'neutron-bgpvpn-opendaylight.yaml')]
91         assert_equal(build_sdn_env_list(ds, SDN_FILE_MAP), res)
92
93     @patch('apex.overcloud.deploy.prep_sriov_env')
94     @patch('apex.overcloud.deploy.prep_storage_env')
95     @patch('apex.overcloud.deploy.build_sdn_env_list')
96     @patch('builtins.open', mock_open())
97     def test_create_deploy_cmd(self, mock_sdn_list, mock_prep_storage,
98                                mock_prep_sriov):
99         mock_sdn_list.return_value = []
100         ds = {'deploy_options':
101               {'ha_enabled': True,
102                'congress': True,
103                'tacker': True,
104                'containers': False,
105                'barometer': True,
106                'ceph': False,
107                'sriov': False
108                },
109               'global_params': MagicMock()}
110
111         ns = {'ntp': ['ntp']}
112         inv = MagicMock()
113         inv.get_node_counts.return_value = (3, 2)
114         virt = True
115         result_cmd = create_deploy_cmd(ds, ns, inv, '/tmp', virt)
116         assert_in('--ntp-server ntp', result_cmd)
117         assert_in('enable_tacker.yaml', result_cmd)
118         assert_in('enable_congress.yaml', result_cmd)
119         assert_in('enable_barometer.yaml', result_cmd)
120         assert_in('virtual-environment.yaml', result_cmd)
121         assert_in('--control-scale 3', result_cmd)
122         assert_in('--compute-scale 2', result_cmd)
123
124     @patch('apex.overcloud.deploy.prep_sriov_env')
125     @patch('apex.overcloud.deploy.prep_storage_env')
126     @patch('builtins.open', mock_open())
127     def test_create_deploy_cmd_containers_sdn(self, mock_prep_storage,
128                                               mock_prep_sriov):
129         ds = {'deploy_options':
130               {'ha_enabled': True,
131                'congress': False,
132                'tacker': False,
133                'containers': True,
134                'barometer': False,
135                'ceph': True,
136                'sdn_controller': 'opendaylight',
137                'sriov': False,
138                'os_version': 'queens'
139                },
140               'global_params': MagicMock()}
141
142         ns = {'ntp': ['ntp']}
143         inv = MagicMock()
144         inv.get_node_counts.return_value = (3, 2)
145         virt = True
146         result_cmd = create_deploy_cmd(ds, ns, inv, '/tmp', virt)
147         assert_in('--ntp-server ntp', result_cmd)
148         assert_not_in('enable_tacker.yaml', result_cmd)
149         assert_not_in('enable_congress.yaml', result_cmd)
150         assert_not_in('enable_barometer.yaml', result_cmd)
151         assert_in('virtual-environment.yaml', result_cmd)
152         assert_in('--control-scale 3', result_cmd)
153         assert_in('--compute-scale 2', result_cmd)
154         assert_in('docker-images.yaml', result_cmd)
155         assert_in('sdn-images.yaml', result_cmd)
156         assert_in('/usr/share/openstack-tripleo-heat-templates/environments'
157                   '/docker.yaml', result_cmd)
158         assert_in('/usr/share/openstack-tripleo-heat-templates/environments/'
159                   'storage-environment.yaml', result_cmd)
160         assert_in('/usr/share/openstack-tripleo-heat-templates/environments'
161                   '/services-docker/neutron-opendaylight.yaml', result_cmd)
162         ds['deploy_options']['os_version'] = 'master'
163         result_cmd = create_deploy_cmd(ds, ns, inv, '/tmp', virt)
164         assert_in('/usr/share/openstack-tripleo-heat-templates/environments'
165                   '/services/neutron-opendaylight.yaml', result_cmd)
166
167     @patch('apex.overcloud.deploy.prep_sriov_env')
168     @patch('apex.overcloud.deploy.prep_storage_env')
169     @patch('apex.overcloud.deploy.build_sdn_env_list')
170     @patch('builtins.open', mock_open())
171     def test_create_deploy_cmd_no_ha_bm(self, mock_sdn_list,
172                                         mock_prep_storage, mock_prep_sriov):
173         mock_sdn_list.return_value = []
174         ds = {'deploy_options': MagicMock(),
175               'global_params': MagicMock()}
176         ds['global_params'].__getitem__.side_effect = \
177             lambda i: False if i == 'ha_enabled' else MagicMock()
178         ds['deploy_options'].__getitem__.side_effect = \
179             lambda i: 'master' if i == 'os_version' else MagicMock()
180         ns = {'ntp': ['ntp']}
181         inv = MagicMock()
182         inv.get_node_counts.return_value = (3, 2)
183         virt = False
184         result_cmd = create_deploy_cmd(ds, ns, inv, '/tmp', virt)
185         assert_in('--ntp-server ntp', result_cmd)
186         assert_in('--control-scale 1', result_cmd)
187         assert_in('--compute-scale 2', result_cmd)
188         assert_in('baremetal-environment.yaml', result_cmd)
189         assert_not_in('enable_tacker.yaml', result_cmd)
190         assert_not_in('enable_congress.yaml', result_cmd)
191         assert_not_in('enable_barometer.yaml', result_cmd)
192
193     @patch('apex.overcloud.deploy.prep_sriov_env')
194     @patch('apex.overcloud.deploy.prep_storage_env')
195     @patch('apex.overcloud.deploy.build_sdn_env_list')
196     def test_create_deploy_cmd_raises(self, mock_sdn_list, mock_prep_storage,
197                                       mock_prep_sriov):
198         mock_sdn_list.return_value = []
199         ds = {'deploy_options': MagicMock(),
200               'global_params': MagicMock()}
201         ds['deploy_options'].__getitem__.side_effect = \
202             lambda i: 'master' if i == 'os_version' else MagicMock()
203         ns = {}
204         inv = MagicMock()
205         inv.get_node_counts.return_value = (0, 0)
206         virt = False
207         assert_raises(ApexDeployException, create_deploy_cmd,
208                       ds, ns, inv, '/tmp', virt)
209
210     @patch('apex.overcloud.deploy.virt_utils')
211     @patch('apex.overcloud.deploy.shutil')
212     @patch('apex.overcloud.deploy.os.path')
213     @patch('builtins.open', mock_open())
214     def test_prep_image(self, mock_os_path, mock_shutil, mock_virt_utils):
215         ds_opts = {'dataplane': 'fdio',
216                    'sdn_controller': 'opendaylight',
217                    'odl_version': 'master',
218                    'sriov': False}
219         ds = {'deploy_options': MagicMock(),
220               'global_params': MagicMock()}
221         ds['deploy_options'].__getitem__.side_effect = \
222             lambda i: ds_opts.get(i, MagicMock())
223         ns = MagicMock()
224         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
225         mock_virt_utils.virt_customize.assert_called()
226
227     @patch('apex.overcloud.deploy.virt_utils')
228     @patch('apex.overcloud.deploy.shutil')
229     @patch('apex.overcloud.deploy.os.path')
230     @patch('builtins.open', mock_open())
231     def test_prep_image_sdn_false(self, mock_os_path, mock_shutil,
232                                   mock_virt_utils):
233         ds_opts = {'dataplane': 'fdio',
234                    'sdn_controller': False}
235         ds = {'deploy_options': MagicMock(),
236               'global_params': MagicMock()}
237         ds['deploy_options'].__getitem__.side_effect = \
238             lambda i: ds_opts.get(i, MagicMock())
239         ns = MagicMock()
240         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
241         mock_virt_utils.virt_customize.assert_called()
242
243     @patch('apex.overcloud.deploy.virt_utils')
244     @patch('apex.overcloud.deploy.shutil')
245     @patch('apex.overcloud.deploy.os.path')
246     @patch('builtins.open', mock_open())
247     def test_prep_image_sdn_odl(self, mock_os_path, mock_shutil,
248                                 mock_virt_utils):
249         ds_opts = {'dataplane': 'ovs',
250                    'sdn_controller': 'opendaylight',
251                    'odl_version': con.DEFAULT_ODL_VERSION,
252                    'odl_vpp_netvirt': True}
253         ds = {'deploy_options': MagicMock(),
254               'global_params': MagicMock()}
255         ds['deploy_options'].__getitem__.side_effect = \
256             lambda i: ds_opts.get(i, MagicMock())
257         ds['deploy_options'].__contains__.side_effect = \
258             lambda i: True if i in ds_opts else MagicMock()
259         ns = MagicMock()
260         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
261         mock_virt_utils.virt_customize.assert_called()
262
263     @patch('apex.overcloud.deploy.c_builder')
264     @patch('apex.overcloud.deploy.oc_builder')
265     @patch('apex.overcloud.deploy.virt_utils')
266     @patch('apex.overcloud.deploy.shutil')
267     @patch('apex.overcloud.deploy.os.path')
268     @patch('builtins.open', mock_open())
269     def test_prep_image_sdn_odl_upstream_containers_patches(
270             self, mock_os_path, mock_shutil, mock_virt_utils,
271             mock_oc_builder, mock_c_builder):
272         ds_opts = {'dataplane': 'ovs',
273                    'sdn_controller': 'opendaylight',
274                    'odl_version': con.DEFAULT_ODL_VERSION,
275                    'odl_vpp_netvirt': True}
276         ds = {'deploy_options': MagicMock(),
277               'global_params': MagicMock()}
278         ds['deploy_options'].__getitem__.side_effect = \
279             lambda i: ds_opts.get(i, MagicMock())
280         ds['deploy_options'].__contains__.side_effect = \
281             lambda i: True if i in ds_opts else MagicMock()
282         ns = MagicMock()
283         mock_c_builder.add_upstream_patches.return_value = ['nova-api']
284         patches = ['dummy_nova_patch']
285         rv = prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test',
286                         docker_tag='latest', patches=patches, upstream=True)
287         mock_oc_builder.inject_opendaylight.assert_called
288         mock_virt_utils.virt_customize.assert_called()
289         mock_c_builder.add_upstream_patches.assert_called
290         self.assertListEqual(sorted(rv), ['nova-api', 'opendaylight'])
291
292     @patch('apex.overcloud.deploy.virt_utils')
293     @patch('apex.overcloud.deploy.shutil')
294     @patch('apex.overcloud.deploy.os.path')
295     @patch('builtins.open', mock_open())
296     def test_prep_image_sdn_odl_not_def(self, mock_os_path,
297                                         mock_shutil, mock_virt_utils):
298         ds_opts = {'dataplane': 'ovs',
299                    'sdn_controller': 'opendaylight',
300                    'odl_version': 'uncommon'}
301         ds = {'deploy_options': MagicMock(),
302               'global_params': MagicMock()}
303         ds['deploy_options'].__getitem__.side_effect = \
304             lambda i: ds_opts.get(i, MagicMock())
305         ns = MagicMock()
306         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
307         mock_virt_utils.virt_customize.assert_called()
308
309     @patch('apex.overcloud.deploy.virt_utils')
310     @patch('apex.overcloud.deploy.shutil')
311     @patch('apex.overcloud.deploy.os.path')
312     @patch('builtins.open', mock_open())
313     def test_prep_image_sdn_ovn(self, mock_os_path, mock_shutil,
314                                 mock_virt_utils):
315         ds_opts = {'dataplane': 'ovs',
316                    'sdn_controller': 'ovn'}
317         ds = {'deploy_options': MagicMock(),
318               'global_params': MagicMock()}
319         ds['deploy_options'].__getitem__.side_effect = \
320             lambda i: ds_opts.get(i, MagicMock())
321         ns = MagicMock()
322         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
323         mock_virt_utils.virt_customize.assert_called()
324
325     @patch('apex.overcloud.deploy.os.path.isfile')
326     def test_prep_image_no_image(self, mock_isfile):
327         mock_isfile.return_value = False
328         assert_raises(ApexDeployException, prep_image,
329                       {}, {}, 'undercloud.qcow2', '/tmp')
330
331     def test_make_ssh_key(self):
332         priv, pub = make_ssh_key()
333         assert_in('-----BEGIN PRIVATE KEY-----', priv)
334         assert_in('ssh-rsa', pub)
335
336     @patch('apex.overcloud.deploy.fileinput')
337     @patch('apex.overcloud.deploy.shutil')
338     def test_prep_env(self, mock_shutil, mock_fileinput):
339         mock_fileinput.input.return_value = \
340             ['CloudDomain', 'replace_private_key', 'replace_public_key',
341              'opendaylight::vpp_routing_node', 'ControllerExtraConfig',
342              'NovaComputeExtraConfig', 'ComputeKernelArgs', 'HostCpusList',
343              'ComputeExtraConfigPre', 'resource_registry',
344              'NovaSchedulerDefaultFilters']
345         ds = {'deploy_options':
346               {'sdn_controller': 'opendaylight',
347                'odl_vpp_routing_node': 'test',
348                'dataplane': 'ovs_dpdk',
349                'sriov': 'xxx',
350                'performance': {'Compute': {'vpp': {'main-core': 'test',
351                                                    'corelist-workers': 'test'},
352                                            'ovs': {'dpdk_cores': 'test'},
353                                            'kernel': {'test': 'test'}},
354                                'Controller': {'vpp': 'test'}}}}
355         ns = {'domain_name': 'test.domain',
356               'networks':
357               {'tenant':
358                {'nic_mapping': {'controller':
359                                 {'members': ['tenant_nic']},
360                                 'compute':
361                                 {'members': ['tenant_nic']}}},
362                'external':
363                [{'nic_mapping': {'controller':
364                                  {'members': ['ext_nic']},
365                                  'compute':
366                                  {'members': ['ext_nic']}}}]}}
367         inv = None
368         try:
369             # Swap stdout
370             saved_stdout = sys.stdout
371             out = StringIO()
372             sys.stdout = out
373             # run test
374             prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
375             output = out.getvalue().strip()
376             assert_in('CloudDomain: test.domain', output)
377             assert_in('ssh-rsa', output)
378             assert_in('ComputeKernelArgs: \'test=test \'', output)
379             assert_in('fdio::vpp_cpu_main_core: \'test\'', output)
380         finally:
381             # put stdout back
382             sys.stdout = saved_stdout
383
384     @patch('apex.overcloud.deploy.fileinput')
385     @patch('apex.overcloud.deploy.shutil')
386     def test_prep_env_round_two(self, mock_shutil, mock_fileinput):
387         mock_fileinput.input.return_value = \
388             ['NeutronVPPAgentPhysnets']
389         ds = {'deploy_options':
390               {'sdn_controller': False,
391                'dataplane': 'fdio',
392                'sriov': 'xxx',
393                'performance': {'Compute': {},
394                                'Controller': {}}}}
395         ns = {'domain_name': 'test.domain',
396               'networks':
397               {'tenant':
398                {'nic_mapping': {'controller':
399                                 {'members': ['tenant_nic']},
400                                 'compute':
401                                 {'members': ['tenant_nic']}}},
402                'external':
403                [{'nic_mapping': {'controller':
404                                  {'members': ['ext_nic']},
405                                  'compute':
406                                  {'members': ['ext_nic']}}}]}}
407         inv = None
408         try:
409             # Swap stdout
410             saved_stdout = sys.stdout
411             out = StringIO()
412             sys.stdout = out
413             # run test
414             prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
415             output = out.getvalue().strip()
416             assert_in('NeutronVPPAgentPhysnets: '
417                       '\'datacentre:tenant_nic,external:tap0\'',
418                       output)
419             assert_in('NeutronVPPAgentPhysnets', output)
420         finally:
421             # put stdout back
422             sys.stdout = saved_stdout
423
424     @patch('apex.overcloud.deploy.fileinput')
425     @patch('apex.overcloud.deploy.shutil')
426     def test_prep_env_round_three(self, mock_shutil, mock_fileinput):
427         mock_fileinput.input.return_value = \
428             ['OS::TripleO::Services::NeutronDhcpAgent',
429              'NeutronDhcpAgentsPerNetwork', 'ComputeServices']
430         ds = {'deploy_options':
431               {'sdn_controller': 'opendaylight',
432                'dataplane': 'fdio',
433                'sriov': 'xxx',
434                'dvr': True}}
435         ns = {'domain_name': 'test.domain',
436               'networks':
437               {'tenant':
438                {'nic_mapping': {'controller':
439                                 {'members': ['tenant_nic']},
440                                 'compute':
441                                 {'members': ['tenant_nic']}}},
442                'external':
443                [{'nic_mapping': {'controller':
444                                  {'members': ['ext_nic']},
445                                  'compute':
446                                  {'members': ['ext_nic']}}}]}}
447         inv = MagicMock()
448         inv.get_node_counts.return_value = (3, 2)
449         try:
450             # Swap stdout
451             saved_stdout = sys.stdout
452             out = StringIO()
453             sys.stdout = out
454             # run test
455             prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
456             output = out.getvalue().strip()
457             assert_in('NeutronDhcpAgentsPerNetwork: 2', output)
458         finally:
459             # put stdout back
460             sys.stdout = saved_stdout
461
462     def test_generate_ceph_key(self):
463         assert_equal(len(generate_ceph_key()), 40)
464
465     @patch('apex.overcloud.deploy.generate_ceph_key')
466     @patch('apex.overcloud.deploy.fileinput')
467     @patch('apex.overcloud.deploy.os.path.isfile')
468     @patch('builtins.open', mock_open())
469     def test_prep_storage_env(self, mock_isfile, mock_fileinput,
470                               mock_ceph_key):
471         mock_fileinput.input.return_value = \
472             ['CephClusterFSID', 'CephMonKey', 'CephAdminKey', 'random_key']
473         ds = {'deploy_options': {
474             'ceph_device': '/dev/sdx',
475             'containers': False
476         }}
477         ns = {}
478         prep_storage_env(ds, ns, virtual=False, tmp_dir='/tmp')
479
480     @patch('apex.overcloud.deploy.utils.edit_tht_env')
481     @patch('apex.overcloud.deploy.generate_ceph_key')
482     @patch('apex.overcloud.deploy.fileinput')
483     @patch('apex.overcloud.deploy.os.path.isfile')
484     @patch('builtins.open', mock_open())
485     def test_prep_storage_env_containers(self, mock_isfile, mock_fileinput,
486                                          mock_ceph_key, mock_edit_tht):
487         mock_fileinput.input.return_value = \
488             ['CephClusterFSID', 'CephMonKey', 'CephAdminKey', 'random_key']
489         ds = {'deploy_options': {
490               'ceph_device': '/dev/sdx',
491               'containers': True,
492               'os_version': 'master'
493               }, 'global_params': {'ha_enabled': False}}
494         ns = {'networks': {con.ADMIN_NETWORK: {'installer_vm':
495                                                {'ip': '192.0.2.1'}}}
496               }
497         prep_storage_env(ds, ns, virtual=True, tmp_dir='/tmp')
498         ceph_params = {
499             'DockerCephDaemonImage':
500                 '192.0.2.1:8787/ceph/daemon:tag-build-master-luminous-centos'
501                 '-7',
502             'CephPoolDefaultSize': 2,
503             'CephAnsibleExtraConfig': {
504                 'centos_package_dependencies': [],
505                 'ceph_osd_docker_memory_limit': '1g',
506                 'ceph_mds_docker_memory_limit': '1g'
507             },
508             'CephPoolDefaultPgNum': 32,
509             'CephAnsibleDisksConfig': {
510                 'devices': ['/dev/sdx'],
511                 'journal_size': 512,
512                 'osd_scenario': 'collocated'
513             }
514         }
515         mock_edit_tht.assert_called_with('/tmp/storage-environment.yaml',
516                                          'parameter_defaults',
517                                          ceph_params)
518
519     @patch('apex.overcloud.deploy.os.path.isfile')
520     @patch('builtins.open', mock_open())
521     def test_prep_storage_env_raises(self, mock_isfile):
522         mock_isfile.return_value = False
523         ds = {'deploy_options': MagicMock()}
524         ns = {}
525         assert_raises(ApexDeployException, prep_storage_env, ds,
526                       ns, virtual=False, tmp_dir='/tmp')
527
528     @patch('apex.overcloud.deploy.generate_ceph_key')
529     @patch('apex.overcloud.deploy.fileinput')
530     @patch('apex.overcloud.deploy.os.path.isfile')
531     @patch('builtins.open', mock_open())
532     def test_prep_sriov_env(self, mock_isfile, mock_fileinput, mock_ceph_key):
533         ds = {'deploy_options':
534               {'sdn_controller': 'opendaylight',
535                'sriov': 'xxx'}}
536         try:
537             # Swap stdout
538             saved_stdout = sys.stdout
539             out = StringIO()
540             sys.stdout = out
541             # Run tests
542             mock_fileinput.input.return_value = \
543                 ['#  NovaSchedulerDefaultFilters',
544                  '#  NovaSchedulerAvailableFilters',
545                  '#NeutronPhysicalDevMappings: "datacentre:ens20f2"',
546                  '#NeutronSriovNumVFs: \"ens20f2:5\"',
547                  '#NovaPCIPassthrough:',
548                  '#  - devname: \"ens20f2\"',
549                  '#    physical_network: \"datacentre\"']
550             prep_sriov_env(ds, '/tmp')
551             output = out.getvalue().strip()
552             assert_in('NovaSchedulerDefaultFilters', output)
553             assert_in('NovaSchedulerAvailableFilters', output)
554             assert_in('NeutronPhysicalDevMappings: \"nfv_sriov:xxx\"', output)
555             assert_in('NeutronSriovNumVFs: \"xxx:8\"', output)
556             assert_in('NovaPCIPassthrough:', output)
557             assert_in('- devname: \"xxx\"', output)
558             assert_in('physical_network: \"nfv_sriov\"', output)
559         finally:
560             # put stdout back
561             sys.stdout = saved_stdout
562
563     @patch('apex.overcloud.deploy.os.path.isfile')
564     @patch('builtins.open', mock_open())
565     def test_prep_sriov_env_raises(self, mock_isfile):
566         ds_opts = {'sriov': True}
567         ds = {'deploy_options': MagicMock()}
568         ds['deploy_options'].__getitem__.side_effect = \
569             lambda i: ds_opts.get(i, MagicMock())
570         mock_isfile.return_value = False
571         ds = {'deploy_options': MagicMock()}
572         assert_raises(ApexDeployException, prep_sriov_env, ds, '/tmp')
573
574     def test_external_network_cmds(self):
575         ds = {'deploy_options':
576               {'sdn_controller': 'opendaylight',
577                'dataplane': 'ovs'}}
578
579         cidr = MagicMock()
580         cidr.version = 6
581         ns_dict = {'networks':
582                    {'external': [{'floating_ip_range': (0, 1),
583                                   'nic_mapping':
584                                   {'compute': {'vlan': 'native'}},
585                                   'gateway': 'gw',
586                                   'cidr': cidr}]}}
587         ns = MagicMock()
588         ns.enabled_network_list = ['external']
589         ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
590         cmds = ' '.join(external_network_cmds(ns, ds))
591         assert_in('--external', cmds)
592         assert_in('--allocation-pool start=0,end=1', cmds)
593         assert_in('--gateway gw', cmds)
594         assert_in('--network external', cmds)
595         assert_in('--provider-physical-network datacentre', cmds)
596
597     def test_external_network_cmds_nosdn_fdio(self):
598         ds = {'deploy_options':
599               {'sdn_controller': False,
600                'dataplane': 'fdio'}}
601
602         cidr = MagicMock()
603         cidr.version = 6
604         ns_dict = {'networks':
605                    {'external': [{'floating_ip_range': (0, 1),
606                                   'nic_mapping':
607                                   {'compute': {'vlan': 'native'}},
608                                   'gateway': 'gw',
609                                   'cidr': cidr}]}}
610         ns = MagicMock()
611         ns.enabled_network_list = ['external']
612         ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
613         cmds = ' '.join(external_network_cmds(ns, ds))
614         assert_in('--external', cmds)
615         assert_in('--allocation-pool start=0,end=1', cmds)
616         assert_in('--gateway gw', cmds)
617         assert_in('--network external', cmds)
618         assert_in('--provider-physical-network external', cmds)
619
620     def test_external_network_cmds_no_ext(self):
621         ds = {'deploy_options':
622               {'sdn_controller': 'opendaylight',
623                'dataplane': 'ovs'}}
624
625         cidr = MagicMock()
626         cidr.version = 6
627         ns_dict = {'apex':
628                    {'networks':
629                     {'admin':
630                      {'introspection_range': (0, 1),
631                       'nic_mapping':
632                       {'compute': {'vlan': '123'}},
633                       'gateway': 'gw',
634                       'cidr': cidr}}}}
635         ns = MagicMock()
636         ns.enabled_network_list = ['admin']
637         ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
638         cmds = ' '.join(external_network_cmds(ns, ds))
639         assert_in('--external', cmds)
640         assert_in('--allocation-pool start=0,end=1', cmds)
641         assert_in('--network external', cmds)
642         assert_in('--provider-network-type vlan', cmds)
643
644     @patch('apex.overcloud.deploy.parsers')
645     def test_create_congress_cmds(self, mock_parsers):
646         assert_greater(len(create_congress_cmds('overcloud_file')), 0)
647
648     @patch('apex.overcloud.deploy.parsers.parse_overcloudrc')
649     def test_create_congress_cmds_raises(self, mock_parsers):
650         mock_parsers.return_value.__getitem__.side_effect = KeyError()
651         assert_raises(KeyError, create_congress_cmds, 'overcloud_file')
652
653     def test_get_docker_sdn_file(self):
654         ds_opts = {'ha_enabled': True,
655                    'congress': True,
656                    'tacker': True,
657                    'containers': False,
658                    'barometer': True,
659                    'ceph': False,
660                    'sdn_controller': 'opendaylight',
661                    'os_version': 'queens'
662                    }
663         output = get_docker_sdn_file(ds_opts)
664         self.assertEqual(output,
665                          ('/usr/share/openstack-tripleo-heat-templates'
666                           '/environments/services-docker/neutron-opendaylight'
667                           '.yaml')
668                          )