diff --git a/releasenotes/notes/ephemeral-heat-minor-update-db24c2f190c1c8a7.yaml b/releasenotes/notes/ephemeral-heat-minor-update-db24c2f190c1c8a7.yaml new file mode 100644 index 000000000..1d6775542 --- /dev/null +++ b/releasenotes/notes/ephemeral-heat-minor-update-db24c2f190c1c8a7.yaml @@ -0,0 +1,10 @@ +--- +prelude: > + During a minor update of the overcloud. It was previously necessary to + execute 3 steps. + - Update Prepare + - Update Run + - Update Converge + Starting in W, it is no longer necessary to perform a Stack update + during the converge. This change removes the stack update from the + converge step. Now, we will just run the deploy_steps_playbook instead. \ No newline at end of file diff --git a/tripleoclient/constants.py b/tripleoclient/constants.py index 0ce485011..78e654a42 100644 --- a/tripleoclient/constants.py +++ b/tripleoclient/constants.py @@ -101,7 +101,6 @@ EXTERNAL_UPGRADE_PLAYBOOKS = ['external_upgrade_steps_playbook.yaml'] # upgrade environment files expected by the client in the --templates # tripleo-heat-templates default above $TRIPLEO_HEAT_TEMPLATES UPDATE_PREPARE_ENV = "environments/lifecycle/update-prepare.yaml" -UPDATE_CONVERGE_ENV = "environments/lifecycle/update-converge.yaml" UPGRADE_PREPARE_ENV = "environments/lifecycle/upgrade-prepare.yaml" UPGRADE_CONVERGE_ENV = "environments/lifecycle/upgrade-converge.yaml" UPGRADE_CONVERGE_FORBIDDEN_PARAMS = ["ceph3_namespace", diff --git a/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py b/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py index 84c8b1caf..056cafbc7 100644 --- a/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py +++ b/tripleoclient/tests/v1/overcloud_update/test_overcloud_update.py @@ -139,35 +139,57 @@ class TestOvercloudUpdateRun(fakes.TestOvercloudUpdateRun): class TestOvercloudUpdateConverge(fakes.TestOvercloudUpdateConverge): - def setUp(self): super(TestOvercloudUpdateConverge, self).setUp() - # Get the command object to test app_args = mock.Mock() app_args.verbose_level = 1 self.cmd = overcloud_update.UpdateConverge(self.app, app_args) + @mock.patch('tripleoclient.utils.get_key') + @mock.patch('tripleoclient.utils.get_default_working_dir') @mock.patch('tripleoclient.utils.ensure_run_as_normal_user') @mock.patch('tripleoclient.utils.prompt_user_for_confirmation', return_value=True) @mock.patch( - 'tripleoclient.v1.overcloud_deploy.DeployOvercloud.take_action') + 'tripleoclient.utils.run_ansible_playbook') def test_update_converge(self, deploy_action, mock_confirm, - mock_usercheck): - argslist = ['--templates', '--stack', 'cloud'] + mock_usercheck, mock_dir, mock_key): + argslist = ['--stack', 'cloud'] verifylist = [ ('stack', 'cloud') ] - parsed_args = self.check_parser(self.cmd, argslist, verifylist) + mock_dir.return_value = "/home/stack/overcloud-deploy" + ansible_dir = "{}/config-download/cloud".format( + mock_dir.return_value + ) + inventory = "{}/tripleo-ansible-inventory.yaml".format( + ansible_dir + ) + ansible_cfg = "{}/ansible.cfg".format( + ansible_dir + ) + mock_key.return_value = '/home/stack/.ssh/id_rsa_tripleo' + parsed_args = self.check_parser(self.cmd, argslist, verifylist) with mock.patch('os.path.exists') as mock_exists, \ mock.patch('os.path.isfile') as mock_isfile: mock_exists.return_value = True mock_isfile.return_value = True self.cmd.take_action(parsed_args) mock_usercheck.assert_called_once() - assert('/usr/share/openstack-tripleo-heat-templates/' - 'environments/lifecycle/update-converge.yaml' - in parsed_args.environment_files) - deploy_action.assert_called_once_with(parsed_args) + deploy_action.assert_called_once_with( + playbook='deploy_steps_playbook.yaml', + inventory=inventory, + workdir=ansible_dir, + playbook_dir=ansible_dir, + ansible_cfg=ansible_cfg, + ssh_user='tripleo-admin', + reproduce_command=True, + forks=parsed_args.ansible_forks, + extra_env_variables={ + "ANSIBLE_BECOME": True, + "ANSIBLE_PRIVATE_KEY_FILE": + "/home/stack/.ssh/id_rsa_tripleo" + } + ) diff --git a/tripleoclient/v1/overcloud_update.py b/tripleoclient/v1/overcloud_update.py index 708fad193..b0574b28d 100644 --- a/tripleoclient/v1/overcloud_update.py +++ b/tripleoclient/v1/overcloud_update.py @@ -12,6 +12,8 @@ # License for the specific language governing permissions and limitations # under the License. # +import os + from oslo_config import cfg from oslo_log import log as logging @@ -24,18 +26,17 @@ from tripleoclient import command from tripleoclient import constants from tripleoclient import utils as oooutils from tripleoclient.v1.overcloud_deploy import DeployOvercloud -from tripleoclient.workflows import deployment CONF = cfg.CONF class UpdatePrepare(DeployOvercloud): - """Run heat stack update for overcloud nodes to refresh heat stack outputs. + """Use Heat to update and render the new Ansible playbooks based + on the updated templates. - The heat stack outputs are what we use later on to generate ansible - playbooks which deliver the minor update workflow. This is used as the - first step for a minor update of your overcloud. + These playbooks will be rendered and used during the update run step + to perform the minor update of the overcloud nodes. """ log = logging.getLogger(__name__ + ".MinorUpdatePrepare") @@ -188,44 +189,46 @@ class UpdateRun(command.Command): else: playbook = parsed_args.playbook - _, ansible_dir = self.get_ansible_key_and_dir( - no_workflow=True, - stack=parsed_args.stack, - orchestration=self.app.client_manager.orchestration - ) - deployment.config_download( - log=self.log, - clients=self.app.client_manager, - stack=oooutils.get_stack( - self.app.client_manager.orchestration, - parsed_args.stack - ), - output_dir=ansible_dir, - verbosity=oooutils.playbook_verbosity(self=self), - ansible_playbook_name=playbook, - inventory_path=oooutils.get_tripleo_ansible_inventory( - parsed_args.static_inventory, - parsed_args.ssh_user, - parsed_args.stack, - return_inventory_file_path=True - ), - limit_hosts=oooutils.playbook_limit_parse( - limit_nodes=parsed_args.limit - ), + ansible_dir = os.path.join(oooutils.get_default_working_dir( + parsed_args.stack + ), + 'config-download', + parsed_args.stack) + + if not parsed_args.static_inventory: + inventory = os.path.join(ansible_dir, + 'tripleo-ansible-inventory.yaml') + else: + inventory = parsed_args.static_inventory + + ansible_cfg = os.path.join(ansible_dir, 'ansible.cfg') + key_file = oooutils.get_key(parsed_args.stack) + + oooutils.run_ansible_playbook( + playbook=playbook, + inventory=inventory, + workdir=ansible_dir, + playbook_dir=ansible_dir, skip_tags=parsed_args.skip_tags, tags=parsed_args.tags, - forks=parsed_args.ansible_forks + ansible_cfg=ansible_cfg, + ssh_user='tripleo-admin', + limit_hosts=parsed_args.limit, + reproduce_command=True, + forks=parsed_args.ansible_forks, + extra_env_variables={ + "ANSIBLE_BECOME": True, + "ANSIBLE_PRIVATE_KEY_FILE": key_file + } ) - self.log.info("Completed Overcloud Minor Update Run.") + self.log.info("Completed Minor Update Run.") class UpdateConverge(DeployOvercloud): """Converge the update on Overcloud nodes. - This restores the plan and stack so that normal deployment workflow is back in place. """ - log = logging.getLogger(__name__ + ".UpdateConverge") def get_parser(self, prog_name): @@ -236,6 +239,7 @@ class UpdateConverge(DeployOvercloud): "required before any update operation. " "Use this with caution! "), ) + return parser def take_action(self, parsed_args): @@ -249,13 +253,30 @@ class UpdateConverge(DeployOvercloud): constants.UPDATE_PROMPT, self.log)): raise OvercloudUpdateNotConfirmed(constants.UPDATE_NO) - # Add the update-converge.yaml environment to unset noops - templates_dir = (parsed_args.templates or - constants.TRIPLEO_HEAT_TEMPLATES) - parsed_args.environment_files = oooutils.prepend_environment( - parsed_args.environment_files, templates_dir, - constants.UPDATE_CONVERGE_ENV) + ansible_dir = os.path.join(oooutils.get_default_working_dir( + parsed_args.stack + ), + 'config-download', + parsed_args.stack) - super(UpdateConverge, self).take_action(parsed_args) - self.log.info("Update converge on stack {0} complete.".format( - parsed_args.stack)) + inventory = os.path.join(ansible_dir, + 'tripleo-ansible-inventory.yaml') + + ansible_cfg = os.path.join(ansible_dir, 'ansible.cfg') + key_file = oooutils.get_key(parsed_args.stack) + + oooutils.run_ansible_playbook( + playbook='deploy_steps_playbook.yaml', + inventory=inventory, + workdir=ansible_dir, + playbook_dir=ansible_dir, + ansible_cfg=ansible_cfg, + ssh_user='tripleo-admin', + reproduce_command=True, + forks=parsed_args.ansible_forks, + extra_env_variables={ + "ANSIBLE_BECOME": True, + "ANSIBLE_PRIVATE_KEY_FILE": key_file + } + ) + self.log.info("Completed Minor Update Converge.")