diff --git a/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py b/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py index 4112fd9b7..537346ea7 100644 --- a/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py +++ b/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py @@ -93,6 +93,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self.cmd._download_missing_files_from_plan = self.real_download_missing shutil.rmtree = self.real_shutil + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.check_stack_network_matches_env_files') @mock.patch("heatclient.common.event_utils.get_events") @mock.patch('tripleo_common.update.add_breakpoints_cleanup_into_env', @@ -107,7 +110,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_create_tempest_deployer_input, mock_create_parameters_env, mock_breakpoints_cleanup, - mock_events, mock_stack_network_check): + mock_events, mock_stack_network_check, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) clients = self.app.client_manager @@ -161,7 +165,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'SnmpdReadonlyUserPassword': 'PASSWORD', 'UpdateIdentifier': '', 'StackAction': 'UPDATE', - 'DeployIdentifier': '' + 'DeployIdentifier': '', + 'UndercloudHostsEntries': [ + '192.168.0.1 uc.ctlplane.localhost uc.ctlplane'] } def _custom_create_params_env(_self, parameters, tht_root, @@ -183,6 +189,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_create_tempest_deployer_input.assert_called_with() + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.workflows.parameters.invoke_plan_env_workflows', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @@ -199,7 +208,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_validate_args, mock_breakpoints_cleanup, mock_postconfig, - mock_invoke_plan_env_wf): + mock_invoke_plan_env_wf, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) @@ -248,7 +258,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'parameter_defaults': { 'StackAction': 'CREATE', 'UpdateIdentifier': '', - 'DeployIdentifier': ''}} + 'DeployIdentifier': '', + 'UndercloudHostsEntries': + ['192.168.0.1 uc.ctlplane.localhost uc.ctlplane']}} mock_rm = shutil.rmtree = mock.MagicMock() self.cmd.take_action(parsed_args) @@ -297,6 +309,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self.assertEqual(env_map.get('parameter_defaults'), parameters_env.get('parameter_defaults')) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.check_stack_network_matches_env_files') @mock.patch('shutil.rmtree', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @@ -323,7 +338,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_breakpoints_cleanup, mock_postconfig, mock_shutil_rmtree, mock_invoke_plan_env_wf, - mock_stack_network_check): + mock_stack_network_check, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) plane_management_fixture = deployment.PlanManagementFixture() @@ -384,7 +400,10 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'SnmpdReadonlyUserPassword': 'PASSWORD', 'UpdateIdentifier': '', 'StackAction': 'CREATE', - 'DeployIdentifier': '' + 'DeployIdentifier': '', + 'UndercloudHostsEntries': [ + '192.168.0.1 uc.ctlplane.localhost uc.ctlplane' + ] } testcase = self @@ -427,6 +446,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): clients.tripleoclient.object_store.put_object.assert_called() self.assertTrue(mock_invoke_plan_env_wf.called) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.check_stack_network_matches_env_files') @mock.patch('tripleoclient.workflows.parameters.' 'check_deprecated_parameters', autospec=True) @@ -447,7 +469,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_get_template_contents, mock_create_parameters_env, mock_validate_args, mock_breakpoints_cleanup, - mock_postconfig, mock_deprecated_params, mock_stack_network_check): + mock_postconfig, mock_deprecated_params, mock_stack_network_check, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) plane_management_fixture = deployment.PlanManagementFixture() @@ -511,6 +534,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): deploy_plan_call_input = deploy_plan_call[1]['workflow_input'] self.assertTrue(deploy_plan_call_input['skip_deploy_identifier']) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.check_stack_network_matches_env_files') @mock.patch("heatclient.common.event_utils.get_events", autospec=True) @mock.patch('tripleo_common.update.add_breakpoints_cleanup_into_env', @@ -525,7 +551,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_create_tempest_deployer_input, mock_deploy_postconfig, mock_breakpoints_cleanup, - mock_events, mock_stack_network_check): + mock_events, mock_stack_network_check, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) plane_management_fixture = deployment.PlanManagementFixture() @@ -877,9 +904,13 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): except ValueError as value_error: self.assertIn('/fake/path', str(value_error)) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates', autospec=True) - def test_dry_run(self, mock_create_tempest_deployer_input): + def test_dry_run(self, mock_create_tempest_deployer_input, + mock_get_undercloud_host_entry): utils_fixture = deployment.UtilsOvercloudFixture() self.useFixture(utils_fixture) clients = self.app.client_manager @@ -898,13 +929,17 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self.assertFalse(utils_fixture.mock_create_ocrc.called) self.assertFalse(mock_create_tempest_deployer_input.called) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.check_stack_network_matches_env_files') @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_heat_deploy', autospec=True) @mock.patch('tempfile.mkdtemp', autospec=True) @mock.patch('shutil.rmtree', autospec=True) def test_answers_file(self, mock_rmtree, mock_tmpdir, - mock_heat_deploy, mock_stack_network_check): + mock_heat_deploy, mock_stack_network_check, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) clients = self.app.client_manager @@ -980,6 +1015,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): utils_fixture.mock_deploy_tht.assert_called_with() + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.check_stack_network_matches_env_files') @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_create_parameters_env', autospec=True) @@ -992,7 +1030,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_process_env, mock_write_overcloudrc, mock_create_parameters_env, - mock_stack_network_check): + mock_stack_network_check, + mock_get_undercloud_host_entry): plane_management_fixture = deployment.PlanManagementFixture() self.useFixture(plane_management_fixture) clients = self.app.client_manager @@ -1033,6 +1072,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self.cmd.take_action, parsed_args) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.check_stack_network_matches_env_files') @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_postconfig', autospec=True) @@ -1054,7 +1096,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_validate_args, mock_breakpoints_cleanup, mock_deploy_post_config, - mock_stack_network_check): + mock_stack_network_check, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) plane_management_fixture = deployment.PlanManagementFixture() @@ -1115,7 +1158,10 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'UpdateIdentifier': '', 'StackAction': 'CREATE', 'NtpServer': 'ntp', - 'DeployIdentifier': '' + 'DeployIdentifier': '', + 'UndercloudHostsEntries': [ + '192.168.0.1 uc.ctlplane.localhost uc.ctlplane' + ] } def _custom_create_params_env(_self, parameters, tht_root, @@ -1204,11 +1250,15 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self.assertRaises(exceptions.StackInProgress, self.cmd.take_action, parsed_args) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.workflows.deployment.create_overcloudrc', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates_tmpdir', autospec=True) - def test_deployed_server(self, mock_deploy_tmpdir, mock_overcloudrc): + def test_deployed_server(self, mock_deploy_tmpdir, mock_overcloudrc, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) utils_fixture = deployment.UtilsOvercloudFixture() @@ -1248,13 +1298,16 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): parsed_args) self.assertFalse(mock_deploy_tmpdir.called) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.workflows.deployment.create_overcloudrc', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates_tmpdir', autospec=True) def test_config_download( self, mock_deploy_tmpdir, - mock_overcloudrc): + mock_overcloudrc, mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) utils_fixture = deployment.UtilsOvercloudFixture() @@ -1279,13 +1332,16 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'deploying', fixture.mock_set_deployment_status.call_args[0][1]) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.workflows.deployment.create_overcloudrc', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates_tmpdir', autospec=True) def test_config_download_only( self, mock_deploy_tmpdir, - mock_overcloudrc): + mock_overcloudrc, mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) utils_fixture = deployment.UtilsOvercloudFixture() @@ -1310,6 +1366,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'deploying', fixture.mock_set_deployment_status.call_args[0][1]) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @@ -1322,7 +1381,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self, mock_deploy_tmpdir, mock_overcloudrc, mock_write_overcloudrc, mock_overcloud_endpoint, - mock_create_tempest_deployer_input): + mock_create_tempest_deployer_input, + mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) clients = self.app.client_manager @@ -1349,13 +1409,16 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'failed', fixture.mock_set_deployment_status.call_args[0][1]) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.workflows.deployment.create_overcloudrc', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates_tmpdir', autospec=True) def test_override_ansible_cfg( self, mock_deploy_tmpdir, - mock_overcloudrc): + mock_overcloudrc, mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) utils_fixture = deployment.UtilsOvercloudFixture() @@ -1378,13 +1441,16 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self.assertEqual('ansible.cfg', fixture.mock_config_download.call_args[0][8]) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.workflows.deployment.create_overcloudrc', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates_tmpdir', autospec=True) def test_config_download_timeout( self, mock_deploy_tmpdir, - mock_overcloudrc): + mock_overcloudrc, mock_get_undercloud_host_entry): fixture = deployment.DeploymentWorkflowFixture() self.useFixture(fixture) utils_fixture = deployment.UtilsOvercloudFixture() @@ -1494,6 +1560,16 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): 'overcloud' ) + @mock.patch('subprocess.Popen', autospec=True) + def test__get_undercloud_host_entry(self, mock_popen): + mock_process = mock.Mock() + mock_process.communicate.return_value = ( + 'fd12::1 uc.ctlplane.localdomain uc.ctlplane', '') + mock_process.returncode = 0 + mock_popen.return_value = mock_process + expected = ('fd12::1 uc.ctlplane.localdomain uc.ctlplane') + self.assertEqual(expected, self.cmd._get_undercloud_host_entry()) + class TestArgumentValidation(fakes.TestDeployOvercloud): diff --git a/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py b/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py index 6572f6867..191958fb1 100644 --- a/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py +++ b/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py @@ -36,6 +36,9 @@ class TestOvercloudUpdatePrepare(fakes.TestOvercloudUpdatePrepare): self.mock_uuid4 = uuid4_patcher.start() self.addCleanup(self.mock_uuid4.stop) + @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' + '_get_undercloud_host_entry', autospec=True, + return_value='192.168.0.1 uc.ctlplane.localhost uc.ctlplane') @mock.patch('tripleoclient.utils.get_stack', autospec=True) @mock.patch('tripleoclient.v1.overcloud_update.UpdatePrepare.log', @@ -50,7 +53,7 @@ class TestOvercloudUpdatePrepare(fakes.TestOvercloudUpdatePrepare): '_deploy_tripleo_heat_templates_tmpdir', autospec=True) def test_update_out(self, mock_deploy, mock_open, mock_copy, mock_yaml, mock_abspath, mock_update, mock_logger, - mock_get_stack): + mock_get_stack, mock_get_undercloud_host_entry): mock_stack = mock.Mock(parameters={'DeployIdentifier': ''}) mock_stack.stack_name = 'overcloud' mock_get_stack.return_value = mock_stack diff --git a/tripleoclient/v1/overcloud_deploy.py b/tripleoclient/v1/overcloud_deploy.py index 214bdf37e..7d3bc2976 100644 --- a/tripleoclient/v1/overcloud_deploy.py +++ b/tripleoclient/v1/overcloud_deploy.py @@ -23,6 +23,7 @@ from prettytable import PrettyTable import re import shutil import six +import subprocess import tempfile import time import yaml @@ -116,8 +117,26 @@ class DeployOvercloud(command.Command): if getattr(args, arg, None) is not None: parameters[param] = getattr(args, arg) + parameters[ + 'UndercloudHostsEntries'] = [self._get_undercloud_host_entry()] + return parameters + def _get_undercloud_host_entry(self): + """Get hosts entry for undercloud ctlplane network + + The host entry will be added on overcloud nodes + """ + ctlplane_hostname = '.'.join([utils.get_short_hostname(), 'ctlplane']) + cmd = ['getent', 'hosts', ctlplane_hostname] + process = subprocess.Popen(cmd, stdout=subprocess.PIPE) + out, err = process.communicate() + if process.returncode != 0: + raise exceptions.DeploymentError('No entry for %s in /etc/hosts' + % ctlplane_hostname) + + return out.rstrip() + def _create_breakpoint_cleanup_env(self, tht_root, container_name): bp_env = {} update.add_breakpoints_cleanup_into_env(bp_env)