Skip to content

Commit 1ac46d4

Browse files
committed
feat: label session and job pods with the preemptible flag
1 parent 22b47cf commit 1ac46d4

2 files changed

Lines changed: 50 additions & 0 deletions

File tree

‎components/renku_data_services/notebooks/core_sessions.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,6 +1222,8 @@ async def start_session(
12221222
if user.is_anonymous:
12231223
labels["renku.io/anonymous-session"] = "true"
12241224

1225+
labels["renku.io/preemptible"] = str(resource_class.preemptible).lower()
1226+
12251227
if session_type.is_non_interactive:
12261228
session_extras = session_extras.extra_container_as_sidecars()
12271229

@@ -1442,6 +1444,8 @@ async def patch_session(
14421444
labels["renku.io/anonymous-session"] = "true"
14431445
if not labels.get("renku.io/session-type"):
14441446
labels["renku.io/session-type"] = SessionType.interactive.value
1447+
if rc is not None:
1448+
labels["renku.io/preemptible"] = str(rc.preemptible).lower()
14451449
if not patch.metadata:
14461450
patch.metadata = AmaltheaSessionV1Alpha1MetadataPatch()
14471451
patch.metadata.labels = labels
@@ -1454,6 +1458,8 @@ async def patch_session(
14541458
labels["renku.io/anonymous-session"] = "true"
14551459
if not labels.get("renku.io/session-type"):
14561460
labels["renku.io/session-type"] = SessionType.interactive.value
1461+
if rc is not None:
1462+
labels["renku.io/preemptible"] = str(rc.preemptible).lower()
14571463
if not isinstance(patch.spec.template, TemplatePatch):
14581464
patch.spec.template = TemplatePatch(metadata=TemplateMetadataPatch())
14591465
if not isinstance(patch.spec.template.metadata, TemplateMetadataPatch):

‎test/bases/renku_data_services/data_api/test_sessions.py‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,6 +1818,50 @@ async def test_starting_session(
18181818
assert session_res.json["error"]["message"] == expected_error_message
18191819

18201820

1821+
@pytest.mark.asyncio
1822+
@pytest.mark.xdist_group("sessions") # Needs to run on the same worker as the rest of the sessions tests
1823+
@pytest.mark.parametrize("preemptible", [True, False])
1824+
async def test_starting_session_labels_preemptible_pods(
1825+
app_manager: DependencyManager,
1826+
sanic_client: SanicASGITestClient,
1827+
create_project,
1828+
create_resource_pool,
1829+
create_session_launcher,
1830+
amalthea_installation,
1831+
user_headers,
1832+
regular_user_api_user,
1833+
valid_resource_pool_payload,
1834+
preemptible: bool,
1835+
) -> None:
1836+
project = await create_project(sanic_client, "Some project", visibility="public")
1837+
classes = [dict(rc, preemptible=preemptible) for rc in valid_resource_pool_payload["classes"]]
1838+
resource_pool = await create_resource_pool(admin=True, classes=classes)
1839+
launcher = await create_session_launcher(
1840+
"launcher",
1841+
project["id"],
1842+
resource_class_id=resource_pool["classes"][0]["id"],
1843+
environment={
1844+
"container_image": "renku/renkulab-py:3.10-0.23.0-amalthea-sessions-3",
1845+
"environment_kind": "CUSTOM",
1846+
"name": "test",
1847+
"port": 8888,
1848+
"environment_image_source": "image",
1849+
},
1850+
)
1851+
1852+
_, res = await sanic_client.post(
1853+
"/api/data/sessions",
1854+
headers=user_headers,
1855+
json={"project_id": project["id"], "launcher_id": launcher["id"]},
1856+
cookies={"_renku_session": "some content"},
1857+
)
1858+
assert res.status_code == 201, res.text
1859+
1860+
session = await app_manager.config.nb_config.k8s_v2_client.get_session(res.json["name"], regular_user_api_user.id)
1861+
assert session is not None
1862+
assert session.metadata.labels["renku.io/preemptible"] == str(preemptible).lower()
1863+
1864+
18211865
@pytest.mark.asyncio
18221866
@pytest.mark.xdist_group("sessions") # Needs to run on the same worker as the rest of the sessions tests
18231867
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)