Skip to content

Commit 6ca5bf0

Browse files
committed
Moved more code
1 parent 8411289 commit 6ca5bf0

14 files changed

Lines changed: 991 additions & 959 deletions

File tree

bases/renku_data_services/data_api/app.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from renku_data_services.search.reprovision import SearchReprovision
3939
from renku_data_services.search.solr_user_query import UsernameResolve
4040
from renku_data_services.session.blueprints import BuildsBP, EnvironmentsBP, SessionLaunchersBP
41-
from renku_data_services.storage.blueprints import StorageSchemaBP
41+
from renku_data_services.storage.blueprints import ProjectStorageBP, StorageSchemaBP
4242
from renku_data_services.users.blueprints import KCUsersBP, UserPreferencesBP, UserSecretsBP
4343

4444

@@ -222,6 +222,7 @@ def register_all_handlers(app: Sanic, dm: DependencyManager) -> Sanic:
222222
oauth_client_factory=dm.oauth_http_client_factory,
223223
project_repo=dm.project_repo,
224224
project_session_secret_repo=dm.project_session_secret_repo,
225+
project_storage_repo=dm.project_storage_repo,
225226
rp_repo=dm.rp_repo,
226227
session_repo=dm.session_repo,
227228
user_repo=dm.kc_user_repo,
@@ -280,7 +281,6 @@ def register_all_handlers(app: Sanic, dm: DependencyManager) -> Sanic:
280281
data_service_base_url=dm.config.nb_config.data_service_url,
281282
k8s_client=dm.k8s_client,
282283
deposit_config=dm.config.deposit_config,
283-
project_storage_k8s=dm.project_storage_k8s,
284284
)
285285
notifications = NotificationsBP(
286286
name="notifications",
@@ -311,6 +311,13 @@ def register_all_handlers(app: Sanic, dm: DependencyManager) -> Sanic:
311311
internal_token_mint=dm.internal_token_mint,
312312
internal_scope_verifier=dm.internal_scope_verifier,
313313
)
314+
project_storage = ProjectStorageBP(
315+
name="project_storage",
316+
url_prefix=url_prefix,
317+
project_storage_k8s=dm.project_storage_k8s,
318+
project_storage_repo=dm.project_storage_repo,
319+
authenticator=dm.authenticator,
320+
)
314321
app.blueprint(
315322
[
316323
resource_pools.blueprint(),
@@ -342,6 +349,7 @@ def register_all_handlers(app: Sanic, dm: DependencyManager) -> Sanic:
342349
capacity_reservation.blueprint(),
343350
resource_usage.blueprint(),
344351
internal_authentication.blueprint(),
352+
project_storage.blueprint(),
345353
]
346354
)
347355
if builds is not None:

bases/renku_data_services/data_api/config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@
1414
)
1515
from renku_data_services.app_config.logging import Config as LoggingConfig
1616
from renku_data_services.authz.config import AuthzConfig
17-
from renku_data_services.data_connectors.config import DepositConfig, ProjectStorageConfig
17+
from renku_data_services.data_connectors.config import DepositConfig
1818
from renku_data_services.db_config.config import DBConfig
1919
from renku_data_services.notebooks.config import NotebooksConfig
2020
from renku_data_services.secrets.config import PublicSecretsConfig
2121
from renku_data_services.session.config import BuildsConfig
2222
from renku_data_services.solr.solr_client import SolrClientConfig
23+
from renku_data_services.storage.config import ProjectStorageConfig
2324
from renku_data_services.users.config import UserPreferencesConfig
2425

2526

