Source code for kingpin.actors.rightscale.deployment

# 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.
#
# Copyright 2018 Nextdoor.com, Inc

"""
:mod:`kingpin.actors.rightscale.deployment`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. _Deployments:
    http://reference.rightscale.com/api1.5/resources/ResourceDeployments.html
"""

import logging

from tornado import gen

from kingpin.actors import exceptions
from kingpin.actors.rightscale import base
from kingpin.constants import REQUIRED

log = logging.getLogger(__name__)

__author__ = 'Mikhail Simin <mikhail@nextdoor.com>'


class DeploymentBaseActor(base.RightScaleBaseActor):

    """Abstract Deployment Actor that provides some utility methods."""

    @gen.coroutine
    def _find_deployment(self, name):

        dep = yield self._client.find_by_name_and_keys(
            collection=self._client._client.deployments,
            name=name)

        raise gen.Return(dep)


[docs]class Create(DeploymentBaseActor): """Creates a RightScale deployment. Options match the documentation in RightScale: http://reference.rightscale.com/api1.5/resources/ResourceDeployments.html **Options** :name: The name of the deployment to be created. :description: The description of the deployment to be created. (*optional*) :server_tag_scope: The routing scope for tags for servers in the deployment. Can be 'deployment' or 'account' (*optional*, default: deployment) """ all_options = { 'name': (str, REQUIRED, 'The name of the deployment to be created.'), 'description': ( str, '', 'The description of the deployment to be created.'), 'server_tag_scope': ( str, '', 'The routing scope for tags for servers in the deployment.') } def __init__(self, *args, **kwargs): """Validate the user-supplied parameters at instantiation time.""" super(Create, self).__init__(*args, **kwargs) allowed_scopes = ('deployment', 'account', '') scope = self.option('server_tag_scope') if scope not in allowed_scopes: raise exceptions.InvalidOptions( 'server_tag_scope "%s" is not one of: %s' % (scope, allowed_scopes)) @gen.coroutine def _execute(self): dep = yield self._find_deployment(self.option('name')) if dep: raise exceptions.InvalidOptions( 'Deployment "%s" already exists.' % self.option('name')) params = {'name': self.option('name'), 'description': self.option('description')} if self.option('server_tag_scope'): params['server_tag_scope'] = self.option('server_tag_scope') params = self._generate_rightscale_params('deployment', params) if self._dry: self.log.info('Would create a deployment %s' % self.option('name')) self.log.debug('Deployment params: %s' % params) raise gen.Return() self.log.info('Creating deployment %s' % self.option('name')) yield self._client.create_resource( self._client._client.deployments, params)
[docs]class Destroy(DeploymentBaseActor): """Deletes a RightScale deployment. Options match the documentation in RightScale: http://reference.rightscale.com/api1.5/resources/ResourceDeployments.html **Options** :name: The name of the deployment to be deleted. """ all_options = { 'name': (str, REQUIRED, 'The name of the deployment to be deleted.'), } @gen.coroutine def _execute(self): dep = yield self._find_deployment(self.option('name')) if not dep: raise exceptions.InvalidOptions( 'Deployment "%s" does not exist.' % self.option('name')) info = (yield self._client.show(dep.self)).soul if self._dry: self.log.info('Would delete deployment %s' % info['name']) raise gen.Return() self.log.info('Deleting deployment %s' % info['name']) yield self._client.destroy_resource(dep)