diff --git a/setup.cfg b/setup.cfg index 4b3ed4ddd..3070fdebf 100644 --- a/setup.cfg +++ b/setup.cfg @@ -108,6 +108,7 @@ mistral.actions = tripleo.plan.list = tripleo_common.actions.plan:ListPlansAction tripleo.plan.export = tripleo_common.actions.plan:ExportPlanAction tripleo.plan.update_from_dir = tripleo_common.actions.plan:UpdatePlanFromDirAction + tripleo.plan.update_plan_environment = tripleo_common.actions.plan:UpdatePlanEnvironmentAction tripleo.logging_to_swift.format_messages = tripleo_common.actions.logging_to_swift:FormatMessagesAction tripleo.logging_to_swift.publish_ui_log_to_swift = tripleo_common.actions.logging_to_swift:PublishUILogToSwiftAction tripleo.logging_to_swift.prepare_log_download = tripleo_common.actions.logging_to_swift:PrepareLogDownloadAction diff --git a/tripleo_common/actions/package_update.py b/tripleo_common/actions/package_update.py index 4aaa431b4..d7969c9a9 100644 --- a/tripleo_common/actions/package_update.py +++ b/tripleo_common/actions/package_update.py @@ -28,11 +28,12 @@ LOG = logging.getLogger(__name__) class UpdateStackAction(templates.ProcessTemplatesAction): - def __init__(self, timeout, container_registry, + def __init__(self, timeout, container_registry, ceph_ansible_playbook, container=constants.DEFAULT_CONTAINER_NAME): super(UpdateStackAction, self).__init__(container) self.timeout_mins = timeout self.container_registry = container_registry + self.ceph_ansible_playbook = ceph_ansible_playbook def run(self, context): # get the stack. Error if doesn't exist @@ -76,11 +77,12 @@ class UpdateStackAction(templates.ProcessTemplatesAction): noop_env['resource_registry'].update(role_env) update_env.update(noop_env) template_utils.deep_update(env, update_env) - - # Update parameters parameters = {} if self.container_registry is not None: parameters.update(self.container_registry['parameter_defaults']) + if self.ceph_ansible_playbook: + parameters.update({'CephAnsiblePlaybook': '%s' % + self.ceph_ansible_playbook}) plan_utils.update_in_env(swift, env, 'parameter_defaults', parameters) # process all plan files and create or update a stack diff --git a/tripleo_common/actions/plan.py b/tripleo_common/actions/plan.py index 077642d56..bfb31569e 100644 --- a/tripleo_common/actions/plan.py +++ b/tripleo_common/actions/plan.py @@ -302,3 +302,58 @@ class UpdatePlanFromDirAction(base.TripleOAction): except Exception as err: msg = "Error while updating plan: %s" % err return actions.Result(error=msg) + + +class UpdatePlanEnvironmentAction(base.TripleOAction): + """Updates the plan environment values + + Updates a plan environment values with the given parameters: + Add new parameter + Delete parameter + + :param parameter: key value of the parameter to add or delete + :param value: value of the parameter to add or delete + :param delete: True if the parameter should be deleted from the env + :param env_key: environment key that should be one of the keys present + in the plan environment dictionary: + 'passwords', + 'description', + 'parameter_defaults', + 'environments', + 'version', + 'template', + 'resource_registry', + 'name' + :param container: name of the Swift container / plan name + """ + + def __init__(self, parameter, env_key, value=None, delete=False, + container=constants.DEFAULT_CONTAINER_NAME): + super(UpdatePlanEnvironmentAction, self).__init__() + self.container = container + self.parameter = parameter + self.value = value + self.delete = delete + self.env_key = env_key + + def run(self, context): + try: + swift = self.get_object_client(context) + plan_env = plan_utils.get_env(swift, self.container) + if self.env_key in plan_env.keys(): + if self.delete: + try: + plan_env[self.env_key].pop(self.parameter) + except KeyError: + pass + else: + plan_env[self.env_key].update({self.parameter: self.value}) + else: + msg = "The environment key doesn't exist: %s" % self.env_key + return actions.Result(error=msg) + except swiftexceptions.ClientException as err: + msg = "Error attempting an operation on container: %s" % err + return actions.Result(error=msg) + except Exception as err: + msg = "Error while updating plan: %s" % err + return actions.Result(error=msg) diff --git a/tripleo_common/tests/actions/test_package_update.py b/tripleo_common/tests/actions/test_package_update.py index ec5677de8..63e2ec859 100644 --- a/tripleo_common/tests/actions/test_package_update.py +++ b/tripleo_common/tests/actions/test_package_update.py @@ -97,7 +97,6 @@ class UpdateStackActionTest(base.TestCase): update_env = {'resource_registry': {'OS::TripleO::DeploymentSteps': 'OS::Heat::None'}} - mock_getenv.return_value = env fake_registry = {'parameter_defaults': {'DockerKeystoneImage': '192.168.24.1:8787/' @@ -109,7 +108,8 @@ class UpdateStackActionTest(base.TestCase): mock_object_client.return_value = mock_swift action = package_update.UpdateStackAction(self.timeout, fake_registry, - container=self.container) + container=self.container, + ceph_ansible_playbook=None) action.run(mock_ctx) mock_updateinenv.assert_called_once_with( mock_swift, env, 'parameter_defaults', diff --git a/workbooks/package_update.yaml b/workbooks/package_update.yaml index f5dbfcab1..5be44805d 100644 --- a/workbooks/package_update.yaml +++ b/workbooks/package_update.yaml @@ -12,6 +12,7 @@ workflows: input: - container - container_registry + - ceph_ansible_playbook - timeout: 240 - queue_name: tripleo - skip_deploy_identifier: False @@ -29,11 +30,22 @@ workflows: on-error: set_update_failed update: - action: tripleo.package_update.update_stack container=<% $.container %> timeout=<% $.timeout %> container_registry=<% $.container_registry %> + action: tripleo.package_update.update_stack container=<% $.container %> timeout=<% $.timeout %> container_registry=<% $.container_registry %> ceph_ansible_playbook=<% $.ceph_ansible_playbook %> input: timeout: <% $.timeout %> container: <% $.container %> container_registry: <% $.container_registry %> + ceph_ansible_playbook: <% $.ceph_ansible_playbook %> + on-success: clean_plan + on-error: set_update_failed + + clean_plan: + action: tripleo.plan.update_plan_environment + input: + container: <% $.container %> + parameter: CephAnsiblePlaybook + env_key: parameter_defaults + delete: true on-success: get_config on-error: set_update_failed