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
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