Source code for cloudify_rest_client.deployment_modifications

########
# Copyright (c) 2015 GigaSpaces Technologies Ltd. All rights reserved
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
#    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    * See the License for the specific language governing permissions and
#    * limitations under the License.

from cloudify_rest_client.responses import ListResponse
from cloudify_rest_client.node_instances import NodeInstance


[docs]class DeploymentModificationNodeInstances(dict): def __init__(self, node_instances): self.update(node_instances) self['added_and_related'] = [NodeInstance(instance) for instance in self.get('added_and_related', [])] self['removed_and_related'] = [NodeInstance(instance) for instance in self.get('removed_and_related', [])] self['before_modification'] = [NodeInstance(instance) for instance in self.get('before_modification', [])] self['before_rollback'] = [NodeInstance(instance) for instance in self.get('before_rollback', [])] @property def added_and_related(self): """List of added nodes and nodes that are related to them""" return self['added_and_related'] @property def removed_and_related(self): """List of removed nodes and nodes that are related to them""" return self['removed_and_related'] @property def before_modification(self): """List of node instances with their state as it existed before the deployment modification started""" return self['before_modification'] @property def before_rollback(self): """If deployment modification was rolledback, this will be a list of node instances with their state as it existed before the deployment modification was rolledback""" return self.get('before_rollback')
[docs]class DeploymentModification(dict): STARTED = 'started' FINISHED = 'finished' ROLLEDBACK = 'rolledback' def __init__(self, modification): self.update(modification) self['node_instances'] = DeploymentModificationNodeInstances( self.get('node_instances') or {}) @property def id(self): """Deployment modification id""" return self['id'] @property def status(self): """Deployment modification status""" return self['status'] @property def deployment_id(self): """Deployment Id the outputs belong to.""" return self['deployment_id'] @property def node_instances(self): """Dict containing added_and_related and remove_and_related node instances list""" return self['node_instances'] @property def modified_nodes(self): """Dict containing original modified nodes that started this modification""" return self['modified_nodes'] @property def created_at(self): """Deployment modification creation date""" return self['created_at'] @property def ended_at(self): """Deployment modification end date""" return self['ended_at'] @property def context(self): """Dict containing context that has been attached to modification. This context has no predefined schema. Its structure can be whatever has been attached to the modification when it was started. """ return self['context']
[docs]class DeploymentModificationsClient(object): def __init__(self, api): self.api = api
[docs] def list(self, deployment_id=None, _include=None, **kwargs): """List deployment modifications :param deployment_id: The deployment id (optional) :param kwargs: Optional filter fields. for a list of available fields see the REST service's models.DeploymentModification.fields """ params = {} if deployment_id: params['deployment_id'] = deployment_id params.update(kwargs) uri = '/deployment-modifications' response = self.api.get(uri, params=params, _include=_include) items = [DeploymentModification(item) for item in response['items']] return ListResponse(items, response['metadata'])
[docs] def start(self, deployment_id, nodes, context=None): """Start deployment modification. :param deployment_id: The deployment id :param nodes: the nodes to modify :return: DeploymentModification dict :rtype: DeploymentModification """ assert deployment_id data = { 'deployment_id': deployment_id, 'nodes': nodes } if context is not None: data['context'] = context uri = '/deployment-modifications' response = self.api.post(uri, data, expected_status_code=201) return DeploymentModification(response)
[docs] def get(self, modification_id, _include=None): """Get deployment modification :param modification_id: The modification id """ uri = '/deployment-modifications/{0}'.format(modification_id) response = self.api.get(uri, _include=_include) return DeploymentModification(response)
[docs] def finish(self, modification_id): """Finish deployment modification :param modification_id: The modification id """ assert modification_id uri = '/deployment-modifications/{0}/finish'.format(modification_id) response = self.api.post(uri) return DeploymentModification(response)
[docs] def rollback(self, modification_id): """Rollback deployment modification :param modification_id: The modification id """ assert modification_id uri = '/deployment-modifications/{0}/rollback'.format(modification_id) response = self.api.post(uri) return DeploymentModification(response)