Skip to content

Commit bce3101

Browse files
committed
squashme: fix linting
1 parent be1c809 commit bce3101

File tree

8 files changed

+90
-19
lines changed

8 files changed

+90
-19
lines changed

components/renku_data_services/data_connectors/blueprints.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from sanic_ext import validate
1010
from ulid import ULID
1111

12-
from renku_data_services import base_models, errors
12+
from renku_data_services import base_models
1313
from renku_data_services.base_api.auth import (
1414
authenticate,
1515
only_authenticated,
@@ -471,7 +471,7 @@ async def openbis_transform_session_token_to_pat() -> (
471471
openbis_pat[1],
472472
)
473473
except Exception as e:
474-
raise errors.ProgrammingError(message=str(e))
474+
raise errors.ProgrammingError(message=str(e)) from e
475475
raise errors.ValidationError(message="The openBIS session token must be a string value.")
476476

477477
raise errors.ValidationError(message="The openBIS storage has only one secret: session_token")

components/renku_data_services/project/db.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,9 @@ async def patch_session_secrets(
840840
)
841841
if session_launcher_secret_orm := existing_secrets_as_dict.get(slot_id):
842842
session_launcher_secret_orm.secret.update(
843-
encrypted_value=encrypted_value, encrypted_key=encrypted_key
843+
encrypted_value=encrypted_value,
844+
encrypted_key=encrypted_key,
845+
expiration_timestamp=session_launcher_secret_orm.secret.expiration_timestamp,
844846
)
845847
else:
846848
name = secret_slot.name

components/renku_data_services/secrets/db.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import random
44
import string
55
from collections.abc import AsyncGenerator, Callable, Sequence
6-
from datetime import UTC, datetime, timedelta
6+
from datetime import UTC, datetime
77
from typing import cast
88

99
from cryptography.hazmat.primitives.asymmetric import rsa
@@ -200,7 +200,11 @@ async def update_secret(self, requested_by: APIUser, secret_id: ULID, patch: Sec
200200
secret_service_public_key=self.secret_service_public_key,
201201
secret_value=patch.secret_value,
202202
)
203-
secret.update(encrypted_value=encrypted_value, encrypted_key=encrypted_key)
203+
secret.update(
204+
encrypted_value=encrypted_value,
205+
encrypted_key=encrypted_key,
206+
expiration_timestamp=patch.expiration_timestamp,
207+
)
204208

205209
return secret.dump()
206210

components/renku_data_services/secrets/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,4 @@ class SecretPatch:
9090
name: str | None
9191
default_filename: str | None
9292
secret_value: str | None = field(repr=False)
93+
expiration_timestamp: datetime | None

components/renku_data_services/storage/rclone_patches.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,63 @@ def apply_patches(spec: list[dict[str, Any]]) -> None:
255255

256256
for patch in patches:
257257
patch(spec)
258+
259+
260+
def __patch_schema_add_openbis_type(spec: list[dict[str, Any]]) -> None:
261+
"""Adds a fake type to help with setting up openBIS storage."""
262+
spec.append(
263+
{
264+
"Name": "openbis",
265+
"Description": "openBIS",
266+
"Prefix": "openbis",
267+
"Options": [
268+
{
269+
"Name": "host",
270+
"Help": 'openBIS host to connect to.\n\nE.g. "openbis-eln-lims.ethz.ch".',
271+
"Provider": "",
272+
"Default": "",
273+
"Value": None,
274+
"Examples": [
275+
{
276+
"Value": "openbis-eln-lims.ethz.ch",
277+
"Help": "Public openBIS demo instance",
278+
"Provider": "",
279+
},
280+
],
281+
"ShortOpt": "",
282+
"Hide": 0,
283+
"Required": True,
284+
"IsPassword": False,
285+
"NoPrefix": False,
286+
"Advanced": False,
287+
"Exclusive": False,
288+
"Sensitive": False,
289+
"DefaultStr": "",
290+
"ValueStr": "",
291+
"Type": "string",
292+
},
293+
{
294+
"Name": "session_token",
295+
"Help": "openBIS session token",
296+
"Provider": "",
297+
"Default": "",
298+
"Value": None,
299+
"ShortOpt": "",
300+
"Hide": 0,
301+
"Required": True,
302+
"IsPassword": True,
303+
"NoPrefix": False,
304+
"Advanced": False,
305+
"Exclusive": False,
306+
"Sensitive": True,
307+
"DefaultStr": "",
308+
"ValueStr": "",
309+
"Type": "string",
310+
},
311+
],
312+
"CommandHelp": None,
313+
"Aliases": None,
314+
"Hide": False,
315+
"MetadataInfo": None,
316+
}
317+
)

components/renku_data_services/users/core.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ def validate_secret_patch(patch: apispec.SecretPatch) -> SecretPatch:
2121
name=patch.name,
2222
default_filename=patch.default_filename,
2323
secret_value=patch.value,
24+
expiration_timestamp=patch.expiration_timestamp,
2425
)

test/bases/renku_data_services/data_api/test_secret.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,17 @@
2727
@pytest.fixture
2828
def create_secret(sanic_client: SanicASGITestClient, user_headers):
2929
async def create_secret_helper(
30-
name: str, value: str, kind: str = "general", default_filename: str | None = None, expiration_timestamp: str | None = None
30+
name: str,
31+
value: str,
32+
kind: str = "general",
33+
default_filename: str | None = None,
34+
expiration_timestamp: str | None = None,
3135
) -> dict[str, Any]:
3236
payload = {"name": name, "value": value, "kind": kind}
3337
if default_filename:
3438
payload["default_filename"] = default_filename
3539
if expiration_timestamp:
3640
payload["expiration_timestamp"] = expiration_timestamp
37-
3841

