From c5c96197e38ee360b3d332db41898deda01f922c Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Fri, 26 Jul 2024 12:23:53 +0100 Subject: [PATCH] automatically clean up pre-pull resources --- apps/kubernetes-provider/src/podCleaner.ts | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/apps/kubernetes-provider/src/podCleaner.ts b/apps/kubernetes-provider/src/podCleaner.ts index 04e3bc065..ba9f40503 100644 --- a/apps/kubernetes-provider/src/podCleaner.ts +++ b/apps/kubernetes-provider/src/podCleaner.ts @@ -15,6 +15,7 @@ export class PodCleaner { private logger = new SimpleLogger("[PodCleaner]"); private k8sClient: { core: k8s.CoreV1Api; + apps: k8s.AppsV1Api; kubeConfig: k8s.KubeConfig; }; @@ -43,6 +44,7 @@ export class PodCleaner { return { core: kubeConfig.makeApiClient(k8s.CoreV1Api), + apps: kubeConfig.makeApiClient(k8s.AppsV1Api), kubeConfig: kubeConfig, }; } @@ -98,6 +100,25 @@ export class PodCleaner { .catch(this.#handleK8sError.bind(this)); } + async #deleteDaemonSets(opts: { + namespace: string; + dryRun?: boolean; + fieldSelector?: string; + labelSelector?: string; + }) { + return await this.k8sClient.apps + .deleteCollectionNamespacedDaemonSet( + opts.namespace, + undefined, // pretty + undefined, // continue + opts.dryRun ? "All" : undefined, + opts.fieldSelector, + undefined, // gracePeriodSeconds + opts.labelSelector + ) + .catch(this.#handleK8sError.bind(this)); + } + async #deleteCompletedRuns() { this.logger.log("Deleting completed runs"); @@ -152,6 +173,28 @@ export class PodCleaner { }); } + async #deleteCompletedPrePulls() { + this.logger.log("Deleting completed pre-pulls"); + + const start = Date.now(); + + const result = await this.#deleteDaemonSets({ + namespace: this.namespace, + labelSelector: "app=task-prepull", + }); + + const elapsedMs = Date.now() - start; + + if (!result) { + this.logger.log("Deleting completed pre-pulls: No delete result", { elapsedMs }); + return; + } + + const total = (result.response as any)?.body?.items?.length ?? 0; + + this.logger.log("Deleting completed pre-pulls: Done", { total, elapsedMs }); + } + async start() { this.enabled = true; this.logger.log("Starting"); @@ -186,6 +229,22 @@ export class PodCleaner { 2 * this.intervalInSeconds * 1000 ); + const completedPrePullInterval = setInterval( + async () => { + if (!this.enabled) { + clearInterval(completedPrePullInterval); + return; + } + + try { + await this.#deleteCompletedPrePulls(); + } catch (error) { + this.logger.error("Error deleting completed pre-pulls", error); + } + }, + 2 * this.intervalInSeconds * 1000 + ); + // this.#launchTests(); }