bases/renku_data_services/data_api/dependencies.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
)
4141
from renku_data_services.data_connectors.deposits.envidat import EnvidatClient
4242
from renku_data_services.data_connectors.deposits.zenodo import ZenodoAPIClient
43-
from renku_data_services.data_connectors.project_storage_k8s import ProjectStorageK8s
4443
from renku_data_services.git.gitlab import DummyGitlabAPI, EmptyGitlabAPI, GitlabAPI
4544
from renku_data_services.k8s.client_interfaces import K8sClient
4645
from renku_data_services.k8s.clients import (
@@ -79,6 +78,8 @@
7978
from renku_data_services.session.constants import BUILD_RUN_GVK, TASK_RUN_GVK
8079
from renku_data_services.session.db import SessionRepository
8180
from renku_data_services.session.k8s_client import ShipwrightClient
81+
from renku_data_services.storage.db import ProjectStorageRepository
82+
from renku_data_services.storage.project_storage_k8s import ProjectStorageK8s
8283
from renku_data_services.users.db import UserPreferencesRepository
8384
from renku_data_services.users.db import UserRepo as KcUserRepo
8485
from renku_data_services.users.dummy_kc_api import DummyKeycloakAPI
@@ -177,6 +178,7 @@ class DependencyManager:
177178
internal_token_mint: RenkuSelfTokenMint
178179
internal_scope_verifier: ScopeVerifier
179180
project_storage_k8s: ProjectStorageK8s
181+
project_storage_repo: ProjectStorageRepository
180182

181183
spec: dict[str, Any] = field(init=False, repr=False, default_factory=dict)
182184
app_name: str = "renku_data_services"
@@ -367,6 +369,13 @@ def from_env(cls) -> DependencyManager:
367369
member_repo=member_repo,
368370
)
369371
project_storage_k8s = ProjectStorageK8s(config.nb_config.k8s_v2_client)
372+
project_storage_repo = ProjectStorageRepository(
373+
session_maker=config.db.async_session_maker,
374+
authz=authz,
375+
project_repo=project_repo,
376+
group_repo=group_repo,
377+
project_storage_config=config.project_storage_config,
378+
)
370379
reprovisioning_repo = ReprovisioningRepository(session_maker=config.db.async_session_maker)
371380

372381
git_repositories_repo = GitRepositoriesRepository(
@@ -423,7 +432,6 @@ def from_env(cls) -> DependencyManager:
423432
project_repo=project_repo,
424433
group_repo=group_repo,
425434
search_updates_repo=search_updates_repo,
426-
project_storage_config=config.project_storage_config,
427435
)
428436
data_connector_secret_repo = DataConnectorSecretRepository(
429437
session_maker=config.db.async_session_maker,
@@ -518,4 +526,5 @@ def from_env(cls) -> DependencyManager:
518526
internal_token_mint=internal_token_mint,
519527
internal_scope_verifier=internal_scope_verifier,
520528
project_storage_k8s=project_storage_k8s,
529+
project_storage_repo=project_storage_repo,
521530
)

components/renku_data_services/data_connectors/blueprints.py

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from renku_data_services import base_models, errors
1212
from renku_data_services.base_api.auth import (
1313
authenticate,
14-
only_admins,
1514
only_authenticated,
1615
)
1716
from renku_data_services.base_api.blueprint import BlueprintFactoryResponse, CustomBlueprint
@@ -54,7 +53,6 @@
5453
)
5554
from renku_data_services.data_connectors.deposits.envidat import EnvidatClient
5655
from renku_data_services.data_connectors.deposits.zenodo import ZenodoAPIClient
57-
from renku_data_services.data_connectors.project_storage_k8s import ProjectStorageK8s
5856
from renku_data_services.k8s.client_interfaces import K8sClient, SecretClient
5957
from renku_data_services.k8s.clients import DepositUploadJobClient
6058
from renku_data_services.notebooks.data_sources import DataSourceRepository
@@ -79,7 +77,6 @@ class DataConnectorsBP(CustomBlueprint):
7977
data_service_base_url: str
8078
k8s_client: K8sClient
8179
deposit_config: DepositConfig
82-
project_storage_k8s: ProjectStorageK8s
8380

8481
def get_all(self) -> BlueprintFactoryResponse:
8582
"""List data connectors."""
@@ -399,52 +396,6 @@ async def _delete_project_link(
399396
_delete_project_link,
400397
)
401398

