Exemple #1
0
def normalize_log_group_name(env_name,
                             log_group=None,
                             cloudwatch_log_source=None):
    """
    Converts the given (potentially None) `log_group` name to a value that can be consumed by `describe_log_groups`.
    :param env_name: An Elastic Beanstalk environment name
    :param log_group: A value for the logGroup name specified by the customer, which is potentially None
    :param cloudwatch_log_source: Name of the log source `log_group` belongs to. One among: instance, environment-health
    :return: A normalized logGroup name
    """
    if not cloudwatch_log_source or cloudwatch_log_source == logs_operations_constants.LOG_SOURCES.INSTANCE_LOG_SOURCE:
        log_group = beanstalk_log_group_builder(env_name, log_group)
    elif cloudwatch_log_source == logs_operations_constants.LOG_SOURCES.ENVIRONMENT_HEALTH_LOG_SOURCE:
        if log_group:
            raise InvalidOptionsError(
                strings['logs.log_group_and_environment_health_log_source'])
        log_group = beanstalk_log_group_builder(
            env_name,
            cloudwatch_log_group_for_environment_health_streaming(env_name))
    else:
        raise InvalidOptionsError(strings[
            'logs.cloudwatch_log_source_argumnent_is_invalid_for_retrieval'].
                                  format(cloudwatch_log_source))

    return log_group
Exemple #2
0
def get_environment_name(app_name, group):
    """
    Returns:
        - environment name is present in the env.yaml file if one exists, or
        - prompts customer interactively to enter an environment name

    If using env.yaml to create an environment with, `group` must be passed through
    the `-g/--env-group-suffix/` argument.

    :param app_name: name of the application associated with the present working
    directory
    :param group: name of the group associated with
    :return: Unique name of the environment which will be created by `eb create`
    """
    env_name = None
    if fileoperations.env_yaml_exists():
        env_name = fileoperations.get_env_name_from_env_yaml()
        if env_name:
            if env_name.endswith('+') and not group:
                raise InvalidOptionsError(strings['create.missinggroupsuffix'])
            elif not env_name.endswith('+') and group:
                raise InvalidOptionsError(
                    strings['create.missing_plus_sign_in_group_name'])
            else:
                env_name = env_name[:-1] + '-' + group

    return env_name or io.prompt_for_environment_name(
        get_unique_environment_name(app_name))
Exemple #3
0
    def __assert_list_argument_xor_modifier_arguments_specified(self):
        if self.list_argument:
            if self.__modifier_arguments_specified():
                raise InvalidOptionsError(
                    strings['tags.list_with_other_arguments'])

        else:
            if not self.__modifier_arguments_specified():
                raise InvalidOptionsError('usage: {0}'.format(
                    self._usage_text))
Exemple #4
0
    def do_command(self):
        workspace_type = fileoperations.get_workspace_type(None)
        if workspace_type == Constants.WorkSpaceTypes.PLATFORM:
            echo(self.custom_platforms())
        elif workspace_type == Constants.WorkSpaceTypes.APPLICATION:
            if self.app.pargs.status:
                raise InvalidOptionsError('You cannot use the "--status" option in application workspaces.')
            if self.app.pargs.all_platforms:
                raise InvalidOptionsError('You cannot use the "--all-platforms" option in application workspaces.')

            echo(self.all_platforms())
