3 \me7D@s:dZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z m Z mZmZmZmZmZddlZddlmZddlmZddlmZdd lmZmZmZmZmZdd l m!Z!ej"e#Z$d Z%d Z&d Z'dddddddZ(e)dddZ*d9eee)e e)e fdddZ+GdddeZ,GdddeZ-GdddeZ.e)e/ddd Z0Gd!d"d"ej1Z2e3dd#d$Z4d:ej5e)e3d&d'd(Z6d;ej5e)e3ej7d)d*d+Z8Gd,d-d-eZ9Gd.d/d/Z:e&e9j;fe)e9e/d0d1d2Zd3d4Z?e#d5kr6ddl@Z@d6ZAe@jBeAd7ZCeCjDeEejFesz0DataSourceLXD.network_config..z8LXD datasource generating network config using fallback.) rXrUNSETrUrYr?r@rVrr(itemsr)r )r/rbrrr network_configs"         zDataSourceLXD.network_config)rHrIrJrKrL)r3r4r5ZdsnamerrgrXr rstrrU DataSourceZsensitive_metadata_keysr rOintrN staticmethodboolrQrYr[rapropertyr@rir6rr)r0r rGs$ rGcCs"tjjtrtjtjtjSdS)z=Return True when this platform appears to have an LXD socket.F)ospathexistsr:statS_ISSOCKlstatst_moderrrr rPs rPT)sessionr;do_raisecCsrt|||}|js*tjd||j|jiSy|jStk rl}ztj dj ||jd|WYdd}~XnXdS)NzSkipping %s on [HTTP:%d]:%szFUnable to process LXD config at {url}. Expected JSON but found: {resp})r;resp) _do_requestokrr( status_codetextZjsonrrrCrD)rwr;rxZ url_responserErrr _get_json_responses  r~)rwr;rxrcCsxHtddd D]8}|j|}d|jkrDtjdtjd|j||qPqWtjd|j||r|j rt j dj |j||j d |S) Nrr#ig?z,[GET] [HTTP:%d] %s, retrying %d more time(s)z[GET] [HTTP:%d] %sz3Invalid HTTP response [{code}] from {route}: {resp})codeZroutery) rangerVr|timeZsleeprrr(r{rrCrDr})rwr;rxZretriesr_rrr rz,s$     rzc@s0eZdZeZeZeZeZeeBeBZdS)r]N) r3r4r5rZNONECONFIGDEVICESr^ALLrrrr r]Is r]c@s@eZdZefedddZejedddZ e eddd Z d S) _MetaDataReader) api_versioncCs||_tjt|j|_dS)N)rr combine_urlLXD_URL _version_url)r/rrrr r-Rsz_MetaDataReader.__init__)rwrc Csdii}tj|jd}t||}xt|D]}tjt|}t||dd}|jsdtj d||j |j q*|j dd }|j |d|<|t kr*t ||kr|j |t |<q*tjd||jdd dq*W|S) aIterate on LXD API config items. Promoting CONFIG_KEY_ALIASES Any CONFIG_KEY_ALIASES which affect cloud-init behavior are promoted as top-level configuration keys: user-data, network-data, vendor-data. LXD's cloud-init.* config keys override any user.* config keys. Log debug messages if any user.* keys are overridden by the related cloud-init.* key. r'F)rxzSkipping %s on [HTTP:%d]:%s/r#z,Ignoring LXD config %s in favor of %s value.userz cloud-initr)rrrr~sortedrrzr{rr(r|r} rpartitionCONFIG_KEY_ALIASESrreplace) r/rwr'Z config_urlZ config_routesZ config_routeZconfig_route_urlZconfig_route_responseZcfg_keyrrr _process_configVs0     z_MetaDataReader._process_config)r\rc Cstj}|j|jtd|ji}tj|krLtj |jd}t ||j |d<tj |krf|j |j|tj|krtj |jd}t||dd}|r||d<|SQRXdS)NZ_metadata_api_versionz meta-datarbF)rx)requestsSessionZmountrr9rr]r^rrrzr}rupdaterrr~)r/r\rwr`Zmd_router;rbrrr __call__s      z_MetaDataReader.__call__N) r3r4r5rZrjr-rrr@rr]rrrrr rQs7r)rr\rcCst|d|dS)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. )r)r\)r)rr\rrr rTs#rTcCs tj|tS)N)rZlist_from_depends datasources)Zdependsrrr get_datasource_listsr__main__z*Query LXD metadata and emit a JSON object.) description)r\)N)T)T)G__doc__Zloggingrpr1rsrenumrrZ json.decoderrZtypingrrrrr r r rZrequests.adaptersr Zurllib3.connectionr Zurllib3.connectionpoolrZ cloudinitrrrrrZ cloudinit.netrZ getLoggerr3rr:rZrrrjr!r)r*r7r9r@rFrkrGrnrPrr~ZResponserzr]rrrTZDEP_FILESYSTEMrrargparserArgumentParserparser parse_argsprintZ json_dumpsrrrr  sd $      $  j Q '