33from dataclasses import dataclass
44from typing import Any
55
6- from sanic import HTTPResponse , Request , empty
6+ from sanic import Request , empty
77from sanic .response import HTTPResponse , JSONResponse
88from sanic_ext import validate
99from ulid import ULID
2020from renku_data_services .base_api .misc import validate_query
2121from renku_data_services .base_api .pagination import PaginationRequest , paginate
2222from renku_data_services .base_models .validation import validate_and_dump , validated_json
23- from renku_data_services .data_connectors .project_storage_k8s import ProjectStorageK8s
2423from renku_data_services .notebooks .data_sources import DataSourceRepository
2524from renku_data_services .storage import apispec , models
2625from renku_data_services .storage .core import (
3029 validate_unsaved_project_storage ,
3130)
3231from renku_data_services .storage .db import ProjectStorageRepository
32+ from renku_data_services .storage .project_storage_k8s import ProjectStorageK8s
3333from renku_data_services .storage .rclone import RCloneValidator
3434
3535
@@ -98,6 +98,8 @@ async def _obscure(
9898
9999@dataclass (kw_only = True )
100100class ProjectStorageBP (CustomBlueprint ):
101+ """Handler for project storage."""
102+
101103 project_storage_k8s : ProjectStorageK8s
102104 project_storage_repo : ProjectStorageRepository
103105 authenticator : base_models .Authenticator
@@ -124,6 +126,52 @@ async def _get_one(_: Request, user: base_models.APIUser, storage_id: ULID, etag
124126
125127 return "/data_connectors/storage/<storage_id:ulid>" , ["GET" ], _get_one
126128
129+ def get_storage_to_project (self ) -> BlueprintFactoryResponse :
130+ """List all project storage to a given project."""
131+
132+ @authenticate (self .authenticator )
133+ async def _get_all_storage_to_project (
134+ _ : Request ,
135+ user : base_models .APIUser ,
136+ project_id : ULID ,
137+ ) -> JSONResponse :
138+ project_storage = await self .project_storage_repo .get_storage_to (user = user , project_id = project_id )
139+ result = [self ._dump_project_storage (project_storage )] if project_storage else []
140+ return validated_json (apispec .ProjectStorageList , result )
141+
142+ return "/projects/<project_id:ulid>/storage" , ["GET" ], _get_all_storage_to_project
143+
144+ def get_storage_config (self ) -> BlueprintFactoryResponse :
145+ """Get the current config used for project storage."""
146+
147+ @authenticate (self .authenticator )
148+ @only_admins
149+ async def _get_project_config (_ : Request , user : base_models .APIUser ) -> JSONResponse :
150+ storage_config = self .project_storage_repo .get_project_storage_config ()
151+ result = apispec .ProjectStorageConfig (
152+ enabled = storage_config .enabled , max_size = int (storage_config .maximum_size .to_gibi ())
153+ )
154+ return validated_json (apispec .ProjectStorageConfig , result )
155+
156+ return "/data_connectors/storage/config" , ["GET" ], _get_project_config
157+
158+ def delete_storage (self ) -> BlueprintFactoryResponse :
159+ """Delete a specific project storage."""
160+
161+ @authenticate (self .authenticator )
162+ @only_authenticated
163+ async def _delete_storage (
164+ _ : Request ,
165+ user : base_models .APIUser ,
166+ storage_id : ULID ,
167+ ) -> HTTPResponse :
168+ deleted = await self .project_storage_repo .delete_project_storage (user = user , storage_id = storage_id )
169+ if deleted :
170+ await self .project_storage_k8s .delete_volume (deleted )
171+ return HTTPResponse (status = 204 )
172+
173+ return "/data_connectors/storage/<storage_id:ulid>" , ["DELETE" ], _delete_storage
174+
127175 def post_storage (self ) -> BlueprintFactoryResponse :
128176 """Create a new shared project storage."""
129177
0 commit comments