Exemple #5
0
    def __raise_if_incompatible_arguments_are_present(self):
        if self.all and self.instance:
            raise InvalidOptionsError(
                strings['logs.all_argument_and_instance_argument'])

        if self.all and self.zip:
            raise InvalidOptionsError(
                strings['logs.all_argument_and_zip_argument'])

        if self.cloudwatch_logs and self.log_group:
            raise InvalidOptionsError(
                strings['logs.cloudwatch_logs_argument_and_log_group_argument']
            )

        if self.cloudwatch_logs and self.instance:
            raise InvalidOptionsError(
                strings['logs.cloudwatch_logs_argument_and_instance_argument'])

        if self.cloudwatch_logs and self.all:
            raise InvalidOptionsError(
                strings['logs.cloudwatch_logs_argument_and_all_argument'])

        if self.cloudwatch_logs and self.zip:
            raise InvalidOptionsError(
                strings['logs.cloudwatch_logs_argument_and_zip_argument'])

        if self.cloudwatch_log_source and self.cloudwatch_log_source not in [
                logs_operations_constants.LOG_SOURCES.ALL_LOG_SOURCES,
                logs_operations_constants.LOG_SOURCES.INSTANCE_LOG_SOURCE,
                logs_operations_constants.LOG_SOURCES.
                ENVIRONMENT_HEALTH_LOG_SOURCE,
        ]:
            raise InvalidOptionsError(strings[
                'logs.cloudwatch_log_source_argumnent_is_invalid_for_enabling_streaming']
                                      )

        if (self.cloudwatch_log_source == logs_operations_constants.
                LOG_SOURCES.ENVIRONMENT_HEALTH_LOG_SOURCE and self.instance):
            raise InvalidOptionsError(
                strings['logs.health_and_instance_argument'])

        if (self.cloudwatch_log_source == logs_operations_constants.
                LOG_SOURCES.ENVIRONMENT_HEALTH_LOG_SOURCE and self.log_group):
            raise InvalidOptionsError(
                strings['logs.log_group_and_environment_health_log_source'])

        if self.cloudwatch_log_source == logs_operations_constants.LOG_SOURCES.ALL_LOG_SOURCES and self.stream:
            raise InvalidOptionsError(strings[
                'logs.cloudwatch_log_source_argumnent_is_invalid_for_enabling_streaming']
                                      )
Exemple #6
0
    def get_logs(self):
        """
            Determines the type of logs to get and how to package them from the flags given to the command. The method
            will either zip or save the individual logs in '.elasticbeanstalk/logs/' directory OR return a pager that
            will allow the user to page through the tail logs.
        """
        if self.all and self.instance:
            raise InvalidOptionsError(strings['logs.allandinstance'])

        if self.zip:
            info_type = 'bundle'
            do_zip = True
        elif self.all:
            info_type = 'bundle'
            do_zip = False
        else:
            info_type = 'tail'
            do_zip = False

        if logsops.log_streaming_enabled(self.app_name, self.env_name):
            log_group = logsops.beanstalk_log_group_builder(self.env_name, self.log_group)
            try:
                logsops.retrieve_cloudwatch_logs(log_group, info_type, do_zip=do_zip, instance_id=self.instance)
            except NotFoundError:
                raise NotFoundError('The specified log group does not exist. "{0}"'.format(log_group))
        else:
            logsops.retrieve_beanstalk_logs(self.env_name, info_type, do_zip=do_zip, instance_id=self.instance)
Exemple #7
0
    def do_command(self):
        self.timeout = self.app.pargs.timeout
        self.nohang = self.app.pargs.nohang
        if self.nohang:
            self.timeout = 0
        if self.app.pargs.modules:
            self.multiple_app_deploy()
            return

        self.message = self.app.pargs.message
        self.staged = self.app.pargs.staged
        self.source = self.app.pargs.source
        self.app_name = self.get_app_name()
        self.env_name = self.get_env_name()
        self.version = self.app.pargs.version
        self.label = self.app.pargs.label
        self.process = self.app.pargs.process
        group_name = self.app.pargs.env_group_suffix

        if self.version and (self.message or self.label):
            raise InvalidOptionsError(strings['deploy.invalidoptions'])

        process_app_versions = fileoperations.env_yaml_exists() or self.process

        deployops.deploy(self.app_name, self.env_name, self.version, self.label,
                         self.message, group_name=group_name, process_app_versions=process_app_versions,
                         staged=self.staged, timeout=self.timeout, source=self.source)