402-
def get_storage_to_project(self) -> BlueprintFactoryResponse:
403-
"""List all project storage to a given project."""
404-
405-
@authenticate(self.authenticator)
406-
async def _get_all_storage_to_project(
407-
_: Request,
408-
user: base_models.APIUser,
409-
project_id: ULID,
410-
) -> JSONResponse:
411-
project_storage = await self.data_connector_repo.get_storage_to(user=user, project_id=project_id)
412-
result = [self._dump_project_storage(project_storage)] if project_storage else []
413-
return validated_json(apispec.ProjectStorageList, result)
414-
415-
return "/projects/<project_id:ulid>/storage", ["GET"], _get_all_storage_to_project
416-
417-
def get_storage_config(self) -> BlueprintFactoryResponse:
418-
"""Get the current config used for project storage."""
419-
420-
@authenticate(self.authenticator)
421-
@only_admins
422-
async def _get_project_config(_: Request, user: base_models.APIUser) -> JSONResponse:
423-
storage_config = self.data_connector_repo.get_project_storage_config()
424-
result = apispec.ProjectStorageConfig(
425-
enabled=storage_config.enabled, max_size=int(storage_config.maximum_size.to_gibi())
426-
)
427-
return validated_json(apispec.ProjectStorageConfig, result)
428-
429-
return "/data_connectors/storage/config", ["GET"], _get_project_config
430-
431-
def delete_storage(self) -> BlueprintFactoryResponse:
432-
"""Delete a specific project storage."""
433-
434-
@authenticate(self.authenticator)
435-
@only_authenticated
436-
async def _delete_storage(
437-
_: Request,
438-
user: base_models.APIUser,
439-
storage_id: ULID,
440-
) -> HTTPResponse:
441-
deleted = await self.data_connector_repo.delete_project_storage(user=user, storage_id=storage_id)
442-
if deleted:
443-
await self.project_storage_k8s.delete_volume(deleted)
444-
return HTTPResponse(status=204)
445-
446-
return "/data_connectors/storage/<storage_id:ulid>", ["DELETE"], _delete_storage
447-
448399
def get_all_data_connectors_links_to_project(self) -> BlueprintFactoryResponse:
449400
"""List all links from data connectors to a given project."""
450401

components/renku_data_services/data_connectors/db.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
)
3030
from renku_data_services.data_connectors import apispec, models
3131
from renku_data_services.data_connectors import orm as schemas
32-
from renku_data_services.data_connectors.config import ProjectStorageConfig
3332
from renku_data_services.data_connectors.core import validate_unsaved_global_data_connector
3433
from renku_data_services.data_connectors.doi.models import DOI
3534
from renku_data_services.k8s.constants import DEFAULT_K8S_CLUSTER
@@ -58,14 +57,12 @@ def __init__(
5857
project_repo: ProjectRepository,
5958
group_repo: GroupRepository,
6059
search_updates_repo: SearchUpdatesRepo,
61-
project_storage_config: ProjectStorageConfig,
6260
) -> None:
6361
self.session_maker = session_maker
6462
self.authz = authz
6563
self.project_repo = project_repo
6664
self.group_repo = group_repo
6765
self.search_updates_repo = search_updates_repo
68-
self.project_storage_config = project_storage_config
6966

