def get_deployment_plan(parsed_deployment, inputs, runtime_only_evaluation=False): try: return tasks.prepare_deployment_plan( parsed_deployment, get_secret_method, inputs=inputs, runtime_only_evaluation=runtime_only_evaluation) except parser_exceptions.MissingRequiredInputError as e: raise manager_exceptions.MissingRequiredDeploymentInputError( str(e)) except parser_exceptions.UnknownInputError as e: raise manager_exceptions.UnknownDeploymentInputError(str(e)) except parser_exceptions.UnknownSecretError as e: raise manager_exceptions.UnknownDeploymentSecretError(str(e)) except parser_exceptions.UnsupportedGetSecretError as e: raise manager_exceptions.UnsupportedDeploymentGetSecretError( str(e))
def stage_deployment_update(self, deployment_id, app_dir, app_blueprint, additional_inputs, new_blueprint_id=None, preview=False, runtime_only_evaluation=False): # enables reverting to original blueprint resources deployment = self.sm.get(models.Deployment, deployment_id) old_blueprint = deployment.blueprint file_server_root = config.instance.file_server_root blueprint_resource_dir = os.path.join(file_server_root, 'blueprints', old_blueprint.tenant_name, old_blueprint.id) runtime_only_evaluation = runtime_only_evaluation or \ deployment.runtime_only_evaluation # The dsl parser expects a URL blueprint_resource_dir_url = 'file:{0}'.format(blueprint_resource_dir) app_path = os.path.join(file_server_root, app_dir, app_blueprint) # parsing the blueprint from here try: plan = tasks.parse_dsl( app_path, resources_base_path=file_server_root, additional_resources=[blueprint_resource_dir_url], **app_context.get_parser_context()) except parser_exceptions.DSLParsingException as ex: raise manager_exceptions.InvalidBlueprintError( 'Invalid blueprint - {0}'.format(ex)) # Updating the new inputs with the deployment inputs # (overriding old values and adding new ones) old_inputs = copy.deepcopy(deployment.inputs) new_inputs = { k: old_inputs[k] for k in plan.inputs.keys() if k in old_inputs } new_inputs.update(additional_inputs) # applying intrinsic functions try: prepared_plan = tasks.prepare_deployment_plan( plan, get_secret_method, inputs=new_inputs, runtime_only_evaluation=runtime_only_evaluation) except parser_exceptions.MissingRequiredInputError as e: raise manager_exceptions.MissingRequiredDeploymentInputError( str(e)) except parser_exceptions.UnknownInputError as e: raise manager_exceptions.UnknownDeploymentInputError(str(e)) except parser_exceptions.UnknownSecretError as e: raise manager_exceptions.UnknownDeploymentSecretError(str(e)) except parser_exceptions.UnsupportedGetSecretError as e: raise manager_exceptions.UnsupportedDeploymentGetSecretError( str(e)) deployment_update_id = '{0}-{1}'.format(deployment.id, uuid.uuid4()) deployment_update = models.DeploymentUpdate( id=deployment_update_id, deployment_plan=prepared_plan, runtime_only_evaluation=runtime_only_evaluation, created_at=utils.get_formatted_timestamp()) deployment_update.set_deployment(deployment) deployment_update.preview = preview deployment_update.old_inputs = old_inputs deployment_update.new_inputs = new_inputs if new_blueprint_id: new_blueprint = self.sm.get(models.Blueprint, new_blueprint_id) deployment_update.old_blueprint = old_blueprint deployment_update.new_blueprint = new_blueprint self.sm.put(deployment_update) return deployment_update
class DeploymentUpdateManager(object): def __init__(self, sm): self.sm = sm self._node_handler = DeploymentUpdateNodeHandler(sm) self._node_instance_handler = DeploymentUpdateNodeInstanceHandler(sm) self._deployment_handler = DeploymentUpdateDeploymentHandler(sm) self._step_validator = StepValidator(sm) def get_deployment_update(self, deployment_update_id, include=None): return self.sm.get(models.DeploymentUpdate, deployment_update_id, include=include) def list_deployment_updates(self, include=None, filters=None, pagination=None, sort=None, substr_filters=None): return self.sm.list(models.DeploymentUpdate, include=include, filters=filters, pagination=pagination, substr_filters=substr_filters, sort=sort) def stage_deployment_update(self, deployment_id, app_dir, app_blueprint, additional_inputs, new_blueprint_id=None, preview=False, runtime_only_evaluation=False): # enables reverting to original blueprint resources deployment = self.sm.get(models.Deployment, deployment_id) old_blueprint = deployment.blueprint file_server_root = config.instance.file_server_root blueprint_resource_dir = os.path.join(file_server_root, 'blueprints', old_blueprint.tenant_name, old_blueprint.id) runtime_only_evaluation = runtime_only_evaluation or \ deployment.runtime_only_evaluation # The dsl parser expects a URL blueprint_resource_dir_url = 'file:{0}'.format(blueprint_resource_dir) app_path = os.path.join(file_server_root, app_dir, app_blueprint) # parsing the blueprint from here try: plan = tasks.parse_dsl( app_path, resources_base_path=file_server_root, additional_resources=[blueprint_resource_dir_url], **app_context.get_parser_context()) except parser_exceptions.DSLParsingException as ex: raise manager_exceptions.InvalidBlueprintError( 'Invalid blueprint - {0}'.format(ex)) # Updating the new inputs with the deployment inputs # (overriding old values and adding new ones) old_inputs = copy.deepcopy(deployment.inputs) new_inputs = { k: old_inputs[k] for k in plan.inputs.keys() if k in old_inputs } new_inputs.update(additional_inputs) # applying intrinsic functions try: prepared_plan = tasks.prepare_deployment_plan( plan, get_secret_method, inputs=new_inputs, runtime_only_evaluation=runtime_only_evaluation) except parser_exceptions.MissingRequiredInputError, e: raise manager_exceptions.MissingRequiredDeploymentInputError( str(e)) except parser_exceptions.UnknownInputError, e: raise manager_exceptions.UnknownDeploymentInputError(str(e))
new_status = models.Execution.CANCELLING if not force \ else models.Execution.FORCE_CANCELLING self.sm.update_execution_status( execution_id, new_status, '') return self.get_execution(execution_id) def create_deployment(self, blueprint_id, deployment_id, inputs=None): blueprint = self.get_blueprint(blueprint_id) plan = blueprint.plan try: deployment_plan = tasks.prepare_deployment_plan(plan, inputs) except parser_exceptions.MissingRequiredInputError, e: raise manager_exceptions.MissingRequiredDeploymentInputError( str(e)) except parser_exceptions.UnknownInputError, e: raise manager_exceptions.UnknownDeploymentInputError(str(e)) now = str(datetime.now()) new_deployment = models.Deployment( id=deployment_id, blueprint_id=blueprint_id, created_at=now, updated_at=now, workflows=deployment_plan['workflows'], inputs=deployment_plan['inputs'], policy_types=deployment_plan['policy_types'], policy_triggers=deployment_plan['policy_triggers'], groups=deployment_plan['groups'], outputs=deployment_plan['outputs']) self.sm.put_deployment(deployment_id, new_deployment) self._create_deployment_nodes(blueprint_id, deployment_id,
class DeploymentUpdateManager(object): def __init__(self): self.sm = get_storage_manager() self._node_handler = DeploymentUpdateNodeHandler() self._node_instance_handler = DeploymentUpdateNodeInstanceHandler() self._deployment_handler = DeploymentUpdateDeploymentHandler() self._step_validator = StepValidator() def get_deployment_update(self, deployment_update_id): """Return the deployment update object :param deployment_update_id: :return: """ return self.sm.get(models.DeploymentUpdate, deployment_update_id) def list_deployment_updates(self, include=None, filters=None, pagination=None, sort=None): """Return a list of deployment updates. :param include: :param filters: :param pagination: :param sort: :return: """ return self.sm.list( models.DeploymentUpdate, include=include, filters=filters, pagination=pagination, sort=sort ) def stage_deployment_update(self, deployment_id, app_dir, app_blueprint, additional_inputs): """Stage a deployment update :param app_blueprint: :param app_dir: :param deployment_id: the deployment id for the update :return: """ # enables reverting to original blueprint resources deployment = self.sm.get(models.Deployment, deployment_id) blueprint_id = deployment.blueprint_id file_server_root = config.instance.file_server_root blueprint_resource_dir = os.path.join( file_server_root, 'blueprints', current_app.config[CURRENT_TENANT_CONFIG].name, blueprint_id) # The dsl parser expects a URL blueprint_resource_dir_url = 'file:{0}'.format(blueprint_resource_dir) app_path = os.path.join(file_server_root, app_dir, app_blueprint) # parsing the blueprint from here try: plan = tasks.parse_dsl( app_path, resources_base_path=file_server_root, additional_resources=[blueprint_resource_dir_url], **app_context.get_parser_context()) except parser_exceptions.DSLParsingException as ex: raise manager_exceptions.InvalidBlueprintError( 'Invalid blueprint - {0}'.format(ex)) # Updating the new inputs with the deployment inputs # (overriding old values and adding new ones) inputs = copy.deepcopy(deployment.inputs) inputs.update(additional_inputs) # applying intrinsic functions try: prepared_plan = tasks.prepare_deployment_plan(plan, get_secret_method(), inputs=inputs) except parser_exceptions.MissingRequiredInputError, e: raise manager_exceptions.MissingRequiredDeploymentInputError( str(e)) except parser_exceptions.UnknownInputError, e: raise manager_exceptions.UnknownDeploymentInputError(str(e))