Exemple #8
0
    def do_command(self):
        number = self.app.pargs.number
        env_name = self.get_env_name()
        instance = self.app.pargs.instance
        cmd = self.app.pargs.command
        custom_ssh = self.app.pargs.custom
        keep_open = self.app.pargs.keep_open
        force = self.app.pargs.force
        setup = self.app.pargs.setup
        timeout = self.app.pargs.timeout

        if timeout and not setup:
            raise InvalidOptionsError(strings['ssh.timeout_without_setup'])

        sshops.prepare_for_ssh(
                env_name=env_name,
                instance=instance,
                keep_open=keep_open,
                force=force,
                setup=setup,
                number=number,
                custom_ssh=custom_ssh,
                command=cmd,
                timeout=timeout
        )
    def __stream_cloudwatch_logs(self):
        self.cloudwatch_log_source = self.cloudwatch_log_source or logs_operations_constants.LOG_SOURCES.INSTANCE_LOG_SOURCE
        if self.cloudwatch_log_source == logs_operations_constants.LOG_SOURCES.INSTANCE_LOG_SOURCE:
            if not logsops.instance_log_streaming_enabled(self.app_name, self.env_name):
                raise InvalidOptionsError(strings['logs.instance_log_streaming_disabled'].format(self.env_name))

            logsops.stream_instance_logs_from_cloudwatch(
                log_group=self.__normalized_log_group_name(),
                specific_log_stream=self.instance
            )

        if self.cloudwatch_log_source == logs_operations_constants.LOG_SOURCES.ENVIRONMENT_HEALTH_LOG_SOURCE:
            if not logsops.environment_health_streaming_enabled(self.app_name, self.env_name):
                raise InvalidOptionsError(strings['logs.environment_health_log_streaming_disabled'].format(self.env_name))

            logsops.stream_instance_logs_from_cloudwatch(log_group=self.__normalized_log_group_name())
Exemple #10
0
    def do_command(self):
        app_name = self.get_app_name()
        env_name = self.get_env_name(cmd_example='eb labs setup-ssl')
        certfile = self.app.pargs.cert_file
        privatekey = self.app.pargs.private_key
        certchain = self.app.pargs.cert_chain
        cert_name = self.app.pargs.name

        # Make sure arguments are valid
        if certfile or privatekey or certfile:
            if not (certfile and privatekey):
                raise InvalidOptionsError(
                    'When providing your own certificate the --cert-file '
                    'and --private-key options are both required.')
            _validate_files_exists(certfile, privatekey, certchain)

        if not cert_name:
            cert_name = env_name

        # Check environment is not single instance
        if _is_single_instance(app_name, env_name):
            raise NotSupportedError('This command is currently not supported '
                                    'for single instance environments. \n'
                                    'For more information please see '
                                    'http://docs.aws.amazon.com/elasticbeanstalk/'
                                    'latest/dg/SSL.SingleInstance.html')

        # Generate cert if not provided
        if not certfile:
            privatekey, certfile = generate_self_signed_cert(cert_name)

        certfile = fileoperations.read_from_text_file(certfile)
        privatekey = fileoperations.read_from_text_file(privatekey)
        if certchain:
            certchain = fileoperations.read_from_text_file(certchain)

        result = iam.upload_server_certificate(cert_name + '.crt', certfile,
                                               privatekey, chain=certchain)
        arn = result['Arn']

        # Update environment
        option_settings = [
            elasticbeanstalk.create_option_setting(
                namespaces.LOAD_BALANCER,
                option_names.LOAD_BALANCER_HTTP_PORT,
                'OFF'
            ),
            elasticbeanstalk.create_option_setting(
                namespaces.LOAD_BALANCER,
                option_names.LOAD_BALANCER_HTTPS_PORT,
                '443'
            ),
            elasticbeanstalk.create_option_setting(
                namespaces.LOAD_BALANCER,
                option_names.SSL_CERT_ID,
                arn
            ),
        ]
        commonops.update_environment(env_name, changes=option_settings,
                                     nohang=False)
