Skip to content

Commit c5c9619

Browse files
committed
automatically clean up pre-pull resources
1 parent a82e323 commit c5c9619

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

apps/kubernetes-provider/src/podCleaner.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export class PodCleaner {
1515
private logger = new SimpleLogger("[PodCleaner]");
1616
private k8sClient: {
1717
core: k8s.CoreV1Api;
18+
apps: k8s.AppsV1Api;
1819
kubeConfig: k8s.KubeConfig;
1920
};
2021

@@ -43,6 +44,7 @@ export class PodCleaner {
4344

4445
return {
4546
core: kubeConfig.makeApiClient(k8s.CoreV1Api),
47+
apps: kubeConfig.makeApiClient(k8s.AppsV1Api),
4648
kubeConfig: kubeConfig,
4749
};
4850
}
@@ -98,6 +100,25 @@ export class PodCleaner {
98100
.catch(this.#handleK8sError.bind(this));
99101
}
100102

103+
async #deleteDaemonSets(opts: {
104+
namespace: string;
105+
dryRun?: boolean;
106+
fieldSelector?: string;
107+
labelSelector?: string;
108+
}) {
109+
return await this.k8sClient.apps
110+
.deleteCollectionNamespacedDaemonSet(
111+
opts.namespace,
112+
undefined, // pretty
113+
undefined, // continue
114+
opts.dryRun ? "All" : undefined,
115+
opts.fieldSelector,
116+
undefined, // gracePeriodSeconds
117+
opts.labelSelector
118+
)
119+
.catch(this.#handleK8sError.bind(this));
120+
}
121+
101122
async #deleteCompletedRuns() {
102123
this.logger.log("Deleting completed runs");
103124

@@ -152,6 +173,28 @@ export class PodCleaner {
152173
});
153174
}
154175

176+
async #deleteCompletedPrePulls() {
177+
this.logger.log("Deleting completed pre-pulls");
178+
179+
const start = Date.now();
180+
181+
const result = await this.#deleteDaemonSets({
182+
namespace: this.namespace,
183+
labelSelector: "app=task-prepull",
184+
});
185+
186+
const elapsedMs = Date.now() - start;
187+
188+
if (!result) {
189+
this.logger.log("Deleting completed pre-pulls: No delete result", { elapsedMs });
190+
return;
191+
}
192+
193+
const total = (result.response as any)?.body?.items?.length ?? 0;
194+
195+
this.logger.log("Deleting completed pre-pulls: Done", { total, elapsedMs });
196+
}
197+
155198
async start() {
156199
this.enabled = true;
157200
this.logger.log("Starting");
@@ -186,6 +229,22 @@ export class PodCleaner {
186229
2 * this.intervalInSeconds * 1000
187230
);
188231

232+
const completedPrePullInterval = setInterval(
233+
async () => {
234+
if (!this.enabled) {
235+
clearInterval(completedPrePullInterval);
236+
return;
237+
}
238+
239+
try {
240+
await this.#deleteCompletedPrePulls();
241+
} catch (error) {
242+
this.logger.error("Error deleting completed pre-pulls", error);
243+
}
244+
},
245+
2 * this.intervalInSeconds * 1000
246+
);
247+
189248
// this.#launchTests();
190249
}
191250

0 commit comments

Comments
 (0)