Arahman-ai
feat: initial deployment - Warehouse Visual Intelligence
8387086
Raw
History Blame Contribute Delete
3.13 kB
"""
Cloud Infrastructure - Google Cloud Storage
Sets up GCS bucket, enables required APIs, and handles upload/download.
Run this once before starting the pipeline: python -m cloud_infra.setup_gcs
"""
import os
import json
from pathlib import Path
from loguru import logger
PROJECT_ID = os.getenv("GCP_PROJECT_ID", "your-project-id")
BUCKET_NAME = os.getenv("GCS_BUCKET_NAME", "warehouse-visual-intelligence")
REGION = os.getenv("GCP_REGION", "us-central1")
def create_bucket(bucket_name: str = BUCKET_NAME, region: str = REGION) -> bool:
"""Create a GCS bucket if it doesn't exist."""
try:
from google.cloud import storage
client = storage.Client(project=PROJECT_ID)
if client.bucket(bucket_name).exists():
logger.info(f"Bucket already exists: gs://{bucket_name}")
return True
bucket = client.create_bucket(bucket_name, location=region)
logger.success(f"Bucket created: gs://{bucket.name} in {region}")
return True
except Exception as e:
logger.error(f"Failed to create bucket: {e}")
return False
def upload_image(local_path: Path, gcs_folder: str = "input/") -> str | None:
"""
Upload a local image to GCS.
Returns:
GCS URI (gs://bucket/path) or None on failure
"""
try:
from google.cloud import storage
client = storage.Client(project=PROJECT_ID)
bucket = client.bucket(BUCKET_NAME)
blob_name = gcs_folder + local_path.name
blob = bucket.blob(blob_name)
blob.upload_from_filename(str(local_path))
uri = f"gs://{BUCKET_NAME}/{blob_name}"
logger.success(f"Uploaded: {local_path.name}{uri}")
return uri
except Exception as e:
logger.error(f"Upload failed: {e}")
return None
def upload_report(report_path: Path, gcs_folder: str = "reports/") -> str | None:
"""Upload a JSON report to GCS."""
return upload_image(report_path, gcs_folder=gcs_folder)
def download_images(gcs_folder: str = "input/", local_dir: Path = Path("data/downloaded/")) -> list[Path]:
"""Download all images from a GCS folder to a local directory."""
local_dir.mkdir(parents=True, exist_ok=True)
downloaded = []
try:
from google.cloud import storage
client = storage.Client(project=PROJECT_ID)
bucket = client.bucket(BUCKET_NAME)
blobs = list(bucket.list_blobs(prefix=gcs_folder))
for blob in blobs:
local_path = local_dir / Path(blob.name).name
blob.download_to_filename(str(local_path))
downloaded.append(local_path)
logger.debug(f"Downloaded: {blob.name}")
logger.info(f"Downloaded {len(downloaded)} file(s) to {local_dir}")
except Exception as e:
logger.error(f"Download failed: {e}")
return downloaded
if __name__ == "__main__":
logger.info("Setting up Google Cloud Storage...")
logger.info(f"Project: {PROJECT_ID}")
logger.info(f"Bucket: gs://{BUCKET_NAME}")
create_bucket()
logger.info("Done. Set GCP_PROJECT_ID and GCS_BUCKET_NAME in your .env file.")