7067
async def get_data_connectors(
7168
self,

components/renku_data_services/notebooks/blueprints.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
from renku_data_services.resource_usage.db import ResourceRequestsRepo
4141
from renku_data_services.session.config import BuildsConfig
4242
from renku_data_services.session.db import SessionRepository
43+
from renku_data_services.storage.db import ProjectStorageRepository
4344
from renku_data_services.users.db import UserRepo
4445

4546
logger = logging.getLogger(__name__)
@@ -62,6 +63,7 @@ class NotebooksNewBP(CustomBlueprint):
6263
image_check_repo: ImageCheckRepository
6364
project_repo: ProjectRepository
6465
project_session_secret_repo: ProjectSessionSecretRepository
66+
project_storage_repo: ProjectStorageRepository
6567
rp_repo: ResourcePoolRepository
6668
session_repo: SessionRepository
6769
user_repo: UserRepo
@@ -96,6 +98,7 @@ async def _handler(
9698
data_connector_repo=self.data_connector_repo,
9799
project_repo=self.project_repo,
98100
project_session_secret_repo=self.project_session_secret_repo,
101+
project_storage_repo=self.project_storage_repo,
99102
rp_repo=self.rp_repo,
100103
session_repo=self.session_repo,
101104
user_repo=self.user_repo,

components/renku_data_services/notebooks/core_sessions.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
DataConnectorSecretRepository,
4545
)
4646
from renku_data_services.data_connectors.models import DataConnectorSecret, DataConnectorWithSecrets
47-
from renku_data_services.data_connectors.project_storage_k8s import ProjectStorageK8s
4847
from renku_data_services.errors import ValidationError, errors
4948
from renku_data_services.k8s.models import ClusterConnection, K8sSecret, sanitizer
5049
from renku_data_services.notebooks import apispec
@@ -125,6 +124,8 @@
125124
from renku_data_services.session.config import BuildsConfig
126125
from renku_data_services.session.db import SessionRepository
127126
from renku_data_services.session.models import Environment, SessionLauncher
127+
from renku_data_services.storage.db import ProjectStorageRepository
128+
from renku_data_services.storage.project_storage_k8s import ProjectStorageK8s
128129
from renku_data_services.users.db import UserRepo
129130
from renku_data_services.utils.core import get_effective_quota
130131

@@ -191,14 +192,14 @@ async def get_extra_containers(
191192
async def get_project_storage(
192193
user: APIUser,
193194
project_storage_k8s: ProjectStorageK8s,
194-
data_connector_repo: DataConnectorRepository,
195+
project_storage_repo: ProjectStorageRepository,
195196
project_id: ULID,
196197
storage_mount: PurePosixPath,
197198
cluster: ClusterConnection,
198199
authz: Authz,
199200
) -> SessionExtraResources:
200201
"""If applicable, fetch the project storage and return it as SessionExtras."""
201-
project_storage = await data_connector_repo.get_storage_to(user, project_id)
202+
project_storage = await project_storage_repo.get_storage_to(user, project_id)
202203
if not project_storage:
203204
logger.debug(f"Project {project_id} has no project storage.")
204205
return SessionExtraResources()
@@ -929,6 +930,7 @@ async def start_session(
929930
data_connector_secret_repo: DataConnectorSecretRepository,
930931
project_repo: ProjectRepository,
931932
project_session_secret_repo: ProjectSessionSecretRepository,
933+
project_storage_repo: ProjectStorageRepository,
932934
rp_repo: ResourcePoolRepository,
933935
session_repo: SessionRepository,
934936
user_repo: UserRepo,
@@ -1069,7 +1071,7 @@ async def start_session(
10691071
project_storage_k8s = ProjectStorageK8s(nb_config.k8s_v2_client)
10701072
session_extras = session_extras.concat(
10711073
await get_project_storage(
1072-
user, project_storage_k8s, data_connector_repo, project.id, storage_mount, cluster, authz
1074+
user, project_storage_k8s, project_storage_repo, project.id, storage_mount, cluster, authz
10731075
)
10741076
)
10751077

components/renku_data_services/project/blueprints.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from renku_data_services.base_models.metrics import MetricsService, ProjectCreationType
2424
from renku_data_services.base_models.validation import validate_and_dump, validated_json
2525
from renku_data_services.data_connectors.db import DataConnectorRepository
26-
from renku_data_services.data_connectors.project_storage_k8s import ProjectStorageK8s
2726
from renku_data_services.errors import errors
2827
from renku_data_services.project import apispec
2928
from renku_data_services.project import models as project_models
@@ -42,6 +41,7 @@
4241
ProjectSessionSecretRepository,
4342
)
4443
from renku_data_services.session.db import SessionRepository
44+
from renku_data_services.storage.project_storage_k8s import ProjectStorageK8s
4545
from renku_data_services.users.db import UserRepo
4646

4747

components/renku_data_services/storage/blueprints.py

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from dataclasses import dataclass
44
from typing import Any
55

6-
from sanic import HTTPResponse, Request, empty
6+
from sanic import Request, empty
77
from sanic.response import HTTPResponse, JSONResponse
88
from sanic_ext import validate
99
from ulid import ULID
@@ -20,7 +20,6 @@
2020
from renku_data_services.base_api.misc import validate_query
2121
from renku_data_services.base_api.pagination import PaginationRequest, paginate
2222
from renku_data_services.base_models.validation import validate_and_dump, validated_json
23-
from renku_data_services.data_connectors.project_storage_k8s import ProjectStorageK8s
2423
from renku_data_services.notebooks.data_sources import DataSourceRepository
2524
from renku_data_services.storage import apispec, models
2625
from renku_data_services.storage.core import (
@@ -30,6 +29,7 @@
3029
validate_unsaved_project_storage,
3130
)
3231
from renku_data_services.storage.db import ProjectStorageRepository
32+
from renku_data_services.storage.project_storage_k8s import ProjectStorageK8s
3333
from renku_data_services.storage.rclone import RCloneValidator
3434

3535

@@ -98,6 +98,8 @@ async def _obscure(
9898

9999
@dataclass(kw_only=True)
100100
class 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

Comments
 (0)