diff --git a/backend/src/ceph_service.py b/backend/src/ceph_service.py index 6f99f1e6e8b99879af02ba01d05b1a32bb45b1fb..d7b4e73d585bea7b3e84477923a55efd10341e42 100644 --- a/backend/src/ceph_service.py +++ b/backend/src/ceph_service.py @@ -1,5 +1,5 @@ from models.buckets import BucketInfo, BucketRWAccess, BucketInfoResponse -from models.buckets import Bu +from models.buckets import BucketContentResponse import boto3 import json import os @@ -10,7 +10,7 @@ AWS_SECRET_ACCESS_KEY = os.getenv("MINIO_SECRET_ACCESS_KEY", "minioadmin") AWS_SESSION_TOKEN = None -def get_s3_client(): +def get_s3_resource(): return boto3.resource('s3', endpoint_url=MINIO_ENDPOINT, aws_access_key_id=AWS_ACCESS_KEY_ID, @@ -21,9 +21,14 @@ def get_s3_client(): ) +def get_s3_client(): + resource = get_s3_resource() + return resource.meta.client + + def list_buckets() -> BucketInfoResponse: - s3 = get_s3_client() - client = s3.meta.client + s3 = get_s3_resource() + client = get_s3_client() response = client.list_buckets() buckets_info = response["Buckets"] buckets = [None] * len(buckets_info) @@ -51,3 +56,10 @@ def list_buckets() -> BucketInfoResponse: size=size_byte ) return BucketInfoResponse(buckets=buckets, total=len(buckets)) + + +def list_bucket(bucket_name: str) -> BucketContentResponse: + client = get_s3_client() + buckets = client.list_objects_v2(Bucket=bucket_name)["Contents"] + print(buckets[0]) + return BucketContentResponse(buckets=buckets, total=len(buckets)) diff --git a/backend/src/models/buckets.py b/backend/src/models/buckets.py index ef72ede784006f01f58e54bcf6629fcee125d27f..fc97663da01b91c42a0f7e3fb0599d85050ed94e 100644 --- a/backend/src/models/buckets.py +++ b/backend/src/models/buckets.py @@ -21,3 +21,25 @@ class BucketInfoResponse(BaseModel): buckets: List[BucketInfo] total: int + +class BucketOwner(BaseModel): + DisplayName: str + ID: str + + +class BucketObject(BaseModel): + Key: str + LastModified: datetime + ETag: str + Size: int + StorageClass: str + Owner: BucketOwner + +class BucketNotfound: + status: str + detail: str + headers: dict + +class BucketContentResponse(BaseModel): + buckets: List[BucketObject] + total: int diff --git a/backend/src/routes/buckets.py b/backend/src/routes/buckets.py index 766c6b7bee0a02385561ceb59437997dcb50d620..6661a12fb0d91881cc90f50cb0813e27090fa888 100644 --- a/backend/src/routes/buckets.py +++ b/backend/src/routes/buckets.py @@ -1,5 +1,6 @@ -from models.buckets import BucketInfoResponse -from fastapi import APIRouter +from models.buckets import BucketInfoResponse, BucketContentResponse, BucketNotfound +from fastapi import APIRouter, HTTPException, Response +from botocore.exceptions import ClientError import ceph_service router = APIRouter() @@ -8,3 +9,14 @@ router = APIRouter() @router.get("/buckets") def list_buckets() -> BucketInfoResponse: return ceph_service.list_buckets() + + +@router.get("/buckets/{bucket_name}") +def list_bucket(bucket_name: str) -> BucketContentResponse: + try: + return ceph_service.list_bucket(bucket_name=bucket_name) + except ClientError as err: + status = err.response["ResponseMetadata"]["HTTPStatusCode"] + detail = err.response["Error"]["Code"] + headers = err.response["ResponseMetadata"]["HTTPHeaders"] + raise HTTPException(status_code=status, detail=detail, headers=headers)