Skip to content

Commit 357962b

Browse files
authored
fix: b64 encode secret values on patch (#1150)
1 parent b5af14c commit 357962b

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

components/renku_data_services/k8s/models.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import annotations
44

5+
from base64 import b64encode
56
from dataclasses import dataclass
67
from enum import StrEnum
78
from typing import Any, Final, Self, cast
@@ -13,7 +14,7 @@
1314
from kr8s.objects import Secret
1415
from kubernetes.client import V1Secret
1516

16-
from renku_data_services.errors import errors
17+
from renku_data_services.errors import ProgrammingError, errors
1718
from renku_data_services.k8s.constants import DUMMY_TASK_RUN_USER_ID, ClusterId
1819

1920
sanitizer = kubernetes.client.ApiClient().sanitize_for_serialization
@@ -235,12 +236,24 @@ def to_v1_secret(self) -> V1Secret:
235236
type=self.manifest.get("type"),
236237
)
237238

239+
def __b64encode_values(self, stringData: dict[str, Any], new_data: dict[str, str]) -> None:
240+
for k, v in stringData.items():
241+
if k in new_data:
242+
raise ProgrammingError(
243+
message=f"Patching a secret with both stringData and data and conflicting key {k}."
244+
)
245+
new_data[k] = b64encode(str(v).encode("utf-8")).decode("utf-8")
246+
238247
def to_patch(self) -> list[dict[str, Any]]:
239248
"""Create a rfc6902 patch that would take an existing secret and patch it to this state."""
240-
if self.manifest.get("stringData"):
241-
raise NotImplementedError("Patching a secret with stringData field is not implemented.")
249+
secretData = self.manifest.get("data") or {}
250+
stringData = self.manifest.get("stringData")
251+
if stringData:
252+
secretData = secretData.copy()
253+
self.__b64encode_values(stringData, secretData)
254+
242255
patch = [
243-
{"op": "replace", "path": "/data", "value": self.manifest.data},
256+
{"op": "replace", "path": "/data", "value": secretData},
244257
{"op": "replace", "path": "/type", "value": self.manifest.get("type", "Opaque")},
245258
]
246259
if "metadata" not in self.manifest:

components/renku_data_services/notebooks/core_sessions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,10 +1006,13 @@ async def start_session(
10061006
)
10071007
secrets_to_create = session_extras.secrets or []
10081008
for s in secrets_to_create:
1009+
logger.debug(f"Creating {len(secrets_to_create)} session secrets")
10091010
await nb_config.k8s_v2_client.create_or_patch_secret(K8sSecret.from_v1_secret(s.secret, cluster))
10101011
try:
1012+
logger.debug(f"Starting session ${session.metadata.name} for user {user.id}")
10111013
session = await nb_config.k8s_v2_client.create_session(session, user)
10121014
except Exception as err:
1015+
logger.debug(f"Removing {len(secrets_to_create)} secrets due to failing session start")
10131016
for s in secrets_to_create:
10141017
await nb_config.k8s_v2_client.delete_secret(K8sSecret.from_v1_secret(s.secret, cluster))
10151018
raise errors.ProgrammingError(message="Could not start the amalthea session") from err

0 commit comments

Comments
 (0)