def run(self, context): swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) parameter_defaults = env.get('parameter_defaults', {}) passwords = self._get_overriden_passwords(env.get('passwords', {}), parameter_defaults) next_index = self.get_next_index(passwords['KeystoneFernetKeys']) keys_map = self.rotate_keys(passwords['KeystoneFernetKeys'], next_index) max_keys = self.get_max_keys_value(parameter_defaults) keys_map = self.purge_excess_keys(max_keys, keys_map) env['passwords']['KeystoneFernetKeys'] = keys_map try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) self.cache_delete(context, self.container, "tripleo.parameters.get") return keys_map
def run(self, context): # get the stack. Error if doesn't exist heat = self.get_orchestration_client(context) try: stack = heat.stacks.get(self.container) except heatexceptions.HTTPNotFound: msg = "Error retrieving stack: %s" % self.container LOG.exception(msg) return actions.Result(error=msg) swift = self.get_object_client(context) # Get output and check if DeployStep are None removals = ['OS::TripleO::DeploymentSteps'] for output in stack.to_dict().get('outputs', {}): if output['output_key'] == 'RoleData': for role in output['output_value']: removals.append("OS::TripleO::Tasks::%sPreConfig" % role) removals.append("OS::TripleO::Tasks::%sPostConfig" % role) plan_env = plan_utils.get_env(swift, self.container) self.remove_noops_from_env(removals, plan_env) plan_utils.put_env(swift, plan_env) user_env = plan_utils.get_user_env(swift, self.container) self.remove_noops_from_env(removals, user_env) plan_utils.put_user_env(swift, self.container, user_env)
def run(self, context): swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) parameter_defaults = env.get('parameter_defaults', {}) passwords = self._get_overriden_passwords(env.get('passwords', {}), parameter_defaults) next_index = self.get_next_index(passwords['KeystoneFernetKeys']) keys_map = self.rotate_keys(passwords['KeystoneFernetKeys'], next_index) max_keys = self.get_max_keys_value(parameter_defaults) keys_map = self.purge_excess_keys(max_keys, keys_map) env['passwords']['KeystoneFernetKeys'] = keys_map try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) self.cache_delete(context, self.container, "tripleo.parameters.get") return keys_map
def run(self, context): # get the stack. Error if doesn't exist heat = self.get_orchestration_client(context) try: stack = heat.stacks.get(self.container) except heatexceptions.HTTPNotFound: msg = "Error retrieving stack: %s" % self.container LOG.exception(msg) return actions.Result(error=msg) swift = self.get_object_client(context) # Get output and check if DeployStep are None removals = ['OS::TripleO::DeploymentSteps'] for output in stack.to_dict().get('outputs', {}): if output['output_key'] == 'RoleData': for role in output['output_value']: removals.append("OS::TripleO::Tasks::%sPreConfig" % role) removals.append("OS::TripleO::Tasks::%sPostConfig" % role) plan_env = plan_utils.get_env(swift, self.container) self.remove_noops_from_env(removals, plan_env) plan_utils.put_env(swift, plan_env) user_env = plan_utils.get_user_env(swift, self.container) self.remove_noops_from_env(removals, user_env) plan_utils.put_user_env(swift, self.container, user_env)
def run(self, context): swift = self.get_object_client(context) mistral = self.get_workflow_client(context) from_mistral = False try: env = plan_utils.get_env(swift, self.plan) except swiftexceptions.ClientException: # The plan has not been migrated yet. Check if there is a # Mistral environment. try: env = mistral.environments.get(self.plan).variables from_mistral = True except (mistralclient_base.APIException, keystoneauth_exc.http.NotFound): # No Mistral env and no template: likely deploying old # templates aka previous version of OpenStack. env = {'version': 1.0, 'name': self.plan, 'description': '', 'template': 'overcloud.yaml', 'environments': [ {'path': 'overcloud-resource-registry-puppet.yaml'} ]} # Store the environment info into Swift plan_utils.put_env(swift, env) if from_mistral: mistral.environments.delete(self.plan)
def run(self, context): swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) for k, v in self.environments.items(): found = False if {'path': k} in env['environments']: found = True if v: if not found: env['environments'].append({'path': k}) else: if found: env['environments'].remove({'path': k}) if self.purge_missing: for e in env['environments']: if e.get('path') not in self.environments: env['environments'].remove(e) self.cache_delete(context, self.container, "tripleo.parameters.get") if self.sort_environments: # get the capabilities-map content to perform the environment # ordering try: swift = self.get_object_client(context) map_file = swiftutils.get_object_string( swift, self.container, 'capabilities-map.yaml') capabilities = yaml.safe_load(map_file) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving capabilities-map.yaml for " "plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) ordered_env = plan_utils.apply_environments_order( capabilities, env.get('environments', [])) env['environments'] = ordered_env try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) return env
def run(self, context): swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) for k, v in self.environments.items(): found = False if {'path': k} in env['environments']: found = True if v: if not found: env['environments'].append({'path': k}) else: if found: env['environments'].remove({'path': k}) if self.purge_missing: for e in env['environments']: if e.get('path') not in self.environments: env['environments'].remove(e) self.cache_delete(context, self.container, "tripleo.parameters.get") if self.sort_environments: # get the capabilities-map content to perform the environment # ordering try: swift = self.get_object_client(context) map_file = swiftutils.get_object_string( swift, self.container, 'capabilities-map.yaml') capabilities = yaml.safe_load(map_file) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving capabilities-map.yaml for " "plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) ordered_env = plan_utils.apply_environments_order( capabilities, env.get('environments', [])) env['environments'] = ordered_env try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) return env
def run(self, context): heat = self.get_orchestration_client(context) swift = self.get_object_client(context) mistral = self.get_workflow_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) try: stack_env = heat.stacks.environment( stack_id=self.container) # legacy heat resource names from overcloud.yaml # We don't modify these to avoid changing defaults for pw_res in constants.LEGACY_HEAT_PASSWORD_RESOURCE_NAMES: try: res = heat.resources.get(self.container, pw_res) param_defaults = stack_env.get('parameter_defaults', {}) param_defaults[pw_res] = res.attributes['value'] except heat_exc.HTTPNotFound: LOG.debug('Heat resouce not found: %s' % pw_res) pass except heat_exc.HTTPNotFound: stack_env = None passwords = password_utils.generate_passwords(mistral, stack_env) # if passwords don't yet exist in plan environment if 'passwords' not in env: env['passwords'] = {} # ensure all generated passwords are present in plan env, # but respect any values previously generated and stored for name, password in passwords.items(): if name not in env['passwords']: env['passwords'][name] = password try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) self.cache_delete(context, self.container, "tripleo.parameters.get") return env['passwords']
def run(self, context): heat = self.get_orchestration_client(context) swift = self.get_object_client(context) mistral = self.get_workflow_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) try: stack_env = heat.stacks.environment( stack_id=self.container) except heat_exc.HTTPNotFound: stack_env = None passwords = password_utils.generate_passwords(mistral, stack_env) # if passwords don't yet exist in plan environment if 'passwords' not in env: env['passwords'] = {} # ensure all generated passwords are present in plan env, # but respect any values previously generated and stored for name, password in passwords.items(): if name not in env['passwords']: env['passwords'][name] = password try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) self.cache_delete(context, self.container, "tripleo.parameters.get") return env['passwords']
def run(self, context): heat = self.get_orchestration_client(context) swift = self.get_object_client(context) mistral = self.get_workflow_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) try: stack_env = heat.stacks.environment(stack_id=self.container) except heat_exc.HTTPNotFound: stack_env = None passwords = password_utils.generate_passwords(mistral, stack_env) # if passwords don't yet exist in plan environment if 'passwords' not in env: env['passwords'] = {} # ensure all generated passwords are present in plan env, # but respect any values previously generated and stored for name, password in passwords.items(): if name not in env['passwords']: env['passwords'][name] = password try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) self.cache_delete(context, self.container, "tripleo.parameters.get") return env['passwords']
def run(self, context): swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) for k, v in self.environments.items(): found = False if {'path': k} in env['environments']: found = True if v: if not found: env['environments'].append({'path': k}) else: if found: env['environments'].remove({'path': k}) if self.purge_missing: for e in env['environments']: if e.get('path') not in self.environments: env['environments'].remove(e) self.cache_delete(context, self.container, "tripleo.parameters.get") try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) return env
def run(self, context): swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) for k, v in self.environments.items(): found = False if {'path': k} in env['environments']: found = True if v: if not found: env['environments'].append({'path': k}) else: if found: env['environments'].remove({'path': k}) if self.purge_missing: for e in env['environments']: if e.get('path') not in self.environments: env['environments'].remove(e) self.cache_delete(context, self.container, "tripleo.parameters.get") try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = "Error uploading to container: %s" % err LOG.exception(err_msg) return actions.Result(error=err_msg) return env
def run(self, context): swift = self.get_object_client(context) mistral = self.get_workflow_client(context) from_mistral = False try: env = plan_utils.get_env(swift, self.plan) except swiftexceptions.ClientException: # The plan has not been migrated yet. Check if there is a # Mistral environment. try: env = mistral.environments.get(self.plan).variables from_mistral = True except (mistralclient_base.APIException, keystoneauth_exc.http.NotFound): # No Mistral env and no template: likely deploying old # templates aka previous version of OpenStack. env = { 'version': 1.0, 'name': self.plan, 'description': '', 'template': 'overcloud.yaml', 'environments': [{ 'path': 'overcloud-resource-registry-puppet.yaml' }] } # Store the environment info into Swift plan_utils.put_env(swift, env) if from_mistral: mistral.environments.delete(self.plan)
def run(self, context): swift = self.get_object_client(context) heat = self.get_orchestration_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) saved_env = copy.deepcopy(env) try: plan_utils.update_in_env(swift, env, self.key, self.parameters) except swiftexceptions.ClientException as err: err_msg = ("Error updating environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) processed_data = super(UpdateParametersAction, self).run(context) # If we receive a 'Result' instance it is because the parent action # had an error. if isinstance(processed_data, actions.Result): return processed_data env = plan_utils.get_env(swift, self.container) if not self.validate: return env params = env.get('parameter_defaults') fields = { 'template': processed_data['template'], 'files': processed_data['files'], 'environment': processed_data['environment'], 'show_nested': True } try: result = { 'heat_resource_tree': heat.stacks.validate(**fields), 'environment_parameters': params, } # Validation passes so the old cache gets replaced. self.cache_set(context, self.container, "tripleo.parameters.get", result) if result['heat_resource_tree']: flattened = {'resources': {}, 'parameters': {}} _flat_it(flattened, 'Root', result['heat_resource_tree']) result['heat_resource_tree'] = flattened except heat_exc.HTTPException as err: LOG.debug("Validation failed rebuilding saved env") # There has been an error validating we must reprocess the # templates with the saved working env plan_utils.put_env(swift, saved_env) self._process_custom_roles(context) err_msg = ("Error validating environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) LOG.debug("Validation worked new env is saved") return result
def run(self, context): # Get object client swift = self.get_object_client(context) # Push plan environment to the swift container plan_utils.put_env(swift, self.plan_environment)
def run(self, context): # get the stack. Error if doesn't exist heat = self.get_orchestration_client(context) try: stack = heat.stacks.get(self.container) except heat_exc.HTTPNotFound: msg = "Error retrieving stack: %s" % self.container LOG.exception(msg) return actions.Result(error=msg) swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) update_env = { 'parameter_defaults': { 'DeployIdentifier': int(time.time()), }, } noop_env = { 'resource_registry': { 'OS::TripleO::DeploymentSteps': 'OS::Heat::None', }, } for output in stack.to_dict().get('outputs', {}): if output['output_key'] == 'RoleData': for role in output['output_value']: role_env = { "OS::TripleO::Tasks::%sPreConfig" % role: 'OS::Heat::None', "OS::TripleO::Tasks::%sPostConfig" % role: 'OS::Heat::None', } noop_env['resource_registry'].update(role_env) update_env.update(noop_env) template_utils.deep_update(env, update_env) try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = ("Error updating environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) # process all plan files and create or update a stack processed_data = super(UpdateStackAction, self).run(context) # If we receive a 'Result' instance it is because the parent action # had an error. if isinstance(processed_data, actions.Result): return processed_data stack_args = processed_data.copy() LOG.info("Performing Heat stack update") LOG.info('updating stack: %s', stack.stack_name) return heat.stacks.update(stack.id, **stack_args)
def run(self, context): # get the stack. Error if doesn't exist heat = self.get_orchestration_client(context) try: stack = heat.stacks.get(self.container) except heat_exc.HTTPNotFound: msg = "Error retrieving stack: %s" % self.container LOG.exception(msg) return actions.Result(error=msg) swift = self.get_object_client(context) try: env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) update_env = { 'parameter_defaults': { 'DeployIdentifier': int(time.time()), }, } noop_env = { 'resource_registry': { 'OS::TripleO::DeploymentSteps': 'OS::Heat::None', }, } for output in stack.to_dict().get('outputs', {}): if output['output_key'] == 'RoleData': for role in output['output_value']: role_env = { "OS::TripleO::Tasks::%sPreConfig" % role: 'OS::Heat::None', "OS::TripleO::Tasks::%sPostConfig" % role: 'OS::Heat::None', } noop_env['resource_registry'].update(role_env) update_env.update(noop_env) template_utils.deep_update(env, update_env) try: plan_utils.put_env(swift, env) except swiftexceptions.ClientException as err: err_msg = ("Error updating environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) # process all plan files and create or update a stack processed_data = super(UpdateStackAction, self).run(context) # If we receive a 'Result' instance it is because the parent action # had an error. if isinstance(processed_data, actions.Result): return processed_data stack_args = processed_data.copy() LOG.info("Performing Heat stack update") LOG.info('updating stack: %s', stack.stack_name) return heat.stacks.update(stack.id, **stack_args)
def run(self, context): # Get object client swift = self.get_object_client(context) # Push plan environment to the swift container plan_utils.put_env(swift, self.plan_environment)