ebcli/controllers/clone.py (103 lines of code) (raw):

# Copyright 2014 Amazon.com, Inc. or its affiliates. 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. A copy of # the License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file 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 ebcli.core.abstractcontroller import AbstractBaseController from ebcli.resources.strings import strings, flag_text, prompts from ebcli.core import io from ebcli.operations import cloneops, solution_stack_ops from ebcli.lib import utils, elasticbeanstalk from ebcli.controllers.create import get_cname_from_customer, get_and_validate_envars from ebcli.operations.tagops import tagops from ebcli.objects.exceptions import InvalidOptionsError, AlreadyExistsError from ebcli.objects.requests import CloneEnvironmentRequest class CloneController(AbstractBaseController): class Meta(AbstractBaseController.Meta): label = 'clone' description = strings['clone.info'] arguments = [ (['environment_name'], dict(action='store', nargs='?', help=flag_text['clone.env'])), (['-n', '--clone_name'], dict(help=flag_text['clone.name'])), (['-c', '--cname'], dict(help=flag_text['clone.cname'])), (['--scale'], dict(type=int, help=flag_text['clone.scale'])), (['--tags'], dict(help=flag_text['clone.tags'])), (['--envvars'], dict(help=flag_text['create.envvars'])), (['-nh', '--nohang'], dict(action='store_true', help=flag_text['clone.nohang'])), (['--timeout'], dict(type=int, help=flag_text['general.timeout'])), (['--exact'], dict(action='store_true', help=flag_text['clone.exact'])), ] usage = 'eb clone <environment_name> (-n CLONE_NAME) [options ...]' def do_command(self): app_name = self.get_app_name() env_name = self.get_env_name() clone_name = self.app.pargs.clone_name cname = self.app.pargs.cname scale = self.app.pargs.scale nohang = self.app.pargs.nohang tags = self.app.pargs.tags envvars = self.app.pargs.envvars exact = self.app.pargs.exact timeout = self.app.pargs.timeout provided_clone_name = clone_name is not None platform = None env = elasticbeanstalk.get_environment(app_name=app_name, env_name=env_name) tier = env.tier if 'worker' in tier.name.lower() and cname: raise InvalidOptionsError(strings['worker.cname']) if cname: if not elasticbeanstalk.is_cname_available(cname): raise AlreadyExistsError(strings['cname.unavailable']. replace('{cname}', cname)) tags = tagops.get_and_validate_tags(tags) envvars = get_and_validate_envars(envvars) if not clone_name: if len(env_name) < 16: unique_name = env_name + '-clone' else: unique_name = 'my-cloned-env' env_list = elasticbeanstalk.get_environment_names(app_name) unique_name = utils.get_unique_name(unique_name, env_list) clone_name = io.prompt_for_environment_name( default_name=unique_name, prompt_text='Enter name for Environment Clone' ) if tier.name.lower() == 'webserver': if not cname and not provided_clone_name: cname = get_cname_from_customer(clone_name) elif not cname: cname = None if not exact: if not provided_clone_name: latest = solution_stack_ops.find_solution_stack_from_string( env.platform.name, find_newer=True ) if latest != env.platform: io.echo() io.echo(prompts['clone.latest']) lst = ['Latest (' + str(latest) + ')', 'Same (' + str(env.platform) + ')'] result = utils.prompt_for_item_in_list(lst) if result == lst[0]: platform = latest else: platform = latest else: platform = solution_stack_ops.find_solution_stack_from_string( env.platform.name, find_newer=True ) if platform != env.platform: io.log_warning(prompts['clone.latestwarn']) clone_request = CloneEnvironmentRequest( app_name=app_name, env_name=clone_name, original_name=env_name, cname=cname, platform=platform, scale=scale, tags=tags, ) clone_request.option_settings += envvars cloneops.make_cloned_env( clone_request, nohang=nohang, timeout=timeout )