cleanup(jenkins): gate orphan volume deletes by pvc namespace

This commit is contained in:
Brad Stein 2026-04-12 14:24:17 -03:00
parent 2ff3686700
commit 4cc2f0c355
2 changed files with 24 additions and 1 deletions

View File

@ -263,6 +263,7 @@ def _workspace_longhorn_candidates(all_pv_names: set[str], removed_pv_names: set
labels = metadata.get("labels") if isinstance(metadata.get("labels"), dict) else {}
pvc_name = labels.get("kubernetes.io/created-for/pvc/name")
pvc_namespace = labels.get("kubernetes.io/created-for/pvc/namespace")
robust_state = status.get("robustness")
state = status.get("state")
attached = status.get("isAttached")
@ -270,7 +271,14 @@ def _workspace_longhorn_candidates(all_pv_names: set[str], removed_pv_names: set
should_delete = False
if name in removed_pv_names:
should_delete = True
elif _is_workspace_name(pvc_name) and name not in all_pv_names:
elif (
_is_workspace_name(pvc_name)
and name not in all_pv_names
and (
pvc_namespace in {None, ""}
or pvc_namespace == settings.jenkins_workspace_namespace
)
):
should_delete = True
if not should_delete:
continue

View File

@ -111,6 +111,7 @@ def _fake_payloads(now_iso: str, old_iso: str) -> dict[str, dict[str, object]]:
"creationTimestamp": old_iso,
"labels": {
"kubernetes.io/created-for/pvc/name": "pvc-workspace-orphan",
"kubernetes.io/created-for/pvc/namespace": "jenkins",
},
}
},
@ -120,17 +121,29 @@ def _fake_payloads(now_iso: str, old_iso: str) -> dict[str, dict[str, object]]:
"creationTimestamp": old_iso,
"labels": {
"kubernetes.io/created-for/pvc/name": "pvc-workspace-annotated-active",
"kubernetes.io/created-for/pvc/namespace": "jenkins",
},
},
"status": {"state": "attached", "isAttached": True, "robustness": "healthy"},
"spec": {"frontend": "blockdev"},
},
{
"metadata": {
"name": "pvc-orphan-other-namespace",
"creationTimestamp": old_iso,
"labels": {
"kubernetes.io/created-for/pvc/name": "pvc-workspace-orphan",
"kubernetes.io/created-for/pvc/namespace": "nextcloud",
},
}
},
{
"metadata": {
"name": "pvc-orphan-fresh",
"creationTimestamp": now_iso,
"labels": {
"kubernetes.io/created-for/pvc/name": "pvc-workspace-fresh",
"kubernetes.io/created-for/pvc/namespace": "jenkins",
},
}
},
@ -141,6 +154,7 @@ def _fake_payloads(now_iso: str, old_iso: str) -> dict[str, dict[str, object]]:
"deletionTimestamp": old_iso,
"labels": {
"kubernetes.io/created-for/pvc/name": "pvc-workspace-orphan",
"kubernetes.io/created-for/pvc/namespace": "jenkins",
},
}
},
@ -238,6 +252,7 @@ def test_cleanup_jenkins_workspace_storage(monkeypatch) -> None:
assert "/api/v1/persistentvolumes/pvc-old" in deleted_paths
assert "/apis/longhorn.io/v1beta2/namespaces/longhorn-system/volumes/pvc-old" in deleted_paths
assert "/apis/longhorn.io/v1beta2/namespaces/longhorn-system/volumes/pvc-orphan" in deleted_paths
assert "/apis/longhorn.io/v1beta2/namespaces/longhorn-system/volumes/pvc-orphan-other-namespace" not in deleted_paths
assert "/apis/longhorn.io/v1beta2/namespaces/longhorn-system/volumes/pvc-attached" not in deleted_paths
assert _metric_value(
"ariadne_jenkins_workspace_cleanup_runs_total",