# Copyright 2015 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # import sys import mock import six from openstackclient.common import exceptions as oscexc from openstackclient.tests import utils as oscutils from tuskarclient.v2.plans import Plan from rdomanager_oscplugin import exceptions from rdomanager_oscplugin.tests.v1.overcloud_deploy import fakes from rdomanager_oscplugin.tests.v1.utils import ( generate_overcloud_passwords_mock) from rdomanager_oscplugin.v1 import overcloud_deploy class TestDeployOvercloud(fakes.TestDeployOvercloud): def setUp(self): super(TestDeployOvercloud, self).setUp() # Get the command object to test self.cmd = overcloud_deploy.DeployOvercloud(self.app, None) self._get_passwords = generate_overcloud_passwords_mock @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_postconfig') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_tempest_deployer_input', autospec=True) @mock.patch('rdomanager_oscplugin.utils.generate_overcloud_passwords') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_overcloudrc') @mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True) @mock.patch('time.sleep', return_value=None) @mock.patch('os_cloud_config.keystone.initialize', autospec=True) @mock.patch('rdomanager_oscplugin.utils.remove_known_hosts', autospec=True) @mock.patch('rdomanager_oscplugin.utils.wait_for_stack_ready', autospec=True) @mock.patch('heatclient.common.template_utils.' 'process_multiple_environments_and_files', autospec=True) @mock.patch('heatclient.common.template_utils.get_template_contents', autospec=True) @mock.patch('os_cloud_config.keystone_pki.generate_certs_into_json', autospec=True) @mock.patch('rdomanager_oscplugin.utils.create_environment_file', autospec=True) @mock.patch('rdomanager_oscplugin.utils.get_config_value', autospec=True) @mock.patch('rdomanager_oscplugin.utils.check_hypervisor_stats', autospec=True) @mock.patch('rdomanager_oscplugin.utils.create_cephx_key', autospec=True) @mock.patch('uuid.uuid1', autospec=True) def test_tht_scale(self, mock_uuid1, mock_create_cephx_key, mock_check_hypervisor_stats, mock_get_key, mock_create_env, generate_certs_mock, mock_get_templte_contents, mock_process_multiple_env, wait_for_stack_ready_mock, mock_remove_known_hosts, mock_keystone_initialize, mock_sleep, mock_setup_endpoints, mock_create_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_deploy_postconfig): arglist = ['--templates', '--ceph-storage-scale', '3'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ] mock_create_cephx_key.return_value = "cephx_key" mock_uuid1.return_value = "uuid" mock_generate_overcloud_passwords.return_value = self._get_passwords() clients = self.app.client_manager orchestration_client = clients.rdomanager_oscplugin.orchestration() mock_stack = fakes.create_to_dict_mock( outputs=[{ 'output_key': 'KeystoneURL', 'output_value': 'Overcloud endpoint' }], stack_name='overcloud', ) orchestration_client.stacks.get.return_value = mock_stack mock_check_hypervisor_stats.return_value = { 'count': 4, 'memory_mb': 4096, 'vcpus': 8, } mock_get_key.return_value = "PASSWORD" clients.network.api.find_attr.return_value = { "id": "network id" } mock_create_env.return_value = "/fake/path" mock_process_multiple_env.return_value = [{}, "env"] mock_get_templte_contents.return_value = [{}, "template"] wait_for_stack_ready_mock.return_value = True parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertTrue(result) args, kwargs = orchestration_client.stacks.update.call_args self.assertEqual(args, (orchestration_client.stacks.get().id, )) expected_parameters = { 'AdminPassword': 'password', 'AdminToken': 'password', 'BlockStorageImage': 'overcloud-full', 'CeilometerMeteringSecret': 'password', 'CeilometerPassword': 'password', 'CephStorageCount': 3, 'CephStorageImage': 'overcloud-full', 'CinderISCSIHelper': 'lioadm', 'CinderPassword': 'password', 'CloudName': 'overcloud', 'controllerImage': 'overcloud-full', 'Debug': 'True', 'ExtraConfig': '{}', 'GlancePassword': 'password', 'HeatPassword': 'password', 'HeatStackDomainAdminPassword': 'password', 'HypervisorNeutronPhysicalBridge': 'br-ex', 'HypervisorNeutronPublicInterface': 'nic1', 'NeutronAllowL3AgentFailover': False, 'NeutronBridgeMappings': 'datacentre:br-ex', 'NeutronControlPlaneID': 'network id', 'NeutronDhcpAgentsPerNetwork': 3, 'NeutronDnsmasqOptions': 'dhcp-option-force=26,1400', 'NeutronFlatNetworks': 'datacentre', 'NeutronL3HA': False, 'NeutronNetworkVLANRanges': 'datacentre:1:1000', 'NeutronPassword': 'password', 'NeutronPublicInterface': 'nic1', 'NovaImage': 'overcloud-full', 'NovaPassword': 'password', 'NtpServer': '', 'OvercloudBlockStorageFlavor': 'baremetal', 'OvercloudCephStorageFlavor': 'baremetal', 'OvercloudComputeFlavor': 'baremetal', 'OvercloudControlFlavor': 'baremetal', 'OvercloudSwiftStorageFlavor': 'baremetal', 'SnmpdReadonlyUserPassword': 'PASSWORD', 'SwiftHashSuffix': 'password', 'SwiftPassword': 'password', 'SwiftStorageImage': 'overcloud-full', } self.assertEqual(set(kwargs['parameters'].keys()) ^ set(expected_parameters.keys()), set()) self.assertEqual(kwargs['parameters'], expected_parameters) self.assertEqual(kwargs['files'], {}) self.assertEqual(kwargs['template'], 'template') self.assertEqual(kwargs['environment'], 'env') self.assertEqual(kwargs['stack_name'], 'overcloud') mock_get_templte_contents.assert_called_with( ('/usr/share/openstack-tripleo-heat-templates/overcloud-without-' 'mergepy.yaml')) mock_create_tempest_deployer_input.assert_called_with(self.cmd) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_postconfig') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_tempest_deployer_input', autospec=True) @mock.patch('rdomanager_oscplugin.utils.generate_overcloud_passwords') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_overcloudrc') @mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True) @mock.patch('time.sleep', return_value=None) @mock.patch('os_cloud_config.keystone.initialize', autospec=True) @mock.patch('rdomanager_oscplugin.utils.remove_known_hosts', autospec=True) @mock.patch('rdomanager_oscplugin.utils.wait_for_stack_ready', autospec=True) @mock.patch('heatclient.common.template_utils.' 'process_multiple_environments_and_files', autospec=True) @mock.patch('heatclient.common.template_utils.get_template_contents', autospec=True) @mock.patch('os_cloud_config.keystone_pki.generate_certs_into_json', autospec=True) @mock.patch('rdomanager_oscplugin.utils.create_environment_file', autospec=True) @mock.patch('rdomanager_oscplugin.utils.get_config_value', autospec=True) @mock.patch('rdomanager_oscplugin.utils.check_hypervisor_stats', autospec=True) @mock.patch('rdomanager_oscplugin.utils.create_cephx_key', autospec=True) @mock.patch('uuid.uuid1', autospec=True) def test_tht_deploy(self, mock_uuid1, mock_create_cephx_key, mock_check_hypervisor_stats, mock_get_key, mock_create_env, generate_certs_mock, mock_get_templte_contents, mock_process_multiple_env, wait_for_stack_ready_mock, mock_remove_known_hosts, mock_keystone_initialize, mock_sleep, mock_setup_endpoints, mock_create_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_deploy_postconfig): arglist = ['--templates', '--ceph-storage-scale', '3'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ] mock_create_cephx_key.return_value = "cephx_key" mock_uuid1.return_value = "uuid" mock_generate_overcloud_passwords.return_value = self._get_passwords() clients = self.app.client_manager orchestration_client = clients.rdomanager_oscplugin.orchestration() mock_stack = fakes.create_to_dict_mock( outputs=[{ 'output_key': 'KeystoneURL', 'output_value': 'Overcloud endpoint' }], stack_name='overcloud', ) orchestration_client.stacks.get.return_value = None def _orch_clt_create(**kwargs): orchestration_client.stacks.get.return_value = mock_stack orchestration_client.stacks.create.side_effect = _orch_clt_create mock_check_hypervisor_stats.return_value = { 'count': 4, 'memory_mb': 4096, 'vcpus': 8, } mock_get_key.return_value = "PASSWORD" clients.network.api.find_attr.return_value = { "id": "network id" } mock_create_env.return_value = "/fake/path" mock_process_multiple_env.return_value = [{}, "env"] mock_get_templte_contents.return_value = [{}, "template"] wait_for_stack_ready_mock.return_value = True parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertTrue(result) args, kwargs = orchestration_client.stacks.create.call_args expected_parameters = { 'AdminPassword': 'password', 'AdminToken': 'password', 'BlockStorageImage': 'overcloud-full', 'CeilometerMeteringSecret': 'password', 'CeilometerPassword': 'password', 'CephAdminKey': 'cephx_key', 'CephClusterFSID': 'uuid', 'CephMonKey': 'cephx_key', 'CephStorageCount': 3, 'CephStorageImage': 'overcloud-full', 'CinderISCSIHelper': 'lioadm', 'CinderPassword': 'password', 'CloudName': 'overcloud', 'controllerImage': 'overcloud-full', 'Debug': 'True', 'ExtraConfig': '{}', 'GlancePassword': 'password', 'HeatPassword': 'password', 'HeatStackDomainAdminPassword': 'password', 'HypervisorNeutronPhysicalBridge': 'br-ex', 'HypervisorNeutronPublicInterface': 'nic1', 'NeutronAllowL3AgentFailover': False, 'NeutronBridgeMappings': 'datacentre:br-ex', 'NeutronControlPlaneID': 'network id', 'NeutronDhcpAgentsPerNetwork': 3, 'NeutronDnsmasqOptions': 'dhcp-option-force=26,1400', 'NeutronEnableTunnelling': 'True', 'NeutronFlatNetworks': 'datacentre', 'NeutronL3HA': False, 'NeutronNetworkType': 'gre', 'NeutronNetworkVLANRanges': 'datacentre:1:1000', 'NeutronPassword': 'password', 'NeutronPublicInterface': 'nic1', 'NeutronTunnelIdRanges': '1:1000', 'NeutronTunnelTypes': 'gre', 'NeutronVniRanges': '1:1000', 'NovaComputeLibvirtType': 'kvm', 'NovaImage': 'overcloud-full', 'NovaPassword': 'password', 'NtpServer': '', 'OvercloudBlockStorageFlavor': 'baremetal', 'OvercloudCephStorageFlavor': 'baremetal', 'OvercloudComputeFlavor': 'baremetal', 'OvercloudControlFlavor': 'baremetal', 'OvercloudSwiftStorageFlavor': 'baremetal', 'SnmpdReadonlyUserPassword': 'PASSWORD', 'SwiftHashSuffix': 'password', 'SwiftPassword': 'password', 'SwiftStorageImage': 'overcloud-full', } self.assertEqual(set(kwargs['parameters'].keys()) ^ set(expected_parameters.keys()), set()) self.assertEqual(kwargs['parameters'], expected_parameters) self.assertEqual(kwargs['files'], {}) self.assertEqual(kwargs['template'], 'template') self.assertEqual(kwargs['environment'], 'env') self.assertEqual(kwargs['stack_name'], 'overcloud') mock_get_templte_contents.assert_called_with( ('/usr/share/openstack-tripleo-heat-templates/overcloud-without-' 'mergepy.yaml')) mock_create_tempest_deployer_input.assert_called_with(self.cmd) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_postconfig') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_tempest_deployer_input', autospec=True) @mock.patch('rdomanager_oscplugin.utils.generate_overcloud_passwords') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_overcloudrc') @mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True) @mock.patch('time.sleep', return_value=None) @mock.patch('os_cloud_config.keystone.initialize', autospec=True) @mock.patch('rdomanager_oscplugin.utils.remove_known_hosts', autospec=True) @mock.patch('rdomanager_oscplugin.utils.wait_for_stack_ready', autospec=True) @mock.patch('heatclient.common.template_utils.' 'process_multiple_environments_and_files', autospec=True) @mock.patch('heatclient.common.template_utils.get_template_contents', autospec=True) @mock.patch('os_cloud_config.keystone_pki.generate_certs_into_json', autospec=True) @mock.patch('rdomanager_oscplugin.utils.create_environment_file', autospec=True) @mock.patch('rdomanager_oscplugin.utils.get_config_value', autospec=True) @mock.patch('rdomanager_oscplugin.utils.check_hypervisor_stats', autospec=True) def test_deploy_custom_templates(self, mock_check_hypervisor_stats, mock_get_key, mock_create_env, generate_certs_mock, mock_get_templte_contents, mock_process_multiple_env, wait_for_stack_ready_mock, mock_remove_known_hosts, mock_keystone_initialize, mock_sleep, mock_setup_endpoints, mock_create_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_deploy_postconfig): arglist = ['--templates', '/home/stack/tripleo-heat-templates'] verifylist = [ ('templates', '/home/stack/tripleo-heat-templates'), ] mock_generate_overcloud_passwords.return_value = self._get_passwords() clients = self.app.client_manager orchestration_client = clients.rdomanager_oscplugin.orchestration() mock_stack = fakes.create_to_dict_mock( outputs=[{ 'output_key': 'KeystoneURL', 'output_value': 'Overcloud endpoint' }], stack_name='overcloud', ) orchestration_client.stacks.get.return_value = mock_stack mock_check_hypervisor_stats.return_value = { 'count': 4, 'memory_mb': 4096, 'vcpus': 8, } mock_get_key.return_value = "PASSWORD" clients.network.api.find_attr.return_value = { "id": "network id" } mock_create_env.return_value = "/fake/path" mock_process_multiple_env.return_value = [{}, "env"] mock_get_templte_contents.return_value = [{}, "template"] wait_for_stack_ready_mock.return_value = True parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertTrue(result) args, kwargs = orchestration_client.stacks.update.call_args self.assertEqual(args, (orchestration_client.stacks.get().id, )) # The parameters output contains lots of output and some is random. # So lets just check that it is present self.assertTrue('parameters' in kwargs) self.assertEqual(kwargs['files'], {}) self.assertEqual(kwargs['template'], 'template') self.assertEqual(kwargs['environment'], 'env') self.assertEqual(kwargs['stack_name'], 'overcloud') mock_get_templte_contents.assert_called_with( '/home/stack/tripleo-heat-templates/overcloud-without-mergepy.yaml' ) mock_create_tempest_deployer_input.assert_called_with(self.cmd) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_postconfig') @mock.patch('rdomanager_oscplugin.utils.get_config_value', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_tempest_deployer_input', autospec=True) @mock.patch('rdomanager_oscplugin.utils.generate_overcloud_passwords') @mock.patch('heatclient.common.template_utils.' 'process_multiple_environments_and_files') @mock.patch('heatclient.common.template_utils.get_template_contents') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_get_stack') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_pre_heat_deploy') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_overcloudrc') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_heat_deploy') def test_tuskar_deploy(self, mock_heat_deploy, mock_create_overcloudrc, most_pre_deploy, mock_get_stack, mock_get_templte_contents, mock_process_multiple_env, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_get_key, mock_deploy_postconfig): arglist = ['--plan', 'undercloud', '--output-dir', 'fake', '--compute-flavor', 'baremetal', '--neutron-bridge-mappings', 'datacentre:br-test', '--neutron-disable-tunneling', '--control-scale', '3', '--neutron-mechanism-drivers', 'linuxbridge', '--ntp-server', 'ntp.local'] verifylist = [ ('templates', None), ('plan', 'undercloud'), ('output_dir', 'fake'), ('ntp_server', 'ntp.local') ] clients = self.app.client_manager management = clients.rdomanager_oscplugin.management() management.plans.templates.return_value = {} management.plans.resource_class = Plan mock_plan = mock.Mock() mock_plan.configure_mock(name="undercloud") management.plans.list.return_value = [mock_plan, ] mock_get_templte_contents.return_value = ({}, "template") mock_process_multiple_env.return_value = ({}, "envs") clients.network.api.find_attr.return_value = { "id": "network id" } mock_get_key.return_value = "PASSWORD" mock_generate_overcloud_passwords.return_value = self._get_passwords() parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertTrue(result) parameters = { 'Cinder-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Compute-1::AdminPassword': 'password', 'Compute-1::CeilometerMeteringSecret': 'password', 'Compute-1::CeilometerPassword': 'password', 'Compute-1::Flavor': 'baremetal', 'Compute-1::NeutronAllowL3AgentFailover': False, 'Compute-1::NeutronBridgeMappings': 'datacentre:br-test', 'Compute-1::NeutronL3HA': True, 'Compute-1::NeutronMechanismDrivers': 'linuxbridge', 'Compute-1::NeutronPassword': 'password', 'Compute-1::NovaPassword': 'password', 'Compute-1::NtpServer': 'ntp.local', 'Compute-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Controller-1::AdminPassword': 'password', 'Controller-1::AdminToken': 'password', 'Controller-1::CeilometerMeteringSecret': 'password', 'Controller-1::CeilometerPassword': 'password', 'Controller-1::CinderPassword': 'password', 'Controller-1::count': 3, 'Controller-1::GlancePassword': 'password', 'Controller-1::HeatPassword': 'password', 'Controller-1::HeatStackDomainAdminPassword': 'password', 'Controller-1::NeutronAllowL3AgentFailover': False, 'Controller-1::NeutronBridgeMappings': 'datacentre:br-test', 'Controller-1::NeutronDhcpAgentsPerNetwork': 3, 'Controller-1::NeutronL3HA': True, 'Controller-1::NeutronMechanismDrivers': 'linuxbridge', 'Controller-1::NeutronPassword': 'password', 'Controller-1::NovaPassword': 'password', 'Controller-1::NtpServer': 'ntp.local', 'Controller-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Controller-1::SwiftHashSuffix': 'password', 'Controller-1::SwiftPassword': 'password', 'NeutronControlPlaneID': 'network id', 'Swift-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD", } mock_heat_deploy.assert_called_with( mock_get_stack(), 'overcloud', 'fake/plan.yaml', parameters, ['fake/environment.yaml'], 240 ) mock_create_tempest_deployer_input.assert_called_with(self.cmd) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_postconfig') @mock.patch('rdomanager_oscplugin.utils.get_config_value', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_tempest_deployer_input', autospec=True) @mock.patch('rdomanager_oscplugin.utils.generate_overcloud_passwords') @mock.patch('heatclient.common.template_utils.' 'process_multiple_environments_and_files') @mock.patch('heatclient.common.template_utils.get_template_contents') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_get_stack') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_pre_heat_deploy') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_overcloudrc') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_heat_deploy') def test_tuskar_scale(self, mock_heat_deploy, mock_create_overcloudrc, most_pre_deploy, mock_get_stack, mock_get_templte_contents, mock_process_multiple_env, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_get_key, mock_deploy_postconfig): arglist = ['--plan', 'undercloud', '--output-dir', 'fake', '--compute-flavor', 'baremetal', '--neutron-bridge-mappings', 'datacentre:br-test', '--neutron-disable-tunneling', '--control-scale', '3', '--ntp-server', 'ntp.local', '--neutron-mechanism-drivers', 'linuxbridge'] verifylist = [ ('templates', None), ('plan', 'undercloud'), ('output_dir', 'fake'), ] clients = self.app.client_manager management = clients.rdomanager_oscplugin.management() management.plans.templates.return_value = {} management.plans.resource_class = Plan mock_plan = mock.Mock() mock_plan.configure_mock(name="undercloud") management.plans.list.return_value = [mock_plan, ] mock_get_templte_contents.return_value = ({}, "template") mock_process_multiple_env.return_value = ({}, "envs") clients.network.api.find_attr.return_value = { "id": "network id" } mock_get_key.return_value = "PASSWORD" mock_generate_overcloud_passwords.return_value = self._get_passwords() parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertTrue(result) parameters = { 'Cinder-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Compute-1::AdminPassword': 'password', 'Compute-1::CeilometerMeteringSecret': 'password', 'Compute-1::CeilometerPassword': 'password', 'Compute-1::Flavor': 'baremetal', 'Compute-1::NeutronAllowL3AgentFailover': False, 'Compute-1::NeutronBridgeMappings': 'datacentre:br-test', 'Compute-1::NeutronL3HA': True, 'Compute-1::NeutronMechanismDrivers': 'linuxbridge', 'Compute-1::NeutronPassword': 'password', 'Compute-1::NovaPassword': 'password', 'Compute-1::NtpServer': 'ntp.local', 'Compute-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Controller-1::AdminPassword': 'password', 'Controller-1::AdminToken': 'password', 'Controller-1::CeilometerMeteringSecret': 'password', 'Controller-1::CeilometerPassword': 'password', 'Controller-1::CinderPassword': 'password', 'Controller-1::count': 3, 'Controller-1::GlancePassword': 'password', 'Controller-1::HeatPassword': 'password', 'Controller-1::HeatStackDomainAdminPassword': 'password', 'Controller-1::NeutronAllowL3AgentFailover': False, 'Controller-1::NeutronBridgeMappings': 'datacentre:br-test', 'Controller-1::NeutronDhcpAgentsPerNetwork': 3, 'Controller-1::NeutronL3HA': True, 'Controller-1::NeutronMechanismDrivers': 'linuxbridge', 'Controller-1::NeutronPassword': 'password', 'Controller-1::NovaPassword': 'password', 'Controller-1::NtpServer': 'ntp.local', 'Controller-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Controller-1::SwiftHashSuffix': 'password', 'Controller-1::SwiftPassword': 'password', 'NeutronControlPlaneID': 'network id', 'Swift-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD", } mock_heat_deploy.assert_called_with( mock_get_stack(), 'overcloud', 'fake/plan.yaml', parameters, ['fake/environment.yaml'], 240 ) mock_create_tempest_deployer_input.assert_called_with(self.cmd) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_postconfig') @mock.patch('rdomanager_oscplugin.utils.get_config_value', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_tempest_deployer_input', autospec=True) @mock.patch('rdomanager_oscplugin.utils.generate_overcloud_passwords') @mock.patch('heatclient.common.template_utils.' 'process_multiple_environments_and_files') @mock.patch('heatclient.common.template_utils.get_template_contents') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_get_stack') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_pre_heat_deploy') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_overcloudrc') @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_heat_deploy') def test_tuskar_deploy_extra_config(self, mock_heat_deploy, mock_create_overcloudrc, most_pre_deploy, mock_get_stack, mock_get_templte_contents, mock_process_multiple_env, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_get_key, mock_deploy_postconfig): arglist = ['--plan', 'undercloud', '--output-dir', 'fake', '--compute-flavor', 'baremetal', '--neutron-bridge-mappings', 'datacentre:br-test', '--neutron-disable-tunneling', '--control-scale', '3', '--ntp-server', 'ntp.local', '-e', 'extra_registry.yaml', '-e', 'extra_environment.yaml', '-t', '120', ] verifylist = [ ('templates', None), ('plan', 'undercloud'), ('output_dir', 'fake'), ('environment_files', ['extra_registry.yaml', 'extra_environment.yaml']) ] clients = self.app.client_manager management = clients.rdomanager_oscplugin.management() management.plans.templates.return_value = {} management.plans.resource_class = Plan mock_plan = mock.Mock() mock_plan.configure_mock(name="undercloud") management.plans.list.return_value = [mock_plan, ] mock_get_templte_contents.return_value = ({}, "template") mock_process_multiple_env.return_value = ({}, "envs") clients.network.api.find_attr.return_value = { "id": "network id" } mock_get_key.return_value = "PASSWORD" mock_generate_overcloud_passwords.return_value = self._get_passwords() parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertTrue(result) parameters = { 'Cinder-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Compute-1::AdminPassword': 'password', 'Compute-1::CeilometerMeteringSecret': 'password', 'Compute-1::CeilometerPassword': 'password', 'Compute-1::Flavor': 'baremetal', 'Compute-1::NeutronAllowL3AgentFailover': False, 'Compute-1::NeutronBridgeMappings': 'datacentre:br-test', 'Compute-1::NeutronL3HA': True, 'Compute-1::NeutronPassword': 'password', 'Compute-1::NovaPassword': 'password', 'Compute-1::NtpServer': 'ntp.local', 'Compute-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Controller-1::AdminPassword': 'password', 'Controller-1::AdminToken': 'password', 'Controller-1::CeilometerMeteringSecret': 'password', 'Controller-1::CeilometerPassword': 'password', 'Controller-1::CinderPassword': 'password', 'Controller-1::count': 3, 'Controller-1::GlancePassword': 'password', 'Controller-1::HeatPassword': 'password', 'Controller-1::HeatStackDomainAdminPassword': 'password', 'Controller-1::NeutronAllowL3AgentFailover': False, 'Controller-1::NeutronBridgeMappings': 'datacentre:br-test', 'Controller-1::NeutronDhcpAgentsPerNetwork': 3, 'Controller-1::NeutronL3HA': True, 'Controller-1::NeutronPassword': 'password', 'Controller-1::NovaPassword': 'password', 'Controller-1::NtpServer': 'ntp.local', 'Controller-1::SnmpdReadonlyUserPassword': "PASSWORD", 'Controller-1::SwiftHashSuffix': 'password', 'Controller-1::SwiftPassword': 'password', 'NeutronControlPlaneID': 'network id', 'Swift-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD", } mock_heat_deploy.assert_called_with( mock_get_stack(), 'overcloud', 'fake/plan.yaml', parameters, ['fake/environment.yaml', 'extra_registry.yaml', 'extra_environment.yaml'], 120 ) # We can't use assert_called_with() here, as we need to compare # two lists that may have different ordering, although the ordering # does not matter: call_args = dict([(x['name'], x['value']) for x in management.plans.patch.call_args_list[0][0][1]]) target = dict([(k, six.text_type(v)) for k, v in parameters.items()]) self.assertEqual(call_args, target) self.assertEqual(management.plans.patch.call_count, 1) mock_create_tempest_deployer_input.assert_called_with(self.cmd) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tuskar', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_pre_heat_deploy', autospec=True) def test_invalid_deploy_call(self, mock_pre_deploy, mock_deploy_tht, mock_deploy_tuskar): arglist = ['--plan', 'undercloud', '--templates'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ('plan', 'undercloud'), ] try: oldstderr = sys.stderr sys.stderr = self.fake_stdout self.assertRaises(oscutils.ParserException, self.check_parser, self.cmd, arglist, verifylist) finally: sys.stderr = oldstderr self.assertFalse(mock_deploy_tht.called) self.assertFalse(mock_deploy_tuskar.called) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tuskar', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_pre_heat_deploy', autospec=True) def test_missing_sat_url(self, mock_pre_deploy, mock_deploy_tht, mock_deploy_tuskar): arglist = ['--templates', '--rhel-reg', '--reg-method', 'satellite', '--reg-org', '123456789', '--reg-activation-key', 'super-awesome-key'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ('rhel_reg', True), ('reg_method', 'satellite'), ('reg_org', '123456789'), ('reg_activation_key', 'super-awesome-key') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertFalse(result) self.assertFalse(mock_deploy_tht.called) self.assertFalse(mock_deploy_tuskar.called) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_tempest_deployer_input', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_create_overcloudrc', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_get_overcloud_endpoint', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tuskar', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates', autospec=True) @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' '_pre_heat_deploy', autospec=True) def test_rhel_reg_params_provided(self, mock_pre_deploy, mock_deploy_tht, mock_deploy_tuskar, mock_oc_endpoint, mock_create_ocrc, mock_create_tempest_deployer_input): arglist = ['--templates', '--rhel-reg', '--reg-sat-url', 'https://example.com', '--reg-method', 'satellite', '--reg-org', '123456789', '--reg-activation-key', 'super-awesome-key'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ('rhel_reg', True), ('reg_sat_url', 'https://example.com'), ('reg_method', 'satellite'), ('reg_org', '123456789'), ('reg_activation_key', 'super-awesome-key') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertTrue(result) self.assertTrue(mock_deploy_tht.called) self.assertTrue(mock_oc_endpoint.called) self.assertTrue(mock_create_ocrc.called) self.assertFalse(mock_deploy_tuskar.called) mock_create_tempest_deployer_input.assert_called_with(self.cmd) def test_validate_args_correct(self): arglist = ['--templates', '--neutron-network-type', 'nettype', '--neutron-tunnel-types', 'nettype'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ('neutron_network_type', 'nettype'), ('neutron_tunnel_types', 'nettype'), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd._validate_args(parsed_args) def test_validate_args_mismatch(self): arglist = ['--templates', '--neutron-network-type', 'nettype1', '--neutron-tunnel-types', 'nettype2'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ('neutron_network_type', 'nettype1'), ('neutron_tunnel_types', 'nettype2'), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.assertRaises(oscexc.CommandError, self.cmd._validate_args, parsed_args) def test_validate_args_no_tunnel_type(self): arglist = ['--templates', '--neutron-network-type', 'nettype'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/'), ('neutron_network_type', 'nettype'), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.assertRaises(oscexc.CommandError, self.cmd._validate_args, parsed_args) @mock.patch('rdomanager_oscplugin.utils.check_hypervisor_stats', autospec=True) def test_pre_heat_deploy_failed(self, mock_check_hypervisor_stats): clients = self.app.client_manager orchestration_client = clients.rdomanager_oscplugin.orchestration() orchestration_client.stacks.get.return_value = None mock_check_hypervisor_stats.return_value = None arglist = ['--templates'] verifylist = [ ('templates', '/usr/share/openstack-tripleo-heat-templates/') ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.assertFalse(result) self.assertRaises(exceptions.DeploymentError, self.cmd._pre_heat_deploy)