3 \meW" @sddlZddlZddlZddlmZmZejeZe ej gZ GdddZ GdddZ ddZdd d ZdddZdddZdddZdS)N) url_helperutilc@s eZdZdZddZddZdS)MetadataLeafDecoderz.Decodes a leaf blob into something meaningful.cCs,|sdS|j}|jdr(|jdr(dSdS)NF{}T)strip startswithendswith)selftextr /usr/lib/python3.6/ec2.py_maybe_json_objects z&MetadataLeafDecoder._maybe_json_objectcCs|sdSytj|}Wntk r*|SX|j|rvy tj|Sttfk rt}ztj d||WYdd}~XnX|j ddkr|j S|S)Nz6Field %s looked like a json object, but it was not: %s ) r decode_binaryUnicodeDecodeErrorrjsonloads ValueError TypeErrorLOGwarningfind splitlines)r fieldblober r r __call__s"  zMetadataLeafDecoder.__call__N)__name__ __module__ __qualname____doc__rr r r r r rsrc@s.eZdZd ddZddZddZdd ZdS) MetadataMaterializerNcCs4||_d|_||_||_|dkr*t|_n||_dS)N)_blob_md _base_url_callerr _leaf_decoder)r rbase_urlcaller leaf_decoderr r r __init__7s zMetadataMaterializer.__init__c Csi}g}tj|}|s||fSdd}dd}x|jD]}|j}||}| s8| rZq8|dkrdq8||r||kr|j|q8|jdd}|} t|dkr|\} } tj| } | dk rd| } | }| ||<q8W||fS) NcSs|jdrdSdSdS)N/TF)r )itemr r r has_childrenIs z1MetadataMaterializer._parse..has_childrencSs|jdr|jdS|S)Nr/)r rstrip)r0r r r get_nameOs  z-MetadataMaterializer._parse..get_namezsecurity-credentials=rz%s/openssh-key)rrrrappendsplitlenZsafe_int) r rleaveschildrenr1r3rZ field_namecontentsresourceZidentZ sub_contentsr r r _parseAs6       zMetadataMaterializer._parsecCs(|jdk r|jS|j|j|j|_|jS)N)r' _materializer&r()r r r r materializels z MetadataMaterializer.materializecCs|j|\}}i}xD|D]<}tj||}|jds:|d7}|j|}|j||||<qWi} x:|jD].\} } tj|| } |j| } |j| | | | <qfWi}|j|x2| j D]&} | |krt j d|q| | || <qW|S)Nr/z&Duplicate key found in results from %s) r<r combine_urlr r)r=itemsr*updatekeysrr)r rr+r8r9Zchild_contentscZ child_urlZ child_blobZ leaf_contentsrr;Zleaf_urlZ leaf_blobZjoinedr r r r=rs(       z!MetadataMaterializer._materialize)N)r!r"r#r.r<r>r=r r r r r%6s +r%cCs |j|kS)z/Returns False if cause.code is in status_codes.)code)Z status_codesZ _request_argscauser r r skip_retry_on_codessrFlatesthttp://169.254.169.254c Cstj||}tj|d}d} y2|s.tjtt}tj|||||||d} | j} Wn\tjk r} z| j tkrzt j t d|WYdd} ~ Xn"t k rt j t d|YnX| S)Nz user-data) ssl_detailstimeoutretries exception_cb headers_cbheaders_redactz$Failed fetching userdata from url %s)rr? functoolspartialrFSKIP_USERDATA_CODESread_file_or_urlr:UrlErrorrDrlogexcr Exception) api_versionmetadata_addressrKrLrMrOrPrNZud_urlZ user_dataresponserr r r get_instance_userdatas,    r[c  stj|||} tjtj|||||| dfdd} y4| } t| j| | |d}|j}t|t shi}|St k rt j t d|| iSXdS)N)rKrLrMrOrPrNcsXy |jStjk rR}z* s.| r2ntjd|dSWYdd}~XnXdS)Nz&Skipped retrieval of the content of %sz (skipped))r:rrUrr)Zurlr)r,retrieval_exception_ignore_cbr r mcallers   z'_get_instance_metadata..mcaller)r-zFailed fetching %s from url %s)rr?rQrRrTr%r:r> isinstancedictrWrrVr)treerXrYrKrLrMr-rOrPrNr\Zmd_urlr]rZZ materializerZmdr )r,r\r _get_instance_metadatas*   rac Cstd|||||||||| d S)Nz meta-data/) r`rXrYrKrLrMr-rPrOrNr\)ra) rXrYrKrLrMr-rOrPrNr\r r r get_instance_metadatasrbc Cstd|||||||||d S)Nzdynamic/instance-identity) r`rXrYrKrLrMr-rPrOrN)ra) rXrYrKrLrMr-rOrPrNr r r get_instance_identitys rc)rGrHNrIrINNN) rGrHNrIrINNNNN) rGrHNrIrINNNNN) rGrHNrIrINNNN)rQrZloggingZ cloudinitrrZ getLoggerr!r frozensetZ NOT_FOUNDrSrr%rFr[rarbrcr r r r  sZ  #T ! )