Skip to content

Commit 09ca8b3

Browse files
committed
chore: use PurePosixPath type in sqlalchemy
1 parent ed279fb commit 09ca8b3

6 files changed

Lines changed: 37 additions & 19 deletions

File tree

components/renku_data_services/migrations/versions/584598f3b769_expand_and_separate_environments_from_.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
mount_dir: str = "/home/jovyan/work"
2222
uid: int = 1000
2323
gid: int = 1000
24-
port: int = 4180
24+
port: int = 8888
2525

2626

2727
def upgrade() -> None:

components/renku_data_services/session/db.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ async def __insert_environment(
7474
container_image=new_environment.container_image,
7575
default_url=new_environment.default_url,
7676
port=new_environment.port,
77-
working_directory=new_environment.working_directory.as_posix(),
78-
mount_directory=new_environment.mount_directory.as_posix(),
77+
working_directory=new_environment.working_directory,
78+
mount_directory=new_environment.mount_directory,
7979
uid=new_environment.uid,
8080
gid=new_environment.gid,
8181
environment_kind=new_environment.environment_kind,
@@ -229,9 +229,7 @@ async def insert_launcher(
229229
raise errors.UnauthorizedError(message="You do not have the required permissions for this operation.")
230230

231231
project_id = new_launcher.project_id
232-
authorized = await self.project_authz.has_permission(
233-
user, ResourceType.project, ULID.from_str(project_id), Scope.WRITE
234-
)
232+
authorized = await self.project_authz.has_permission(user, ResourceType.project, project_id, Scope.WRITE)
235233
if not authorized:
236234
raise errors.MissingResourceError(
237235
message=f"Project with id '{project_id}' does not exist or you do not have access to it."

components/renku_data_services/session/orm.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from renku_data_services.crc.orm import ResourceClassORM
1313
from renku_data_services.project.orm import ProjectORM
1414
from renku_data_services.session import models
15-
from renku_data_services.utils.sqlalchemy import ULIDType
15+
from renku_data_services.utils.sqlalchemy import PurePosixPathType, ULIDType
1616

1717
metadata_obj = MetaData(schema="sessions") # Has to match alembic ini section name
1818
JSONVariant = JSON().with_variant(JSONB(), "postgresql")
@@ -51,8 +51,8 @@ class EnvironmentORM(BaseORM):
5151
"""Default URL path to open in a session."""
5252

5353
port: Mapped[int] = mapped_column("port")
54-
working_directory: Mapped[str] = mapped_column("working_directory", String())
55-
mount_directory: Mapped[str] = mapped_column("mount_directory", String())
54+
working_directory: Mapped[PurePosixPath] = mapped_column("working_directory", PurePosixPathType)
55+
mount_directory: Mapped[PurePosixPath] = mapped_column("mount_directory", PurePosixPathType)
5656
uid: Mapped[int] = mapped_column("uid")
5757
gid: Mapped[int] = mapped_column("gid")
5858
environment_kind: Mapped[models.EnvironmentKind] = mapped_column("environment_kind")
@@ -72,8 +72,8 @@ def dump(self) -> models.Environment:
7272
gid=self.gid,
7373
uid=self.uid,
7474
environment_kind=self.environment_kind,
75-
mount_directory=PurePosixPath(self.mount_directory),
76-
working_directory=PurePosixPath(self.working_directory),
75+
mount_directory=self.mount_directory,
76+
working_directory=self.working_directory,
7777
port=self.port,
7878
args=self.args,
7979
command=self.command,

components/renku_data_services/utils/sqlalchemy.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Utilities for SQLAlchemy."""
22

3+
from pathlib import PurePosixPath
34
from typing import cast
45

56
from sqlalchemy import Dialect, types
@@ -23,3 +24,22 @@ def process_result_value(self, value: str | None, dialect: Dialect) -> ULID | No
2324
if value is None:
2425
return None
2526
return cast(ULID, ULID.from_str(value)) # cast because mypy doesn't understand ULID type annotations
27+
28+
29+
class PurePosixPathType(types.TypeDecorator):
30+
"""Wrapper type for Path <--> str conversion."""
31+
32+
impl = types.String
33+
cache_ok = True
34+
35+
def process_bind_param(self, value: PurePosixPath | None, dialect: Dialect) -> str | None:
36+
"""Transform value for storing in the database."""
37+
if value is None:
38+
return None
39+
return value.as_posix()
40+
41+
def process_result_value(self, value: str | None, dialect: Dialect) -> PurePosixPath | None:
42+
"""Transform string from database into PosixPath."""
43+
if value is None:
44+
return None
45+
return PurePosixPath(value)

test/bases/renku_data_services/data_api/test_migrations.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,8 @@ async def test_migration_to_f34b87ddd954(
100100

101101

102102
@pytest.mark.asyncio
103-
async def test_migration_to_584598f3b769(sanic_client_no_migrations: SanicASGITestClient, app_config: Config) -> None:
103+
async def test_migration_to_584598f3b769(app_config: Config) -> None:
104104
run_migrations_for_app("common", "dcc1c1ee662f")
105-
sanic_client = sanic_client_no_migrations
106105
await app_config.kc_user_repo.initialize(app_config.kc_api)
107106
await app_config.group_repo.generate_user_namespaces()
108107
env_id = str(ULID())
@@ -122,14 +121,15 @@ async def test_migration_to_584598f3b769(sanic_client_no_migrations: SanicASGITe
122121
)
123122
)
124123
run_migrations_for_app("common", "584598f3b769")
125-
_, response = await sanic_client.get("/api/data/environments")
126-
assert response.status_code == 200, response.text
127-
assert len(response.json) == 1
128-
env = response.json[0]
124+
async with app_config.db.async_session_maker() as session, session.begin():
125+
res = await session.execute(sa.text("SELECT * FROM sessions.environments"))
126+
data = res.all()
127+
assert len(data) == 1
128+
env = data[0]._mapping
129129
assert env["id"] == env_id
130130
assert env["name"] == "test"
131131
assert env["container_image"] == "test"
132132
assert env["default_url"] == "/test"
133-
assert env["port"] == 4180
133+
assert env["port"] == 8888
134134
assert env["uid"] == 1000
135135
assert env["gid"] == 1000

test/bases/renku_data_services/data_api/test_sessions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ async def test_patch_session_environment_unauthorized(
152152

153153
_, res = await sanic_client.patch(f"/api/data/environments/{environment_id}", headers=user_headers, json=payload)
154154

155-
assert res.status_code == 403, res.text
155+
assert res.status_code == 401, res.text
156156

157157

158158
@pytest.mark.asyncio

0 commit comments

Comments
 (0)