o .&a%@s~ddlZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z e e Z edddgZGdd d eZdS) N) exceptions) mktempfile parse_s3_url)datetimeChangeSetResult changeset_idchangeset_typec@sHeZdZ dddZddZddZdd Zd d Zd d ZddZ dS)Deployer%awscli-cloudformation-package-deploy-cCs||_||_dSN)_clientchangeset_prefix)selfcloudformation_clientr rO/usr/lib/python3/dist-packages/awscli/customizations/cloudformation/deployer.py__init__!s zDeployer.__init__c Csz|jj|d}t|ddkrWdS|dd}|ddkWStjjyP}z#t|}d||vrCt d|WYd }~dStj d |d |d }~ww) z Checks if a CloudFormation stack with given name exists :param stack_name: Name or ID of the stack :return: True if stack exists. False otherwise  StackNameStacksFr StackStatusREVIEW_IN_PROGRESSz Stack with id {0} does not existNzUnable to get stack details.exc_info) r describe_stackslenbotocorer ClientErrorstrformatLOGdebug)r stack_namerespstackemsgrrr has_stack&s" zDeployer.has_stackc  s|t} d| } |jttt} ||s%d} dd|D}nd} |j j |d} dd| dDfd d|D}| ||| ||| |d }|rt /}| | d |||jd }t|d d}||d|d d|d<Wdn1swY|dur||d<|dur||d<z|j jdi|}t|d| WSty}z tjd|d|d}~ww)a Call Cloudformation to create a changeset and wait for it to complete :param stack_name: Name or ID of stack :param cfn_template: CloudFormation template string :param parameter_values: Template parameters object :param capabilities: Array of capabilities passed to CloudFormation :param tags: Array of tags passed to CloudFormation :return: zCreated by AWS CLI at {0} UTCCREATEcSsg|] }|dds|qS)UsePreviousValueFget.0xrrr cs  z-Deployer.create_changeset..UPDATErcSsg|]}|dqS) ParameterKeyr)r. parameterrrrr0is Parameterscs(g|]}|ddr|dvs|qS)r*Fr2r+r-existing_parametersrrr0ks   ) ChangeSetNamer TemplateBody ChangeSetTyper4 Capabilities DescriptionTagsr8templateVersion)version_propertyKeyN TemplateURLRoleARNNotificationARNsIdzUnable to create changesetrr)rutcnow isoformatr r rinttimer(r get_template_summaryrwritepopflushupload_with_dedupnamerto_path_style_s3_urlr,create_change_setr Exceptionr!r")rr# cfn_templateparameter_values capabilitiesrole_arnnotification_arns s3_uploadertagsnow descriptionchangeset_namersummarykwargstemporary_fileurlpartsr$exrr5rcreate_changesetJsV      zDeployer.create_changesetc Cstjdtj|jd}ddi}z |j|||dWdStjj y[}z-t j d|d|j }|d}|d }|d krDd |vsHd |vrNtj |d td|||d}~ww)z Waits until the changeset creation completes :param changeset_id: ID or name of the changeset :param stack_name: Stack name :return: Latest status of the create-change-set operation z' Waiting for changeset to be created.. change_set_create_completeDelay)r7r WaiterConfigz!Create changeset waiter exceptionrStatus StatusReasonFAILEDz1The submitted information didn't contain changes.zNo updates are to be performedr#zs