Exemple #11
0
def validate_source_location(source_location):
    valid_source_locations = ['codecommit']
    if source_location in valid_source_locations:
        return
    else:
        raise InvalidOptionsError(
            "Source location '{0}' is not in the list of valid locations: {1}".
            format(source_location, valid_source_locations))
Exemple #12
0
def prepare_for_ssh(env_name,
                    instance,
                    keep_open,
                    force,
                    setup,
                    number,
                    keyname=None,
                    no_keypair_error_message=None,
                    custom_ssh=None,
                    command=None,
                    timeout=None):
    if setup:
        setup_ssh(env_name, keyname, timeout=timeout)
        return

    if instance and number:
        raise InvalidOptionsError(strings['ssh.instanceandnumber'])

    if not instance:
        instances = commonops.get_instance_ids(env_name)
        if number is not None:
            if number > len(instances) or number < 1:
                raise InvalidOptionsError('Invalid index number (' +
                                          str(number) +
                                          ') for environment with ' +
                                          str(len(instances)) + ' instances')
            else:
                instance = instances[number - 1]

        elif len(instances) == 1:
            instance = instances[0]
        else:
            io.echo()
            io.echo('Select an instance to ssh into')
            instance = utils.prompt_for_item_in_list(instances)

    try:
        ssh_into_instance(instance,
                          keep_open=keep_open,
                          force_open=force,
                          custom_ssh=custom_ssh,
                          command=command)
    except NoKeypairError:
        if not no_keypair_error_message:
            no_keypair_error_message = prompts['ssh.nokey']
        io.log_error(no_keypair_error_message)
Exemple #13
0
def raise_if_environment_health_log_streaming_is_not_enabled(app_name, env_name):
    """
    Raises if CloudWatch environment-health log streaming is not enabled for the environment, `env_name`
    :param app_name: An Elastic Beanstalk application name
    :param env_name: An Elastic Beanstalk environment name contained within `app_name`
    :return: None
    """
    if not environment_health_streaming_enabled(app_name, env_name):
        raise InvalidOptionsError(strings['logs.environment_health_log_streaming_disabled'].format(env_name))
Exemple #14
0
def _raise_if_environment_is_not_using_enhanced_health(configuration_settings):
    option_settings = configuration_settings.get('OptionSettings')
    health_type = elasticbeanstalk.get_option_setting(
        option_settings,
        namespaces.HEALTH_SYSTEM,
        option_names.SYSTEM_TYPE
    )

    if health_type != 'enhanced':
        raise InvalidOptionsError(strings['cloudwatch_environment_health_log_streaming.enhanced_health_not_found'])
def get_and_validate_tags(tags):
    if not tags:
        return []

    tags = tags.strip().strip('"').strip('\'')
    tags = tags.split(',')
    tag_list = []
    if len(tags) > 47:
        raise InvalidOptionsError(strings['tags.max'])
    for t in tags:
        # validate
        if not re.match('^[\w\s.:/+%@-]{1,128}=[\w\s.:/+=@-]{0,256}$', t):
            raise InvalidOptionsError(strings['tags.invalidformat'])
        else:
            # build tag
            key, value = t.split('=', 1)
            tag_list.append(
                {'Key': key,
                 'Value': value}
            )
    return tag_list
 def collect_changes(self, usr_model):
     """
         Because we can't remove options from the lifecycle config we can only add to them so we just take the
             direct user model and apply that.
         :param usr_model: User model, key-value style
         :return: api_model
     """
     # Validate the service role they gave us exists
     if 'ServiceRole' in usr_model['Configurations']:
         service_role = usr_model['Configurations']['ServiceRole'].split('/')[-1]
         try:
             get_role(service_role)
         except (NotFoundError, ServiceError):
             raise InvalidOptionsError(strings['lifecycle.invalidrole'].replace('{role}', service_role))
     return usr_model['Configurations']
