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