1 ##############################################################################
2 # Copyright (c) 2016 Dan Radez (dradez@redhat.com) (Red Hat)
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 ##############################################################################
14 from mock import patch
15 from mock import MagicMock
16 from mock import mock_open
17 from io import StringIO
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
34 from nose.tools import (
35 assert_regexp_matches,
43 class TestOvercloudDeploy(unittest.TestCase):
46 """This method is run once for each class before any tests are run"""
49 def teardown_class(cls):
50 """This method is run once for each class _after_ all tests are run"""
53 """This method is run once before _each_ test method is executed"""
56 """This method is run once after _each_ test method is executed"""
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])
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), [])
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])
77 def test_build_sdn_env_list_with_string(self):
78 ds = {'sdn_controller': 'opendaylight',
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)
85 def test_build_sdn_env_list_with_default(self):
86 ds = {'sdn_controller': 'opendaylight',
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)
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,
99 mock_sdn_list.return_value = []
100 ds = {'deploy_options':
109 'global_params': MagicMock()}
111 ns = {'ntp': ['ntp']}
113 inv.get_node_counts.return_value = (3, 2)
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)
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,
129 ds = {'deploy_options':
136 'sdn_controller': 'opendaylight',
138 'os_version': 'queens'
140 'global_params': MagicMock()}
142 ns = {'ntp': ['ntp']}
144 inv.get_node_counts.return_value = (3, 2)
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)
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']}
182 inv.get_node_counts.return_value = (3, 2)
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)
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,
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()
205 inv.get_node_counts.return_value = (0, 0)
207 assert_raises(ApexDeployException, create_deploy_cmd,
208 ds, ns, inv, '/tmp', virt)
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,
217 ds_opts = {'dataplane': 'fdio',
218 'sdn_controller': 'opendaylight',
219 'odl_version': 'master',
221 ds = {'deploy_options': MagicMock(),
222 'global_params': MagicMock()}
223 ds['deploy_options'].__getitem__.side_effect = \
224 lambda i: ds_opts.get(i, 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()
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,
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())
243 prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
244 mock_virt_utils.virt_customize.assert_called()
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()
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()
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()
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'])
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,
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())
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()
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,
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())
330 prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
331 mock_virt_utils.virt_customize.assert_called()
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')
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)
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',
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',
366 {'nic_mapping': {'controller':
367 {'members': ['tenant_nic']},
369 {'members': ['tenant_nic']}}},
371 [{'nic_mapping': {'controller':
372 {'members': ['ext_nic']},
374 {'members': ['ext_nic']}}}]}}
378 saved_stdout = sys.stdout
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)
390 sys.stdout = saved_stdout
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,
401 'performance': {'Compute': {},
403 ns = {'domain_name': 'test.domain',
406 {'nic_mapping': {'controller':
407 {'members': ['tenant_nic']},
409 {'members': ['tenant_nic']}}},
411 [{'nic_mapping': {'controller':
412 {'members': ['ext_nic']},
414 {'members': ['ext_nic']}}}]}}
418 saved_stdout = sys.stdout
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\'',
427 assert_in('NeutronVPPAgentPhysnets', output)
430 sys.stdout = saved_stdout
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',
443 ns = {'domain_name': 'test.domain',
446 {'nic_mapping': {'controller':
447 {'members': ['tenant_nic']},
449 {'members': ['tenant_nic']}}},
451 [{'nic_mapping': {'controller':
452 {'members': ['ext_nic']},
454 {'members': ['ext_nic']}}}]}}
456 inv.get_node_counts.return_value = (3, 2)
459 saved_stdout = sys.stdout
463 prep_env(ds, ns, inv, 'opnfv-env.yml', '/net-env.yml', '/tmp')
464 output = out.getvalue().strip()
465 assert_in('NeutronDhcpAgentsPerNetwork: 2', output)
468 sys.stdout = saved_stdout
470 def test_generate_ceph_key(self):
471 assert_equal(len(generate_ceph_key()), 40)
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,
479 mock_fileinput.input.return_value = \
480 ['CephClusterFSID', 'CephMonKey', 'CephAdminKey', 'random_key']
481 ds = {'deploy_options': {
482 'ceph_device': '/dev/sdx',
486 prep_storage_env(ds, ns, virtual=False, tmp_dir='/tmp')
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',
500 'os_version': 'master'
501 }, 'global_params': {'ha_enabled': False}}
502 ns = {'networks': {con.ADMIN_NETWORK: {'installer_vm':
503 {'ip': '192.0.2.1'}}}
505 prep_storage_env(ds, ns, virtual=True, tmp_dir='/tmp')
507 'DockerCephDaemonImage':
508 '192.0.2.1:8787/ceph/daemon:tag-build-master-luminous-centos'
510 'CephPoolDefaultSize': 2,
511 'CephAnsibleExtraConfig': {
512 'centos_package_dependencies': [],
513 'ceph_osd_docker_memory_limit': '1g',
514 'ceph_mds_docker_memory_limit': '1g'
516 'CephPoolDefaultPgNum': 32,
517 'CephAnsibleDisksConfig': {
518 'devices': ['/dev/sdx'],
520 'osd_scenario': 'collocated'
523 mock_edit_tht.assert_called_with('/tmp/storage-environment.yaml',
524 'parameter_defaults',
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()}
533 assert_raises(ApexDeployException, prep_storage_env, ds,
534 ns, virtual=False, tmp_dir='/tmp')
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',
546 saved_stdout = sys.stdout
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)
569 sys.stdout = saved_stdout
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')
582 def test_external_network_cmds(self):
583 ds = {'deploy_options':
584 {'sdn_controller': 'opendaylight',
589 ns_dict = {'networks':
590 {'external': [{'floating_ip_range': (0, 1),
592 {'compute': {'vlan': 'native'}},
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)
605 def test_external_network_cmds_nosdn_fdio(self):
606 ds = {'deploy_options':
607 {'sdn_controller': False,
608 'dataplane': 'fdio'}}
612 ns_dict = {'networks':
613 {'external': [{'floating_ip_range': (0, 1),
615 {'compute': {'vlan': 'native'}},
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)
628 def test_external_network_cmds_no_ext(self):
629 ds = {'deploy_options':
630 {'sdn_controller': 'opendaylight',
638 {'introspection_range': (0, 1),
640 {'compute': {'vlan': '123'}},
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)
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)
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')
661 def test_get_docker_sdn_file(self):
662 ds_opts = {'ha_enabled': True,
668 'sdn_controller': 'opendaylight',
669 'os_version': 'queens'
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'