Exemple #17
0
    def __attempt_to_checkout_branch_specified_in_source_input(source):
        source_location, repo, branch = utils.parse_source(source)
        if not branch or not repo:
            raise InvalidOptionsError(strings['codecommit.bad_source'])

        source_control = SourceControl.get_source_control()
        source_control.is_setup()

        repo = repo or gitops.get_default_repository()

        useops.switch_default_repo_and_branch(repo, branch)
        successfully_checked_out_branch = source_control.checkout_branch(
            branch)

        if not successfully_checked_out_branch:
            raise NotFoundError(
                "Could not checkout branch {0}.".format(branch))
Exemple #18
0
    def __get_logs(self):
        """
        Determines whether to:
            - retrieve logs from CloudWatch or Beanstalk
                - from CloudWatch when log-streaming to CloudWatch is enabled
                - from Beanstalk when log-streaming to CloudWatch is disabled
            - retrieve instance or environment-health logs
                - instance logs when --cloudwatch-log-source is 'instance' or None
                - environment-health logs when --cloudwatch-log-source is 'environment-health'
                - all other values for --cloudwatch-log-source will result in an exception being thrown
            - determine whether to tail the logs, or to download them as a zip file or regular log files
        """
        info_type = logsops.resolve_log_result_type(self.zip, self.all)
        should_zip_logs = self.zip

        if self.cloudwatch_log_source == logs_operations_constants.LOG_SOURCES.ENVIRONMENT_HEALTH_LOG_SOURCE:
            logsops.raise_if_environment_health_log_streaming_is_not_enabled(
                self.app_name, self.env_name)

            logsops.retrieve_cloudwatch_environment_health_logs(
                self.__normalized_log_group_name(),
                info_type,
                do_zip=should_zip_logs,
            )
        elif self.cloudwatch_log_source == logs_operations_constants.LOG_SOURCES.INSTANCE_LOG_SOURCE:
            logsops.raise_if_instance_log_streaming_is_not_enabled(
                self.app_name, self.env_name)

            self.__retrieve_cloudwatch_instance_logs(info_type,
                                                     should_zip_logs)
        elif self.cloudwatch_log_source:
            raise InvalidOptionsError(strings[
                'logs.cloudwatch_log_source_argumnent_is_invalid_for_retrieval']
                                      )
        elif logsops.instance_log_streaming_enabled(self.app_name,
                                                    self.env_name):
            self.__retrieve_cloudwatch_instance_logs(info_type,
                                                     should_zip_logs)
        else:
            logsops.retrieve_beanstalk_logs(self.env_name,
                                            info_type,
                                            do_zip=should_zip_logs,
                                            instance_id=self.instance)
Exemple #19
0
    def do_command(self):
        self.timeout = self.app.pargs.timeout
        self.nohang = self.app.pargs.nohang
        if self.nohang:
            self.timeout = 0
        if self.app.pargs.modules:
            self.multiple_app_deploy()
            return

        self.message = self.app.pargs.message
        self.staged = self.app.pargs.staged
        self.source = self.app.pargs.source
        self.app_name = self.get_app_name()
        self.env_name = self.get_env_name()
        self.version = self.app.pargs.version
        self.label = self.app.pargs.label
        self.process = self.app.pargs.process
        group_name = self.app.pargs.env_group_suffix

        if self.version and (self.message or self.label):
            raise InvalidOptionsError(strings['deploy.invalidoptions'])

        # ToDo add support for deploying to multiples?
        # for arg in self.app.pargs.environment_name:
        #     # deploy to every environment listed
        #     ## Right now you can only list one

        process_app_versions = fileoperations.env_yaml_exists() or self.process

        deployops.deploy(self.app_name,
                         self.env_name,
                         self.version,
                         self.label,
                         self.message,
                         group_name=group_name,
                         process_app_versions=process_app_versions,
                         staged=self.staged,
                         timeout=self.timeout,
                         source=self.source)
