示例#1
0
def create_change_set(cfn_client, fqn, template, parameters, tags,
                      change_set_type='UPDATE', replacements_only=False,
                      service_role=None):
    logger.debug("Attempting to create change set of type %s for stack: %s.",
                 change_set_type,
                 fqn)
    args = generate_cloudformation_args(
        fqn, parameters, tags, template,
        change_set_type=change_set_type,
        service_role=service_role,
        change_set_name=get_change_set_name()
    )
    try:
        response = cfn_client.create_change_set(**args)
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Message'] == ('TemplateURL must reference '
                                              'a valid S3 object to which '
                                              'you have access.'):
            response = s3_fallback(fqn, template, parameters,
                                   tags, cfn_client.create_change_set,
                                   get_change_set_name(),
                                   service_role)
        else:
            raise
    change_set_id = response["Id"]
    response = wait_till_change_set_complete(
        cfn_client, change_set_id
    )
    status = response["Status"]
    if status == "FAILED":
        status_reason = response["StatusReason"]
        if ("didn't contain changes" in response["StatusReason"] or
                "No updates are to be performed" in response["StatusReason"]):
            logger.debug(
                "Stack %s did not change, not updating and removing "
                "changeset.",
                fqn,
            )
            cfn_client.delete_change_set(ChangeSetName=change_set_id)
            raise exceptions.StackDidNotChange()
        logger.warn(
            "Got strange status, '%s' for changeset '%s'. Not deleting for "
            "further investigation - you will need to delete the changeset "
            "manually.",
            status, change_set_id
        )
        raise exceptions.UnhandledChangeSetStatus(
            fqn, change_set_id, status, status_reason
        )

    execution_status = response["ExecutionStatus"]
    if execution_status != "AVAILABLE":
        raise exceptions.UnableToExecuteChangeSet(fqn,
                                                  change_set_id,
                                                  execution_status)

    changes = response["Changes"]
    return changes, change_set_id
示例#2
0
def create_change_set(cfn_client,
                      fqn,
                      template,
                      parameters,
                      tags,
                      replacements_only=False,
                      service_role=None):
    logger.debug("Attempting to create change set for stack: %s.", fqn)
    args = generate_cloudformation_args(fqn,
                                        parameters,
                                        tags,
                                        template,
                                        service_role=service_role,
                                        change_set_name=get_change_set_name())
    try:
        response = retry_on_throttling(cfn_client.create_change_set,
                                       kwargs=args)
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Message'] == ('TemplateURL must reference '
                                              'a valid S3 object to which '
                                              'you have access.'):
            response = s3_fallback(fqn, template, parameters, tags,
                                   cfn_client.create_change_set,
                                   get_change_set_name(), service_role)
        else:
            raise
    change_set_id = response["Id"]
    response = wait_till_change_set_complete(cfn_client, change_set_id)
    status = response["Status"]
    if status == "FAILED":
        status_reason = response["StatusReason"]
        if "didn't contain changes" in response["StatusReason"]:
            logger.debug(
                "Stack %s did not change, not updating.",
                fqn,
            )
            raise exceptions.StackDidNotChange
        raise exceptions.UnhandledChangeSetStatus(fqn, change_set_id, status,
                                                  status_reason)

    execution_status = response["ExecutionStatus"]
    if execution_status != "AVAILABLE":
        raise exceptions.UnableToExecuteChangeSet(fqn, change_set_id,
                                                  execution_status)

    changes = response["Changes"]
    return changes, change_set_id