ó 5b]]c@sÏdZddlmZddlZddlmZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZejeƒZdZdZd efd „ƒYZdS( sT 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 iÿÿÿÿ(tprint_functionN(t_send_response(t log_helper(tsleeptSUCCESStFAILEDt CfnResourcecBs4eZedddd„Zd„Zed„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd"ded„Zd„Zd„Zed„ƒZd„Zd„Zd„Zd„Z d„Z!d„Z"d „Z#d!„Z$RS(#tDEBUGtERRORicCsÉd|_d|_d|_d|_d|_d|_d|_d|_||_ ||_ ||_ t |_ ||_d|_d|_d|_d|_d|_d|_i|_i|_d|_d|_tjdƒ|_tjdƒ|_yœ|jsStjdd|jƒ|_tjdd|jƒ|_ tjdd|jƒ|_!n|rut"j#|d|d d ƒnt"j#|d dd|ƒWn3t$k rÄ}t%j&|d t'ƒ|j(|ƒnXdS( Ntt AWS_SAM_LOCALt AWS_REGIONtlambdat region_nameteventstlogst boto_levelt RequestTypet ContainerInitt formatter_clstexc_info()tNonet _create_funct _update_funct _delete_funct_poll_create_funct_poll_update_funct_poll_delete_funct_timert _init_failedt _json_loggingt _log_levelt _boto_leveltFalseRt_polling_intervaltStatustReasontPhysicalResourceIdtStackIdt RequestIdtLogicalResourceIdtDatat_eventt_contextt _response_urltostgetenvt _sam_localt_regiontboto3tclientt_lambda_clientt_events_clientt _logs_clientRtsetupt ExceptiontloggerterrortTruet init_failure(tselft json_loggingt log_levelRtpolling_intervalte((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt__init__sH                        cCs5zyÑ|j||ƒtj|ƒ|j||ƒ|jƒrX|jrXtjdƒn2|jƒrt|j|ƒntjdƒt|_ tjd|j ƒ|j rÓ|j dkrÃ|j ƒn|j |ƒnWn<t k r}tj|dtƒ|jtt|ƒƒnXWd|jr0|jjƒnXdS(Ns<Skipping poller functionality, as this is a local invocationsenabling send_responses_send_response: %stDeleteR(t _log_setupR8tdebugt_crhelper_initt _poll_enabledR/tinfot _polling_initR:RRt_wait_for_cwlogst _cfn_responseR7R9t_sendRtstrRtcancel(R<teventtcontextR@((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt__call__Ds*       cCsOt|jjƒdƒd}|dkr2d}n|dkrK||ƒndS(Nièiixi(tintR+tget_remaining_time_in_millis(R<Rt sleep_time((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRI^s    cCsy|jrVtj|jd|jd|dd|dd|dd|dd|jƒntj|jd|jddƒdS(NRRR&R'R(taws_request_idR(RRR6RR RTR(R<RNRO((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRCes  "cCsþt|_t|_d|_d|_|d|_|d|_|d|_i|_ d|j ƒkrv|d|_ n|d|_ ||_ ||_ |d|_|jr»|jjƒn|jrÝ|jtt|jƒƒS|jƒ|j|jƒƒdS(NR R&R'R(t CrHelperDataRt ResponseURL(R!RRR#R$R%R&R'R(R)tkeysRR*R+R,RRMRRKRRLt _set_timeoutt_wrap_functiont _get_func(R<RNRO((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyREms(               cCsÏtjd|jƒd|jƒkr||jtkr|tjdƒ|j|jd<|jƒd|_tjd|jƒntjd|jƒ|js¨|jtkrËtjdƒ|j ƒt |_ ndS(Nspid1: %st CrHelperPollsSetting up pollingR%spid2: %sspid3: %ss'Polling complete, removing cwe schedule( R8RDR%RWR#RRGR)t_setup_pollingRt_remove_pollingR:R(R<RN((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRHƒs!     cCsÉ|j r9d|jƒkr9tjdƒ|d|_n‚|j sR|jtkr»d|jƒkrttjdƒntjdƒ|djdƒdd|dd|jd ƒ|_n|jƒdS( NR%s<PhysicalResourceId present in event, Using that for responses3No physical resource id returned, generating one...R&t/it_R(i(R%RWR8RGR:tsplitt _rand_stringRK(R<RN((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRJ“s  :cCs#t|dj|jdjƒƒƒS(Ns _poll_{}_funcR(tgetattrtformatR*tlower(R<((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRF¡scCs ||_|S(N(R(R<tfunc((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pytcreate¤s cCs ||_|S(N(R(R<Re((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pytupdate¨s cCs ||_|S(N(R(R<Re((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pytdelete¬s cCs ||_|S(N(R(R<Re((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt poll_create°s cCs ||_|S(N(R(R<Re((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt poll_update´s cCs ||_|S(N(R(R<Re((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt poll_delete¸s cCsgy||j|jƒ|_WnDtk rb}tjt|ƒdtƒt|ƒ|_t |_ nXdS(NR( R*R+R%R7R8R9RLR:R$RR#(R<ReR@((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRY¼s cCs!tjdƒ|jtdƒdS(Ns7Execution is about to time out, sending failure messagesExecution timed out(R8R9RKR(R<((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt_timeoutÄs cCs:tj|jjƒdd|jƒ|_|jjƒdS(Ng@@gà?(t threadingtTimerR+RRRlRtstart(R<((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRXÈscCsKd}d|jjƒkr(d|}nt||j|jdjƒƒƒS(Ns_{}_funcR[t_pollR(R*RWRbRcRd(R<t request_type((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRZÍs R cCs ttt|jƒƒƒdkrQdt|jƒtt|jƒƒd|_ntt|ƒƒdkrdt|ƒtt|ƒƒd}ni|jd6t|jƒd6|jd6|jd6|jd6t|jƒd 6|jd 6}|r |j i|d6|d 6ƒn||j |ƒdS( NisERROR: (truncated) iðR#R%R&R'R(R$R)( tlenRLR$R#R%R&R'R(R)RgR,(R<tstatustreasont send_responset response_body((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRKÓs!0'     cCs&||_tjt|ƒdtƒdS(NR(RR8R9RLR:(R<R9((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyR;ås cCs@x9dddgD](}||jjƒkr|j|=qqWdS(NR[tCrHelperPermissiont CrHelperRule(R)RW(R<tk((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt_cleanup_responseéscCsdjd„t|ƒDƒƒS(NR css(|]}tjtjtjƒVqdS(N(trandomtchoicetstringtascii_uppercasetdigits(t.0R_((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pys ðs(tjointrange(tl((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyRaîsc CsO|jd|jdƒ}|jjd|jjd|ddddd |ƒ|S( NR(it FunctionNamet StatementIdtActionslambda:InvokeFunctiont Principalsevents.amazonaws.comt SourceArn(R*RaR3tadd_permissionR+t function_name(R<trule_arntsid((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt_add_permissionòs  cCsI|jjd|jd|jdƒddj|jƒddƒ}|dS( NtNameR(itScheduleExpressionsrate({} minutes)tStatetENABLEDtRuleArn(R4tput_ruleR*RaRcR"(R<tresponse((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt _put_ruleýs   c CsÉ|jdjdƒd}|jdjdƒd}|jdjdƒd}|jdjdƒd}tj|jƒ|jjd|did d 6d ||||fd 6tj|jƒd 6gƒdS(NRxt:iiiR^tRuletTargetst1tIdsarn:%s:lambda:%s:%s:function:%stArntInput(R*R`R8RDR4t put_targetstjsontdumps(R<t func_nametregiont account_idt partitiont rule_name((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt _put_targetss cCs-|jjd|jdƒdddgƒdS(NR—R^itIdsR™(R4tremove_targetsR`(R<R‹((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt_remove_targetss cCs#|jjd|jjd|ƒdS(NR„R…(R3tremove_permissionR+RŠ(R<RŒ((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt_remove_permissions  cCs$|jjd|jdƒdƒdS(NRŽR^i(R4t delete_ruleR`(R<R‹((sp/private/var/folders/s9/cbx9s9sn1m78mn5k39dlfbrs55jgn7/T/pip-install-K6xnzh/crhelper/crhelper/resource_helper.pyt _delete_rule"s cCsd|j|jds