Exemple #20
0
 def __assert_resource_argument_conflict(self):
     if self.environment_passed and self.resource:
         raise InvalidOptionsError(
             strings['tags.resource_environment_conflict'])
Exemple #21
0
def raise_if_source_location_is_not_codecommit(source_location):
    if source_location != 'codecommit':
        raise InvalidOptionsError('Source location "{0}" is not supported by the EBCLI'.format(source_location))
Exemple #22
0
def create_app_version_from_source(
        app_name,
        source,
        process=False,
        label=None,
        message=None,
        build_config=None
):
    cwd = os.getcwd()
    fileoperations.ProjectRoot.traverse()
    try:
        if heuristics.directory_is_empty():
            io.echo('NOTE: {}'.format(strings['appversion.none']))
            return None
    finally:
        os.chdir(cwd)

    source_control = SourceControl.get_source_control()
    if source_control.untracked_changes_exist():
        io.log_warning(strings['sc.unstagedchanges'])

    if label:
        version_label = label
    else:
        version_label = source_control.get_version_label()

    if message:
        description = message
    else:
        description = source_control.get_message()

    if len(description) > 200:
        description = description[:195] + '...'

    source_location, repository, branch = utils.parse_source(source)

    if not branch or not repository:
        raise InvalidOptionsError(strings['codecommit.bad_source'])

    if source_location == "codecommit":
        try:
            result = codecommit.get_branch(repository, branch)
        except ServiceError as ex:
            io.log_error(
                "Could not get branch '{0}' for the repository '{1}' "
                "because of this error: {2}".format(
                    branch,
                    repository,
                    ex.code
                )
            )
            raise ex

        commit_id = result['branch']['commitId']
        if repository is None or commit_id is None:
            raise ServiceError("Could not find repository or commit id to create an application version")
    else:
        LOG.debug("Source location '{0}' is not supported".format(source_location))
        raise InvalidOptionsError(
            "This command does not support the given source location: {0}".format(
                source_location
            )
        )

    io.log_info('Creating AppVersion ' + version_label)
    return _create_application_version(app_name, version_label, description,
                                       None, None, process, repository=repository, commit_id=commit_id,
                                       build_config=build_config)
