3 cjzf @s6ddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z ddlmZejeZddddfd e jifd d ddfd Zd7ZdZdZdZdZdZdZdZdZdZeeeeeeeefZd8Z Gd(d)d)e!Z"Gd*d+d+Z#Gd,d-d-ej$d.Z%Gd/d0d0e%Z&Gd1d2d2e%Z'd9d3d4Z(dS):N)netsourcessubp url_helperutil)BrokenMetadata)ec2network_configcCs|S)N)xr r /usr/lib/python3.6/openstack.pysr meta_jsauthorized_keyscCs|S)Nr )r r r r r s)zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keyslocal-hostnamehostnameF instance-iduuidTlatestz 2012-08-10z 2013-04-04z 2013-10-17z 2015-10-15z 2016-06-30z 2016-10-06z 2017-02-22z 2018-08-27bgpovsbridge cascadingdvsethernethw_vebhypervovsphytap vhostuservifc@s eZdZdS) NonReadableN)__name__ __module__ __qualname__r r r r r"Qsr"c@s4eZdZddZddZddZddZd d Zd S) SourceMixincCs>|js dS|jjdi}x |jD]\}}||kr"|Sq"WdS)Nzblock-device-mapping)Z ec2_metadatagetitems)selfnameZbdmZent_namedevicer r r _ec2_name_to_deviceVszSourceMixin._ec2_name_to_devicecCs$d}|jdkrd}tj|jj|S)NZ public_keysz public-keys)versionrZnormalize_pubkey_datametadatar')r)r*r r r get_public_ssh_keys_s zSourceMixin.get_public_ssh_keysc CsRd}y2d|}|dkrd|}tj|}|r4|d}Wntjk rLYnX|S)NzLABEL=%sZswapzTYPE=%sr)rZfind_devs_withrZProcessExecutionError)r)r*r+ZcriteriaZ dev_entriesr r r _os_name_to_devicees  zSourceMixin._os_name_to_devicecCsV|sdS|jdsd|}tjj|r*|S|jtjj|}|rRtjd|||SdS)N/z/dev/%szRemapped device name %s => %s) startswithospathexistsZ _remap_devicebasenameLOGdebug)r)r+Zremappedr r r _validate_device_namers  z!SourceMixin._validate_device_namecCs|sdS|g}|dkr"|jdd|dkr4|jdd}tjd|x&|D]}|j|}|j|}|rJPqJW|stjd|x&|D]}|j|}|j|}|rPqW|sdStjd|||SdS)NrootrZamiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)insertappendr8r9r,r:r1)r)r*namesr+nr r r device_name_to_devices2          z!SourceMixin.device_name_to_deviceN)r#r$r%r,r0r1r:r@r r r r r&Us   r&c@sheZdZddZejddZejdddZejdd Zejd d Z d d Z dddZ ddZ dS) BaseReadercCs ||_dS)N) base_path)r)rBr r r __init__szBaseReader.__init__cGsdS)Nr )r)baseadd_onsr r r _path_joinszBaseReader._path_joinFcCsdS)Nr )r)r5decoder r r _path_readszBaseReader._path_readcCsdS)Nr )r)r r r _fetch_available_versionssz$BaseReader._fetch_available_versionscCsdS)Nr )r)r r r _read_ec2_metadataszBaseReader._read_ec2_metadatacCsy |j}Wn6tk rB}ztjd|j|g}WYdd}~XnXddtttD}t}x|D]}||krrqd|}PqdWtjd|||S)Nz4Unable to read openstack versions from %s due to: %scSsg|]}|qSr r ).0vr r r sz4BaseReader._find_working_version..zSelected version '%s' from %s) rI Exceptionr8r9rBreversedlist OS_VERSIONS OS_LATEST)r)Zversions_availableeZ supportedZselected_versionZpotential_versionr r r _find_working_versions(  z BaseReader._find_working_versioncCs\|jddjd}|jd}dd|D}|s:td||j|jdf|}|j||dS) NZ content_pathrr2cSsg|]}t|r|qSr )len)rKpr r r rMsz1BaseReader._read_content_path..z!Item %s has no valid content path openstack)rG)r'lstripsplitrrFrBrH)r)itemrGr5Z path_piecesZ valid_piecesr r r _read_content_paths  zBaseReader._read_content_pathc(stjtjtttfdfdd}ddd}|j}x|jD]\}\}}}j j |}d}d}yj |}WnDt k r} z(|st jd || nt jd || WYdd} ~ XnXd }|r| rtd ||o|r$y ||}Wn6tk r"} ztd || f| WYdd} ~ XnX|rD|||<qDW|d} d| kr| d} ytj| | d<Wn6ttfk r} ztd| | WYdd} ~ XnXi} | jdg} xn| D]f}d|krq|d}yj|| |<Wn6tk r} ztd|| f| WYdd} ~ XnXqW| |d<| jdd}|ryj|d d}||d<Wn2t k r~} ztd| | WYdd} ~ XnXy| dd|d<Wntk rYnXj|d<xHtD]@\}}}|r|| krtd||| kr| j|| |<qW|S)zReads a version 2 formatted location. Return a dict with metadata, userdata, ec2-metadata, dsmode, network_config, files and version (2). If not a valid location, raise a NonReadable exception. )Z root_typescsi}jd|ddtjf|d<jd|ddddf|d <jd|d df|d <jd|d df|d <jd|ddf|d<|S)NrWzmeta_data.jsonTr/Z user_dataFcSs|S)Nr )r r r r r sz7BaseReader.read_v2..datafiles..userdatazvendor_data.jsonZ vendordatazvendor_data2.jsonZ vendordata2znetwork_data.jsonZ networkdata)rFr load_json)r.files)load_json_anytyper)r r datafiless"         z%BaseReader.read_v2..datafilesr)r\r.NFz*Failed reading optional path %s due to: %sz+Failed reading mandatory path %s due to: %sTzMissing mandatory path: %szFailed to process path %s: %sr/ random_seedz.Badly formatted metadata random_seed entry: %sr^r5z#Failed to read provided file %s: %sr )rGz(Failed to read network configuration: %smetadsmodez ec2-metadatazNo '%s' entry in metadata) functoolspartialrr]dictrPstrrTr(rFrBrHIOErrorr8r9r"rNrbase64Z b64decode ValueError TypeErrorr'r[KeyErrorrJ KEY_COPIES)r)r`resultsdatar*r5Zrequired translatorfoundrSr/rbr^Zmetadata_filesrZZnet_itemcontentZ target_keyZ source_keyZ is_requiredr )r_r)r read_v2s !                  zBaseReader.read_v2N)F)F) r#r$r%rCabcabstractmethodrFrHrIrJrTr[rtr r r r rAs  rA) metaclasscsFeZdZfddZddZdddZdd Zd d Zd d ZZ S)ConfigDriveReadercstt|j|d|_dS)N)superrxrC _versions)r)rB) __class__r r rCfszConfigDriveReader.__init__cGs|gt|}tjj|S)N)rPr4r5join)r)rDrEZ componentsr r r rFjszConfigDriveReader._path_joinFcCstj||dS)N)rG)rZ load_file)r)r5rGr r r rHnszConfigDriveReader._path_readcs@|jdkr:|j|jdfddtjD}t||_|jS)NrWcs$g|]}tjjtjjr|qSr )r4r5isdirr|)rKd)r5r r rMusz?ConfigDriveReader._fetch_available_versions..)rzrFrBr4listdirsorted)r)rrr )r5r rIqs    z+ConfigDriveReader._fetch_available_versionscCsl|j|jddd}tjj|s"iSytj|j|Stk rf}zt d||f|WYdd}~XnXdS)Nrrzmeta-data.jsonzFailed to process path %s: %s) rFrBr4r5r6rr]rHrNr)r)r5rSr r r rJ|s  z$ConfigDriveReader._read_ec2_metadatacCsi}x2tjD]&}|j|j|}tjj|r|||<qWt|dkrRtd|ji}xtj D]\}\}}}||kr ||}y|j |}Wn0t k r} zt d|| WYdd} ~ XnXy||||<Wn6t k r} zt d|| f| WYdd} ~ XnXq`tj|||<q`W|d} |d} | jd| } | rX| j} d d | D|d<d | krn| d |d <d |d } d| kr| d| d<| jdd| d<i| d<| S)zReads a version 1 formatted location. Return a dict with metadata, userdata, dsmode, files and version (1). If not a valid path, raise a NonReadable exception. rz%s: no files foundzFailed to read: %sNzFailed to process path %s: %srrz public-keyscSs$g|]}t|r|jd r|qS)#)rUr3)rKliner r r rMsz-ConfigDriveReader.read_v1..z instance-idr-)r.r/rdz user-datarr\r^)FILES_V1keysrFrBr4r5r6rUr"r(rHrirrNcopydeepcopyr' splitlines)r)rrr*r5ZmdkeyrqdefaultcontentsrSZkeydatarlinesror r r read_v1sL            zConfigDriveReader.read_v1)F) r#r$r%rCrFrHrIrJr __classcell__r r )r{r rxes    rxcs@eZdZdfdd ZddZddd Zd d Zd d ZZS)MetadataReaderNcs4tt|j|||_t||_t||_d|_dS)N) ryrrC ssl_detailsfloattimeoutintretriesrz)r)Zbase_urlrrr)r{r r rCs   zMetadataReader.__init__cCsf|jdk r|jSg}|j|jd}|j|dd}x(|jD]}|j}|sLq:|j|q:W||_|jS)NrWT)rG)rzrFrBrHrstripr=)r)rrZ version_pathrsrr r r rIs z(MetadataReader._fetch_available_versionsFcCs:dd}tj||j|j|j|d}|r0|jjS|jSdS)Nc Ss8yt|j}|dkrdSWnttfk r2YnXdS)NiFT)rcoderlrk)Z _request_argscauserr r r should_retry_cbs z2MetadataReader._path_read..should_retry_cb)rrrZ exception_cb)rZreadurlrrrrrG)r)r5rGrZresponser r r rHs  zMetadataReader._path_readcGstj|f|S)N)rZ combine_url)r)rDrEr r r rFszMetadataReader._path_joincCstj|j|j|jdS)N)rrr)rZget_instance_metadatarrr)r)r r r rJsz!MetadataReader._read_ec2_metadata)Nrr)F) r#r$r%rCrIrHrFrJrr r )r{r rs  rc sx|dkr dSddddddgddd d d d d ddddg d|jdg}|jdg}|jdg}g}id}d}g}xr|D]hg} tfddjD} dkrd| d<d} jdr؈jdj} | d<| jd| ddd} xdfdd|DD]L} tfdd| jD}| dd krH|jdd!in| dd"krf|jdd#inz| ddJkr|jd| dinX| ddKkr|jd(| jd)d*n2| ddLkr| jd-d.i|jd,| jd)d*d/d| jdgD}|r||d<| ddMkr | jd-d0i| dd'kr6d0|d'<| dd+krLd0|d+<| j|q W| jd| iddNkri}| r| jd| ix@jD]4\}}|d2krqn|jd1r|j||iqW||}|d37}|j| d4d5tjd2f| j||d6|| d<nddOkrd8d9d:f}| j|d:d;d<|j| d9d5d9f|j| dd=d:d9f| jd;|d>n.dt krt j d?d| jd@| dA|j| | | d<qxWdBd|D}|s|r|dkrt j }xFjD]:\}}|jdr4q|jdC|kr||dC|d<qWxL|D]D}|jd}|stdD|||krtdE||||d<q`WxT|D]L\} }}t|ttfrfdFd|D| |<n|d| |<qWt j}|rBx4|D],} | d|kr|| d| d<dG| d<qWx*|D]"}|} | jddHi|j| qHWd3|dIS)Pa)Return a dictionary of network_config by parsing provided OpenStack ConfigDrive NetworkData json format OpenStack network_data.json provides a 3 element dictionary - "links" (links are network devices, physical or virtual) - "networks" (networks are ip network configurations for one or more links) - services (non-ip services, like dns) networks and links are combined via network items referencing specific links via a 'link_id' which maps to a links 'id' field. To convert this format to network_config yaml, we first iterate over the links and then walk the network list to determine if any of the networks utilize the current link; if so we generate a subnet entry for the device We also need to map network_data.json fields to network_config fields. For example, the network_data links 'id' field is equivalent to network_config 'name' field for devices. We apply more of this mapping to the various link types that we encounter. There are additional fields that are populated in the network_data.json from OpenStack that are not relevant to network_config yaml, so we enumerate a dictionary of valid keys for network_yaml and apply filtering to drop these superflous keys from the network_config yaml. Nr*type mac_addresssubnetsparamsZmtuaddressZnetmaskZ broadcastZmetricZgatewayZ pointopointZscopedns_nameserversZ dns_searchZroutes)physicalsubnetlinksnetworksserviceszbond%drc3s&|]\}}|dkr||fVqdS)rNr )rKkrL) valid_keysr r Qsz#convert_net_json..Zethernet_mac_addressid)r*macrrcs g|]}|ddkr|qS)linkrr )rKr?)rr r rMfsz$convert_net_json..c3s&|]\}}|dkr||fVqdS)rNr )rKrrL)rr r rhsZ ipv4_dhcpZdhcp4 ipv6_dhcpZdhcp6 ipv6_slaacipv6_dhcpv6-statelessipv6_dhcpv6-statefulipv4staticZ ip_address)rripv6static6z accept-raFcSs"g|]}|jddkr|dqS)rZdnsr)r')rKservicer r r rMsTbondZ bond_linksr-Zbond_interfacesz%s)rr*vlanz%s.%sZ vlan_linkvlan_idZvlan_mac_address)r*rrz%%s.%s)rr*z9Unknown network_data link type (%s); treating as physicalr)rrcSs&g|]}|jddkrd|kr|qS)rrr*)r')rKr~r r r rMsrz#No mac_address or name entry for %sz"Unable to find a system nic for %scsg|]}|dqS)r*r )rKtarget)fmt link_id_infor r rMsZ infinibandZ nameserver)r.config)rrr)rr)rr)rr)r)r)r'rgr(lowerupdater=r3rrKNOWN_PHYSICAL_TYPESr8ZwarningrZget_interfaces_by_macrk isinstancerPtupleZget_ib_hwaddrs_by_interface)Z network_jsonZ known_macsrrrZ link_updatesZ bond_name_fmtZ bond_numberrrZcfgZ link_mac_addrZcurinfoZnetworkrrrrrLZ link_namer*Z need_namesZ_link_idinfor~rrZtargetsZib_known_hwaddrsrr )rrrrr convert_net_jsons                       rrrFrrT)rr) Nrrrrrrrrrrr r!)NN))rurjrreZloggingr4Z cloudinitrrrrrZcloudinit.sourcesrZcloudinit.sources.helpersrZ getLoggerr#r8r]rrnrRZ OS_FOLSOMZ OS_GRIZZLYZ OS_HAVANAZ OS_LIBERTYZ OS_NEWTON_ONEZ OS_NEWTON_TWOZOS_OCATAZOS_ROCKYrQrrir"r&ABCMetarArxrrr r r r  sf     LEo: