Spaces:
Sleeping
Sleeping
| from typing import Any, Dict, Optional | |
| import requests | |
| from codecarbon.external.logger import logger | |
| def postprocess_gcp_cloud_metadata(cloud_metadata: Dict[str, Any]) -> Dict[str, Any]: | |
| # Attributes contains custom metadata and also contains Kubernetes config, | |
| # startup script and secrets, filter it out | |
| if "attributes" in cloud_metadata: | |
| del cloud_metadata["attributes"] | |
| return cloud_metadata | |
| CLOUD_METADATA_MAPPING: Dict[str, Dict[str, Any]] = { | |
| "AWS": { | |
| "url": "http://169.254.169.254/latest/dynamic/instance-identity/document", | |
| "headers": {}, | |
| }, | |
| "Azure": { | |
| "url": "http://169.254.169.254/metadata/instance?api-version=2019-08-15", | |
| "headers": {"Metadata": "true"}, | |
| }, | |
| "GCP": { | |
| "url": "http://169.254.169.254/computeMetadata/v1/instance/?recursive=true&alt=json", # noqa: E501 | |
| "headers": {"Metadata-Flavor": "Google"}, | |
| "postprocess_function": postprocess_gcp_cloud_metadata, | |
| }, | |
| } | |
| def get_env_cloud_details(timeout: int = 1) -> Optional[Any]: | |
| """ | |
| >>> get_env_cloud_details() | |
| {'provider': 'AWS', | |
| 'metadata': {'accountId': '26550917306', | |
| 'architecture': 'x86_64', | |
| 'availabilityZone': 'us-east-1b', | |
| 'billingProducts': None, | |
| 'devpayProductCodes': None, | |
| 'marketplaceProductCodes': None, | |
| 'imageId': 'ami-025ed45832b817a35', | |
| 'instanceId': 'i-7c3e81fed58d8f7f7', | |
| 'instanceType': 'g4dn.2xlarge', | |
| 'kernelId': None, | |
| 'pendingTime': '2020-01-23T20:44:53Z', | |
| 'privateIp': '172.156.72.143', | |
| 'ramdiskId': None, | |
| 'region': 'us-east-1', | |
| 'version': '2017-09-30'}} | |
| """ | |
| for provider in CLOUD_METADATA_MAPPING.keys(): | |
| try: | |
| params = CLOUD_METADATA_MAPPING[provider] | |
| response = requests.get( | |
| params["url"], headers=params["headers"], timeout=timeout | |
| ) | |
| response.raise_for_status() | |
| response_data = response.json() | |
| postprocess_function = params.get("postprocess_function") | |
| if postprocess_function is not None: | |
| response_data = postprocess_function(response_data) | |
| return {"provider": provider, "metadata": response_data} | |
| except requests.exceptions.RequestException: | |
| logger.debug("Not running on %s", provider) | |
| return None | |