3 \meX:@sdZddlZddlZddlZddlmZddlmZmZddl m Z m Z m Z m Z mZddlmZddlmZmZmZmZddlmZmZejeZd d iZd Zd Zed ZdZ ddiZ!eddZ"Gdddej#Z$eddddZ%Gddde j&Z'ee(dddZ)e*dddZ+d-e,e(e,e-d d!d"Z.d d#e*e"d$d%d&Z/e'e j0ffgZ1d'd(Z2ed)krddl3Z3d*Z4e3j5e4d+Z6e6j7e8e j9e/e+d,dS).a3Datasource for Oracle (OCI/Oracle Cloud Infrastructure) Notes: * This datasource does not support OCI Classic. OCI Classic provides an EC2 lookalike metadata service. * The UUID provided in DMI data is not the same as the meta-data provided instance-id, but has an equivalent lifespan. * We do need to support upgrade from an instance that cloud-init identified as OpenStack. * Bare metal instances use iSCSI root, virtual machine instances do not. * Both bare metal and virtual machine instances provide a chassis-asset-tag of OracleCloud.com. N) namedtuple)OptionalTuple) atomic_helperdminetsourcesutil) NetworkConfig)cmdline ephemeralget_interfaces_by_macis_netfail_master)UrlErrorreadurlconfigure_secondary_nicsFzOracleCloud.comz&http://169.254.169.254/opc/v{version}/z{path}/i(#Z Authorizationz Bearer Oracle OpcMetadataz version instance_data vnics_datac@seZdZdZedddZdS)KlibcOracleNetworkConfigSourcezOverride super class to lower the applicability conditions. If any `/run/net-*.cfg` files exist, then it is applicable. Even if `/run/initramfs/open-iscsi.interface` does not exist. )returncCs t|jS)zOverride is_applicable)bool_files)selfr&/usr/lib/python3.6/DataSourceOracle.py is_applicable8sz,KlibcOracleNetworkConfigSource.is_applicableN)__name__ __module__ __qualname____doc__rrrrrrr1sr)network_configrcCsd|kr dS|ddkr,tjd|ddSt}|ddkrxdd|dDD]@}|d d krRd |krR|d }|j|}|sqRqRt|rR|d =qRWn|ddkrxp|jd ijD]\\}}d |kr|jd ijd}|r|j|}|sqqt|r|d d=|d=||d d<qWdS)aP Search network config physical interfaces to see if any of them are a netfailover master. If found, we prevent matching by MAC as the other failover devices have the same MAC but need to be ignored. Note: we rely on cloudinit.net changes which prevent netfailover devices from being present in the provided network config. For more details about netfailover devices, refer to cloudinit.net module. :param network_config A v1 or v2 network config dict with the primary NIC, and possibly secondary nic configured. This dict will be mutated. versionNz+Ignoring unknown network config version: %scSsg|]}d|kr|qS)typer).0crrr Ysz,_ensure_netfailover_safe..configr#physical mac_address ethernetsmatch macaddresszset-namename)r!r")LOGdebugr getritems)rZ mac_to_nameZcfgZmacZcur_name_Zmacaddrrrr_ensure_netfailover_safe=s<        r3cseZdZUdZdZdZejjejj ejj ejj fZ e ejdf gddZefddZedd d Zeedd d Zd dZedddZddZedddZedddZeddZdedddZZS)DataSourceOracleZOracleN.r!)r'r csJtt|j|f||d|_tjtj|d|jgitg|_ t |_ dS)NZ datasource) superr4__init__ _vnics_datar Z mergemanydictZget_cfg_by_pathdsnameBUILTIN_DS_CONFIGds_cfgr_network_config_source)rsys_cfgargskwargs) __class__rrr6s  zDataSourceOracle.__init__)rcCst|jjdgS)Nr')r_network_configr0)rrrr_has_network_configsz$DataSourceOracle._has_network_configcCstS)z@Check platform environment to report if this datasource may run.)_is_platform_viablerrrr ds_detectszDataSourceOracle.ds_detectc Cst|_tj|jtjtjdddt dd}|j }|j j dt d}|t|pX|d}WdQRX|j}|_tj|jd|_|j|_|d |d d |d |d d|_d|kr|dj d}|rtj||_|dj d|jd<dS)Nr"instance)r path)urlheaders)ZifaceZconnectivity_url_datar)fetch_vnics_data)r Z ociAdNameidrZhostnameZ displayName)zavailability-zonez instance-idz launch-indexzlocal-hostnamer-metadata user_dataZssh_authorized_keys public_keysT)_read_system_uuid system_uuidr ZEphemeralDHCPv4ZdistrorZfind_fallback_nicMETADATA_PATTERNformat V2_HEADERS_is_iscsi_rootr:r0r9read_opc_metadata instance_dataZ_crawled_metadata METADATA_ROOTr Zmetadata_address vnics_datar7rJbase64Z b64decodeZ userdata_raw)rZnetwork_contextZfetch_primary_nicZfetch_secondary_nicsZfetched_metadatadatarKrrr _get_datas:        zDataSourceOracle._get_datacCs tj|jS)zquickly check (local only) if self.instance_id is still valid On Oracle, the dmi-provided system uuid differs from the instance-id but has the same life-span.)rZinstance_id_matches_system_uuidrN)rr<rrrcheck_instance_idsz"DataSourceOracle.check_instance_idcCstj|jjdS)NrL)rZnormalize_pubkey_datarJr0)rrrrget_public_ssh_keyssz$DataSourceOracle.get_public_ssh_keyscCs |jjS)z)Return whether we are on a iscsi machine.)r;r)rrrrrRszDataSourceOracle._is_iscsi_rootcCs |jjS)N)r;Z render_config)rrrr_get_iscsi_configsz"DataSourceOracle._get_iscsi_configc Cs|jr|jSd}|jr$|j|_|js:tjdd}|jjdtd}|sT|ry|j |Wn t k rt j tdYnXt |j|jS)zNetwork config is read from initramfs provided files Priority for primary network_config selection: - iscsi - imds If none is present, then we fall back to fallback configuration. FzLCould not obtain network configuration from initramfs. Falling back to IMDS.Trz+Failed to parse IMDS network configuration!)rAr@rRr\r.warningr:r0r9!_add_network_config_from_opc_imds Exceptionr logexcr3)r set_primaryZ set_secondaryrrrrs*     zDataSourceOracle.network_configF)rac Csb|jdkrtjddS| r:d|jdkr:tjddSt}|rJ|jn |jdd}xt|D]\}}|ov|dk}|dj}||krtjd|qd||}tj|d } |jd dkr |rd d i} nd |dd| j d} |d|t | gd} |jdj | qd|jd dkrdt d|id|d} |sL|dd| j g| d<| |jd|<qdWdS)aGenerate primary and/or secondary NIC config from IMDS and merge it. It will mutate the network config to include the secondary VNICs. :param set_primary: If True set primary interface. :raises: Exceptions are not handled within this function. Likely exceptions are KeyError/IndexError (if the IMDS returns valid JSON with unexpected contents). Nz#NIC data is UNSET but should not beZnicIndexrz\VNIC metadata indicates this is a bare metal machine; skipping secondary VNIC configuration.r!ZmacAddrz)Interface with MAC %s not found; skippingZsubnetCidrBlockr r#ZdhcpZstaticZ privateIp/)r#Zaddressr()r-r#r)mtuZsubnetsr'r"r,F)rcr+Zdhcp6Zdhcp4Z addressesr*) r7r.r]r enumeratelower ipaddressZ ip_networkr@Z prefixlenMTUappend) rraZinterfaces_by_macrVindexZ vnic_dictZ is_primaryr)r-ZnetworkZsubnetZinterface_configrrrr^sL      z2DataSourceOracle._add_network_config_from_opc_imds)F)rrrr8rNZvendordata_purerZNetworkConfigSourceZCMD_LINEZ SYSTEM_CFGZDSZ INITRAMFSZnetwork_config_sourcesrr@dictr6rrA staticmethodrCrYrZr[rRr\propertyrr^ __classcell__rr)r?rr4qs&  . .r4)rcCstjd}|dkrdS|jS)Nz system-uuid)r read_dmi_datare)Zsys_uuidrrrrMOs rMcCstjd}|tkS)Nzchassis-asset-tag)rrnCHASSIS_ASSET_TAG)Z asset_tagrrrrBTs rBr")metadata_versionrEretriesrcCs*ttj||d|dkrtnd|djjS)N)r rEr!)rFrGrq)rrOrPrQZ _responseZjson)rprErqrrr_fetchYs rr)rH)rHrcCsd}yt|dd}Wn$tk r8d}t|dd}YnXd}|rtyt|dd}Wn tk rrtjtdYnXt|||S)aCFetch metadata from the /opc/ routes. :return: A namedtuple containing: The metadata version as an integer The JSON-decoded value of the instance data endpoint on the IMDS The JSON-decoded value of the vnics data endpoint if `fetch_vnics_data` is True, else None r"rD)rEr!NZvnicsz+Failed to fetch IMDS network configuration!)rrrr r`r.r)rHrprTrVrrrrSasrScCs tj|tS)N)rZlist_from_depends datasources)Zdependsrrrget_datasource_listsrt__main__z Query Oracle Cloud metadata and emit a JSON object with two keys: `read_opc_metadata` and `_is_platform_viable`. The values of each are the return values of the corresponding functions defined in DataSourceOracle.py.) description)rSrB)r"):rrWrfZlogging collectionsrZtypingrrZ cloudinitrrrrr Zcloudinit.distros.networkingr Z cloudinit.netr r r rZcloudinit.url_helperrrZ getLoggerrr.r9rorUrOrgrQrZKlibcNetworkConfigSourcerr3Z DataSourcer4strrMrrBintrjrrrSZDEP_FILESYSTEMrsrtargparservArgumentParserparser parse_argsprintZ json_dumpsrrrrsH     4_