B {‰Da12ã@s’dZddlmZddlZddlmZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZe e¡ZdZdZGd d „d eƒZdS) uT TODO: * Async mode – take a wait condition handle as an input, increases max timeout to 12 hours * Idempotency – If a duplicate request comes in (say there was a network error in signaling back to cfn) the subsequent request should return the already created response, will need a persistent store of some kind... * Functional tests é)Úprint_functionN)Ú_send_response)Ú log_helper)ÚsleepÚSUCCESSÚFAILEDc@seZdZdFdd„Zd d „Zefd d „Zd d„Zdd„Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zdd-efd.d/„Zd0d1„Zd2d3„Zed4d5„ƒZd6d7„Zd8d9„Zd:d;„Zdd?„Z!d@dA„Z"dBdC„Z#dDdE„Z$dS)GÚ CfnResourceFÚDEBUGÚERRORééxNc Csj||_d|_d|_d|_d|_d|_d|_d|_d|_||_ ||_ ||_ d|_ ||_ d|_d|_d|_d|_d|_d|_i|_d|_i|_d|_d|_t d¡|_t d¡|_||_yt|jsþtjd|j|jd|_ tjd|j|jd|_!tjd|j|jd|_"|rt#j$||d d nt#j$|d|d Wn<t%k rd}zt&j'|d d | (|¡Wdd}~XYnXdS)NFÚZ AWS_SAM_LOCALZ AWS_REGIONÚlambda)Z region_nameÚverifyÚeventsZlogsZ ContainerInit)Ú boto_levelÚ RequestType)Ú formatter_clsrT)Úexc_info))Ú_sleep_on_deleteÚ _create_funcÚ _update_funcÚ _delete_funcÚ_poll_create_funcÚ_poll_update_funcÚ_poll_delete_funcÚ_timerÚ _init_failedÚ _json_loggingÚ _log_levelÚ _boto_levelrÚ_polling_intervalÚStatusÚReasonÚPhysicalResourceIdÚStackIdÚ RequestIdÚLogicalResourceIdÚDataÚNoEchoÚ_eventÚ_contextÚ _response_urlÚosÚgetenvÚ _sam_localZ_regionÚ _ssl_verifyÚboto3ÚclientÚ_lambda_clientÚ_events_clientZ _logs_clientrÚsetupÚ ExceptionÚloggerÚerrorÚ init_failure)ÚselfZ json_loggingZ log_levelrZpolling_intervalZsleep_on_deleteZ ssl_verifyÚe©r<ú?/tmp/pip-target-ffaknybf/lib/python/crhelper/resource_helper.pyÚ__init__sN  zCfnResource.__init__c Csøzàyš| ||¡t |¡| ||¡s*dS| ¡rD|jrDt d¡n$| ¡rX| |¡nt d¡d|_t d|j¡|jrš|j dkr|  ¡|  |¡Wn@t k rÜ}z"tj |dd| tt|ƒ¡Wdd}~XYnXWd|jrò|j ¡XdS)Nzt|j ¡dƒd}d}||jkr*|j}|dkr:||ƒdS)Nièéré)Úintr+Úget_remaining_time_in_millisr)r:rZ time_leftZ sleep_timer<r<r=rEcs  zCfnResource._wait_for_cwlogsc CsN|jr6tj|j|j|d|d|d|d|jdntj|j|jdddS)Nrr%r&r')rrr%r&r'Úaws_request_id)rr)rrr5rr rQ)r:rJrKr<r<r=r?ms  zCfnResource._log_setupcCs¸d|_t|_d|_d|_|d|_|d|_|d|_i|_d|  ¡krR|d|_|d|_ ||_ ||_ |d|_ |jr‚|j ¡|jrž| tt|jƒ¡dS| ¡| | ¡¡d S) NFr r%r&r'Ú CrHelperDatarZ ResponseURLT)rrr"r#r$r%r&r'r(Úkeysrr*r+r,rrIrrGrrHÚ _set_timeoutÚ_wrap_functionÚ _get_func)r:rJrKr<r<r=rAus,        zCfnResource._crhelper_initcCs–t d|j¡d| ¡krZ|jtkrZt d¡|j|jd<| ¡d|_t d|j¡t d|j¡|jsz|jtkr’t d¡|  ¡d|_ dS) Nzpid1: %sÚ CrHelperPollzSetting up pollingr$zpid2: %szpid3: %sz'Polling complete, removing cwe scheduleT) r7r@r$rSr"rrCr(Ú_setup_pollingÚ_remove_pollingr)r:rJr<r<r=rDs   zCfnResource._polling_initcCs(d |d d¡d|d| d¡g¡S)NÚ_r%ú/rNr'é)ÚjoinÚsplitÚ _rand_string)r:rJr<r<r=Úgenerate_physical_idsz CfnResource.generate_physical_idcCsZ|js(d| ¡kr(t d¡|d|_n&|jr8|jdkrNt d¡| |¡|_| ¡dS)Nr$zÿsz+CfnResource._rand_string..)r]Úrange)Úlr<r<r=r_ýszCfnResource._rand_stringcCs2|jd| d¡}|jj|jj|dd|d|S)Nr'r\zlambda:InvokeFunctionzevents.amazonaws.com)Ú FunctionNameÚ StatementIdÚActionZ PrincipalZ SourceArn)r*r_r3Zadd_permissionr+Ú function_name)r:Úrule_arnÚsidr<r<r=Ú_add_permissionszCfnResource._add_permissioncCs2|jj|jd| d¡d |j¡dd}|dS)Nr'r\zrate({} minutes)ZENABLED)ÚNameZScheduleExpressionZStateZRuleArn)r4Zput_ruler*r_rbr!)r:Úresponser<r<r=Ú _put_rule s  zCfnResource._put_rulecCsŽ|jd d¡d}|jd d¡d}|jd d¡d}|jd d¡d}t |j¡|jj|dd||||ft |j¡d œgd dS) Nruú:éérNr[Ú1zarn:%s:lambda:%s:%s:function:%s)ZIdZArnZInput)ÚRuleZTargets)r*r^r7r@r4Z put_targetsÚjsonÚdumps)r:Ú func_nameZregionZ account_idÚ partitionZ rule_namer<r<r=Ú _put_targetss zCfnResource._put_targetscCs |jj| d¡ddgddS)Nr[rNrŽ)rZIds)r4Zremove_targetsr^)r:r…r<r<r=Ú_remove_targets%s zCfnResource._remove_targetscCs|jj|jj|ddS)N)rr‚)r3Zremove_permissionr+r„)r:r†r<r<r=Ú_remove_permission+szCfnResource._remove_permissioncCs|jj| d¡dddS)Nr[rN)rˆ)r4Z delete_ruler^)r:r…r<r<r=Ú _delete_rule1szCfnResource._delete_rulecCsL|j|jd<d|jd<| ¡|jd<| |jd¡|jd<| |jj¡dS)NrRTrWrurt)r(r*rŠr‡r”r+r„)r:r<r<r=rX6s   zCfnResource._setup_pollingcCs¶d|j ¡kr|j d¡d|j ¡kr4|j d¡d|j ¡krT| |jd¡n t d¡d|j ¡kr~| |jd¡n t d¡d|j ¡kr¨| |jd¡n t d¡dS)NrRr$ruzECannot remove CloudWatch events rule, Rule arn not available in eventrtzLCannot remove lambda events permission, permission id not available in eventzGCannot remove CloudWatch events target, Rule arn not available in event) r*rSÚpopr(r•r7r8r–r—)r:r<r<r=rY=s    zCfnResource._remove_polling)Fr r r r N)%Ú__name__Ú __module__Ú __qualname__r>rLrrEr?rArDr`rFrBrerfrgrhrirjrUrkrTrVrrGr9rwÚ staticmethodr_r‡rŠr”r•r–r—rXrYr<r<r<r=rs> *    r)Ú__doc__Ú __future__rrlZcrhelper.utilsrZcrhelperrÚloggingrxr1rzrr-ÚtimerÚ getLoggerr™r7rrÚobjectrr<r<r<r=Ús