Exemple #23
0
    def do_command(self):
        env_name = self.app.pargs.environment_name
        modules = self.app.pargs.modules
        if modules and len(modules) > 0:
            self.compose_multiple_apps()
            return
        group = self.app.pargs.env_group_suffix
        cname = self.app.pargs.cname
        tier = self.app.pargs.tier
        itype = self.app.pargs.instance_type
        platform = self.app.pargs.platform
        single = self.app.pargs.single
        iprofile = self.app.pargs.instance_profile
        service_role = self.app.pargs.service_role
        label = self.app.pargs.version
        branch_default = self.app.pargs.branch_default
        key_name = self.app.pargs.keyname
        sample = self.app.pargs.sample
        nohang = self.app.pargs.nohang
        tags = self.app.pargs.tags
        envvars = self.app.pargs.envvars
        scale = self.app.pargs.scale
        timeout = self.app.pargs.timeout
        cfg = self.app.pargs.cfg
        elb_type = self.app.pargs.elb_type
        source = self.app.pargs.source
        process = self.app.pargs.process
        enable_spot = self.app.pargs.enable_spot
        spot_max_price = self.app.pargs.spot_max_price
        instance_types = self.app.pargs.instance_types
        on_demand_base_capacity = self.app.pargs.on_demand_base_capacity
        on_demand_above_base_capacity = self.app.pargs.on_demand_above_base_capacity
        max_instances = self.app.pargs.max_instances
        min_instances = self.app.pargs.min_instances

        interactive = False if env_name else True

        provided_env_name = env_name

        if sample and label:
            raise InvalidOptionsError(strings['create.sampleandlabel'])

        if single and scale:
            raise InvalidOptionsError(strings['create.singleandsize'])

        if (max_instances or min_instances) and scale:
            raise InvalidOptionsError(strings['create.scaleandminmax'])

        if (max_instances or min_instances) and single:
            raise InvalidOptionsError(strings['create.singleandminmax'])

        if single and elb_type:
            raise InvalidOptionsError(strings['create.single_and_elb_type'])

        if cname and tier and Tier.looks_like_worker_tier(tier):
            raise InvalidOptionsError(strings['worker.cname'])

        if cname and not elasticbeanstalk.is_cname_available(cname):
            raise AlreadyExistsError(strings['cname.unavailable'].replace(
                '{cname}', cname))

        if tier and Tier.looks_like_worker_tier(tier):
            if self.app.pargs.vpc_elbpublic or self.app.pargs.vpc_elbsubnets or self.app.pargs.vpc_publicip:
                raise InvalidOptionsError(
                    strings['create.worker_and_incompatible_vpc_arguments'])

        if (not tier or Tier.looks_like_webserver_tier(tier)) and single:
            if self.app.pargs.vpc_elbpublic or self.app.pargs.vpc_elbsubnets:
                raise InvalidOptionsError(
                    strings['create.single_and_elbpublic_or_elb_subnet'])

        if (spot_max_price or on_demand_base_capacity
                or on_demand_above_base_capacity) and not enable_spot:
            raise InvalidOptionsError(strings['create.missing_enable_spot'])

        if instance_types is "":
            raise InvalidOptionsError(
                strings['spot.instance_types_validation'])

        if itype and instance_types:
            raise InvalidOptionsError(strings['create.itype_and_instances'])

        platform = _determine_platform(platform, iprofile)

        app_name = self.get_app_name()
        tags = tagops.get_and_validate_tags(tags)
        envvars = get_and_validate_envars(envvars)
        process_app_version = fileoperations.env_yaml_exists() or process
        template_name = get_template_name(app_name, cfg)
        tier = get_environment_tier(tier)
        env_name = provided_env_name or get_environment_name(app_name, group)
        cname = cname or get_environment_cname(env_name, provided_env_name,
                                               tier)
        key_name = key_name or commonops.get_default_keyname()
        elb_type = elb_type or get_elb_type_from_customer(
            interactive, single, tier)
        enable_spot = enable_spot or spotops.get_spot_request_from_customer(
            interactive)
        instance_types = instance_types or spotops.get_spot_instance_types_from_customer(
            interactive, enable_spot)
        database = self.form_database_object()
        vpc = self.form_vpc_object(tier, single)

        if not timeout and database:
            timeout = 15

        env_request = CreateEnvironmentRequest(
            app_name=app_name,
            env_name=env_name,
            group_name=group,
            cname=cname,
            template_name=template_name,
            platform=platform,
            tier=tier,
            instance_type=itype,
            version_label=label,
            instance_profile=iprofile,
            service_role=service_role,
            single_instance=single,
            key_name=key_name,
            sample_application=sample,
            tags=tags,
            scale=scale,
            database=database,
            vpc=vpc,
            elb_type=elb_type,
            enable_spot=enable_spot,
            instance_types=instance_types,
            spot_max_price=spot_max_price,
            on_demand_base_capacity=on_demand_base_capacity,
            on_demand_above_base_capacity=on_demand_above_base_capacity,
            min_instances=min_instances,
            max_instances=max_instances)

        env_request.option_settings += envvars

        createops.make_new_env(env_request,
                               branch_default=branch_default,
                               process_app_version=process_app_version,
                               nohang=nohang,
                               interactive=interactive,
                               timeout=timeout,
                               source=source)
