o x[hLT@s"dZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z ddl mZmZmZmZmZddlmZddlmZmZmZmZddlmZeeZdd iZd Z d Z!d Z"e!d Z#e"d Z$ddiZ%dZ&Gddde Z'Gdddej(Z)deddfddZ*Gdddej+Z,Gddde,Z-de.fddZ/de e.fd d!Z0de1fd"d#Z2d$e.de3fd%d&Z4d$e.de ee.e.ffd'd(Z5d$e.de.fd)d*Z6d e,j7e,j8e#gd+d,e1d-e e.de e'fd.d/Z9e,ej:ffe-ej:ej;ffgZe?e@e9e$e#gd4e2d5dSdS)6a3Datasource 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)AnyDictList NamedTupleOptionalTuple) atomic_helperdminetsourcesutil) NetworkConfig)cmdline ephemeralget_interfaces_by_macis_netfail_master) wait_for_urlconfigure_secondary_nicsFzOracleCloud.comz&http://169.254.169.254/opc/v{version}/z+http://[fd00:c1::a9fe:a9fe]/opc/v{version}/z{path}/ Authorizationz Bearer Oraclei(#c@sBeZdZUeed<eeefed<eeeefed<eed<dS)ReadOpcMetadataResponseversion instance_data vnics_data imds_url_usedN) __name__ __module__ __qualname__int__annotations__rstrrrr r D/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOracle.pyr4s  rc@seZdZdZdefddZdS)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_filesselfr r r! is_applicableB z,KlibcOracleNetworkConfigSource.is_applicableN)rrr__doc__r$r(r r r r!r";sr"network_configr#cCsd|vrdS|ddvrtd|ddSt}|ddkrJdd|dDD]}|d d krGd |vrG|d }||}|s@q(t|rG|d =q(dS|dd kr|d iD]/\}}d|vr|did}|r||}|ssqXt|r|dd=|d=||dd<qXdSdS)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. rN)z+Ignoring unknown network config version: %sr,cSsg|]}d|vr|qS)typer ).0cr r r! csz,_ensure_netfailover_safe..configr.physical mac_addressr- ethernetsmatch macaddresszset-namename)LOGdebugrgetritems)r+ mac_to_namecfgmaccur_name_macaddrr r r!_ensure_netfailover_safeGsH        rCcseZdZUdZdZejjejjejj ejj fZ e ejdfe d<dZdZdZfdd Zd ed dffd d Zd efddZed efddZddZd efddZddZd efddZd efddZeddZd"defd d!Z Z!S)#DataSourceOracleOracleN.network_config_sourcesTcsttt|j|g|Ri|d|_tt|d|jgitg|_ t |_ gdd|_ | }|j|_|j|_dS)N datasourcer,r2r)superrD__init__ _vnics_datar mergemanydictget_cfg_by_pathdsnameBUILTIN_DS_CONFIGds_cfgr"_network_config_source_network_configget_url_paramsmax_wait_seconds url_max_waittimeout_seconds url_timeout)r'sys_cfgargskwargs url_params __class__r r!rLs  zDataSourceOracle.__init__ci_pkl_versionr#csXt|t|dst|ddt|dst|dtt|ds*gdd|_dSdS)NrMrSrTr,rJ)rK _unpicklehasattrsetattrr"rT)r'r`r^r r!ras     zDataSourceOracle._unpicklecCst|jdgS)Nr2)r$rTr;r&r r r!_has_network_configz$DataSourceOracle._has_network_configcCstS)z@Check platform environment to report if this datasource may run.)_is_platform_viabler r r r! ds_detectszDataSourceOracle.ds_detectc Csdt|_tjdddtddtjddditjdddtddtjdddif}|jr;t}t j |j |dd|d}nt }| }|jd td }|t|pT||j|jttgd }Wdn1shwY|sqd St|jd |_|j}|_|j|_|d |dd|d|dd|_d|vr|dd}|rt||_|dd|jd<dS)Nr-instancerpath)urlheadersrkr,T)distro interfaceipv6ipv4connectivity_urls_datarfetch_vnics_datamax_waittimeoutmetadata_patternsFrk ociAdNameidrhostname displayName)zavailability-zonez instance-idz launch-indexzlocal-hostnamer8metadata user_datassh_authorized_keys public_keys) _read_system_uuid system_uuidIPV4_METADATA_PATTERNformat V2_HEADERSIPV6_METADATA_PATTERNperform_dhcp_setupr find_fallback_nicrEphemeralIPNetworkrmr nullcontext_is_iscsi_rootrRr;rQread_opc_metadatarWrY _get_versioned_metadata_base_urlrmetadata_addressr_crawled_metadatarrMr|base64 b64decode userdata_raw) r'rqnic_namenetwork_contextfetch_primary_nicfetch_secondary_nicsfetched_metadatadatar}r r r! _get_datas     zDataSourceOracle._get_datacCs t|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.)r instance_id_matches_system_uuidr)r'rZr r r!check_instance_id s z"DataSourceOracle.check_instance_idcCst|jdS)Nr)r normalize_pubkey_datar|r;r&r r r!get_public_ssh_keysrez$DataSourceOracle.get_public_ssh_keyscC |jS)z)Return whether we are on a iscsi machine.)rSr(r&r r r!rr)zDataSourceOracle._is_iscsi_rootcCrN)rS render_configr&r r r!_get_iscsi_configs z"DataSourceOracle._get_iscsi_configcCs|r|jSd}|r||_|stdd}|jdtd}|s*|rAz| |Wnt y@t tdYnwt |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!)rdrTrrr9warningrRr;rQ!_add_network_config_from_opc_imds Exceptionr logexcrC)r' set_primary set_secondaryr r r!r+s2    zDataSourceOracle.network_configFrc CsH|jdur tddS|sd|jdvrtddSt}|r$|jn|jdd}t|D]\}}|o8|dk}|d}|dd oK|d d  }||vrWtd |q/||} |rgt|d d} nt|d } |j ddkr|r|rddig} n4ddig} n.g} |d r| d|d d| j d|d r| d|d dd| j d| d|t | d} |j d | q/|j ddkr!t d|id} | |j d| <|o|| d<|o| | d<|sg| d<|d r| d |d d| j |d r| d |d dd| j | |j d| <q/dS)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 benicIndexrz\VNIC metadata indicates this is a bare metal machine; skipping secondary VNIC configuration.r,macAddripv6SubnetCidrBlockF privateIpz)Interface with MAC %s not found; skipping ipv6AddressessubnetCidrBlockrr.dhcp6dhcpstatic/)r.addressr3)r8r.r4mtusubnetsr2r-r7)rr6r5dhcp4 addresses) rMr9rr enumeratelowerr; ipaddress ip_networkrTappend prefixlenMTU) r'rinterfaces_by_macrindex vnic_dict is_primaryr4 is_ipv6_onlyr8networkrinterface_configr r r!rHs              z2DataSourceOracle._add_network_config_from_opc_imds)F)"rrrrPrr NetworkConfigSourceCMD_LINE SYSTEM_CFGDS INITRAMFSrFrrrrWrYrLrrar$rd staticmethodrgrrrrdictrpropertyr+r __classcell__r r r^r!rD{s0   V -rDc@seZdZdZdS)DataSourceOracleNetFN)rrrrr r r r!rsrrcCs|sdS|tddS)NFopcr) startswithIPV4_METADATA_ROOTsplit)rr r r!_is_ipv4_metadata_urlsrcCstd}|dur dS|S)Nz system-uuid)r read_dmi_datar)sys_uuidr r r!rs rcCstd}|tkS)Nzchassis-asset-tag)r rCHASSIS_ASSET_TAG) asset_tagr r r!rfs rfrkcCsd|vrdSdS)Nz/opc/v2/r-r,r rwr r r! _url_versionsrcCst|dkrtSdS)Nr-)rrrwr r r! _headers_cbsrcCsH|s|Sd|vr|dddSd|vr|dddStd|)zQ Remove everything following the version number in the metadata address. v2rzv2/v1zv1/zInvalid metadata address: )r ValueErrorrwr r r!rs rrrrsrvc sfdddD}td|t}t|||tddd\}}|s,tdd |d Std |t | d }t |} d } |rot| d dg|t||tddd\} } | rjt | d } td| ntdt | || |S)a Fetch metadata from the /opc/ routes from the IMDS. Returns: Optional[ReadOpcMetadataResponse]: If fetching metadata fails, None. If fetching metadata succeeds, a namedtuple containing: - The metadata version as an integer - The JSON-decoded value of the instance data from the IMDS - The JSON-decoded value of the vnics data from the IMDS if `fetch_vnics_data` is True, else None. Alternatively, None if fetching metadata failed - The url that was used to fetch the metadata. This allows for later determining if v1 or v2 endppoint was used and whether the IMDS was reached via IPv4 or IPv6. cs$g|]}D] }|j|ddqqS)rhri)r)r/rmetadata_patternrvr r!r1s z%read_opc_metadata..)r-r,z*Attempting to fetch IMDS metadata from: %sg?T)urlsrtru headers_cb sleep_timeconnect_synchronouslyz-Failed to fetch IMDS metadata from any of: %sz, Nz7Successfully fetched instance metadata from IMDS at: %szutf-8rhvnicsz4Successfully fetched vnics metadata from IMDS at: %sz+Failed to fetch IMDS network configuration!)r9r:time monotonicrrrjoinjsonloadsdecoderreplacer) rsrtrurvr start_timeurl_that_workedinstance_responsermetadata_versionr vnics_urlvnics_responser rr!rs`      rcCs t|tSr)r list_from_depends datasources)dependsr r r!get_datasource_listGs r__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.r)rrf)Ar*rrrloggingrtypingrrrrrr cloudinitrr r r r cloudinit.distros.networkingr cloudinit.netrrrrcloudinit.url_helperr getLoggerrr9rQrrIPV6_METADATA_ROOTrrrrrKlibcNetworkConfigSourcer"rC DataSourcerDrrrrr$rfrrrrrWrYrDEP_FILESYSTEM DEP_NETWORKrr descriptionprint json_dumpsr r r r!s     4C U