From ff029ea31eae8120b010fba2e2d6bee48cfef469 Mon Sep 17 00:00:00 2001 From: Jacopo Gasparetto <jacopo.gasparetto@cnaf.infn.it> Date: Wed, 5 Apr 2023 17:49:43 +0200 Subject: [PATCH] Add BucketResponse model and change return values --- backend/src/ceph_service.py | 26 +++++++++++++++++++++----- backend/src/models/buckets.py | 20 ++++++++++++++++++++ backend/src/routes/buckets.py | 3 ++- 3 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 backend/src/models/buckets.py diff --git a/backend/src/ceph_service.py b/backend/src/ceph_service.py index a39481b..5be6fe8 100644 --- a/backend/src/ceph_service.py +++ b/backend/src/ceph_service.py @@ -1,3 +1,4 @@ +from models.buckets import Bucket, BucketRWAccess, BucketResponse import boto3 import json import os @@ -21,9 +22,24 @@ def get_s3_client(): return client -def list_buckets() -> json: +def list_buckets() -> BucketResponse: s3 = get_s3_client() - buckets = s3.list_buckets() - buckets = {key: buckets[key] for key in ["Buckets", "Owner"]} - return json.dumps(buckets, default=str) - + response = s3.list_buckets() + buckets_info = response["Buckets"] + buckets = [None] * len(buckets_info) + for i, bucket_info in enumerate(buckets_info): + bucket_name = bucket_info["Name"] + creation_date = bucket_info["CreationDate"] + bucket_acl = s3.get_bucket_acl(Bucket=bucket_name) + grant = bucket_acl["Grants"][0] # TODO: Here we can have multiple grants + permission = grant["Permission"] + read = permission in ("READ", "FULL_CONTROL") + write = permission in ("WRITE", "FULL_CONTROL") + rw_access = BucketRWAccess(read=read, write=write) + buckets[i] = Bucket( + name=bucket_name, + creation_date=creation_date, + details={}, + rw_access=rw_access + ) + return BucketResponse(buckets=buckets, total=len(buckets)) diff --git a/backend/src/models/buckets.py b/backend/src/models/buckets.py new file mode 100644 index 0000000..542e0bc --- /dev/null +++ b/backend/src/models/buckets.py @@ -0,0 +1,20 @@ +from pydantic import BaseModel +from datetime import datetime +from typing import List + + +class BucketRWAccess(BaseModel): + read: bool + write: bool + + +class Bucket(BaseModel): + name: str + creation_date: datetime + details: dict + rw_access: BucketRWAccess + + +class BucketResponse(BaseModel): + buckets: List[Bucket] + total: int diff --git a/backend/src/routes/buckets.py b/backend/src/routes/buckets.py index 193a973..d3bb3af 100644 --- a/backend/src/routes/buckets.py +++ b/backend/src/routes/buckets.py @@ -1,3 +1,4 @@ +from models.buckets import BucketResponse from fastapi import APIRouter import ceph_service @@ -5,5 +6,5 @@ router = APIRouter() @router.get("/buckets") -def list_buckets(): +def list_buckets() -> BucketResponse: return ceph_service.list_buckets() -- GitLab