diff --git a/packages/cleaner/src/bin/www.ts b/packages/cleaner/src/bin/www.ts index 5ba3de60..42ce84ef 100644 --- a/packages/cleaner/src/bin/www.ts +++ b/packages/cleaner/src/bin/www.ts @@ -1,3 +1,4 @@ +import type { TimeRange } from "../lib/cloudRun"; import runJob from "../job"; import logger from '../lib/logger'; @@ -8,7 +9,11 @@ import logger from '../lib/logger'; throw new Error('GCP_PROJECT_ID is required'); } - const serviceNamesToDelete = await runJob(process.env.GCP_PROJECT_ID, process.env.DRY_RUN === 'true') + const serviceNamesToDelete = await runJob({ + projectId: process.env.GCP_PROJECT_ID, + dryRun: process.env.DRY_RUN === 'true', + timeRange: process.env.TIME_RANGE as TimeRange, + }) if (serviceNamesToDelete.length === 0) { logger.warn('Skipping: No services to delete'); } else { diff --git a/packages/cleaner/src/job.ts b/packages/cleaner/src/job.ts index 763ee749..a41b07b3 100644 --- a/packages/cleaner/src/job.ts +++ b/packages/cleaner/src/job.ts @@ -8,7 +8,17 @@ import logger from './lib/logger'; * @param dryRun If true, the job will not delete any services * @returns The service names that were deleted */ -async function runJob(projectId: string, dryRun: boolean = false) { +async function runJob(payload: { + projectId: string, + dryRun: boolean, + timeRange?: cloudRun.TimeRange, +}) { + const { + projectId, + dryRun, + timeRange = '30 days' + } = payload; + const services = await cloudRun.listServices( cloudRun.buildParent(projectId), [ @@ -21,7 +31,7 @@ async function runJob(projectId: string, dryRun: boolean = false) { { field: 'age', operation: 'greaterThanOrEqualTo', - value: '30 days', + value: timeRange, } ] ); diff --git a/packages/cleaner/src/lib/cloudRun.ts b/packages/cleaner/src/lib/cloudRun.ts index dd718cc7..f23820fa 100644 --- a/packages/cleaner/src/lib/cloudRun.ts +++ b/packages/cleaner/src/lib/cloudRun.ts @@ -107,10 +107,12 @@ export type FilterOperation = | 'lessThan' | 'equalTo'; -export interface FilterCreatedAt { +export type TimeRange = `${number} ${'days' | 'hours' | 'min' | 'seconds'}`; + +export interface FilterAge { field: 'age'; operation: FilterOperation; - value: `${number} ${'days' | 'hours' | 'min' | 'seconds'}`; + value: TimeRange; } export interface FilterName { @@ -127,7 +129,7 @@ export interface FilterLabels { } export type Filter = - | FilterCreatedAt + | FilterAge | FilterName | FilterLabels; @@ -148,7 +150,7 @@ export interface Service { * @param value A filter value * @returns A age value in milliseconds */ -export function getCreationAgeValue(value: FilterCreatedAt['value']): number { +export function getCreationAgeValue(value: FilterAge['value']): number { const [duration, unit] = value.split(' '); const multiplier = { days: 86400000,