f7D bdZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z m Z mZmZmZmZmZddlZddlmZddlmZddlmZdd lmZmZmZmZmZdd l m!Z!ejDe#Z$d Z%d Z&d Z'dddddddZ(de)fdZ* d2deee)de e)e ffdZ+GddeZ,GddeZ-GddeZ.de)de/fdZ0GddejbZ2de3fd Z4 d3d!ejjd"e)d#e3fd$Z6 d3d!ejjd"e)d#e3dejnfd%Z8Gd&d'eZ9Gd(d)Z:e&e9jvfd*e)d+e9de/fd,Zd-Z?e#d.k(rSddl@Z@d/ZAe@jeA0ZCeCjeEejevJ    .. vm>vJ  sA B  'BB c eZdZUdZej Zeee fe d<ej Z eee fe d<ejjdzZ ee dfe d<dZded d ffd Zed efd Zd efd Zd e fdZd e fdZed efdZxZS) DataSourceLXDLXD_network_config_crawled_metadata)user.meta-datarrrr.sensitive_metadata_keysTci_pkl_versionrNc2t||d|_y)NT)rJ _unpickleskip_hotplug_detect)rNrrOs r4rzDataSourceLXD._unpickles .)#' rDctS)z@Check platform environment to report if this datasource may run.)is_platform_viablerirDr4 ds_detectzDataSourceLXD.ds_detects "##rDctjtjdt|_t d|j jd|_|j jdi}|jdi}|r t d|}t|jts9tjtj|j|g|_d|j vr|j d|_ d|j vrt d|j d|_d|j vr|j d|_y ) z=Crawl LXD socket API instance data and return True on successzCrawl of metadata service)logfuncmsgfunc meta-datar@r}rrrT)rlog_timer+rA read_metadatar|rwgetmetadatarnro mergemanydictrp userdata_rawr{vendordata_raw)rNr@ user_metadatas r4 _get_datazDataSourceLXD._get_datas-!%II+"  3 //33K@  ''++Hb9 #3R8 6 -M$--. .. . >DM $00 0 $ 6 6{ CD  t55 5#= $"8"89I"J$D  D22 2"&"8"8"GD rDc8djttS)z.Return subplatform details for this datasourcez"LXD socket API v. {ver} ({socket}))verrR)rsLXD_SOCKET_API_VERSIONrerWs r4_get_subplatformzDataSourceLXD._get_subplatforms3::&;  rDcttj}|jdi}t |t st j|}|jd|jjdk(S)z%Return True if instance_id unchanged. metadata_keysrz instance-id) r MetaDataKeys META_DATArrnrorrpr)rNsys_cfgresponsemds r4check_instance_idzDataSourceLXD.check_instance_ids] |/E/EF \\+r *"d##Bvvm$ (9(9-(HHHrDc|jtjk(r|jtjk(r|j t |jt r|jjdr*tjd|jd|_nb|jjdrG|jdjDcgc]\}}|ddk(r|}}}t||_|jtjk(r$tjdt|_tt |jScc}}w)zNetwork config read from LXD socket config/user.network-config. If none is present, then we generate fallback configuration. rz,LXD datasource using provided network configdevicesr;nicz8LXD datasource generating network config using fallback.) r{rUNSETr|rrnrorr+rAitemsrCr )rNkvrs r4network_configzDataSourceLXD.network_configs)   7== 0%%6 $00$7))--.>?IILM+/+A+A(,D(++// : %)$:$:9$E$K$K$M* AqV9-*G* ,C7+KD(   7== 0 IIJ $;#>?? rDsessionrfdo_raisec6t|||}|js.tjd||j|j iS |j S#t$r6}tjdj||j |d}~wwxYw)NSkipping %s on [HTTP:%d]:%szFUnable to process LXD config at {url}. Expected JSON but found: {resp})rfresp) _do_requestokr+rA status_codetextjsonrrrrrs)rrfr url_responservs r4_get_json_responserswX6L ?? )   $ $        "" .. //5vl//060   s A B"1BBctdddD][}|j|}d|jk(r8tjdt j d|j||[nt jdj||rG|js;tjdj|j||j |S) Nrig?z,[GET] [HTTP:%d] %s, retrying %d more time(s)z[GET] [HTTP:%d] %sz3Invalid HTTP response [{code}] from {route}: {resp})coderouter) rangerrtimesleepr+r,rArrrrrsr)rrfrretriesrs r4rr,sQ# ;;s# (&& & JJsO KK>$$    II"H$8$8#> .. A H H))]] I    OrDcTeZdZeZeZeZeZeezezZy)rN) rXrYrZrNONECONFIGDEVICESrALLrirDr4rrIs- 6D VFfGI 7 Y &CrDrcPeZdZefdefdZdejdefdZ de defdZ y) _MetaDataReader api_versioncd||_tjt|j|_yrQ)rr combine_urlLXD_URL _version_url)rNrs r4rKz_MetaDataReader.__init__Rs%&&227D(B(BF8 W %,,&g.f<.22*73KKF a@;! D rDrcFtj5}|j|jt d|j i}t j|vr9tj|jd}t||j|d<t j|vr |j|j|t j|vr5tj|jd}t!||d}|r||d<|cdddS#1swYyxYw)N_metadata_api_versionrrFr)requestsSessionmountrrcrrrrrrrrupdaterrr)rNrrrmd_routerfrs r4__call__z_MetaDataReader.__call__s     7 MM$++-=-? @/1A1ABB%%6%11%%{#.gx"@"E"E;""m3 $..w78##}4 ,,T->-> J,WcEJ$+ByM!   s C8DD N) rXrYrZrrrKrrrorrrrirDr4rrQs@*@NCN5x'7'75D5n$rDrrrc(t||S)a8Fetch metadata from the /dev/lxd/socket routes. Perform a number of HTTP GETs on known routes on the devlxd socket API. Minimally all containers must respond to /meta-data when the LXD configuration setting `security.devlxd` is true. When `security.devlxd` is false, no /dev/lxd/socket file exists. This datasource will return False from `is_platform_viable` in that case. Perform a GET of /config` and walk all `user.*` configuration keys, storing all keys and values under a dict key LXD_SOCKET_API_VERSION: config {...}. In the presence of the following optional user config keys, create top level aliases: - user.user-data -> user-data - user.vendor-data -> vendor-data - user.network-config -> network-config :param api_version: LXD API version to operated with. :param metadata_keys: Instance of `MetaDataKeys` indicating what keys to fetch. :return: A dict with the following optional keys: meta-data, user-data, vendor-data, network-config, network_mode, devices. Below is a dict representation of all raw configuration keys and values provided to the container surfaced by the socket under the /1.0/config/ route. )rr)r)rrs r4rrsF 4?{ 3# rDc6tj|tSrQ)rlist_from_depends datasources)dependss r4get_datasource_listrs  $ $Wk ::rD__main__z*Query LXD metadata and emit a JSON object.) descriptionrrQ)T)G__doc__loggingrrRrrenumrr json.decoderrtypingrrrr r r r rrequests.adaptersr urllib3.connectionrurllib3.connectionpoolr cloudinitrrrrr cloudinit.netr getLoggerrXr+rerrrrr5rCrFr^rcrorwrryrrrrResponserrrrrDEP_FILESYSTEMrrargparserArgumentParserparser parse_argsprint json_dumpsrirDr4r s, (@@@).5DD+g!! (!1+!+% c6!%# 49 # #s(^#L,>,6-65{5 cd:g0G&&g0TD;?   $'370;?   $'37 :'4'MMb."."2"2%%% %TW++-. ; zBK $X $ $ =F     \=M=M!NO rD