ó \´žbc@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 CfnResourcecBsCeZeddddd$d„Zd„Zed„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd$ded„Zd„Zd„Zed„ƒZd„Zd„Zd„Z d„Z!d „Z"d!„Z#d"„Z$d#„Z%RS(%tDEBUGtERRORiixcCsÿ||_d|_d|_d|_d|_d|_d|_d|_d|_ ||_ ||_ ||_ t |_||_d|_d|_d|_d|_d|_d|_i|_t |_i|_d|_d|_tjdƒ|_tjdƒ|_||_y·|js‰t j!dd|jd|jƒ|_"t j!dd|jd|jƒ|_#t j!dd|jd|jƒ|_$n|r«t%j&|d |d d ƒnt%j&|d dd |ƒWn3t'k rú}t(j)|d t*ƒ|j+|ƒnXdS(Ntt AWS_SAM_LOCALt AWS_REGIONtlambdat region_nametverifyteventstlogst boto_levelt RequestTypet ContainerInitt formatter_clstexc_info(,t_sleep_on_deletetNonet _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 RequestIdtLogicalResourceIdtDatatNoEchot_eventt_contextt _response_urltostgetenvt _sam_localt_regiont _ssl_verifytboto3tclientt_lambda_clientt_events_clientt _logs_clientRtsetupt ExceptiontloggerterrortTruet init_failure(tselft json_loggingt log_levelRtpolling_intervaltsleep_on_deletet ssl_verifyte((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt__init__sN                           $$'cCs;zy×|j||ƒtj|ƒ|j||ƒs9dS|jƒr^|jr^tjdƒn2|jƒrz|j|ƒntjdƒt|_ tjd|j ƒ|j rÙ|j dkrÉ|j ƒn|j |ƒnWn<t k r}tj|dtƒ|jtt|ƒƒnXWd|jr6|jjƒnXdS(Ns<Skipping poller functionality, as this is a local invocationsenabling send_responses_send_response: %stDeleteR(t _log_setupR<tdebugt_crhelper_initt _poll_enabledR2tinfot _polling_initR>RRt_wait_for_cwlogst _cfn_responseR;R=t_sendRtstrRtcancel(R@teventtcontextRF((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt__call__Hs,       cCs[t|jjƒdƒd}d}||jkr>|j}n|dkrW||ƒndS(Nièiii(tintR.tget_remaining_time_in_millisR(R@Rt time_leftt sleep_time((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyROcs   cCsy|jrVtj|jd|jd|dd|dd|dd|dd|jƒntj|jd|jddƒdS(NRRR(R)R*taws_request_idR(R RR:R!R"R[R(R@RTRU((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRIms  "cCst|_t|_d|_d|_|d|_|d|_|d|_i|_ d|j ƒkrv|d|_ n|d|_ ||_ ||_ |d|_|jr»|jjƒn|jrá|jtt|jƒƒtS|jƒ|j|jƒƒtS(NR R(R)R*t CrHelperDataRt ResponseURL(R#RRR%R&R'R(R)R*R+tkeysRR-R.R/RRSRRQRRRt _set_timeoutt_wrap_functiont _get_funcR>(R@RTRU((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRKus,               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( R<RJR'R^R%RRMR+t_setup_pollingRt_remove_pollingR>R(R@RT((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRNs!     cCs4dj|djdƒd|d|jdƒgƒS(Nt_R(t/iR*i(tjointsplitt _rand_string(R@RT((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pytgenerate_physical_idscCs‚|j r9d|jƒkr9tjdƒ|d|_n;|j sR|jtkrttjdƒ|j|ƒ|_n|jƒdS(NR's<PhysicalResourceId present in event, Using that for responses3No physical resource id returned, generating one...(R'R^R<RMR>RjRQ(R@RT((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRP¤s  cCs#t|dj|jdjƒƒƒS(Ns _poll_{}_funcR(tgetattrtformatR-tlower(R@((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRL¯scCs ||_|S(N(R(R@tfunc((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pytcreate²s cCs ||_|S(N(R(R@Rn((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pytupdate¶s cCs ||_|S(N(R(R@Rn((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pytdeleteºs cCs ||_|S(N(R(R@Rn((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt poll_create¾s cCs ||_|S(N(R(R@Rn((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt poll_updateÂs cCs ||_|S(N(R(R@Rn((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt poll_deleteÆs cCssy(|r||j|jƒnd|_WnDtk rn}tjt|ƒdtƒt|ƒ|_t |_ nXdS(NR R( R-R.R'R;R<R=RRR>R&RR%(R@RnRF((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyR`Ês (cCs!tjdƒ|jtdƒdS(Ns7Execution is about to time out, sending failure messagesExecution timed out(R<R=RQR(R@((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt_timeoutÒs cCs:tj|jjƒdd|jƒ|_|jjƒdS(Ng@@gà?(t threadingtTimerR.RXRuRtstart(R@((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyR_ÖscCsKd}d|jjƒkr(d|}nt||j|jdjƒƒƒS(Ns_{}_funcRbt_pollR(R-R^RkRlRm(R@t request_type((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRaÛs R cCs0ttt|jƒƒƒdkrQdt|jƒtt|jƒƒd|_ntt|ƒƒdkrdt|ƒtt|ƒƒd}ni|jd6t|jƒd6|jd6|jd6|jd6t|jƒd 6|jd 6|j d 6}|r|j i|d6|d 6ƒn||j ||j ƒdS( NisERROR: (truncated) iðR%R'R(R)R*R&R+R,( tlenRRR&R%R'R(R)R*R+R,RpR/R4(R@tstatustreasont send_responset response_body((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRQás !0'      cCs&||_tjt|ƒdtƒdS(NR(RR<R=RRR>(R@R=((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyR?ôs cCs@x9dddgD](}||jjƒkr|j|=qqWdS(NRbtCrHelperPermissiont CrHelperRule(R+R^(R@tk((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt_cleanup_responseøscCsdjd„t|ƒDƒƒS(NR css(|]}tjtjtjƒVqdS(N(trandomtchoicetstringtascii_uppercasetdigits(t.0Re((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pys ÿs(Rgtrange(tl((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRiýsc CsO|jd|jdƒ}|jjd|jjd|ddddd |ƒ|S( NR*it FunctionNamet StatementIdtActionslambda:InvokeFunctiont Principalsevents.amazonaws.comt SourceArn(R-RiR7tadd_permissionR.t function_name(R@trule_arntsid((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt_add_permissions  cCsg|jdkrdnd}|jjd|jd|jdƒddj|j|ƒd d ƒ}|d S( NitminutestminutetNameR*itScheduleExpressions rate({} {})tStatetENABLEDtRuleArn(R$R8tput_ruleR-RiRl(R@t schedule_unittresponse((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/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(NRt:iiiRftRuletTargetst1tIdsarn:%s:lambda:%s:%s:function:%stArntInput(R-RhR<RJR8t put_targetstjsontdumps(R@t func_nametregiont account_idt partitiont rule_name((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt _put_targetss cCs-|jjd|jdƒdddgƒdS(NR¢RfitIdsR¤(R8tremove_targetsRh(R@R“((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt_remove_targets&s cCs#|jjd|jjd|ƒdS(NRŒR(R7tremove_permissionR.R’(R@R”((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt_remove_permission,s  cCs$|jjd|jdƒdƒdS(NR˜Rfi(R8t delete_ruleRh(R@R“((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyt _delete_rule2s cCsd|j|jdR R•R°R.R’(R@((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRc7s  cCsÿd|jjƒkr(|jjdƒnd|jjƒkrP|jjdƒnd|jjƒkr||j|jdƒn tjdƒd|jjƒkrµ|j|jdƒn tjdƒd|jjƒkrî|j|jdƒn tjdƒdS(NR\R'RsECannot remove CloudWatch events rule, Rule arn not available in eventR€sLCannot remove lambda events permission, permission id not available in eventsGCannot remove CloudWatch events target, Rule arn not available in event( R-R^tpopR+R³R<R=RµR·(R@((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRd>s  N(&t__name__t __module__R#RRGRVRRORIRKRNRjRPRLRoRpRqRrRsRtR`RuR_RaRRQR?Rƒt staticmethodRiR•R R°R³RµR·RcRd(((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyRs>*                       (t__doc__t __future__RRvtcrhelper.utilsRtcrhelperRtloggingR„R5R†R©R0ttimeRt getLoggerR¹R<RRtobjectR(((sq/private/var/folders/49/mc35vj0j30g7w0ryjvyy2vz80000gs/T/pip-target-LegFql/lib/python/crhelper/resource_helper.pyts