Exemple #24
0
    def do_command(self):
        # save command line args
        env_name = self.app.pargs.environment_name
        modules = self.app.pargs.modules
        if modules and len(modules) > 0:
            self.compose_multiple_apps()
            return
        group = self.app.pargs.env_group_suffix
        cname = self.app.pargs.cname
        tier = self.app.pargs.tier
        itype = self.app.pargs.instance_type
        solution_string = self.app.pargs.platform or solution_stack_ops.get_default_solution_stack(
        )
        single = self.app.pargs.single
        iprofile = self.app.pargs.instance_profile
        service_role = self.app.pargs.service_role
        label = self.app.pargs.version
        branch_default = self.app.pargs.branch_default
        key_name = self.app.pargs.keyname
        sample = self.app.pargs.sample
        nohang = self.app.pargs.nohang
        tags = self.app.pargs.tags
        envvars = self.app.pargs.envvars
        scale = self.app.pargs.scale
        timeout = self.app.pargs.timeout
        cfg = self.app.pargs.cfg
        elb_type = self.app.pargs.elb_type
        source = self.app.pargs.source
        process = self.app.pargs.process
        region = self.app.pargs.region
        interactive = False if env_name else True

        provided_env_name = env_name

        if sample and label:
            raise InvalidOptionsError(strings['create.sampleandlabel'])

        if single and scale:
            raise InvalidOptionsError(strings['create.singleandsize'])

        if single and elb_type:
            raise InvalidOptionsError(strings['create.single_and_elb_type'])

        if cname and tier and Tier.looks_like_worker_tier(tier):
            raise InvalidOptionsError(strings['worker.cname'])

        if cname and not elasticbeanstalk.is_cname_available(cname):
            raise AlreadyExistsError(strings['cname.unavailable'].replace(
                '{cname}', cname))

        if tier and Tier.looks_like_worker_tier(tier):
            if self.app.pargs.vpc_elbpublic or self.app.pargs.vpc_elbsubnets or self.app.pargs.vpc_publicip:
                raise InvalidOptionsError(
                    strings['create.worker_and_incompatible_vpc_arguments'])

        if (not tier or Tier.looks_like_webserver_tier(tier)) and single:
            if self.app.pargs.vpc_elbpublic or self.app.pargs.vpc_elbsubnets:
                raise InvalidOptionsError(
                    strings['create.single_and_elbpublic_or_elb_subnet'])

        app_name = self.get_app_name()
        tags = createops.get_and_validate_tags(tags)
        envvars = get_and_validate_envars(envvars)
        process_app_version = fileoperations.env_yaml_exists() or process
        platform = get_platform(solution_string, iprofile)
        template_name = get_template_name(app_name, cfg)
        tier = get_environment_tier(tier)
        env_name = provided_env_name or get_environment_name(app_name, group)
        cname = cname or get_environment_cname(env_name, provided_env_name,
                                               tier)
        key_name = key_name or commonops.get_default_keyname()
        elb_type = elb_type or get_elb_type_from_customer(
            interactive, single, region, tier)
        database = self.form_database_object()
        vpc = self.form_vpc_object(tier, single)

        # avoid prematurely timing out in the CLI when an environment is launched with a RDS DB
        if not timeout and database:
            timeout = 15

        env_request = CreateEnvironmentRequest(app_name=app_name,
                                               env_name=env_name,
                                               group_name=group,
                                               cname=cname,
                                               template_name=template_name,
                                               platform=platform,
                                               tier=tier,
                                               instance_type=itype,
                                               version_label=label,
                                               instance_profile=iprofile,
                                               service_role=service_role,
                                               single_instance=single,
                                               key_name=key_name,
                                               sample_application=sample,
                                               tags=tags,
                                               scale=scale,
                                               database=database,
                                               vpc=vpc,
                                               elb_type=elb_type)

        env_request.option_settings += envvars

        createops.make_new_env(env_request,
                               branch_default=branch_default,
                               process_app_version=process_app_version,
                               nohang=nohang,
                               interactive=interactive,
                               timeout=timeout,
                               source=source)
Exemple #25
0
    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)