From c21d24fbba4f549809ee948ba83057d786596a00 Mon Sep 17 00:00:00 2001 From: Alex Schultz Date: Tue, 22 Sep 2020 14:06:34 -0600 Subject: [PATCH] Add --disable-container-prepare flag Users may want to skip the container prepare process to ensure they don't update their containers. This change adds a --disable-container-prepare flag to the following actions which should skip the preparation actions. - overcloud deploy (and updates) - overcloud plan actions - undercloud deploy (and upgrades) - tripleo deploy (and standalone deploy) Closes-Bug: #1896757 Depends-On: https://review.opendev.org/#/c/737522/ Change-Id: I30b448930f53aef108d9bdb544a6d02b18658b0d (cherry picked from commit 0d84ac9234bf93ca4d1471d5860739bc31a6be80) --- tripleoclient/tests/v1/test_overcloud_plan.py | 11 +++++- .../tests/workflows/test_plan_management.py | 14 ++++++- tripleoclient/v1/overcloud_deploy.py | 18 +++++++-- tripleoclient/v1/overcloud_plan.py | 20 ++++++++-- tripleoclient/v1/tripleo_deploy.py | 13 ++++++- tripleoclient/v1/undercloud.py | 13 ++++++- tripleoclient/v1/undercloud_config.py | 6 ++- tripleoclient/workflows/plan_management.py | 38 +++++++++++++------ 8 files changed, 109 insertions(+), 24 deletions(-) diff --git a/tripleoclient/tests/v1/test_overcloud_plan.py b/tripleoclient/tests/v1/test_overcloud_plan.py index fd50fca69..f26ee8fd0 100644 --- a/tripleoclient/tests/v1/test_overcloud_plan.py +++ b/tripleoclient/tests/v1/test_overcloud_plan.py @@ -132,6 +132,7 @@ class TestOvercloudCreatePlan(utils.TestCommand): "container": "overcast", "generate_passwords": True, "use_default_templates": True, + "disable_image_params_prepare": False, }, verbosity=3, ) @@ -164,6 +165,7 @@ class TestOvercloudCreatePlan(utils.TestCommand): "container": "overcast", "generate_passwords": True, "use_default_templates": False, + "disable_image_params_prepare": False, }, verbosity=3, ) @@ -205,6 +207,7 @@ class TestOvercloudCreatePlan(utils.TestCommand): "generate_passwords": True, "plan_environment": "the_plan_environment.yaml", "use_default_templates": False, + "disable_image_params_prepare": False, }, verbosity=3, ) @@ -217,11 +220,13 @@ class TestOvercloudCreatePlan(utils.TestCommand): self, mock_tmp, mock_cd, mock_run_playbook): # Setup - arglist = ['overcast', '--disable-password-generation'] + arglist = ['overcast', '--disable-password-generation', + '--disable-container-prepare'] verifylist = [ ('name', 'overcast'), ('templates', None), - ('disable_password_generation', True) + ('disable_password_generation', True), + ('disable_container_prepare', True) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -238,6 +243,7 @@ class TestOvercloudCreatePlan(utils.TestCommand): "container": "overcast", "generate_passwords": False, "use_default_templates": True, + "disable_image_params_prepare": True, }, verbosity=3, ) @@ -271,6 +277,7 @@ class TestOvercloudCreatePlan(utils.TestCommand): "generate_passwords": True, "use_default_templates": False, "source_url": "http://tripleo.org/templates", + "disable_image_params_prepare": False, }, verbosity=3, ) diff --git a/tripleoclient/tests/workflows/test_plan_management.py b/tripleoclient/tests/workflows/test_plan_management.py index f7c7e0155..1a9f68d91 100644 --- a/tripleoclient/tests/workflows/test_plan_management.py +++ b/tripleoclient/tests/workflows/test_plan_management.py @@ -51,6 +51,7 @@ class TestPlanCreationWorkflows(utils.TestCommand): "container": "test-overcloud", "generate_passwords": True, "use_default_templates": False, + "disable_image_params_prepare": False, }, verbosity=0, ) @@ -82,6 +83,7 @@ class TestPlanCreationWorkflows(utils.TestCommand): "container": "test-overcloud", "generate_passwords": True, "use_default_templates": False, + "disable_image_params_prepare": False, }, verbosity=0, ) @@ -118,6 +120,7 @@ class TestPlanCreationWorkflows(utils.TestCommand): "generate_passwords": True, "plan_environment": "the-plan-environment.yaml", "use_default_templates": False, + "disable_image_params_prepare": False, }, verbosity=0, ) @@ -152,6 +155,7 @@ class TestPlanCreationWorkflows(utils.TestCommand): "container": "test-overcloud", "generate_passwords": True, "use_default_templates": False, + "disable_image_params_prepare": False, }, verbosity=0, ) @@ -173,7 +177,8 @@ class TestPlanCreationWorkflows(utils.TestCommand): self.app.client_manager, 'test-overcloud', '/tht-root/', - generate_passwords=False) + generate_passwords=False, + disable_image_params_prepare=True) mock_run_playbook.assert_called_once_with( 'cli-create-deployment-plan.yaml', @@ -184,6 +189,7 @@ class TestPlanCreationWorkflows(utils.TestCommand): "container": "test-overcloud", "generate_passwords": False, "use_default_templates": False, + "disable_image_params_prepare": True, }, verbosity=0, ) @@ -268,6 +274,7 @@ class TestPlanUpdateWorkflows(base.TestCommand): extra_vars={ "container": "test-overcloud", "generate_passwords": True, + "disable_image_params_prepare": False, }, verbosity=1, ) @@ -303,6 +310,7 @@ class TestPlanUpdateWorkflows(base.TestCommand): extra_vars={ "container": "test-overcloud", "generate_passwords": True, + "disable_image_params_prepare": False, }, verbosity=1, ) @@ -324,7 +332,8 @@ class TestPlanUpdateWorkflows(base.TestCommand): plan_management.update_plan_from_templates( self.app.client_manager, 'test-overcloud', - '/tht-root/') + '/tht-root/', + disable_image_params_prepare=True) # A dictionary without the "passwords" key is provided in # the _load_passwords method. mock_yaml_safe_load.return_value = {} @@ -339,6 +348,7 @@ class TestPlanUpdateWorkflows(base.TestCommand): extra_vars={ "container": "test-overcloud", "generate_passwords": True, + "disable_image_params_prepare": True, }, verbosity=1, ) diff --git a/tripleoclient/v1/overcloud_deploy.py b/tripleoclient/v1/overcloud_deploy.py index 8976d686d..2b784cbd7 100644 --- a/tripleoclient/v1/overcloud_deploy.py +++ b/tripleoclient/v1/overcloud_deploy.py @@ -460,7 +460,8 @@ class DeployOvercloud(command.Command): parsed_args.plan_environment_file, parsed_args.networks_file, type(self)._keep_env_on_update, - verbosity_level=utils.playbook_verbosity(self=self) + utils.playbook_verbosity(self=self), + parsed_args.disable_container_prepare ) else: plan_management.create_plan_from_templates( @@ -468,7 +469,8 @@ class DeployOvercloud(command.Command): parsed_args.roles_file, generate_passwords, parsed_args.plan_environment_file, parsed_args.networks_file, - verbosity_level=utils.playbook_verbosity(self=self) + utils.playbook_verbosity(self=self), + parsed_args.disable_container_prepare ) # Get any missing (e.g j2 rendered) files from the plan to tht_root @@ -726,7 +728,7 @@ class DeployOvercloud(command.Command): "baremetal_deployment": roles, "baremetal_deployed_path": output_path, "ssh_public_keys": ssh_key, - "ssh_user_name": parsed_args.overcloud_ssh_user, + "ssh_user_name": parsed_args.overcloud_ssh_user } with utils.TempDirs() as tmp: @@ -1057,6 +1059,16 @@ class DeployOvercloud(command.Command): help=_('The number of Ansible forks to use for the' ' config-download ansible-playbook command.') ) + parser.add_argument( + '--disable-container-prepare', + action='store_true', + default=False, + help=_('Disable the container preparation actions to prevent ' + 'container tags from being updated and new containers ' + 'from being fetched. If you skip this but do not have ' + 'the container parameters configured, the deployment ' + 'action may fail.') + ) return parser def take_action(self, parsed_args): diff --git a/tripleoclient/v1/overcloud_plan.py b/tripleoclient/v1/overcloud_plan.py index 6bf470492..d3fffd13d 100644 --- a/tripleoclient/v1/overcloud_plan.py +++ b/tripleoclient/v1/overcloud_plan.py @@ -104,7 +104,16 @@ class CreatePlan(command.Command): 'to deploy. If this or --templates isn\'t provided, the ' 'templates packaged on the Undercloud will be used.') ) - + parser.add_argument( + '--disable-container-prepare', + action='store_true', + default=False, + help=_('Disable the container preparation actions to prevent ' + 'container tags from being updated and new containers ' + 'from being fetched. If you skip this but do not have ' + 'the container parameters configured, the deployment ' + 'action may fail.') + ) return parser def take_action(self, parsed_args): @@ -120,12 +129,16 @@ class CreatePlan(command.Command): if not parsed_args.templates and not parsed_args.source_url: use_default_templates = True + # Needs this to avoid too long lines + disable_container_prepare = parsed_args.disable_container_prepare + if parsed_args.templates: plan_management.create_plan_from_templates( clients, name, parsed_args.templates, generate_passwords=generate_passwords, plan_env_file=parsed_args.plan_environment_file, - verbosity_level=utils.playbook_verbosity(self=self) + verbosity_level=utils.playbook_verbosity(self=self), + disable_image_params_prepare=disable_container_prepare ) else: plan_management.create_deployment_plan( @@ -133,7 +146,8 @@ class CreatePlan(command.Command): generate_passwords=generate_passwords, source_url=source_url, use_default_templates=use_default_templates, - verbosity_level=utils.playbook_verbosity(self=self) + verbosity_level=utils.playbook_verbosity(self=self), + disable_image_params_prepare=disable_container_prepare ) diff --git a/tripleoclient/v1/tripleo_deploy.py b/tripleoclient/v1/tripleo_deploy.py index 556b1a0a4..26248dbe6 100644 --- a/tripleoclient/v1/tripleo_deploy.py +++ b/tripleoclient/v1/tripleo_deploy.py @@ -802,7 +802,8 @@ class Deploy(command.Command): environments, self.tht_render, parsed_args.templates, cleanup=parsed_args.cleanup) - self._prepare_container_images(env, roles_data) + if not parsed_args.disable_container_prepare: + self._prepare_container_images(env, roles_data) parameters.convert_docker_params(env) self.log.debug(_("Getting template contents")) @@ -1114,6 +1115,16 @@ class Deploy(command.Command): help=_('The number of Ansible forks to use for the' ' config-download ansible-playbook command.') ) + parser.add_argument( + '--disable-container-prepare', + action='store_true', + default=False, + help=_('Disable the container preparation actions to prevent ' + 'container tags from being updated and new containers ' + 'from being fetched. If you skip this but do not have ' + 'the container parameters configured, the deployment ' + 'action may fail.') + ) stack_action_group = parser.add_mutually_exclusive_group() diff --git a/tripleoclient/v1/undercloud.py b/tripleoclient/v1/undercloud.py index 6ac8a5372..b8bfb67af 100644 --- a/tripleoclient/v1/undercloud.py +++ b/tripleoclient/v1/undercloud.py @@ -122,6 +122,16 @@ class InstallUndercloud(command.Command): parser.add_argument('-y', '--yes', default=False, action='store_true', help=_("Skip yes/no prompt (assume yes).")) + parser.add_argument( + '--disable-container-prepare', + action='store_true', + default=False, + help=_('Disable the container preparation actions to prevent ' + 'container tags from being updated and new containers ' + 'from being fetched. If you skip this but do not have ' + 'the container parameters configured, the deployment ' + 'action may fail.') + ) return parser def take_action(self, parsed_args): @@ -140,7 +150,8 @@ class InstallUndercloud(command.Command): verbose_level=self.app_args.verbose_level, force_stack_update=parsed_args.force_stack_update, dry_run=parsed_args.dry_run, - inflight=inflight) + inflight=inflight, + disable_container_prepare=parsed_args.disable_container_prepare) self.log.warning("Running: %s" % ' '.join(cmd)) if not parsed_args.dry_run: diff --git a/tripleoclient/v1/undercloud_config.py b/tripleoclient/v1/undercloud_config.py index 365b27b6f..c0658cb7b 100644 --- a/tripleoclient/v1/undercloud_config.py +++ b/tripleoclient/v1/undercloud_config.py @@ -438,7 +438,8 @@ def _process_chrony_acls(env): def prepare_undercloud_deploy(upgrade=False, no_validations=True, verbose_level=1, yes=False, force_stack_update=False, dry_run=False, - inflight=False): + inflight=False, + disable_container_prepare=False): """Prepare Undercloud deploy command based on undercloud.conf""" if CONF.get('undercloud_hostname'): @@ -841,6 +842,9 @@ def prepare_undercloud_deploy(upgrade=False, no_validations=True, if inflight: deploy_args.append('--inflight-validations') + if disable_container_prepare: + deploy_args.append('--disable-container-prepare') + if CONF.get('custom_env_files'): for custom_file in CONF['custom_env_files']: deploy_args += ['-e', custom_file] diff --git a/tripleoclient/workflows/plan_management.py b/tripleoclient/workflows/plan_management.py index 4d43cc465..ff1794226 100644 --- a/tripleoclient/workflows/plan_management.py +++ b/tripleoclient/workflows/plan_management.py @@ -66,7 +66,8 @@ def _upload_templates(swift_client, container_name, tht_root, roles_file=None, def create_deployment_plan(container, generate_passwords, use_default_templates=False, source_url=None, - verbosity_level=0, plan_env_file=None): + verbosity_level=0, plan_env_file=None, + disable_image_params_prepare=False): """Create a deployment plan. :param container: Container name to push to. @@ -87,12 +88,16 @@ def create_deployment_plan(container, generate_passwords, :param plan_env_file: Path to plan environment file :type plan_env_file: String + + :param disable_image_params_prepare: Disable container params prepare task + :type disable_image_params_prepare: Boolean """ extra_vars = { "container": container, "generate_passwords": generate_passwords, "use_default_templates": use_default_templates, + "disable_image_params_prepare": disable_image_params_prepare } if source_url: @@ -132,7 +137,8 @@ def delete_deployment_plan(clients, container): def update_deployment_plan(clients, container, generate_passwords, - verbosity_level=0): + verbosity_level=0, + disable_image_params_prepare=False): """Update a deployment plan. :param clients: Application client object. @@ -146,6 +152,9 @@ def update_deployment_plan(clients, container, generate_passwords, :param verbosity_level: Verbosity level used in playbook execution :type verbosity_level: Integer + + :param disable_image_params_prepare: Disable container params prepare task + :type disable_image_params_prepare: Boolean """ with utils.TempDirs() as tmp: @@ -157,6 +166,7 @@ def update_deployment_plan(clients, container, generate_passwords, extra_vars={ "container": container, "generate_passwords": generate_passwords, + "disable_image_params_prepare": disable_image_params_prepare }, verbosity=verbosity_level ) @@ -171,7 +181,8 @@ def list_deployment_plans(clients): def create_plan_from_templates(clients, name, tht_root, roles_file=None, generate_passwords=True, plan_env_file=None, - networks_file=None, verbosity_level=0): + networks_file=None, verbosity_level=0, + disable_image_params_prepare=False): swift_client = clients.tripleoclient.object_store print("Creating Swift container to store the plan") @@ -183,10 +194,12 @@ def create_plan_from_templates(clients, name, tht_root, roles_file=None, plan_env_file, networks_file) try: - create_deployment_plan(container=name, - generate_passwords=generate_passwords, - plan_env_file=plan_env_file, - verbosity_level=verbosity_level) + create_deployment_plan( + container=name, + generate_passwords=generate_passwords, + plan_env_file=plan_env_file, + verbosity_level=verbosity_level, + disable_image_params_prepare=disable_image_params_prepare) except exceptions.WorkflowServiceError: swiftutils.delete_container(swift_client, name) raise @@ -195,7 +208,8 @@ def create_plan_from_templates(clients, name, tht_root, roles_file=None, def update_plan_from_templates(clients, name, tht_root, roles_file=None, generate_passwords=True, plan_env_file=None, networks_file=None, keep_env=False, - verbosity_level=1): + verbosity_level=1, + disable_image_params_prepare=False): swift_client = clients.tripleoclient.object_store passwords = None keep_file_contents = {} @@ -247,9 +261,11 @@ def update_plan_from_templates(clients, name, tht_root, roles_file=None, plan_env_file, networks_file) _update_passwords(swift_client, name, passwords) - update_deployment_plan(clients, container=name, - generate_passwords=generate_passwords, - verbosity_level=verbosity_level) + update_deployment_plan( + clients, container=name, + generate_passwords=generate_passwords, + verbosity_level=verbosity_level, + disable_image_params_prepare=disable_image_params_prepare) def _load_content_or_file(swift_client, container, remote_and_local_map):