3 \me3@sddlZddlZddlZddlmZmZmZddlmZej e Z Gdddej Z dddZddd Zdd d Zd d ZGddde Ze ejffeejejffgZddZdS)N)dmisourcesutil)enic@s`eZdZdZddZddZddZdd Zed d Z d d Z ddZ ddZ eddZ dS)DataSourceNoCloudZNoCloudcCsJtjj||||d|_tjj|jdtjj|jdg|_d|_d|_ dS)Nnocloudz nocloud-net/file://)rr ) r DataSource__init__seedospathjoinseed_dir seed_dirssupported_seed_starts)selfsys_cfgdistropathsr'/usr/lib/python3.6/DataSourceNoCloud.pyr s zDataSourceNoCloud.__init__cCstjj|}d||j|jfS)Nz%s [seed=%s][dsmode=%s])rr __str__r dsmode)rrootrrrr#s zDataSourceNoCloud.__str__cCs|tjd}|jtjdtjd|j}|jtjd|j|jtjd|tt|t|@}|jdd|S)Nz TYPE=vfatz TYPE=iso9660zLABEL=%szLABEL_FATBOOT=%sT)reverse)rZfind_devs_withextendupperlowerlistsetsort)rlabelZfslistZ label_listZdevlistrrr _get_devices's  zDataSourceNoCloud._get_devicesc"Csd|jd}g}idddd}y8i}tjd}|rTt||rT|jdt|d|i}Wn tk rvtjt dd SXy(i}t|r|jd t|d|i}Wn tk rtjt d d SXd dgd dgd}xZ|j D]P}y4tj |f|}|j|t j d|t||}PWqt k r*YqXqW|jjdrZ|jd|jd|dd<d |jkrd|jkrt||j}|jddd} |jjdd} | dk rx|j| D]} ynt j d| ytj| | |}Wn(t k rt jd| | wYnXt||}t j d| |j| PWnXtk rZ} z| jtjkrJWYdd} ~ Xn&tjk r~tjt d| YnXqWt|dkrd Sd|dkrL|dd} d }x"|jD]}| j|r|}PqW|st j d| |d Stj| } tj| dd\}}}t j d| tj|d|g|d<||d <||d <|j| tj|d|g|d<|j|djd g|_|jtjkrt j d!||jd Sd"j ||_!|d|_"|d |_#|d |_$|d|_%|djd#|_&d$S)%Nr)z instance-idr)z meta-dataz user-dataz vendor-dataznetwork-configzsystem-serial-numberrz meta-datazUnable to parse dmi dataFcmdlinez!Unable to parse command line dataz user-dataz vendor-dataznetwork-config)requiredZoptionalzUsing seeded data from %sseedfromZds_config_seedfromZ ds_configcSstj|f|S)N)rpathprefix2dict)Zmpdatarrr_pp2d_callbacktsz3DataSourceNoCloud._get_data.._pp2d_callbackZfs_labelZcidatazAttempting to use data from %sz)device %s with label=%s not a valid seed.zUsing data from %sz(Failed to mount %s when looking for datarz Seed from %s not supported by %s)ZtimeoutzUsing seeded cache data from %srz&%s: not claiming datasource, dsmode=%s,znetwork-interfacesT)'rrZ read_dmi_dataload_cmdline_dataappend_merge_new_seed ExceptionrZlogexcLOGrr)debug ValueErrorZds_cfggetr$Zmount_cbZwarningOSErrorerrnoENOENTZMountFailedErrorlenr startswithZ sub_dmi_varsZ read_seeded mergemanydictZ_determine_dsmoderZDSMODE_DISABLEDrr ZmetadataZ userdata_rawZvendordata_raw_network_config _network_eni)rZdefaultsfoundZmydatamdserialZ pp2d_kwargsrseededr+r#Zdever(Z seedfoundprotoZmd_seedZudZvdrrr _get_data3s                                 zDataSourceNoCloud._get_datacCs.t|dsd|_|js(tjr"dnd|_|jS)N_platform_typeZlxdr)hasattrrDrZis_lxd)rrrr platform_types  zDataSourceNoCloud.platform_typecCstjS)z=Return unknown when 'cloud-name' key is absent from metadata.)rZMETADATA_UNKNOWN)rrrr_get_cloud_namesz!DataSourceNoCloud._get_cloud_namecCs$|jjdrd}nd}d||jfS)z/Return the subplatform metadata source details.z/devz config-diskzseed-dirz%s (%s))r r9)rZsubplatform_typerrr_get_subplatforms z"DataSourceNoCloud._get_subplatformcCs:|j}|sdSt|d|jg}t|d}|s2dS||kS)Nr)dirs)Zget_instance_idgetattrr_quick_read_instance_id)rrZcurrentrIZquick_idrrrcheck_instance_ids z#DataSourceNoCloud.check_instance_idcCs(|jdkr"|jdk r"tj|j|_|jS)N)r;r<rZconvert_eni_data)rrrrnetwork_configs  z DataSourceNoCloud.network_configN)__name__ __module__ __qualname__Zdsnamer rr$rCpropertyrFrGrHrLrMrrrrrs   rc Cs|dkr g}d}i}t|r,||kr,||Sxb|D]Z}|dkr@q2y6tj|dgd}tj|d}|rt||krt||SWq2tk rYq2Xq2WdS)Nz instance-idz meta-data)r')r-rr) load_yamlr3)rIZiid_keyfilldr*r>rrrrKs"    rKcCsdtjfdtjfg}xn|D]f\}}t|||s0qd|kr s  i   (