8.2.34 | Linux | www-data (uid:33)
👁 View: DataSourceCloudCIX.py
📁 /snap/core24/2124/lib/python3/dist-packages/cloudinit/sources/DataSourceCloudCIX.py
# This file is part of cloud-init. See LICENSE file for license information. import json import logging from typing import Optional from cloudinit import dmi, sources, url_helper, util LOG = logging.getLogger(__name__) METADATA_URLS = ["http://169.254.169.254"] METADATA_VERSION = 1 CLOUDCIX_DMI_NAME = "CloudCIX" class DataSourceCloudCIX(sources.DataSource): dsname = "CloudCIX" # Setup read_url parameters through get_url_params() url_retries = 3 url_timeout_seconds = 5 url_sec_between_retries = 5 def __init__(self, sys_cfg, distro, paths): super(DataSourceCloudCIX, self).__init__(sys_cfg, distro, paths) self._metadata_url = None self._net_cfg = None def _get_data(self): """ Fetch the user data and the metadata """ try: crawled_data = self.crawl_metadata_service() except sources.InvalidMetaDataException as error: LOG.error( "Failed to read data from CloudCIX datasource: %s", error ) return False self.metadata = crawled_data["meta-data"] self.userdata_raw = util.decode_binary(crawled_data["user-data"]) return True def crawl_metadata_service(self) -> dict: md_url = self.determine_md_url() if md_url is None: raise sources.InvalidMetaDataException( "Could not determine metadata URL" ) data = read_metadata(md_url, self.get_url_params()) return data def determine_md_url(self) -> Optional[str]: if self._metadata_url: return self._metadata_url # Try to reach the metadata server url_params = self.get_url_params() base_url, _ = url_helper.wait_for_url( METADATA_URLS, max_wait=url_params.max_wait_seconds, timeout=url_params.timeout_seconds, ) if not base_url: return None # Find the highest supported metadata version for version in range(METADATA_VERSION, 0, -1): url = url_helper.combine_url( base_url, "v{0}".format(version), "metadata" ) try: response = url_helper.readurl(url, timeout=self.url_timeout) except url_helper.UrlError as e: LOG.debug("URL %s raised exception %s", url, e) continue if response.ok(): self._metadata_url = url_helper.combine_url( base_url, "v{0}".format(version) ) break else: LOG.debug("No metadata found at URL %s", url) return self._metadata_url @staticmethod def ds_detect(): return is_platform_viable() @property def network_config(self): if self._net_cfg: return self._net_cfg if not self.metadata: return None self._net_cfg = self.metadata["network"] return self._net_cfg def is_platform_viable() -> bool: return dmi.read_dmi_data("system-product-name") == CLOUDCIX_DMI_NAME def read_metadata(base_url: str, url_params): """ Read metadata from metadata server at base_url :returns: dictionary of retrieved metadata and user data containing the following keys: meta-data, user-data :param: base_url: meta data server's base URL :param: url_params: dictionary of URL retrieval parameters. Valid keys are `retries`, `sec_between` and `timeout`. :raises: InvalidMetadataException upon network error connecting to metadata URL, error response from meta data server or failure to decode/parse metadata and userdata payload. """ md = {} leaf_key_format_callback = ( ("metadata", "meta-data", util.load_json), ("userdata", "user-data", util.maybe_b64decode), ) for url_leaf, new_key, format_callback in leaf_key_format_callback: try: response = url_helper.readurl( url=url_helper.combine_url(base_url, url_leaf), retries=url_params.num_retries, sec_between=url_params.sec_between_retries, timeout=url_params.timeout_seconds, ) except url_helper.UrlError as error: raise sources.InvalidMetaDataException( f"Failed to fetch IMDS {url_leaf}: " f"{base_url}/{url_leaf}: {error}" ) if not response.ok(): raise sources.InvalidMetaDataException( f"No valid {url_leaf} found. " f"URL {base_url}/{url_leaf} returned code {response.code}" ) try: md[new_key] = format_callback(response.contents) except json.decoder.JSONDecodeError as exc: raise sources.InvalidMetaDataException( f"Invalid JSON at {base_url}/{url_leaf}: {exc}" ) from exc return md # Used to match classes to dependencies datasources = [ (DataSourceCloudCIX, (sources.DEP_FILESYSTEM, sources.DEP_NETWORK)), ] # Return a list of data sources that match this set of dependencies def get_datasource_list(depends): return sources.list_from_depends(depends, datasources)
← Back
💻 Terminal
📤 Upload
📂
Click or Drag & Drop
📁 /snap/core24/2124/lib/python3/dist-packages/cloudinit/sources
NameSizePermModifiedActions
📁 __pycache__/-07552026-08-24 03:28🗑 Delete
📁 azure/-07552026-08-24 03:28🗑 Delete
📁 helpers/-07552026-08-24 03:28🗑 Delete
DataSourceAkamai.py12.7K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceAliYun.py15.1K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceAltCloud.py8.4K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceAzure.py78.6K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceBigstep.py1.9K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceCloudCIX.py5.2K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceCloudSigma.py3.9K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceCloudStack.py12.6K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceConfigDrive.py11.2K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceDigitalOcean.py4.2K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceEc2.py43.8K06442026-03-30 18:55👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceExoscale.py8.6K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceGCE.py13.7K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceHetzner.py9.1K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceIBMCloud.py14.6K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceLXD.py17.2K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceMAAS.py14.8K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceNWCS.py4.4K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceNoCloud.py15.7K06442026-03-30 18:55👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceNone.py1.3K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceOVF.py12.8K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceOpenNebula.py15.7K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceOpenStack.py10.2K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceOracle.py20.2K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceRbxCloud.py7.9K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceScaleway.py13.5K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceSmartOS.py34.3K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceUpCloud.py5.2K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceVMware.py41.8K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceVultr.py4.5K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
DataSourceWSL.py16.9K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
__init__.py45K06442026-02-27 22:51👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del