Made shut down stale tasks configurable.

Signed-off-by: Bogdan Nechyporenko <bnechyporenko@bol.com>
This commit is contained in:
Bogdan Nechyporenko
2023-10-14 23:13:04 +02:00
committed by Fredrik Adelöw
parent 739de82471
commit de7513e7fa
2 changed files with 36 additions and 5 deletions
@@ -32,7 +32,7 @@ import {
scaffolderTaskBrokerExtensionPoint,
scaffolderTemplatingExtensionPoint,
} from '@backstage/plugin-scaffolder-node/alpha';
import { createBuiltinActions } from './scaffolder';
import { createBuiltinActions, DatabaseTaskStore } from './scaffolder';
import { createRouter } from './service/router';
/**
@@ -75,6 +75,7 @@ export const scaffolderPlugin = createBackendPlugin({
deps: {
logger: coreServices.logger,
config: coreServices.rootConfig,
lifecycle: coreServices.lifecycle,
reader: coreServices.urlReader,
permissions: coreServices.permissions,
database: coreServices.database,
@@ -84,6 +85,7 @@ export const scaffolderPlugin = createBackendPlugin({
async init({
logger,
config,
lifecycle,
reader,
database,
httpRouter,
@@ -104,6 +106,26 @@ export const scaffolderPlugin = createBackendPlugin({
}),
];
lifecycle.addShutdownHook(async () => {
const databaseTaskStore = await DatabaseTaskStore.create({
database,
});
const { tasks: pendingTasks } = await databaseTaskStore.list({
status: 'processing',
});
if (pendingTasks.length > 0) {
await Promise.all(
pendingTasks.map(task =>
databaseTaskStore.shutdownTask({ taskId: task.id }),
),
);
logger.info(
`Successfully shut ${pendingTasks.length} processing tasks down.`,
);
}
});
const actionIds = actions.map(action => action.id).join(', ');
log.info(
`Starting scaffolder with the following actions enabled ${actionIds}`,
@@ -23,10 +23,6 @@ import { ConflictError, NotFoundError } from '@backstage/errors';
import { Knex } from 'knex';
import { v4 as uuid } from 'uuid';
import {
SerializedTaskEvent,
SerializedTask,
TaskStatus,
TaskEventType,
TaskStore,
TaskStoreEmitOptions,
TaskStoreListEventsOptions,
@@ -34,6 +30,12 @@ import {
TaskStoreCreateTaskResult,
TaskStoreShutDownTaskOptions,
} from './types';
import {
SerializedTaskEvent,
SerializedTask,
TaskStatus,
TaskEventType,
} from '@backstage/plugin-scaffolder-node';
import { DateTime } from 'luxon';
const migrationsDir = resolvePackagePath(
@@ -147,6 +149,7 @@ export class DatabaseTaskStore implements TaskStore {
async list(options: {
createdBy?: string;
status?: TaskStatus;
}): Promise<{ tasks: SerializedTask[] }> {
const queryBuilder = this.db<RawDbTaskRow>('tasks');
@@ -156,6 +159,12 @@ export class DatabaseTaskStore implements TaskStore {
});
}
if (options.status) {
queryBuilder.where({
status: options.status,
});
}
const results = await queryBuilder.orderBy('created_at', 'desc').select();
const tasks = results.map(result => ({