From 5a58092168be995a31d9d49bb26b7e70caec068c Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Thu, 21 Oct 2021 16:32:45 +0100 Subject: [PATCH] no longer expose the storage task broker We can implement the task broker completely, so it is not neccessary to export it. This commit also addresses some review comments. Signed-off-by: Brian Fletcher --- plugins/scaffolder-backend/api-report.md | 178 ++++++++---------- plugins/scaffolder-backend/src/index.ts | 7 + .../src/scaffolder/index.ts | 25 +-- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 17 +- .../scaffolder/tasks/DefaultWorkflowRunner.ts | 8 +- .../scaffolder/tasks/LegacyWorkflowRunner.ts | 4 - .../tasks/StorageTaskBroker.test.ts | 6 +- .../src/scaffolder/tasks/StorageTaskBroker.ts | 27 +-- .../src/scaffolder/tasks/TaskWorker.ts | 58 +++++- .../src/scaffolder/tasks/index.ts | 4 +- .../src/scaffolder/tasks/types.ts | 56 +++--- .../scaffolder-backend/src/service/router.ts | 9 +- 12 files changed, 215 insertions(+), 184 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index e0e7ad7ee5..f47c550875 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -26,7 +26,6 @@ import { ScmIntegrationRegistry } from '@backstage/integration'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateEntityV1beta2 } from '@backstage/catalog-model'; import { UrlReader } from '@backstage/backend-common'; -import * as winston from 'winston'; import { Writable } from 'stream'; // Warning: (ae-forgotten-export) The symbol "InputBase" needs to be exported by the entry point index.d.ts @@ -57,6 +56,9 @@ export class CatalogEntityClient { ): Promise; } +// @public +export type CompletedTaskState = 'failed' | 'completed'; + // Warning: (ae-missing-release-tag) "createBuiltinActions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -191,11 +193,22 @@ export const createTemplateAction: < templateAction: TemplateAction, ) => TemplateAction; +// Warning: (ae-missing-release-tag) "CreateWorkerOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type CreateWorkerOptions = { + taskBroker: TaskBroker; + actionRegistry: TemplateActionRegistry; + integrations: ScmIntegrations; + workingDirectory: string; + logger: Logger_2; +}; + // @public export class DatabaseTaskStore implements TaskStore { constructor(db: Knex); // (undocumented) - claimTask(): Promise; + claimTask(): Promise; // (undocumented) completeTask({ taskId, @@ -218,14 +231,12 @@ export class DatabaseTaskStore implements TaskStore { // (undocumented) emitLogEvent({ taskId, body }: TaskStoreEmitOptions): Promise; // (undocumented) - getTask(taskId: string): Promise; + getTask(taskId: string): Promise; // (undocumented) heartbeatTask(taskId: string): Promise; - // Warning: (ae-forgotten-export) The symbol "TaskStoreGetEventsOptions" needs to be exported by the entry point index.d.ts - // // (undocumented) - listEvents({ taskId, after }: TaskStoreGetEventsOptions): Promise<{ - events: DbTaskEventRow[]; + listEvents({ taskId, after }: TaskStoreListEventsOptions): Promise<{ + events: SerializedTaskEvent[]; }>; // (undocumented) listStaleTasks({ timeoutS }: { timeoutS: number }): Promise<{ @@ -235,29 +246,6 @@ export class DatabaseTaskStore implements TaskStore { }>; } -// @public -export type DbTaskRow = { - id: string; - spec: TaskSpec; - status: Status; - createdAt: string; - lastHeartbeatAt?: string; - secrets?: TaskSecrets; -}; - -// Warning: (ae-forgotten-export) The symbol "WorkflowRunner" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "DefaultWorkflowRunner" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export class DefaultWorkflowRunner implements WorkflowRunner { - // Warning: (ae-forgotten-export) The symbol "Options" needs to be exported by the entry point index.d.ts - constructor(options: Options_3); - // Warning: (ae-forgotten-export) The symbol "WorkflowResponse" needs to be exported by the entry point index.d.ts - // - // (undocumented) - execute(task: Task): Promise; -} - // @public export type DispatchResult = { taskId: string; @@ -280,14 +268,6 @@ export function fetchContents({ outputPath: string; }): Promise; -// @public -export class LegacyWorkflowRunner implements WorkflowRunner { - // Warning: (ae-forgotten-export) The symbol "Options" needs to be exported by the entry point index.d.ts - constructor(options: Options_2); - // (undocumented) - execute(task: Task): Promise; -} - // Warning: (ae-missing-release-tag) "OctokitProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @@ -299,17 +279,6 @@ export class OctokitProvider { } // @public -export type RawDbTaskEventRow = { - id: number; - task_id: string; - body: string; - event_type: TaskEventType; - created_at: string; -}; - -// Warning: (ae-missing-release-tag) "RouterOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) export interface RouterOptions { // (undocumented) actions?: TemplateAction[]; @@ -353,6 +322,25 @@ export class ScaffolderEntitiesProcessor implements CatalogProcessor { validateEntityKind(entity: Entity): Promise; } +// @public +export type SerializedTask = { + id: string; + spec: TaskSpec; + status: Status; + createdAt: string; + lastHeartbeatAt?: string; + secrets?: TaskSecrets; +}; + +// @public +export type SerializedTaskEvent = { + id: number; + taskId: string; + body: JsonObject; + type: TaskEventType; + createdAt: string; +}; + // @public export type Status = | 'open' @@ -361,40 +349,8 @@ export type Status = | 'cancelled' | 'completed'; -// @public -export class StorageTaskBroker implements TaskBroker { - constructor(storage: TaskStore, logger: Logger_2); - // (undocumented) - claim(): Promise; - // (undocumented) - dispatch(spec: TaskSpec, secrets?: TaskSecrets): Promise; - // (undocumented) - get(taskId: string): Promise; - // (undocumented) - protected readonly logger: Logger_2; - // (undocumented) - observe( - options: { - taskId: string; - after: number | undefined; - }, - callback: ( - error: Error | undefined, - result: { - events: DbTaskEventRow[]; - }, - ) => void, - ): () => void; - // (undocumented) - protected readonly storage: TaskStore; - // (undocumented) - vacuumTasks(timeoutS: { timeoutS: number }): Promise; -} - // @public export interface Task { - // Warning: (ae-forgotten-export) The symbol "CompletedTaskState" needs to be exported by the entry point index.d.ts - // // (undocumented) complete(result: CompletedTaskState, metadata?: JsonValue): Promise; // (undocumented) @@ -409,14 +365,10 @@ export interface Task { spec: TaskSpec; } -// Warning: (ae-missing-release-tag) "TaskAgent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export class TaskAgent implements Task { // (undocumented) complete(result: CompletedTaskState, metadata?: JsonObject): Promise; - // Warning: (ae-forgotten-export) The symbol "TaskState" needs to be exported by the entry point index.d.ts - // // (undocumented) static create( state: TaskState, @@ -440,12 +392,9 @@ export interface TaskBroker { // (undocumented) claim(): Promise; // (undocumented) - dispatch( - spec: TaskSpec, - secretTaskSecretss?: TaskSecrets, - ): Promise; + dispatch(spec: TaskSpec, secrets?: TaskSecrets): Promise; // (undocumented) - get(taskId: string): Promise; + get(taskId: string): Promise; // (undocumented) observe( options: { @@ -455,7 +404,7 @@ export interface TaskBroker { callback: ( error: Error | undefined, result: { - events: DbTaskEventRow[]; + events: SerializedTaskEvent[]; }, ) => void, ): () => void; @@ -463,9 +412,6 @@ export interface TaskBroker { vacuumTasks(timeoutS: { timeoutS: number }): Promise; } -// @public -export type TaskEventType = 'completion' | 'log'; - // @public export type TaskSecrets = { token: string | undefined; @@ -514,10 +460,20 @@ export interface TaskSpecV1beta3 { steps: TaskStep[]; } +// @public +export interface TaskState { + // (undocumented) + secrets?: TaskSecrets; + // (undocumented) + spec: TaskSpec; + // (undocumented) + taskId: string; +} + // @public export interface TaskStore { // (undocumented) - claimTask(): Promise; + claimTask(): Promise; // (undocumented) completeTask(options: { taskId: string; @@ -534,12 +490,12 @@ export interface TaskStore { // (undocumented) emitLogEvent({ taskId, body }: TaskStoreEmitOptions): Promise; // (undocumented) - getTask(taskId: string): Promise; + getTask(taskId: string): Promise; // (undocumented) heartbeatTask(taskId: string): Promise; // (undocumented) - listEvents({ taskId, after }: TaskStoreGetEventsOptions): Promise<{ - events: DbTaskEventRow[]; + listEvents({ taskId, after }: TaskStoreListEventsOptions): Promise<{ + events: SerializedTaskEvent[]; }>; // (undocumented) listStaleTasks(options: { timeoutS: number }): Promise<{ @@ -555,16 +511,32 @@ export type TaskStoreEmitOptions = { body: JsonObject; }; +// @public +export type TaskStoreListEventsOptions = { + taskId: string; + after?: number | undefined; +}; + // @public export class TaskWorker { - // Warning: (ae-forgotten-export) The symbol "Options" needs to be exported by the entry point index.d.ts - constructor(options: Options); + constructor(options: TaskWorkerOptions); + // (undocumented) + static createWorker(options: CreateWorkerOptions): TaskWorker; // (undocumented) runOneTask(task: Task): Promise; // (undocumented) start(): void; } +// @public +export type TaskWorkerOptions = { + taskBroker: TaskBroker; + runners: { + legacyWorkflowRunner: LegacyWorkflowRunner; + workflowRunner: WorkflowRunner; + }; +}; + // Warning: (ae-missing-release-tag) "TemplateAction" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -594,5 +566,7 @@ export class TemplateActionRegistry { // Warnings were encountered during analysis: // -// src/scaffolder/tasks/DatabaseTaskStore.d.ts:51:9 - (ae-forgotten-export) The symbol "DbTaskEventRow" needs to be exported by the entry point index.d.ts +// src/scaffolder/tasks/TaskWorker.d.ts:14:9 - (ae-forgotten-export) The symbol "LegacyWorkflowRunner" needs to be exported by the entry point index.d.ts +// src/scaffolder/tasks/TaskWorker.d.ts:15:9 - (ae-forgotten-export) The symbol "WorkflowRunner" needs to be exported by the entry point index.d.ts +// src/scaffolder/tasks/types.d.ts:37:5 - (ae-forgotten-export) The symbol "TaskEventType" needs to be exported by the entry point index.d.ts ``` diff --git a/plugins/scaffolder-backend/src/index.ts b/plugins/scaffolder-backend/src/index.ts index 76cda63eef..4c31e9f982 100644 --- a/plugins/scaffolder-backend/src/index.ts +++ b/plugins/scaffolder-backend/src/index.ts @@ -24,3 +24,10 @@ export * from './scaffolder'; export * from './service/router'; export * from './lib/catalog'; export * from './processor'; +export { TaskAgent } from './scaffolder/tasks'; +export type { + TaskBroker, + DispatchResult, + TaskStore, + Task, +} from './scaffolder/tasks/types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/index.ts b/plugins/scaffolder-backend/src/scaffolder/index.ts index cf2a554189..b2599f20ed 100644 --- a/plugins/scaffolder-backend/src/scaffolder/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/index.ts @@ -14,27 +14,18 @@ * limitations under the License. */ export * from './actions'; -export { - TaskAgent, - DatabaseTaskStore, - StorageTaskBroker, - TaskWorker, - LegacyWorkflowRunner, - DefaultWorkflowRunner, -} from './tasks'; +export { DatabaseTaskStore, TaskWorker } from './tasks'; +export type { TaskWorkerOptions, CreateWorkerOptions } from './tasks'; +export type { TaskState } from './tasks'; export type { - Task, - TaskBroker, - TaskSpec, TaskSecrets, - DispatchResult, - TaskStore, + TaskSpec, + CompletedTaskState, TaskStoreEmitOptions, - DbTaskRow, + TaskStoreListEventsOptions, + SerializedTask, + SerializedTaskEvent, TaskSpecV1beta2, TaskSpecV1beta3, Status, - TaskEventType, } from './tasks/types'; - -export type { RawDbTaskEventRow } from './tasks/DatabaseTaskStore'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 8f659cad02..3aec10d949 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -20,15 +20,15 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; import { v4 as uuid } from 'uuid'; import { - DbTaskEventRow, - DbTaskRow, + SerializedTaskEvent, + SerializedTask, Status, TaskEventType, TaskSecrets, TaskSpec, TaskStore, TaskStoreEmitOptions, - TaskStoreGetEventsOptions, + TaskStoreListEventsOptions, } from './types'; import { DateTime } from 'luxon'; @@ -46,10 +46,6 @@ export type RawDbTaskRow = { secrets?: string; }; -/** - * RawDbTaskEventRow - * @public - */ export type RawDbTaskEventRow = { id: number; task_id: string; @@ -60,6 +56,7 @@ export type RawDbTaskEventRow = { /** * DatabaseTaskStore + * * @public */ export class DatabaseTaskStore implements TaskStore { @@ -72,7 +69,7 @@ export class DatabaseTaskStore implements TaskStore { constructor(private readonly db: Knex) {} - async getTask(taskId: string): Promise { + async getTask(taskId: string): Promise { const [result] = await this.db('tasks') .where({ id: taskId }) .select(); @@ -109,7 +106,7 @@ export class DatabaseTaskStore implements TaskStore { return { taskId }; } - async claimTask(): Promise { + async claimTask(): Promise { return this.db.transaction(async tx => { const [task] = await tx('tasks') .where({ @@ -251,7 +248,7 @@ export class DatabaseTaskStore implements TaskStore { async listEvents({ taskId, after, - }: TaskStoreGetEventsOptions): Promise<{ events: DbTaskEventRow[] }> { + }: TaskStoreListEventsOptions): Promise<{ events: SerializedTaskEvent[] }> { const rawEvents = await this.db('task_events') .where({ task_id: taskId, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DefaultWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DefaultWorkflowRunner.ts index 7b2b437be2..145ded6bc0 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DefaultWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DefaultWorkflowRunner.ts @@ -34,7 +34,7 @@ import { validate as validateJsonSchema } from 'jsonschema'; import { parseRepoUrl } from '../actions/builtin/publish/util'; import { TemplateActionRegistry } from '../actions'; -type Options = { +type NunjucksWorkflowRunnerOptions = { workingDirectory: string; actionRegistry: TemplateActionRegistry; integrations: ScmIntegrations; @@ -77,10 +77,6 @@ const createStepLogger = ({ task, step }: { task: Task; step: TaskStep }) => { return { taskLogger, streamLogger }; }; -/* - * DefaultWorkflowRunner - * @public - */ export class DefaultWorkflowRunner implements WorkflowRunner { private readonly nunjucks: nunjucks.Environment; @@ -92,7 +88,7 @@ export class DefaultWorkflowRunner implements WorkflowRunner { }, }; - constructor(private readonly options: Options) { + constructor(private readonly options: NunjucksWorkflowRunnerOptions) { this.nunjucks = nunjucks.configure(this.nunjucksOptions); // TODO(blam): let's work out how we can deprecate these. diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/LegacyWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/LegacyWorkflowRunner.ts index e71fe596cd..97e3a4dec4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/LegacyWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/LegacyWorkflowRunner.ts @@ -43,13 +43,9 @@ type Options = { const isValidTaskSpec = (taskSpec: TaskSpec): taskSpec is TaskSpecV1beta2 => taskSpec.apiVersion === 'backstage.io/v1beta2'; - /** * This is the legacy workflow runner, which supports handlebars. This entire implementation will be replaced * with the default workflow runner interface in the future so this entire thing can go bye bye. - * - * LegacyWorkflowRunner - * @public */ export class LegacyWorkflowRunner implements WorkflowRunner { private readonly handlebars: typeof Handlebars; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts index 1a4d0d68c5..183253ea0e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts @@ -18,7 +18,7 @@ import { getVoidLogger, DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { DatabaseTaskStore } from './DatabaseTaskStore'; import { StorageTaskBroker, TaskAgent } from './StorageTaskBroker'; -import { TaskSecrets, TaskSpec, DbTaskEventRow } from './types'; +import { TaskSecrets, TaskSpec, SerializedTaskEvent } from './types'; async function createStore(): Promise { const manager = DatabaseManager.fromConfig( @@ -127,8 +127,8 @@ describe('StorageTaskBroker', () => { const { taskId } = await broker1.dispatch({} as TaskSpec); - const logPromise = new Promise(resolve => { - const observedEvents = new Array(); + const logPromise = new Promise(resolve => { + const observedEvents = new Array(); broker2.observe({ taskId, after: undefined }, (_err, { events }) => { observedEvents.push(...events); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 59f605702d..af1f3752e1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -23,11 +23,13 @@ import { TaskStore, TaskBroker, DispatchResult, - DbTaskEventRow, - DbTaskRow, + SerializedTaskEvent, + SerializedTask, } from './types'; -/* +/** + * TaskAgent + * * @public */ export class TaskAgent implements Task { @@ -106,7 +108,12 @@ export class TaskAgent implements Task { } } -interface TaskState { +/** + * TaskState + * + * @public + */ +export interface TaskState { spec: TaskSpec; taskId: string; secrets?: TaskSecrets; @@ -120,14 +127,10 @@ function defer() { return { promise, resolve }; } -/** - * StorageTaskBroker - * @public - */ export class StorageTaskBroker implements TaskBroker { constructor( - protected readonly storage: TaskStore, - protected readonly logger: Logger, + private readonly storage: TaskStore, + private readonly logger: Logger, ) {} private deferredDispatch = defer(); @@ -161,7 +164,7 @@ export class StorageTaskBroker implements TaskBroker { }; } - async get(taskId: string): Promise { + async get(taskId: string): Promise { return this.storage.getTask(taskId); } @@ -172,7 +175,7 @@ export class StorageTaskBroker implements TaskBroker { }, callback: ( error: Error | undefined, - result: { events: DbTaskEventRow[] }, + result: { events: SerializedTaskEvent[] }, ) => void, ): () => void { const { taskId } = options; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 1f6d9d3381..65ba71e9fe 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -13,10 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Task, TaskBroker, WorkflowRunner } from './types'; import { LegacyWorkflowRunner } from './LegacyWorkflowRunner'; +import { DefaultWorkflowRunner } from './DefaultWorkflowRunner'; +import { Logger } from 'winston'; +import { TemplateActionRegistry } from '../actions'; +import { ScmIntegrations } from '@backstage/integration'; -type Options = { +/** + * TaskWorkerOptions + * + * @public + */ +export type TaskWorkerOptions = { taskBroker: TaskBroker; runners: { legacyWorkflowRunner: LegacyWorkflowRunner; @@ -24,12 +34,56 @@ type Options = { }; }; +/** + * CreateWorkerOptions + * + * @public + */ +export type CreateWorkerOptions = { + taskBroker: TaskBroker; + actionRegistry: TemplateActionRegistry; + integrations: ScmIntegrations; + workingDirectory: string; + logger: Logger; +}; + /** * TaskWorker + * * @public */ export class TaskWorker { - constructor(private readonly options: Options) {} + constructor(private readonly options: TaskWorkerOptions) {} + + static createWorker(options: CreateWorkerOptions) { + const { + taskBroker, + logger, + actionRegistry, + integrations, + workingDirectory, + } = options; + + const legacyWorkflowRunner = new LegacyWorkflowRunner({ + logger, + actionRegistry, + integrations, + workingDirectory, + }); + + const workflowRunner = new DefaultWorkflowRunner({ + actionRegistry, + integrations, + logger, + workingDirectory, + }); + + return new TaskWorker({ + taskBroker: taskBroker, + runners: { legacyWorkflowRunner, workflowRunner }, + }); + } + start() { (async () => { for (;;) { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts index c068e8d7e1..ada12df476 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts @@ -16,6 +16,6 @@ export { DatabaseTaskStore } from './DatabaseTaskStore'; export { StorageTaskBroker, TaskAgent } from './StorageTaskBroker'; +export type { TaskState } from './StorageTaskBroker'; export { TaskWorker } from './TaskWorker'; -export { LegacyWorkflowRunner } from './LegacyWorkflowRunner'; -export { DefaultWorkflowRunner } from './DefaultWorkflowRunner'; +export type { TaskWorkerOptions, CreateWorkerOptions } from './TaskWorker'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 63b409e7ca..e30d156736 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -18,6 +18,7 @@ import { JsonValue, JsonObject } from '@backstage/config'; /** * Status + * * @public */ export type Status = @@ -27,13 +28,19 @@ export type Status = | 'cancelled' | 'completed'; +/** + * CompletedTaskState + * + * @public + */ export type CompletedTaskState = 'failed' | 'completed'; /** - * DbTaskRow + * SerializedTask + * * @public */ -export type DbTaskRow = { +export type SerializedTask = { id: string; spec: TaskSpec; status: Status; @@ -42,17 +49,14 @@ export type DbTaskRow = { secrets?: TaskSecrets; }; -/** - * TaskEventType - * @public - */ export type TaskEventType = 'completion' | 'log'; /** - * DbTaskEventRow + * SerializedTaskEvent + * * @public */ -export type DbTaskEventRow = { +export type SerializedTaskEvent = { id: number; taskId: string; body: JsonObject; @@ -62,6 +66,7 @@ export type DbTaskEventRow = { /** * TaskSpecV1beta2 + * * @public */ export interface TaskSpecV1beta2 { @@ -88,6 +93,7 @@ export interface TaskStep { /** * TaskSpecV1beta3 + * * @public */ export interface TaskSpecV1beta3 { @@ -100,12 +106,14 @@ export interface TaskSpecV1beta3 { /** * TaskSpec + * * @public */ export type TaskSpec = TaskSpecV1beta2 | TaskSpecV1beta3; /** * TaskSecrets + * * @public */ export type TaskSecrets = { @@ -114,6 +122,7 @@ export type TaskSecrets = { /** * DispatchResult + * * @public */ export type DispatchResult = { @@ -122,6 +131,7 @@ export type DispatchResult = { /** * Task + * * @public */ export interface Task { @@ -135,14 +145,12 @@ export interface Task { /** * TaskBroker + * * @public */ export interface TaskBroker { claim(): Promise; - dispatch( - spec: TaskSpec, - secretTaskSecretss?: TaskSecrets, - ): Promise; + dispatch(spec: TaskSpec, secrets?: TaskSecrets): Promise; vacuumTasks(timeoutS: { timeoutS: number }): Promise; observe( options: { @@ -151,15 +159,15 @@ export interface TaskBroker { }, callback: ( error: Error | undefined, - result: { events: DbTaskEventRow[] }, + result: { events: SerializedTaskEvent[] }, ) => void, ): () => void; - - get(taskId: string): Promise; + get(taskId: string): Promise; } /** * TaskStoreEmitOptions + * * @public */ export type TaskStoreEmitOptions = { @@ -167,13 +175,19 @@ export type TaskStoreEmitOptions = { body: JsonObject; }; -export type TaskStoreGetEventsOptions = { +/** + * TaskStoreListEventsOptions + * + * @public + */ +export type TaskStoreListEventsOptions = { taskId: string; after?: number | undefined; }; /** * TaskStore + * * @public */ export interface TaskStore { @@ -181,8 +195,8 @@ export interface TaskStore { task: TaskSpec, secrets?: TaskSecrets, ): Promise<{ taskId: string }>; - getTask(taskId: string): Promise; - claimTask(): Promise; + getTask(taskId: string): Promise; + claimTask(): Promise; completeTask(options: { taskId: string; status: Status; @@ -197,14 +211,10 @@ export interface TaskStore { listEvents({ taskId, after, - }: TaskStoreGetEventsOptions): Promise<{ events: DbTaskEventRow[] }>; + }: TaskStoreListEventsOptions): Promise<{ events: SerializedTaskEvent[] }>; } export type WorkflowResponse = { output: { [key: string]: JsonValue } }; -/* - * WorkflowRunner - * @public - */ export interface WorkflowRunner { execute(task: Task): Promise; } diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index afc9cee986..d4d4dd0486 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -26,7 +26,6 @@ import { TaskWorker, } from '../scaffolder/tasks'; import { TemplateActionRegistry } from '../scaffolder/actions/TemplateActionRegistry'; -import { TaskBroker } from '../scaffolder'; import { getEntityBaseUrl, getWorkingDirectory } from './helpers'; import { ContainerRunner, @@ -41,11 +40,15 @@ import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateAction } from '../scaffolder/actions'; import { createBuiltinActions } from '../scaffolder/actions/builtin/createBuiltinActions'; - import { LegacyWorkflowRunner } from '../scaffolder/tasks/LegacyWorkflowRunner'; import { DefaultWorkflowRunner } from '../scaffolder/tasks/DefaultWorkflowRunner'; -import { TaskSpec } from '../scaffolder/tasks/types'; +import { TaskBroker, TaskSpec } from '../scaffolder/tasks/types'; +/** + * RouterOptions + * + * @public + */ export interface RouterOptions { logger: Logger; config: Config;