3 Gm^]1@sdZddlmZddlZddlmZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZejeZdZdZGd d d eZdS) 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)sleepSUCCESSFAILEDc@seZdZdFddZdd Zefd d Zd d ZddZddZ ddZ ddZ ddZ ddZ ddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-efd.d/Zd0d1Zd2d3Zed4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@dAZ"dBdCZ#dDdEZ$d,S)G CfnResourceFDEBUGERRORxcCsP||_d|_d|_d|_d|_d|_d|_d|_d|_||_ ||_ ||_ d|_ ||_ d|_d|_d|_d|_d|_d|_i|_i|_d|_d|_tjd|_tjd|_yf|jstjd|jd|_tjd|jd|_tjd|jd|_ |rt!j"||d d nt!j"|d|d Wn<t#k rJ}zt$j%|d d |j&|WYdd}~XnXdS)NFZ AWS_SAM_LOCALZ AWS_REGIONlambda)Z region_nameeventsZlogsZ 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_intervalStatusReasonPhysicalResourceIdStackId RequestIdLogicalResourceIdData_event_context _response_urlosgetenv _sam_localZ_regionboto3client_lambda_client_events_clientZ _logs_clientrsetup Exceptionloggererror init_failure)selfZ json_loggingZ log_levelrZpolling_intervalZsleep_on_deleteer9t|jjdd}d}||jkr*|j}|dkr:||dS)Nir)intr)get_remaining_time_in_millisr)r7rZ time_leftZ sleep_timer9r9r:rCas  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)rrr2rrrO)r7rHrIr9r9r:r=ks  zCfnResource._log_setupcCsd|_t|_d|_d|_|d|_|d|_|d|_i|_d|j krR|d|_|d|_ ||_ ||_ |d|_ |jr|jj|jr|jtt|jdS|j|j|jd S) NFr r$r%r& CrHelperDatarZ ResponseURLT)rrr!r"r#r$r%r&r'keysrr(r)r*rrGrrErrF _set_timeout_wrap_function _get_func)r7rHrIr9r9r:r?ss,        zCfnResource._crhelper_initcCstjd|jd|jkrZ|jtkrZtjd|j|jd<|jd|_tjd|jtjd|j|jsz|jtkrtjd|j d|_ dS) Nzpid1: %s CrHelperPollzSetting up pollingr#zpid2: %szpid3: %sz'Polling complete, removing cwe scheduleT) r4r>r#rQr!rrAr'_setup_polling_remove_pollingr)r7rHr9r9r:rBs   zCfnResource._polling_initcCs(dj|djdd|d|jdgS)N_r$/rLr&)joinsplit _rand_string)r7rHr9r9r:generate_physical_idsz CfnResource.generate_physical_idcCs^|j r*d|jkr*tjd|d|_n(|j s<|jdkrRtjd|j||_|jdS)Nr#zsz+CfnResource._rand_string..)r[range)lr9r9r:r]szCfnResource._rand_stringcCs2|jd|jd}|jj|jj|dd|d|S)Nr&rZzlambda:InvokeFunctionzevents.amazonaws.com) FunctionName StatementIdZActionZ PrincipalZ SourceArn)r(r]r0Zadd_permissionr) function_name)r7rule_arnsidr9r9r:_add_permissionszCfnResource._add_permissioncCs2|jj|jd|jddj|jdd}|dS)Nr&rZzrate({} minutes)ZENABLED)NameZScheduleExpressionZStateZRuleArn)r1Zput_ruler(r]r`r )r7responser9r9r: _put_rule s  zCfnResource._put_rulecCs|jdjdd}|jdjdd}|jdjdd}|jdjdd}tj|j|jj|dd||||ftj|jd gd dS) Nrt:rLrY1zarn:%s:lambda:%s:%s:function:%s)ZIdZArnZInput)RuleZTargets)r(r\r4r>r1Z put_targetsjsondumps)r7 func_nameZregionZ account_id partitionZ rule_namer9r9r: _put_targetss zCfnResource._put_targetscCs |jj|jdddgddS)NrYrLr)rZIds)r1Zremove_targetsr\)r7rr9r9r:_remove_targets"s zCfnResource._remove_targetscCs|jj|jj|ddS)N)rr)r0Zremove_permissionr)r)r7rr9r9r:_remove_permission(szCfnResource._remove_permissioncCs|jj|jddddS)NrYrL)r)r1Z delete_ruler\)r7rr9r9r: _delete_rule.szCfnResource._delete_rulecCsL|j|jd<d|jd<|j|jd<|j|jd|jd<|j|jjdS)NrPTrUrtrs)r'r(rrrr)r)r7r9r9r:rV3s   zCfnResource._setup_pollingcCsd|jjkr|jjdd|jjkr4|jjdd|jjkrT|j|jdn tjdd|jjkr~|j|jdn tjdd|jjkr|j|jdn tjddS)NrPr#rtzECannot remove CloudWatch events rule, Rule arn not available in eventrszLCannot remove lambda events permission, permission id not available in eventzGCannot remove CloudWatch events target, Rule arn not available in event) r(rQpopr'rr4r5rr)r7r9r9r:rW:s    zCfnResource._remove_polling)Fr r r r )%__name__ __module__ __qualname__r;rJrrCr=r?rBr^rDr@rcrdrerfrgrhrSrirRrTrrEr6rv staticmethodr]rrrrrrrVrWr9r9r9r:rs> (    r)__doc__ __future__rrjZcrhelper.utilsrZcrhelperrloggingrwr.ryrr+timer getLoggerrr4rrobjectrr9r9r9r:s