3 =\@@sddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m ZddlmZddlmZddlmZGdd d eZGd d d eZGd d d ZGdddZGdddeZGdddeZGdddeZGdddZ dS)N)reduce) ClientFactory)CFNYAMLHandler)PrintMsg)TaskCat)Poolc@seZdZdZdS)AMIUpdaterExceptionz0Raised when AMIUpdater experiences a fatal errorN)__name__ __module__ __qualname____doc__r r k/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-emcbgzcf/taskcat/taskcat/amiupdater.pyrsrc@s*eZdZgZd ddZddZddZdS) APIResultsDataTcOs"||_||_||_||_||_dS)N)codenameami_id creation_dateregioncustom_comparisons)selfrrrrrargskwargsr r r__init__s zAPIResultsData.__init__cCs"|jr|j|jkStj||SdS)N)rrobject__lt__)rotherr r rr s zAPIResultsData.__lt__cCs"|jr|j|jkStj||SdS)N)rrr__gt__)rrr r rr's zAPIResultsData.__gt__N)T)r r r resultsrrrr r r rrs rc@s8eZdZddiiiZeZedddZeddZdS) ConfigglobalAMIsNc&Cst|d`}ytj||_WnHtjk rd}z*tdjtj|tdjtj|WYdd}~XnXWdQRXy0x*|jj dj dj D]}|j j |qWWnLt k r}z0tdjtj||tdjtj|tWYdd}~XnXdS)Nrz{} [{}] - YAML Syntax Error!z{} {}rr z2{} {} config file [{}] is not structured properly!z{} {})openyaml safe_loadraw_dictZ YAMLErrorprintformatrERRORgetkeys codenamesadd Exceptionr)clsfn configtypefexr r rload3s .z Config.loadcCs|jddj|dS)Nrr )r%update)r.dnr r r update_filterDszConfig.update_filter)N) r r r r%setr+ classmethodr4r7r r r rr/s   rcs|eZdZdZiZiZfddZddZddZdd Z e d d Z e d d Z e ddZ e ddZe ddZZS) CodenamesNcsx|d|jjkrB|jj|d}|d|jjkrt|j|d=n2|d|jjkrf|jj|d}nttj|}|S)Nr)_objsr*r) _no_filterssuperr:r)r.rrinstance) __class__r r__new__NszCodenames.__new__cOs8||_t|_t|_|jr*||j|<n ||j|<dS)N)cnr8_regionsZ _region_data_create_codename_filtersr;r<)rrArrr r rrYs  zCodenames.__init__cCs\tjtjdj|j}|jr"|j}|rNdd|jD|_|jj ddgd|jsXdSdS)Nzglobal/AMIs/{}cSsg|]\}}||gdqS))NameValuesr ).0kvr r r jsz6Codenames._create_codename_filters..state available)rDrET) TemplateClassdeep_getrr%r'rA_filtersitemsfiltersappend)rZcnfilterr r rrCbsz"Codenames._create_codename_filterscCs t|jS)N)listrB)rr r rregionspszCodenames.regionscCst|jjS)N)rRr;values)r.r r robjectssszCodenames.objectscCs |jjS)N)r<r*)r.r r runknown_mappingswszCodenames.unknown_mappingscCs>ttjdkrtdtttj}|j|jtjdS)zFetches AMI IDs from AWSrz=No AMI filters were found. Nothing to fetch from the EC2 API.N) lenRegionalCodenamerUr ThreadPoolrLrSmap_per_rcn_ami_fetch)r.poolr r rfetch_latest_amis{szCodenames.fetch_latest_amiscCs$tjjd|jj|jdd|_dS)Nec2)ZFiltersZImages) AMIUpdaterclient_factoryr)rZdescribe_imagesrPr)r.rcnr r rr[szCodenames._per_rcn_ami_fetchc si}g}g}xftjD]Zj|jkrJfddjD|jj<q|jjjfddjDiiqWxf|jD]Z\}}xP|jD]D\}}t|dkr|j ||fqt |ddd}d|_ |j |qWq~W|r x|D]} t dj tj| qWtd |t_dS) Nc s8g|]0}tj|dttjj|ddjjqS)ImageId CreationDatez%Y-%m-%dT%H:%M:%S.%fZ)rrAintdatetimestrptime timestampr)rFr3)rar rrIsz/Codenames.parse_api_results..c s8g|]0}tj|dttjj|ddjjqS)rbrcz%Y-%m-%dT%H:%M:%S.%fZ)rrArdrerfrgr)rFr3)rar rrIsrT)reverseFzG{} The following Codename / Region had no results from the EC2 API. {}z8One or more filters returns no results from the EC2 API.)rXrUrAr*rrr5rOrWrQsortedrr&r'rr(rr) r.Z raw_ami_namesZregion_codename_result_listZmissing_results_listrrSrZ results_listZ latest_amiZcode_regr )rarparse_api_resultss.   zCodenames.parse_api_results)r r r rPr;r<r@rrCrSr9rUrVr]r[rj __classcell__r r )r?rr:Is     r:cs:eZdZiZfddZeddZdfdd ZZS) rXc svy|jd}|jd}Wntk r.YnXdj||}||jjkrX|jj|}ntt|j|}||j|<|S)NrrAz{}{})r)KeyErrorr'_xr*r=r:r@)r.rrrrArGr>)r?r rr@s   zRegionalCodename.__new__cCsdd|jjDS)NcSsg|]}|jr|qSr )rP)rFzr r rrIsz,RegionalCodename.objects..)rmrT)r.r r rrUszRegionalCodename.objectsNcs0||_d|_||_tt|j||f||dS)N)rrrNr=rXr)rrArrPrr)r?r rrszRegionalCodename.__init__)N) r r r rmr@r9rUrrkr r )r?rrXs  rXc@s^eZdZdZdZddddgZeZeZe ddd Z e d d Z e d d Z e ddZdS)rLzMappings/AWSAMIRegionMapz Metadata/AWSAMIRegionMap/Filtersz .templatez.jsonz.yamlz.ymlNcstfdd|jd|}|S)Ncst|tr|j|SS)N) isinstancedictr))dkey)defaultr rsz(TemplateClass.deep_get../)rsplit) dictionaryr*rsZzulur )rsrrMszTemplateClass.deep_getcCs,x&|jdddD]}|j|i}qWdS)Nru)rv setdefault)rwr*valuerrr r rdeep_setszTemplateClass.deep_setcCsddt|jDS)NcSsg|]}|dk r|qS)AMIr )rFr3r r rrIsz)TemplateClass.regions..)rRrB)r.r r rrSszTemplateClass.regionsc Csvt|}|j}WdQRX|j}|dd krR|d dkrRd}tj|tjd }nd }tjt|d tjd }|||fS)zLoads the template to inspectNr{[rx}]json)object_pairs_hookr#ZrU)r~rry)rr) r"readstriprloads collections OrderedDictcfyZordered_safe_load)filenamer1ZtfdataZstripped_tfdatafiletypeZloaded_template_datar r r_fetch_contentss zTemplateClass._fetch_contents)N)r r r mapping_path metadata_path template_extr8rBZ _codenames staticmethodrMr|r9rSrr r r rrLs    rLc@sReZdZgZiZeddZdddZddZdd Z d d Z d d Z ddZ dS)TemplateObjectcCs|jS)N)r;)r.r r rrUszTemplateObject.objectsFcCs|||_|j|\|_|_|_|j|j|j|_|j|j|j|_ ||_ d|_ d|_ |js\dS|j |jj||jdS)N) _filenamerr _contents_rawrMr _mapping_rootrfilter_metadata all_regionsrPr_determine_regionsr;rQ_generate_regional_codenames)rrrr r rrs zTemplateObject.__init__c Csx|jD]|}|dkrq|jrFxf|jjD]}t|||j|dq(Wqy(x"|j|jD]}t||dqXWWqtk rYqXqWdS)Nr})rArrP)rAr)rBrr*rXrrl)rrrGr r rrs z+TemplateObject._generate_regional_codenamescCst|_tjjddjd}x|D]}|jj|dq$W|jr`x|jD]}|jj |qJWndxb|j j D]T}|dkrzql||jkr|tj krt djtj|ntdj|j||jj |qlWdS)Nr^z us-east-1ZRegionsZ RegionNamer}zW{} The {} region is currently unsupported. AMI IDs will not be updated for this region.z1Template: [{}] Region: [{}] is not a valid region)rRZ _region_listr_r`r)Zdescribe_regionsrQrrBr,rr*EXCLUDED_REGIONSr&r'rr(rr)rZ _ec2_regionsZ_ec2rrr r rr.s    z!TemplateObject._determine_regionscCs0|jddj|dj|d}|r,||j|<dS)NZMappingsZAWSAMIRegionMap)rr)replacement_ami_map)rrArrZ currvaluer r rset_region_amiBszTemplateObject.set_region_amicCstj|||j|_dS)N)resubr)rold_aminew_amir r r rotate_ami_idGszTemplateObject.rotate_ami_idc CsLx"|jjD]\}}|j||q Wt|jd}|j|jWdQRXdS)Nw)rrOrr"rwriter)rrrZupdated_templater r rrJszTemplateObject.writeN)F) r r r r;rr9rUrrrrrrr r r rrs  rc@sneZdZdZejddZdZddddgZdd d Z d d Z ddZ e ddZ e ddZddZddZdS)r_NZtaskcatz/cfg/amiupdater.cfg.ymlzVhttps://raw.githubusercontent.com/aws-quickstart/taskcat/master/cfg/amiupdater.cfg.ymlz us-gov-east-1z us-gov-west-1zcn-northwest-1z cn-north-1TcCsJ|r |t_ntt_d|_|r.tj|jdd|r@tj|dd||_dS)NFZUpstream)r0ZUser)r_r`rrrr4upstream_config_file_template_path)rZpath_to_templatesZuser_config_fileZuse_upstream_mappingsr`r r rr]szAMIUpdater.__init__c Cs*t|j}tj|}WdQRX||_dS)z Loads the AMIUpdater Config FileN)r"Z_user_config_filer#r$config)rr1Zconfig_contentsr r r_load_config_filejs zAMIUpdater._load_config_fileccsr|j}tjj|r|VnTtjj|rnxFtj|D]8\}}}x,|D]$}|jttj rBtjj ||VqBWq2WdS)N) rospathisfileisdirwalkendswithtuplerLrjoin)rpdirpathdirnameZ file_namesr/r r r_fetch_template_filesps   z AMIUpdater._fetch_template_filescCstjd\}}|r|SdS)NTF)tcZcheckforupdate)r.neededversionr r r#check_updated_upstream_mapping_speczsz.AMIUpdater.check_updated_upstream_mapping_specc Cs8tj|j}|jr4t|j}|j|jWdQRXdS)N)requestsr)upstream_config_file_urlokr"rrcontent)r.r!r1r r rupdate_upstream_mapping_specs  z'AMIUpdater.update_upstream_mapping_speccCsPx|jD] }t|q Wtj}|rLtdjtjx|D] }t|qs*      k"&V