Deprecates the use of '--upstream' argument
[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.builders.overcloud_builder.inject_opendaylight')
211     @patch('apex.overcloud.deploy.virt_utils')
212     @patch('apex.overcloud.deploy.shutil')
213     @patch('apex.overcloud.deploy.os.path')
214     @patch('builtins.open', mock_open())
215     def test_prep_image(self, mock_os_path, mock_shutil, mock_virt_utils,
216                         mock_inject_odl):
217         ds_opts = {'dataplane': 'fdio',
218                    'sdn_controller': 'opendaylight',
219                    'odl_version': 'master',
220                    'sriov': False}
221         ds = {'deploy_options': MagicMock(),
222               'global_params': MagicMock()}
223         ds['deploy_options'].__getitem__.side_effect = \
224             lambda i: ds_opts.get(i, MagicMock())
225         ns = MagicMock()
226         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
227         mock_virt_utils.virt_customize.assert_called()
228         mock_inject_odl.assert_called()
229
230     @patch('apex.overcloud.deploy.virt_utils')
231     @patch('apex.overcloud.deploy.shutil')
232     @patch('apex.overcloud.deploy.os.path')
233     @patch('builtins.open', mock_open())
234     def test_prep_image_sdn_false(self, mock_os_path, mock_shutil,
235                                   mock_virt_utils):
236         ds_opts = {'dataplane': 'fdio',
237                    'sdn_controller': False}
238         ds = {'deploy_options': MagicMock(),
239               'global_params': MagicMock()}
240         ds['deploy_options'].__getitem__.side_effect = \
241             lambda i: ds_opts.get(i, MagicMock())
242         ns = MagicMock()
243         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
244         mock_virt_utils.virt_customize.assert_called()
245
246     @patch('apex.builders.overcloud_builder.inject_opendaylight')
247     @patch('apex.overcloud.deploy.virt_utils')
248     @patch('apex.overcloud.deploy.shutil')
249     @patch('apex.overcloud.deploy.os.path')
250     @patch('builtins.open', mock_open())
251     def test_prep_image_sdn_odl(self, mock_os_path, mock_shutil,
252                                 mock_virt_utils, mock_inject_odl):
253         ds_opts = {'dataplane': 'ovs',
254                    'sdn_controller': 'opendaylight',
255                    'odl_version': con.DEFAULT_ODL_VERSION,
256                    'odl_vpp_netvirt': True}
257         ds = {'deploy_options': MagicMock(),
258               'global_params': MagicMock()}
259         ds['deploy_options'].__getitem__.side_effect = \
260             lambda i: ds_opts.get(i, MagicMock())
261         ds['deploy_options'].__contains__.side_effect = \
262             lambda i: True if i in ds_opts else MagicMock()
263         ns = MagicMock()
264         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
265         mock_virt_utils.virt_customize.assert_called()
266         mock_inject_odl.assert_called()
267
268     @patch('apex.overcloud.deploy.c_builder')
269     @patch('apex.overcloud.deploy.oc_builder')
270     @patch('apex.overcloud.deploy.virt_utils')
271     @patch('apex.overcloud.deploy.shutil')
272     @patch('apex.overcloud.deploy.os.path')
273     @patch('builtins.open', mock_open())
274     def test_prep_image_sdn_odl_upstream_containers_patches(
275             self, mock_os_path, mock_shutil, mock_virt_utils,
276             mock_oc_builder, mock_c_builder):
277         ds_opts = {'dataplane': 'ovs',
278                    'sdn_controller': 'opendaylight',
279                    'odl_version': con.DEFAULT_ODL_VERSION,
280                    'odl_vpp_netvirt': True}
281         ds = {'deploy_options': MagicMock(),
282               'global_params': MagicMock()}
283         ds['deploy_options'].__getitem__.side_effect = \
284             lambda i: ds_opts.get(i, MagicMock())
285         ds['deploy_options'].__contains__.side_effect = \
286             lambda i: True if i in ds_opts else MagicMock()
287         ns = MagicMock()
288         mock_c_builder.add_upstream_patches.return_value = ['nova-api']
289         patches = ['dummy_nova_patch']
290         rv = prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test',
291                         docker_tag='latest', patches=patches)
292         mock_oc_builder.inject_opendaylight.assert_called()
293         mock_virt_utils.virt_customize.assert_called()
294         mock_c_builder.add_upstream_patches.assert_called()
295         self.assertListEqual(sorted(rv), ['nova-api', 'opendaylight'])
296
297     @patch('apex.overcloud.deploy.oc_builder')
298     @patch('apex.overcloud.deploy.virt_utils')
299     @patch('apex.overcloud.deploy.shutil')
300     @patch('apex.overcloud.deploy.os.path')
301     @patch('builtins.open', mock_open())
302     def test_prep_image_sdn_odl_not_def(self, mock_os_path,
303                                         mock_shutil, mock_virt_utils,
304                                         mock_oc_builder):
305         ds_opts = {'dataplane': 'ovs',
306                    'sdn_controller': 'opendaylight',
307                    'odl_version': 'uncommon'}
308         ds = {'deploy_options': MagicMock(),
309               'global_params': MagicMock()}
310         ds['deploy_options'].__getitem__.side_effect = \
311             lambda i: ds_opts.get(i, MagicMock())
312         ns = MagicMock()
313         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
314         mock_virt_utils.virt_customize.assert_called()
315         mock_oc_builder.inject_opendaylight.assert_called()
316
317     @patch('apex.overcloud.deploy.virt_utils')
318     @patch('apex.overcloud.deploy.shutil')
319     @patch('apex.overcloud.deploy.os.path')
320     @patch('builtins.open', mock_open())
321     def test_prep_image_sdn_ovn(self, mock_os_path, mock_shutil,
322                                 mock_virt_utils):
323         ds_opts = {'dataplane': 'ovs',
324                    'sdn_controller': 'ovn'}
325         ds = {'deploy_options': MagicMock(),
326               'global_params': MagicMock()}
327         ds['deploy_options'].__getitem__.side_effect = \
328             lambda i: ds_opts.get(i, MagicMock())
329         ns = MagicMock()
330         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
331         mock_virt_utils.virt_customize.assert_called()
332
333     @patch('apex.overcloud.deploy.os.path.isfile')
334     def test_prep_image_no_image(self, mock_isfile):
335         mock_isfile.return_value = False
336         assert_raises(ApexDeployException, prep_image,
337                       {}, {}, 'undercloud.qcow2', '/tmp')
338
339     def test_make_ssh_key(self):
340         priv, pub = make_ssh_key()
341         assert_in('-----BEGIN PRIVATE KEY-----', priv)
342         assert_in('ssh-rsa', pub)
343
344     @patch('apex.overcloud.deploy.fileinput')
345     @patch('apex.overcloud.deploy.shutil')
346     def test_prep_env(self, mock_shutil, mock_fileinput):
347         mock_fileinput.input.return_value = \
348             ['CloudDomain', 'replace_private_key', 'replace_public_key',
349              'opendaylight::vpp_routing_node', 'ControllerExtraConfig',
350              'NovaComputeExtraConfig', 'ComputeKernelArgs', 'HostCpusList',
351              'ComputeExtraConfigPre', 'resource_registry',
352              'NovaSchedulerDefaultFilters']
353         ds = {'deploy_options':
354               {'sdn_controller': 'opendaylight',
355                'odl_vpp_routing_node': 'test',
356                'dataplane': 'ovs_dpdk',
357                'sriov': 'xxx',
358                'performance': {'Compute': {'vpp': {'main-core': 'test',
359                                                    'corelist-workers': 'test'},
360                                            'ovs': {'dpdk_cores': 'test'},
361                                            'kernel': {'test': 'test'}},
362                                'Controller': {'vpp': 'test'}}}}
363         ns = {'domain_name': 'test.domain',
364               'networks':
365               {'tenant':
366                {'nic_mapping': {'controller':
367                                 {'members': ['tenant_nic']},
368                                 'compute':
369                                 {'members': ['tenant_nic']}}},
370                'external':
371                [{'nic_mapping': {'controller':
372                                  {'members': ['ext_nic']},
373                                  'compute':
374                                  {'members': ['ext_nic']}}}]}}
375         inv = None
376         try:
377             # Swap stdout
378             saved_stdout = sys.stdout
379             out = StringIO()
380             sys.stdout = out
381             # run test
382             prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
383             output = out.getvalue().strip()
384             assert_in('CloudDomain: test.domain', output)
385             assert_in('ssh-rsa', output)
386             assert_in('ComputeKernelArgs: \'test=test \'', output)
387             assert_in('fdio::vpp_cpu_main_core: \'test\'', output)
388         finally:
389             # put stdout back
390             sys.stdout = saved_stdout
391
392     @patch('apex.overcloud.deploy.fileinput')
393     @patch('apex.overcloud.deploy.shutil')
394     def test_prep_env_round_two(self, mock_shutil, mock_fileinput):
395         mock_fileinput.input.return_value = \
396             ['NeutronVPPAgentPhysnets']
397         ds = {'deploy_options':
398               {'sdn_controller': False,
399                'dataplane': 'fdio',
400                'sriov': 'xxx',
401                'performance': {'Compute': {},
402                                'Controller': {}}}}
403         ns = {'domain_name': 'test.domain',
404               'networks':
405               {'tenant':
406                {'nic_mapping': {'controller':
407                                 {'members': ['tenant_nic']},
408                                 'compute':
409                                 {'members': ['tenant_nic']}}},
410                'external':
411                [{'nic_mapping': {'controller':
412                                  {'members': ['ext_nic']},
413                                  'compute':
414                                  {'members': ['ext_nic']}}}]}}
415         inv = None
416         try:
417             # Swap stdout
418             saved_stdout = sys.stdout
419             out = StringIO()
420             sys.stdout = out
421             # run test
422             prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
423             output = out.getvalue().strip()
424             assert_in('NeutronVPPAgentPhysnets: '
425                       '\'datacentre:tenant_nic,external:tap0\'',
426                       output)
427             assert_in('NeutronVPPAgentPhysnets', output)
428         finally:
429             # put stdout back
430             sys.stdout = saved_stdout
431
432     @patch('apex.overcloud.deploy.fileinput')
433     @patch('apex.overcloud.deploy.shutil')
434     def test_prep_env_round_three(self, mock_shutil, mock_fileinput):
435         mock_fileinput.input.return_value = \
436             ['OS::TripleO::Services::NeutronDhcpAgent',
437              'NeutronDhcpAgentsPerNetwork', 'ComputeServices']
438         ds = {'deploy_options':
439               {'sdn_controller': 'opendaylight',
440                'dataplane': 'fdio',
441                'sriov': 'xxx',
442                'dvr': True}}
443         ns = {'domain_name': 'test.domain',
444               'networks':
445               {'tenant':
446                {'nic_mapping': {'controller':
447                                 {'members': ['tenant_nic']},
448                                 'compute':
449                                 {'members': ['tenant_nic']}}},
450                'external':
451                [{'nic_mapping': {'controller':
452                                  {'members': ['ext_nic']},
453                                  'compute':
454                                  {'members': ['ext_nic']}}}]}}
455         inv = MagicMock()
456         inv.get_node_counts.return_value = (3, 2)
457         try:
458             # Swap stdout
459             saved_stdout = sys.stdout
460             out = StringIO()
461             sys.stdout = out
462             # run test
463             prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
464             output = out.getvalue().strip()
465             assert_in('NeutronDhcpAgentsPerNetwork: 2', output)
466         finally:
467             # put stdout back
468             sys.stdout = saved_stdout
469
470     def test_generate_ceph_key(self):
471         assert_equal(len(generate_ceph_key()), 40)
472
473     @patch('apex.overcloud.deploy.generate_ceph_key')
474     @patch('apex.overcloud.deploy.fileinput')
475     @patch('apex.overcloud.deploy.os.path.isfile')
476     @patch('builtins.open', mock_open())
477     def test_prep_storage_env(self, mock_isfile, mock_fileinput,
478                               mock_ceph_key):
479         mock_fileinput.input.return_value = \
480             ['CephClusterFSID', 'CephMonKey', 'CephAdminKey', 'random_key']
481         ds = {'deploy_options': {
482             'ceph_device': '/dev/sdx',
483             'containers': False
484         }}
485         ns = {}
486         prep_storage_env(ds, ns, virtual=False, tmp_dir='/tmp')
487
488     @patch('apex.overcloud.deploy.utils.edit_tht_env')
489     @patch('apex.overcloud.deploy.generate_ceph_key')
490     @patch('apex.overcloud.deploy.fileinput')
491     @patch('apex.overcloud.deploy.os.path.isfile')
492     @patch('builtins.open', mock_open())
493     def test_prep_storage_env_containers(self, mock_isfile, mock_fileinput,
494                                          mock_ceph_key, mock_edit_tht):
495         mock_fileinput.input.return_value = \
496             ['CephClusterFSID', 'CephMonKey', 'CephAdminKey', 'random_key']
497         ds = {'deploy_options': {
498               'ceph_device': '/dev/sdx',
499               'containers': True,
500               'os_version': 'master'
501               }, 'global_params': {'ha_enabled': False}}
502         ns = {'networks': {con.ADMIN_NETWORK: {'installer_vm':
503                                                {'ip': '192.0.2.1'}}}
504               }
505         prep_storage_env(ds, ns, virtual=True, tmp_dir='/tmp')
506         ceph_params = {
507             'DockerCephDaemonImage':
508                 '192.0.2.1:8787/ceph/daemon:tag-build-master-luminous-centos'
509                 '-7',
510             'CephPoolDefaultSize': 2,
511             'CephAnsibleExtraConfig': {
512                 'centos_package_dependencies': [],
513                 'ceph_osd_docker_memory_limit': '1g',
514                 'ceph_mds_docker_memory_limit': '1g'
515             },
516             'CephPoolDefaultPgNum': 32,
517             'CephAnsibleDisksConfig': {
518                 'devices': ['/dev/sdx'],
519                 'journal_size': 512,
520                 'osd_scenario': 'collocated'
521             }
522         }
523         mock_edit_tht.assert_called_with('/tmp/storage-environment.yaml',
524                                          'parameter_defaults',
525                                          ceph_params)
526
527     @patch('apex.overcloud.deploy.os.path.isfile')
528     @patch('builtins.open', mock_open())
529     def test_prep_storage_env_raises(self, mock_isfile):
530         mock_isfile.return_value = False
531         ds = {'deploy_options': MagicMock()}
532         ns = {}
533         assert_raises(ApexDeployException, prep_storage_env, ds,
534                       ns, virtual=False, tmp_dir='/tmp')
535
536     @patch('apex.overcloud.deploy.generate_ceph_key')
537     @patch('apex.overcloud.deploy.fileinput')
538     @patch('apex.overcloud.deploy.os.path.isfile')
539     @patch('builtins.open', mock_open())
540     def test_prep_sriov_env(self, mock_isfile, mock_fileinput, mock_ceph_key):
541         ds = {'deploy_options':
542               {'sdn_controller': 'opendaylight',
543                'sriov': 'xxx'}}
544         try:
545             # Swap stdout
546             saved_stdout = sys.stdout
547             out = StringIO()
548             sys.stdout = out
549             # Run tests
550             mock_fileinput.input.return_value = \
551                 ['#  NovaSchedulerDefaultFilters',
552                  '#  NovaSchedulerAvailableFilters',
553                  '#NeutronPhysicalDevMappings: "datacentre:ens20f2"',
554                  '#NeutronSriovNumVFs: \"ens20f2:5\"',
555                  '#NovaPCIPassthrough:',
556                  '#  - devname: \"ens20f2\"',
557                  '#    physical_network: \"datacentre\"']
558             prep_sriov_env(ds, '/tmp')
559             output = out.getvalue().strip()
560             assert_in('NovaSchedulerDefaultFilters', output)
561             assert_in('NovaSchedulerAvailableFilters', output)
562             assert_in('NeutronPhysicalDevMappings: \"nfv_sriov:xxx\"', output)
563             assert_in('NeutronSriovNumVFs: \"xxx:8\"', output)
564             assert_in('NovaPCIPassthrough:', output)
565             assert_in('- devname: \"xxx\"', output)
566             assert_in('physical_network: \"nfv_sriov\"', output)
567         finally:
568             # put stdout back
569             sys.stdout = saved_stdout
570
571     @patch('apex.overcloud.deploy.os.path.isfile')
572     @patch('builtins.open', mock_open())
573     def test_prep_sriov_env_raises(self, mock_isfile):
574         ds_opts = {'sriov': True}
575         ds = {'deploy_options': MagicMock()}
576         ds['deploy_options'].__getitem__.side_effect = \
577             lambda i: ds_opts.get(i, MagicMock())
578         mock_isfile.return_value = False
579         ds = {'deploy_options': MagicMock()}
580         assert_raises(ApexDeployException, prep_sriov_env, ds, '/tmp')
581
582     def test_external_network_cmds(self):
583         ds = {'deploy_options':
584               {'sdn_controller': 'opendaylight',
585                'dataplane': 'ovs'}}
586
587         cidr = MagicMock()
588         cidr.version = 6
589         ns_dict = {'networks':
590                    {'external': [{'floating_ip_range': (0, 1),
591                                   'nic_mapping':
592                                   {'compute': {'vlan': 'native'}},
593                                   'gateway': 'gw',
594                                   'cidr': cidr}]}}
595         ns = MagicMock()
596         ns.enabled_network_list = ['external']
597         ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
598         cmds = ' '.join(external_network_cmds(ns, ds))
599         assert_in('--external', cmds)
600         assert_in('--allocation-pool start=0,end=1', cmds)
601         assert_in('--gateway gw', cmds)
602         assert_in('--network external', cmds)
603         assert_in('--provider-physical-network datacentre', cmds)
604
605     def test_external_network_cmds_nosdn_fdio(self):
606         ds = {'deploy_options':
607               {'sdn_controller': False,
608                'dataplane': 'fdio'}}
609
610         cidr = MagicMock()
611         cidr.version = 6
612         ns_dict = {'networks':
613                    {'external': [{'floating_ip_range': (0, 1),
614                                   'nic_mapping':
615                                   {'compute': {'vlan': 'native'}},
616                                   'gateway': 'gw',
617                                   'cidr': cidr}]}}
618         ns = MagicMock()
619         ns.enabled_network_list = ['external']
620         ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
621         cmds = ' '.join(external_network_cmds(ns, ds))
622         assert_in('--external', cmds)
623         assert_in('--allocation-pool start=0,end=1', cmds)
624         assert_in('--gateway gw', cmds)
625         assert_in('--network external', cmds)
626         assert_in('--provider-physical-network external', cmds)
627
628     def test_external_network_cmds_no_ext(self):
629         ds = {'deploy_options':
630               {'sdn_controller': 'opendaylight',
631                'dataplane': 'ovs'}}
632
633         cidr = MagicMock()
634         cidr.version = 6
635         ns_dict = {'apex':
636                    {'networks':
637                     {'admin':
638                      {'introspection_range': (0, 1),
639                       'nic_mapping':
640                       {'compute': {'vlan': '123'}},
641                       'gateway': 'gw',
642                       'cidr': cidr}}}}
643         ns = MagicMock()
644         ns.enabled_network_list = ['admin']
645         ns.__getitem__.side_effect = lambda i: ns_dict.get(i, MagicMock())
646         cmds = ' '.join(external_network_cmds(ns, ds))
647         assert_in('--external', cmds)
648         assert_in('--allocation-pool start=0,end=1', cmds)
649         assert_in('--network external', cmds)
650         assert_in('--provider-network-type vlan', cmds)
651
652     @patch('apex.overcloud.deploy.parsers')
653     def test_create_congress_cmds(self, mock_parsers):
654         assert_greater(len(create_congress_cmds('overcloud_file')), 0)
655
656     @patch('apex.overcloud.deploy.parsers.parse_overcloudrc')
657     def test_create_congress_cmds_raises(self, mock_parsers):
658         mock_parsers.return_value.__getitem__.side_effect = KeyError()
659         assert_raises(KeyError, create_congress_cmds, 'overcloud_file')
660
661     def test_get_docker_sdn_file(self):
662         ds_opts = {'ha_enabled': True,
663                    'congress': True,
664                    'tacker': True,
665                    'containers': False,
666                    'barometer': True,
667                    'ceph': False,
668                    'sdn_controller': 'opendaylight',
669                    'os_version': 'queens'
670                    }
671         output = get_docker_sdn_file(ds_opts)
672         self.assertEqual(output,
673                          ('/usr/share/openstack-tripleo-heat-templates'
674                           '/environments/services-docker/neutron-opendaylight'
675                           '.yaml')
676                          )