GCP Compute Engine provider plugin for cloudfit-core
Project description
cloudfit-provider-gcp
GCP Compute Engine provider plugin for cloudfit-core.
Fetches machine types, pricing, and availability from the GCP Compute Engine API and normalizes them into MachineType objects that cloudfit-core understands.
Installation
pip install cloudfit-provider-gcp
Requires Python 3.9+ and cloudfit-core>=0.1.0.
Authentication
Uses Application Default Credentials. Set up once with:
gcloud auth application-default login
Or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to a service account key path. In production (Cloud Run, GKE), credentials are picked up automatically from the instance metadata server: no configuration needed.
Quick start
from cloudfit_provider_gcp import GCPProvider
from cloudfit import rank, WorkloadProfile
# initialize: no credentials needed if ADC is configured
provider = GCPProvider(project_id="your-gcp-project")
# fetch all machine types for a region
instances = provider.fetch_instances(region="us-central1")
print(f"fetched {len(instances)} machine types")
# plug directly into cloudfit-core
profile = WorkloadProfile(
vcpu=60,
ram_gb=224,
workload="io-intensive",
archetype="io",
optimize_for="balanced",
)
results = rank(profile, instances)
for r in results[:3]:
print(f"{r.instance.id:35s} score={r.score:.2f} ${r.instance.price_hr:.2f}/hr")
Fetching multiple regions
from cloudfit_provider_gcp import GCPProvider
provider = GCPProvider(project_id="your-gcp-project")
regions = ["us-central1", "us-east1", "europe-west1", "asia-east1"]
all_instances = []
for region in regions:
all_instances.extend(provider.fetch_instances(region=region))
print(f"total: {len(all_instances)} machine types across {len(regions)} regions")
Examples
Runnable scripts are in examples/:
| Script | Needs GCP credentials? | What it shows |
|---|---|---|
recommend.py |
yes (ADC) | live GCPProvider.fetch_instances() → cloudfit.rank() |
recommend_offline.py |
no | recorded fixture → normalize_machine_type() → cloudfit.rank() |
Try the offline one first: it runs anywhere, no GCP account required:
python examples/recommend_offline.py
Ranking for 32 vCPU / 120 GB (optimize_for=balanced):
ok n2-standard-32 score=1.00 $ 1.53/hr [active]
ok c2-standard-60 score=0.61 $ 2.82/hr [active]
ok c3d-standard-60-lssd score=0.60 $ 2.87/hr [active]
-- a2-highgpu-1g $ 0.73/hr [active] ✗ RAM 85 GB < required 120 GB
-- n1-standard-8 $ 0.37/hr [deprecated] ✗ RAM 30 GB < required 120 GB
-- f1-micro $ 0.03/hr [tombstoned] ✗ RAM 1 GB < required 120 GB
Pricing
Pricing is fetched from the GCP Cloud Billing Catalog API. Prices are on-demand (no committed-use or spot discount), reconstructed per instance from each family's vCPU and RAM SKU rates. If a family's SKUs can't be matched, price_hr falls back to 0.0 and the instance is still scored (its cost_score is just 0).
price_hr = provider.get_pricing("n2-standard-32", region="us-central1")
# → 1.5468
Cron / scheduled refresh
For production use, run the fetcher on a daily schedule and write results to the cloudfit registry store (PostgreSQL). The recommended pattern is a Cloud Scheduler trigger invoking a Cloud Run Job.
from cloudfit_provider_gcp import GCPProvider
from cloudfit_provider_gcp.registry import write_to_registry
provider = GCPProvider(project_id="your-gcp-project")
instances = provider.fetch_instances_all_regions()
write_to_registry(instances, database_url=os.environ["DATABASE_URL"])
Deprecation handling
When GCP marks a machine type as deprecated, the provider sets status="deprecated" on the MachineType. When a type is fully removed, it becomes status="tombstoned": it is never deleted from the registry, so existing configs can warn instead of silently breaking.
Repository structure
cloudfit-provider-gcp/
├── README.md
├── CONTRIBUTING.md
├── CITATION.cff
├── pyproject.toml
├── LICENSE
├── .gitignore
│
├── cloudfit_provider_gcp/
│ ├── __init__.py # exports GCPProvider
│ ├── provider.py # GCPProvider: implements Provider base class
│ ├── normalizer.py # raw GCP API response → MachineType
│ ├── pricing.py # Cloud Billing Catalog API → price_hr
│ ├── regions.py # GCP region list + helpers
│ └── registry.py # write normalized instances to PostgreSQL
│
├── examples/
│ ├── recommend.py # live fetch → rank (needs GCP credentials)
│ └── recommend_offline.py # fixture → rank (no credentials needed)
│
└── tests/
├── test_normalizer.py # unit tests: no API calls needed
├── test_regions.py
└── fixtures/
└── machine_type_response.json # recorded GCP API response
Related projects
cloudfit-core: scoring enginecloudfit-provider-aws: AWS provider (planning phase)cloudfit-api: REST API over the scoring engine (live demo)cloudfit-ui: Gradio UI over the scoring engine (live demo)samplesheet-parser: Illumina SampleSheet parser
License
Apache 2.0: see LICENSE.
Author: Chaitanya Krishna Kasaraneni · Google Scholar · ORCID 0000-0001-5792-1095
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cloudfit_provider_gcp-0.1.1.tar.gz.
File metadata
- Download URL: cloudfit_provider_gcp-0.1.1.tar.gz
- Upload date:
- Size: 23.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20163d25927f2a0412e8ce5f664c252ae25325ca25fadf4dc09fcd74cf99eca4
|
|
| MD5 |
b26b9477c8c4f9277d56dfeb1ea73cb7
|
|
| BLAKE2b-256 |
118593b9ac384fffe34b8f100294ac86b7cc13c2fa623c9868956c71232a89ea
|
Provenance
The following attestation bundles were made for cloudfit_provider_gcp-0.1.1.tar.gz:
Publisher:
ci.yml on cloudfit-io/cloudfit-provider-gcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cloudfit_provider_gcp-0.1.1.tar.gz -
Subject digest:
20163d25927f2a0412e8ce5f664c252ae25325ca25fadf4dc09fcd74cf99eca4 - Sigstore transparency entry: 1704694782
- Sigstore integration time:
-
Permalink:
cloudfit-io/cloudfit-provider-gcp@2e436e86d7970fb42fbd81ac0e02d7ca3651097f -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/cloudfit-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@2e436e86d7970fb42fbd81ac0e02d7ca3651097f -
Trigger Event:
push
-
Statement type:
File details
Details for the file cloudfit_provider_gcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: cloudfit_provider_gcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 17.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79cc5b81fe15994938b49a8a5836460c6e0cdc04fee81813ec9860939990eaa2
|
|
| MD5 |
0e6c69f9af3aed274daea2c6d1fff95f
|
|
| BLAKE2b-256 |
92b055f7a0e24f5a9f90de4a07f2514ea555524c9368910fdf93980f2368a85e
|
Provenance
The following attestation bundles were made for cloudfit_provider_gcp-0.1.1-py3-none-any.whl:
Publisher:
ci.yml on cloudfit-io/cloudfit-provider-gcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cloudfit_provider_gcp-0.1.1-py3-none-any.whl -
Subject digest:
79cc5b81fe15994938b49a8a5836460c6e0cdc04fee81813ec9860939990eaa2 - Sigstore transparency entry: 1704694789
- Sigstore integration time:
-
Permalink:
cloudfit-io/cloudfit-provider-gcp@2e436e86d7970fb42fbd81ac0e02d7ca3651097f -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/cloudfit-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@2e436e86d7970fb42fbd81ac0e02d7ca3651097f -
Trigger Event:
push
-
Statement type: