܍~cJA TdZddlZddlZddlZddlmZmZddlmZddl m Z m Z m Z m Z mZmZddlZddlmZddlmZddlmZdd lmZdd lmZmZmZmZdd lmZej e!Z"d Z#d Z$dZ%dddddddZ&de'fdZ( d4de e e'de e'e ffdZ)GddeZ*GddeZ+GddeZ,de'de-fdZ.Gdd ej/Z0de1fd!Z2 d5d#ej3d$e'd%e1fd&Z4 d5d#ej3d$e'd%e1dej5fd'Z6Gd(d)eZ7Gd*d+Z8e$e7j9fd,e'd-e7de-fd.Z:e0ej;ffgZZ>d1Z?e>j@e?2ZAeABeCejDe:e7j93dSdS)6aDatasource for LXD, reads /dev/lxd/sock representation of instance data. Notes: * This datasource replaces previous NoCloud datasource for LXD. * Older LXD images may not have updates for cloud-init so NoCloud may still be detected on those images. * Detect LXD datasource when /dev/lxd/sock is an active socket file. * Info on dev-lxd API: https://linuxcontainers.org/lxd/docs/master/dev-lxd N)Flagauto)JSONDecodeError)AnyDictListOptionalUnioncast) HTTPAdapter)HTTPConnection)HTTPConnectionPool)log)sourcessubp url_helperutil)find_fallback_nicz /dev/lxd/sockz1.0z http://lxd user-datanetwork-config vendor-data)zcloud-init.user-datazcloud-init.network-configzcloud-init.vendor-datauser.user-datazuser.network-configuser.vendor-datareturncfd}tjdr tjdg\}}n9#tj$r'}td||cYd}~Sd}~wwxYw|dvr1t jdd}|dkrdS|d krd Sd S|S) Neth0zsystemd-detect-virtzHUnable to run systemd-detect-virt: %s. Rendering default network config.)kvmqemuunameppc64leenp0s5s390xenc9enp5s0)rwhichProcessExecutionErrorLOGwarningstripr system_info) default_name virt_type_errarchs A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceLXD.py_get_fallback_interface_namer2.sL z'((  9&;%<==LIqq)   KK5             ??  !   #%%g.q1Dy  xvx s1A'A"A'"A'nicsct}|rtd|n)t}td|dd|dddgdgd S) zCReturn network config V1 dict representing instance network config.zCLXD datasource generating network from discovered active device: %szVLXD datasource generating network from systemd-detect-virt platform default device: %sphysicaldhcpr)typecontrol)r8namesubnets)versionconfig)rr(debugr2)r3 primary_nics r1generate_network_configr@Hs$%%K         344   +    ##%+??@      c$eZdZfdZdZxZS)SocketHTTPConnectioncXtd||_dSN localhost)super__init__ socket_pathselfrI __class__s r1rHzSocketHTTPConnection.__init__os) %%%&rActjtjtj|_|j|jdSN)socketAF_UNIX SOCK_STREAMsockconnectrIrKs r1rSzSocketHTTPConnection.connectss9M&.&2DEE  $*+++++rA)__name__ __module__ __qualname__rHrS __classcell__rLs@r1rCrCnsG''''',,,,,,,rArCc$eZdZfdZdZxZS)SocketConnectionPoolcX||_tddSrE)rIrGrHrJs r1rHzSocketConnectionPool.__init__ys)& %%%%%rAc*t|jSrN)rCrIrTs r1 _new_connzSocketConnectionPool._new_conn}s#D$4555rA)rUrVrWrHr^rXrYs@r1r[r[xsG&&&&&6666666rAr[ceZdZddZdS)LXDSocketAdapterNc*ttSrN)r[LXD_SOCKET_PATH)rKurlproxiess r1get_connectionzLXDSocketAdapter.get_connections#O444rArN)rUrVrWrerAr1r`r`s(555555rAr` metadata_typec6t|tr|S|iS tj|}n<#t$r/}t jd|||d}~wwxYw|)t jd|||S)a6Convert raw instance data from str, bytes, YAML to dict :param metadata_type: string, one of as: meta-data, vendor-data, user-data network-config :param metadata_value: str, bytes or dict representing or instance-data. :raises: InvalidMetaDataError on invalid instance-data content. NzAInvalid {md_type}. Expected str, bytes or dict but found: {value})md_typevaluez:Invalid {md_type} format. Expected YAML but found: {value}) isinstancedictr load_yamlAttributeErrorrInvalidMetaDataExceptionformat)rgmetadata_valueparsed_metadataexcs r1_raw_instance_data_to_dictrts.$'' .88 . vm>vJJ    . vm>vJJ    s2 A+*A&&A+ceZdZUdZejZeee fe d<ejZ eee fe d<dZ dZ deddffd Zdefd Zdefd Zde fd Zde fd ZedefdZxZS) DataSourceLXDLXD_network_config_crawled_metadata) merged_cfguser.meta-datarrTci_pkl_versionrNcXt|d|_dS)NT)rG _unpickleskip_hotplug_detect)rKr|rLs r1r~zDataSourceLXD._unpickles) .)))#'   rActS)z@Check platform environment to report if this datasource may run.)is_platform_viablerTs r1_is_platform_viablez!DataSourceLXD._is_platform_viables!###rAc|stddStjtjdt |_td|jd|_ |jdi}|di}|rtd|}t|j ts2tj tj |j |g|_ d|jvr|jd|_d |jvr td |jd |_d |jvr|jd |_d S) z=Crawl LXD socket API instance data and return True on successz+Not an LXD datasource: No LXD socket found.FzCrawl of metadata service)logfuncmsgfunc meta-datar=r{rrrT)rr(r>rlog_time read_metadataryrtgetmetadatarkrl mergemanydictrm userdata_rawrxvendordata_raw)rKr= user_metadatas r1 _get_datazDataSourceLXD._get_datasv''))  IIC D D D5!%I+" " "  3 /33K@@   '++Hb99 #3R88  6 -M$-..  . .. >DM $0 0 0 $ 6{ CD  t5 5 5#= $"89I"J$$D  D2 2 2"&"8"GD trAcDdttS)z.Return subplatform details for this datasourcez"LXD socket API v. {ver} ({socket}))verrO)rpLXD_SOCKET_API_VERSIONrbrTs r1_get_subplatformzDataSourceLXD._get_subplatforms$3::&;   rActtj}|di}t |t st j|}|d|jdkS)z%Return True if instance_id unchanged. metadata_keysrz instance-id) r MetaDataKeys META_DATArrkrlrrmr)rKsys_cfgresponsemds r1check_instance_idzDataSourceLXD.check_instance_idsp |/EFFF \\+r * *"d## $##Bvvm$$ (9(9-(H(HHHrAc|jtjkr|jtjkr|t |jt r|jdr-t d|jd|_nW|jdr=d|jd D}t||_|jtjkr-t dt|_tt |jS)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 configdevicesc0g|]\}}|ddk|S)r8nicrf).0kvs r1 z0DataSourceLXD.network_config..s5*** AqV9-----rAz8LXD datasource generating network config using fallback.) rxrUNSETryrrkrlrr(r>itemsr@r )rKrs r1network_configzDataSourceLXD.network_configs;  7= 0 0%66   $0$77 L)--.>?? LIILMMM+/+A(,D((+// ::L**$($:9$E$K$K$M$M***G ,C7+K+KD(  7= 0 0 IIJ   $;#<#??? 5rATsessionrcdo_raisect|||} |S#t$r4}tjd||j|d}~wwxYw)NzFUnable to process LXD config at {url}. Expected JSON but found: {resp})rcresp) _do_requestjsonrrrorptext)rrcr url_responserss r1_get_json_responserswX66L  """ . //5vl/0600    s' A%/A  A%c||}td|j||r;|js4t jd|j||j|S)Nz[GET] [HTTP:%d] %sz3Invalid HTTP response [{code}] from {route}: {resp})coderouter) rr(r> status_codeokrrorpr)rrcrrs r1rr#s{{3HII"H$8#>>>   . A H H)] I      OrAcneZdZeZeZeZeZeezezZdS)rN) rUrVrWrNONECONFIGDEVICESrALLrfrAr1rr3sI 466D TVVFdffGI 7 Y &CCCrArcHeZdZefdefdZdejdefdZ de defdZ dS) _MetaDataReader api_versionc\||_tjt|j|_dSrN)rr combine_urlLXD_URL _version_url)rKrs r1rHz_MetaDataReader.__init__<s(&&27Drr rpartitionCONFIG_KEY_ALIASESr)replace) rKrr= config_url config_routes config_routeconfig_route_urlconfig_route_responsecfg_keys r1_process_configz_MetaDataReader._process_config@sX!"~+D,=xHH +7J?? #=11! ! L)5g|LL $/)E%%% !)+  1$)5).  "--c2226G)>(BF8 W %,,,&g.f<<.2*73KKF a@@  rArc"tj5}||jt d|ji}t j|vr2tj |jd}t||j |d<t j |vr(| ||t j|vr-tj |jd}t!|||d<|cdddS#1swxYwYdS)N_metadata_api_versionrr)requestsSessionmountrr`rrrrrrrrupdaterrr)rKrrrmd_routercs r1__call__z_MetaDataReader.__call__wsD     7 MM$+-=-?-? @ @ @/1ABB%66%1%{#.gx"@"@"E;"m33 $..w77888#}44 ,T-> JJ 27C @ @9                   sC#DD DN) rUrVrWrrrHrrrlrrrrfrAr1rr;s*@NNCNNNN5x'75D5555n$rArrrc6t||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 r1rrs,F 4?{ 3 3 3#   rAc6tj|tSrN)rlist_from_depends datasources)dependss r1get_datasource_listrs  $Wk : ::rA__main__z*Query LXD metadata and emit a JSON object.) descriptionrrN)T)E__doc__rrOrenumrr json.decoderrtypingrrrr r r rrequests.adaptersr urllib3.connectionr urllib3.connectionpoolr cloudinitrloggingrrrr cloudinit.netr getLoggerrUr(rbrrrrr2r@rCr[r`rlrt DataSourcervrrrrResponserrrrrDEP_FILESYSTEMrrargparserArgumentParserparser parse_argsprint json_dumpsrfrAr1rsX ((((((9999999999999999)))))).-----555555$$$$$$555555555555++++++g!!! (!1+!+% c6!%## 49 # #s(^####L,,,,,>,,,66666-66655555{555 cd:g0g0g0g0g0G&g0g0g0TD;?     $' 37     ;?     $' 37       '''''4'''KKKKKKKK^."."2%%%% %%%%TW+-. ;;; zOOOBK $X $ = = =F  E/$/--l6FGGG H HIIIII rA