3942
_, response = await sanic_client.post("/api/data/user/secrets", headers=user_headers, json=payload)
4043

@@ -101,7 +104,7 @@ async def test_get_one_secret(sanic_client: SanicASGITestClient, user_headers, c
101104
secret = await create_secret("secret-2", "value-2")
102105
await create_secret("secret-3", "value-3")
103106

104-
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret["id"]}", headers=user_headers)
107+
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret['id']}", headers=user_headers)
105108
assert response.status_code == 200, response.text
106109
assert response.json is not None
107110
assert response.json["name"] == secret["name"]
@@ -115,21 +118,21 @@ async def test_get_one_secret_not_expired(sanic_client: SanicASGITestClient, use
115118
secret_1 = await create_secret("secret-1", "value-1", expiration_timestamp=expiration_timestamp)
116119
secret_2 = await create_secret("secret-2", "value-2", expiration_timestamp="2029-12-31")
117120

118-
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret_1["id"]}", headers=user_headers)
121+
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret_1['id']}", headers=user_headers)
119122
assert response.status_code == 200, response.text
120123
assert response.json is not None
121124
assert response.json["name"] == "secret-1"
122125
assert response.json["id"] == secret_1["id"]
123126

124-
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret_2["id"]}", headers=user_headers)
127+
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret_2['id']}", headers=user_headers)
125128
assert response.status_code == 200, response.text
126129
assert response.json is not None
127130
assert response.json["name"] == "secret-2"
128131
assert response.json["id"] == secret_2["id"]
129132

130133
time.sleep(20)
131134

132-
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret_1["id"]}", headers=user_headers)
135+
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret_1['id']}", headers=user_headers)
133136
assert response.status_code == 404
134137

135138

@@ -193,7 +196,7 @@ async def test_get_delete_a_secret(sanic_client: SanicASGITestClient, user_heade
193196
secret = await create_secret("secret-2", "value-2")
194197
await create_secret("secret-3", "value-3")
195198

196-
_, response = await sanic_client.delete(f"/api/data/user/secrets/{secret["id"]}", headers=user_headers)
199+
_, response = await sanic_client.delete(f"/api/data/user/secrets/{secret['id']}", headers=user_headers)
197200
assert response.status_code == 204, response.text
198201

199202
_, response = await sanic_client.get("/api/data/user/secrets", headers=user_headers)
@@ -209,12 +212,12 @@ async def test_get_update_a_secret(sanic_client: SanicASGITestClient, user_heade
209212
await create_secret("secret-3", "value-3")
210213

211214
_, response = await sanic_client.patch(
212-
f"/api/data/user/secrets/{secret["id"]}", headers=user_headers, json={"name": "new-name", "value": "new-value"}
215+
f"/api/data/user/secrets/{secret['id']}", headers=user_headers, json={"name": "new-name", "value": "new-value"}
213216
)
214217
assert response.status_code == 422
215218

216219
_, response = await sanic_client.patch(
217-
f"/api/data/user/secrets/{secret["id"]}", headers=user_headers, json={"value": "new-value"}
220+
f"/api/data/user/secrets/{secret['id']}", headers=user_headers, json={"value": "new-value"}
218221
)
219222
assert response.status_code == 200, response.text
220223
assert response.json is not None
@@ -223,7 +226,7 @@ async def test_get_update_a_secret(sanic_client: SanicASGITestClient, user_heade
223226
assert response.json["expiration_timestamp"] is None
224227
assert "value" not in response.json
225228

226-
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret["id"]}", headers=user_headers)
229+
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret['id']}", headers=user_headers)
227230
assert response.status_code == 200, response.text
228231
assert response.json is not None
229232
assert response.json["id"] == secret["id"]
@@ -232,13 +235,13 @@ async def test_get_update_a_secret(sanic_client: SanicASGITestClient, user_heade
232235
assert "value" not in response.json
233236

234237
_, response = await sanic_client.patch(
235-
f"/api/data/user/secrets/{secret["id"]}",
238+
f"/api/data/user/secrets/{secret['id']}",
236239
headers=user_headers,
237240
json={"value": "newest-value", "expiration_timestamp": "2029-12-31"},
238241
)
239242
assert response.status_code == 200, response.text
240243

241-
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret["id"]}", headers=user_headers)
244+
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret['id']}", headers=user_headers)
242245
assert response.status_code == 200, response.text
243246
assert response.json is not None
244247
assert response.json["id"] == secret["id"]
@@ -255,7 +258,7 @@ async def test_cannot_get_another_user_secret(
255258
secret = await create_secret("secret-2", "value-2")
256259
await create_secret("secret-3", "value-3")
257260

258-
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret["id"]}", headers=admin_headers)
261+
_, response = await sanic_client.get(f"/api/data/user/secrets/{secret['id']}", headers=admin_headers)
259262
assert response.status_code == 404, response.text
260263
assert "cannot be found" in response.json["error"]["message"]
261264

test/bases/renku_data_services/data_api/test_storage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
from renku_data_services.data_api.dependencies import DependencyManager
1313
from renku_data_services.migrations.core import run_migrations_for_app
1414
from renku_data_services.storage.rclone import RCloneValidator
15-
from renku_data_services.utils.core import get_openbis_session_token
1615
from renku_data_services.storage.rclone_patches import BANNED_STORAGE, OAUTH_PROVIDERS
16+
from renku_data_services.utils.core import get_openbis_session_token
1717
from test.utils import SanicReusableASGITestClient
1818

1919
_valid_storage: dict[str, Any] = {

0 commit comments

Comments
 (0)