def patch(self, node_instance_id): """ Update node instance by id """ verify_json_content_type() if request.json.__class__ is not dict or \ 'version' not in request.json or \ request.json['version'].__class__ is not int: if request.json.__class__ is not dict: message = 'Request body is expected to be a map containing ' \ 'a "version" field and optionally ' \ '"runtimeProperties" and/or "state" fields' elif 'version' not in request.json: message = 'Request body must be a map containing a ' \ '"version" field' else: message = \ "request body's 'version' field must be an int but" \ " is of type {0}".format(request.json['version'] .__class__.__name__) raise manager_exceptions.BadParametersError(message) node = models.DeploymentNodeInstance( id=node_instance_id, node_id=None, relationships=None, host_id=None, deployment_id=None, runtime_properties=request.json.get('runtime_properties'), state=request.json.get('state'), version=request.json['version']) get_storage_manager().update_node_instance(node) return responses.NodeInstance(**get_storage_manager( ).get_node_instance(node_instance_id).to_dict())
def finish_deployment_modification(self, modification_id): modification = self.sm.get_deployment_modification(modification_id) if modification.status in models.DeploymentModification.END_STATES: raise manager_exceptions.DeploymentModificationAlreadyEndedError( 'Cannot finish deployment modification: {0}. It is already in' ' {1} status.'.format(modification_id, modification.status)) modified_nodes = modification.modified_nodes for node_id, modified_node in modified_nodes.items(): self.sm.update_node(modification.deployment_id, node_id, number_of_instances=modified_node['instances']) node_instances = modification.node_instances for node_instance in node_instances['removed_and_related']: if node_instance.get('modification') == 'removed': self.sm.delete_node_instance(node_instance['id']) else: removed_relationship_target_ids = set([ rel['target_id'] for rel in node_instance['relationships'] ]) current = self.sm.get_node_instance(node_instance['id']) new_relationships = [ rel for rel in current.relationships if rel['target_id'] not in removed_relationship_target_ids ] self.sm.update_node_instance( models.DeploymentNodeInstance( id=node_instance['id'], relationships=new_relationships, version=current.version, node_id=None, host_id=None, deployment_id=None, state=None, runtime_properties=None)) now = str(datetime.now()) self.sm.update_deployment_modification( models.DeploymentModification( id=modification_id, status=models.DeploymentModification.FINISHED, ended_at=now, created_at=None, deployment_id=None, modified_nodes=None, node_instances=None, context=None)) return models.DeploymentModification( id=modification_id, status=models.DeploymentModification.FINISHED, ended_at=None, created_at=None, deployment_id=None, modified_nodes=None, node_instances=None, context=None)
def rollback_deployment_modification(self, modification_id): modification = self.sm.get_deployment_modification(modification_id) if modification.status in models.DeploymentModification.END_STATES: raise manager_exceptions.DeploymentModificationAlreadyEndedError( 'Cannot rollback deployment modification: {0}. It is already ' 'in {1} status.'.format(modification_id, modification.status)) deplyment_id_filter = self.create_filters_dict( deployment_id=modification.deployment_id) node_instances = self.sm.get_node_instances( filters=deplyment_id_filter).items modification.node_instances['before_rollback'] = [ instance.to_dict() for instance in node_instances ] for instance in node_instances: self.sm.delete_node_instance(instance.id) for instance in modification.node_instances['before_modification']: self.sm.put_node_instance( models.DeploymentNodeInstance(**instance)) nodes_num_instances = { node.id: node for node in self.sm.get_nodes( filters=deplyment_id_filter, include=['id', 'number_of_instances']).items } for node_id, modified_node in modification.modified_nodes.items(): self.sm.update_node( modification.deployment_id, node_id, planned_number_of_instances=nodes_num_instances[node_id]. number_of_instances) now = str(datetime.now()) self.sm.update_deployment_modification( models.DeploymentModification( id=modification_id, status=models.DeploymentModification.ROLLEDBACK, ended_at=now, created_at=None, deployment_id=None, modified_nodes=None, node_instances=modification.node_instances, context=None)) return models.DeploymentModification( id=modification_id, status=models.DeploymentModification.ROLLEDBACK, ended_at=None, created_at=None, deployment_id=None, modified_nodes=None, node_instances=None, context=None)
def _create_deployment_node_instances(self, deployment_id, dsl_node_instances): for node_instance in dsl_node_instances: instance_id = node_instance['id'] node_id = node_instance['name'] relationships = node_instance.get('relationships', []) host_id = node_instance.get('host_id') instance = models.DeploymentNodeInstance( id=instance_id, node_id=node_id, host_id=host_id, relationships=relationships, deployment_id=deployment_id, state='uninitialized', runtime_properties={}, version=None) self.sm.put_node_instance(instance)
def start_deployment_modification(self, deployment_id, modified_nodes, context): # verify deployment exists self.sm.get_deployment(deployment_id, include=['id']) deployment_id_filter = self.create_filters_dict( deployment_id=deployment_id) existing_modifications = self.sm.deployment_modifications_list( include=['id', 'status']).items active_modifications = [ m.id for m in existing_modifications if m.status == models.DeploymentModification.STARTED] if active_modifications: raise \ manager_exceptions.ExistingStartedDeploymentModificationError( 'Cannot start deployment modification while there are ' 'existing started deployment modifications. Currently ' 'started deployment modifications: {0}' .format(active_modifications)) nodes = [node.to_dict() for node in self.sm.get_nodes( filters=deployment_id_filter).items] node_instances = [instance.to_dict() for instance in self.sm.get_node_instances( filters=deployment_id_filter).items] node_instances_modification = tasks.modify_deployment( nodes=nodes, previous_node_instances=node_instances, modified_nodes=modified_nodes) node_instances_modification['before_modification'] = [ instance.to_dict() for instance in self.sm.get_node_instances(filters=deployment_id_filter).items] now = str(datetime.now()) modification_id = str(uuid.uuid4()) modification = models.DeploymentModification( id=modification_id, created_at=now, ended_at=None, status=models.DeploymentModification.STARTED, deployment_id=deployment_id, modified_nodes=modified_nodes, node_instances=node_instances_modification, context=context) self.sm.put_deployment_modification(modification_id, modification) for node_id, modified_node in modified_nodes.items(): self.sm.update_node( modification.deployment_id, node_id, planned_number_of_instances=modified_node['instances']) added_and_related = node_instances_modification['added_and_related'] added_node_instances = [] for node_instance in added_and_related: if node_instance.get('modification') == 'added': added_node_instances.append(node_instance) else: current = self.sm.get_node_instance(node_instance['id']) new_relationships = current.relationships new_relationships += node_instance['relationships'] self.sm.update_node_instance(models.DeploymentNodeInstance( id=node_instance['id'], relationships=new_relationships, version=current.version, node_id=None, host_id=None, deployment_id=None, state=None, runtime_properties=None)) self._create_deployment_node_instances(deployment_id, added_node_instances) return modification
self._create_deployment_environment(new_deployment, deployment_plan, now) node_instances = deployment_plan['node_instances'] for node_instance in node_instances: instance_id = node_instance['id'] node_id = node_instance['name'] relationships = node_instance.get('relationships', []) host_id = node_instance.get('host_id') instance = models.DeploymentNodeInstance( id=instance_id, node_id=node_id, host_id=host_id, relationships=relationships, deployment_id=deployment_id, state='uninitialized', runtime_properties=None, version=None) self.sm.put_node_instance(instance) self._wait_for_count(expected_count=len(node_instances), query_method=self.sm.get_node_instances, deployment_id=deployment_id) return new_deployment @staticmethod def evaluate_deployment_outputs(deployment_id): deployment = get_blueprints_manager().get_deployment(