From 0988c86166e5079d528b29d7015338c57848c0b1 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 18 Feb 2022 13:03:53 +0100 Subject: [PATCH 1/6] chore: constructor for DatabaseTaskStore is now private Signed-off-by: blam --- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index dcda3b921e..8fe98da53f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -80,7 +80,7 @@ export class DatabaseTaskStore implements TaskStore { return new DatabaseTaskStore(options); } - constructor(options: DatabaseTaskStoreOptions) { + private constructor(options: DatabaseTaskStoreOptions) { this.db = options.database; } From 3cdd27b4c76d2340da1bfbe9e0d5647e2ae3c0ec Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 18 Feb 2022 13:13:31 +0100 Subject: [PATCH 2/6] chore: renaming some types that are exported and moving across Signed-off-by: blam --- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 6 ++--- .../src/scaffolder/tasks/StorageTaskBroker.ts | 4 ++-- .../src/scaffolder/tasks/index.ts | 2 ++ .../src/scaffolder/tasks/types.ts | 24 +++++++++++++++---- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 8fe98da53f..173fbb7778 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -22,7 +22,7 @@ import { v4 as uuid } from 'uuid'; import { SerializedTaskEvent, SerializedTask, - Status, + TaskStatus, TaskEventType, TaskSecrets, TaskSpec, @@ -40,7 +40,7 @@ const migrationsDir = resolvePackagePath( export type RawDbTaskRow = { id: string; spec: string; - status: Status; + status: TaskStatus; last_heartbeat_at?: string; created_at: string; secrets?: string | null; @@ -202,7 +202,7 @@ export class DatabaseTaskStore implements TaskStore { eventBody, }: { taskId: string; - status: Status; + status: TaskStatus; eventBody: JsonObject; }): Promise { let oldStatus: string; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 7e7ebe5436..7f09623cb5 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -17,7 +17,7 @@ import { JsonObject } from '@backstage/types'; import { assertError } from '@backstage/errors'; import { Logger } from 'winston'; import { - CompletedTaskState, + TaskCompletionState, TaskContext, TaskSecrets, TaskSpec, @@ -75,7 +75,7 @@ export class TaskManager implements TaskContext { } async complete( - result: CompletedTaskState, + result: TaskCompletionState, metadata?: JsonObject, ): Promise { await this.storage.completeTask({ diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts index f563a08df6..47507b8c9c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts @@ -21,6 +21,7 @@ export type { CreateWorkerOptions } from './TaskWorker'; export type { TaskSecrets, TaskSpec, + TaskCompletionState, CompletedTaskState, TaskStoreEmitOptions, TaskStoreListEventsOptions, @@ -29,6 +30,7 @@ export type { TaskSpecV1beta2, TaskSpecV1beta3, Status, + TaskStatus, TaskEventType, TaskBroker, TaskContext, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 8b28fe562c..abb3fe45ef 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -32,11 +32,11 @@ export type { }; /** - * Status + * The status of each step of the Task * * @public */ -export type Status = +export type TaskStatus = | 'open' | 'processing' | 'failed' @@ -44,11 +44,27 @@ export type Status = | 'completed'; /** - * CompletedTaskState + * The status of each step of the Task + * + * @public + * @deprecated use TaskStatus instead + */ +export type Status = TaskStatus; + +/** + * The state of a completed task. * * @public */ -export type CompletedTaskState = 'failed' | 'completed'; +export type TaskCompletionState = 'failed' | 'completed'; + +/** + * The state of a completed task. + * + * @public + * @deprecated use TaskCompletionState instead + */ +export type CompletedTaskState = TaskCompletionState; /** * SerializedTask From a7e01ab339913ea90837b5aba29c1556b15c2572 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 18 Feb 2022 13:34:28 +0100 Subject: [PATCH 3/6] make some breaking changes to TaskStore and TaskBroker Signed-off-by: blam --- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 13 +++-- .../tasks/StorageTaskBroker.test.ts | 27 +++++----- .../src/scaffolder/tasks/StorageTaskBroker.ts | 9 ++-- .../src/scaffolder/tasks/TaskWorker.test.ts | 36 +++++++------ .../src/scaffolder/tasks/index.ts | 2 + .../src/scaffolder/tasks/types.ts | 53 +++++++++++++++---- .../scaffolder-backend/src/service/router.ts | 9 ++-- 7 files changed, 98 insertions(+), 51 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 173fbb7778..389ecae5c6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -24,11 +24,11 @@ import { SerializedTask, TaskStatus, TaskEventType, - TaskSecrets, - TaskSpec, TaskStore, TaskStoreEmitOptions, TaskStoreListEventsOptions, + TaskStoreCreateTaskOptions, + TaskStoreCreateTaskResult, } from './types'; import { DateTime } from 'luxon'; @@ -108,14 +108,13 @@ export class DatabaseTaskStore implements TaskStore { } async createTask( - spec: TaskSpec, - secrets?: TaskSecrets, - ): Promise<{ taskId: string }> { + options: TaskStoreCreateTaskOptions, + ): Promise { const taskId = uuid(); await this.db('tasks').insert({ id: taskId, - spec: JSON.stringify(spec), - secrets: secrets ? JSON.stringify(secrets) : undefined, + spec: JSON.stringify(options.spec), + secrets: options.secrets ? JSON.stringify(options.secrets) : undefined, status: 'open', }); return { taskId }; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts index 93285a4ab3..daf444cdd8 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts @@ -47,7 +47,7 @@ describe('StorageTaskBroker', () => { const logger = getVoidLogger(); it('should claim a dispatched work item', async () => { const broker = new StorageTaskBroker(storage, logger); - await broker.dispatch({} as TaskSpec); + await broker.dispatch({ spec: {} as TaskSpec }); await expect(broker.claim()).resolves.toEqual(expect.any(TaskManager)); }); @@ -57,15 +57,15 @@ describe('StorageTaskBroker', () => { await expect(Promise.race([promise, 'waiting'])).resolves.toBe('waiting'); - await broker.dispatch({} as TaskSpec); + await broker.dispatch({ spec: {} as TaskSpec }); await expect(promise).resolves.toEqual(expect.any(TaskManager)); }); it('should dispatch multiple items and claim them in order', async () => { const broker = new StorageTaskBroker(storage, logger); - await broker.dispatch({ steps: [{ id: 'a' }] } as TaskSpec); - await broker.dispatch({ steps: [{ id: 'b' }] } as TaskSpec); - await broker.dispatch({ steps: [{ id: 'c' }] } as TaskSpec); + await broker.dispatch({ spec: { steps: [{ id: 'a' }] } as TaskSpec }); + await broker.dispatch({ spec: { steps: [{ id: 'b' }] } as TaskSpec }); + await broker.dispatch({ spec: { steps: [{ id: 'c' }] } as TaskSpec }); const taskA = await broker.claim(); const taskB = await broker.claim(); @@ -80,14 +80,14 @@ describe('StorageTaskBroker', () => { it('should store secrets', async () => { const broker = new StorageTaskBroker(storage, logger); - await broker.dispatch({} as TaskSpec, fakeSecrets); + await broker.dispatch({ spec: {} as TaskSpec, secrets: fakeSecrets }); const task = await broker.claim(); expect(task.secrets).toEqual(fakeSecrets); }, 10000); it('should complete a task', async () => { const broker = new StorageTaskBroker(storage, logger); - const dispatchResult = await broker.dispatch({} as TaskSpec); + const dispatchResult = await broker.dispatch({ spec: {} as TaskSpec }); const task = await broker.claim(); await task.complete('completed'); const taskRow = await storage.getTask(dispatchResult.taskId); @@ -96,7 +96,10 @@ describe('StorageTaskBroker', () => { it('should remove secrets after picking up a task', async () => { const broker = new StorageTaskBroker(storage, logger); - const dispatchResult = await broker.dispatch({} as TaskSpec, fakeSecrets); + const dispatchResult = await broker.dispatch({ + spec: {} as TaskSpec, + secrets: fakeSecrets, + }); await broker.claim(); const taskRow = await storage.getTask(dispatchResult.taskId); @@ -105,7 +108,7 @@ describe('StorageTaskBroker', () => { it('should fail a task', async () => { const broker = new StorageTaskBroker(storage, logger); - const dispatchResult = await broker.dispatch({} as TaskSpec); + const dispatchResult = await broker.dispatch({ spec: {} as TaskSpec }); const task = await broker.claim(); await task.complete('failed'); const taskRow = await storage.getTask(dispatchResult.taskId); @@ -116,7 +119,7 @@ describe('StorageTaskBroker', () => { const broker1 = new StorageTaskBroker(storage, logger); const broker2 = new StorageTaskBroker(storage, logger); - const { taskId } = await broker1.dispatch({} as TaskSpec); + const { taskId } = await broker1.dispatch({ spec: {} as TaskSpec }); const logPromise = new Promise(resolve => { const observedEvents = new Array(); @@ -155,7 +158,7 @@ describe('StorageTaskBroker', () => { it('should heartbeat', async () => { const broker = new StorageTaskBroker(storage, logger); - const { taskId } = await broker.dispatch({} as TaskSpec); + const { taskId } = await broker.dispatch({ spec: {} as TaskSpec }); const task = await broker.claim(); const initialTask = await storage.getTask(taskId); @@ -173,7 +176,7 @@ describe('StorageTaskBroker', () => { it('should be update the status to failed if heartbeat fails', async () => { const broker = new StorageTaskBroker(storage, logger); - const { taskId } = await broker.dispatch({} as TaskSpec); + const { taskId } = await broker.dispatch({ spec: {} as TaskSpec }); const task = await broker.claim(); jest diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 7f09623cb5..49c1056727 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -23,10 +23,10 @@ import { TaskSpec, TaskStore, TaskBroker, - DispatchResult, SerializedTaskEvent, SerializedTask, } from './types'; +import { TaskBrokerDispatchOptions } from '.'; /** * TaskManager @@ -155,10 +155,9 @@ export class StorageTaskBroker implements TaskBroker { } async dispatch( - spec: TaskSpec, - secrets?: TaskSecrets, - ): Promise { - const taskRow = await this.storage.createTask(spec, secrets); + options: TaskBrokerDispatchOptions, + ): Promise<{ taskId: string }> { + const taskRow = await this.storage.createTask(options); this.signalDispatch(); return { taskId: taskRow.taskId, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index 9b6baf3b84..9ff6b9c8a1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -91,12 +91,14 @@ describe('TaskWorker', () => { }); await broker.dispatch({ - apiVersion: 'backstage.io/v1beta2', - steps: [{ id: 'test', name: 'test', action: 'not-found-action' }], - output: { - result: '{{ steps.test.output.testOutput }}', + spec: { + apiVersion: 'backstage.io/v1beta2', + steps: [{ id: 'test', name: 'test', action: 'not-found-action' }], + output: { + result: '{{ steps.test.output.testOutput }}', + }, + values: {}, }, - values: {}, }); const task = await broker.claim(); @@ -122,12 +124,14 @@ describe('TaskWorker', () => { }); await broker.dispatch({ - apiVersion: 'scaffolder.backstage.io/v1beta3', - steps: [{ id: 'test', name: 'test', action: 'not-found-action' }], - output: { - result: '{{ steps.test.output.testOutput }}', + spec: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [{ id: 'test', name: 'test', action: 'not-found-action' }], + output: { + result: '{{ steps.test.output.testOutput }}', + }, + parameters: {}, }, - parameters: {}, }); const task = await broker.claim(); @@ -151,12 +155,14 @@ describe('TaskWorker', () => { }); const { taskId } = await broker.dispatch({ - apiVersion: 'scaffolder.backstage.io/v1beta3', - steps: [{ id: 'test', name: 'test', action: 'not-found-action' }], - output: { - result: '{{ steps.test.output.testOutput }}', + spec: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [{ id: 'test', name: 'test', action: 'not-found-action' }], + output: { + result: '{{ steps.test.output.testOutput }}', + }, + parameters: {}, }, - parameters: {}, }); const task = await broker.claim(); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts index 47507b8c9c..be1eaef643 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts @@ -36,5 +36,7 @@ export type { TaskContext, TaskStore, DispatchResult, + TaskBrokerDispatchResult, + TaskBrokerDispatchOptions, TemplateMetadata, } from './types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index abb3fe45ef..147fa359d2 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -74,7 +74,7 @@ export type CompletedTaskState = TaskCompletionState; export type SerializedTask = { id: string; spec: TaskSpec; - status: Status; + status: TaskStatus; createdAt: string; lastHeartbeatAt?: string; secrets?: TaskSecrets; @@ -110,14 +110,31 @@ export type TaskSecrets = Record & { }; /** - * DispatchResult + * The result of the TaskBroker Dispatch * * @public */ -export type DispatchResult = { +export type TaskBrokerDispatchResult = { taskId: string; }; +/** + * The options passed to TaskBroker Dispatch + * Currently a spec and optional secrets + * + * @public + */ +export type TaskBrokerDispatchOptions = { + spec: TaskSpec; + secrets?: TaskSecrets; +}; + +/** + * DispatchResult + * @deprecated use TaskBrokerDispatchResult instead + */ +export type DispatchResult = TaskBrokerDispatchResult; + /** * Task * @@ -128,7 +145,7 @@ export interface TaskContext { secrets?: TaskSecrets; done: boolean; emitLog(message: string, metadata?: JsonValue): Promise; - complete(result: CompletedTaskState, metadata?: JsonValue): Promise; + complete(result: TaskCompletionState, metadata?: JsonValue): Promise; getWorkspaceName(): Promise; } @@ -139,7 +156,9 @@ export interface TaskContext { */ export interface TaskBroker { claim(): Promise; - dispatch(spec: TaskSpec, secrets?: TaskSecrets): Promise; + dispatch( + options: TaskBrokerDispatchOptions, + ): Promise; vacuumTasks(timeoutS: { timeoutS: number }): Promise; observe( options: { @@ -174,6 +193,23 @@ export type TaskStoreListEventsOptions = { after?: number | undefined; }; +/** + * The options passed to TaskStore create + * @public + */ +export type TaskStoreCreateTaskOptions = { + spec: TaskSpec; + secrets?: TaskSecrets; +}; + +/** + * The response from TaskStoreCreate + * @public + */ +export type TaskStoreCreateTaskResult = { + taskId: string; +}; + /** * TaskStore * @@ -181,14 +217,13 @@ export type TaskStoreListEventsOptions = { */ export interface TaskStore { createTask( - task: TaskSpec, - secrets?: TaskSecrets, - ): Promise<{ taskId: string }>; + options: TaskStoreCreateTaskOptions, + ): Promise; getTask(taskId: string): Promise; claimTask(): Promise; completeTask(options: { taskId: string; - status: Status; + status: TaskStatus; eventBody: JsonObject; }): Promise; heartbeatTask(taskId: string): Promise; diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 8a3645cf31..371fc47dc2 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -266,9 +266,12 @@ export async function createRouter( ); } - const result = await taskBroker.dispatch(taskSpec, { - ...req.body.secrets, - backstageToken: token, + const result = await taskBroker.dispatch({ + spec: taskSpec, + secrets: { + ...req.body.secrets, + backstageToken: token, + }, }); res.status(201).json({ id: result.taskId }); From 7f193ff0193c915168ae0b8f9f94e0c8b390b189 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 18 Feb 2022 13:40:22 +0100 Subject: [PATCH 4/6] chore: fix the types and update the api-report Signed-off-by: blam --- .changeset/gentle-ghosts-love.md | 5 ++ .changeset/tender-apricots-fetch.md | 5 ++ plugins/scaffolder-backend/api-report.md | 81 ++++++++++++------- .../src/scaffolder/tasks/index.ts | 2 + .../src/scaffolder/tasks/types.ts | 2 + 5 files changed, 65 insertions(+), 30 deletions(-) create mode 100644 .changeset/gentle-ghosts-love.md create mode 100644 .changeset/tender-apricots-fetch.md diff --git a/.changeset/gentle-ghosts-love.md b/.changeset/gentle-ghosts-love.md new file mode 100644 index 0000000000..b0727512d6 --- /dev/null +++ b/.changeset/gentle-ghosts-love.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +breaking diff --git a/.changeset/tender-apricots-fetch.md b/.changeset/tender-apricots-fetch.md new file mode 100644 index 0000000000..fe52e688da --- /dev/null +++ b/.changeset/tender-apricots-fetch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +smaller diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 14b422048d..c0ff3b3f2b 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -50,8 +50,8 @@ export type ActionContext = { templateInfo?: TemplateInfo; }; -// @public -export type CompletedTaskState = 'failed' | 'completed'; +// @public @deprecated +export type CompletedTaskState = TaskCompletionState; // Warning: (ae-missing-release-tag) "createBuiltinActions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -315,7 +315,6 @@ export type CreateWorkerOptions = { // @public export class DatabaseTaskStore implements TaskStore { - constructor(options: DatabaseTaskStoreOptions); // (undocumented) claimTask(): Promise; // (undocumented) @@ -325,7 +324,7 @@ export class DatabaseTaskStore implements TaskStore { eventBody, }: { taskId: string; - status: Status; + status: TaskStatus; eventBody: JsonObject; }): Promise; // Warning: (ae-forgotten-export) The symbol "DatabaseTaskStoreOptions" needs to be exported by the entry point index.d.ts @@ -334,11 +333,8 @@ export class DatabaseTaskStore implements TaskStore { static create(options: DatabaseTaskStoreOptions): Promise; // (undocumented) createTask( - spec: TaskSpec, - secrets?: TaskSecrets, - ): Promise<{ - taskId: string; - }>; + options: TaskStoreCreateTaskOptions, + ): Promise; // (undocumented) emitLogEvent({ taskId, body }: TaskStoreEmitOptions): Promise; // (undocumented) @@ -357,10 +353,8 @@ export class DatabaseTaskStore implements TaskStore { }>; } -// @public -export type DispatchResult = { - taskId: string; -}; +// @public @deprecated +export type DispatchResult = TaskBrokerDispatchResult; // Warning: (ae-missing-release-tag) "fetchContents" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -449,7 +443,7 @@ export class ScaffolderEntitiesProcessor implements CatalogProcessor { export type SerializedTask = { id: string; spec: TaskSpec; - status: Status; + status: TaskStatus; createdAt: string; lastHeartbeatAt?: string; secrets?: TaskSecrets; @@ -464,20 +458,17 @@ export type SerializedTaskEvent = { createdAt: string; }; -// @public -export type Status = - | 'open' - | 'processing' - | 'failed' - | 'cancelled' - | 'completed'; +// @public @deprecated +export type Status = TaskStatus; // @public export interface TaskBroker { // (undocumented) claim(): Promise; // (undocumented) - dispatch(spec: TaskSpec, secrets?: TaskSecrets): Promise; + dispatch( + options: TaskBrokerDispatchOptions, + ): Promise; // (undocumented) get(taskId: string): Promise; // (undocumented) @@ -499,10 +490,24 @@ export interface TaskBroker { vacuumTasks(timeoutS: { timeoutS: number }): Promise; } +// @public +export type TaskBrokerDispatchOptions = { + spec: TaskSpec; + secrets?: TaskSecrets; +}; + +// @public +export type TaskBrokerDispatchResult = { + taskId: string; +}; + +// @public +export type TaskCompletionState = 'failed' | 'completed'; + // @public export interface TaskContext { // (undocumented) - complete(result: CompletedTaskState, metadata?: JsonValue): Promise; + complete(result: TaskCompletionState, metadata?: JsonValue): Promise; // (undocumented) done: boolean; // (undocumented) @@ -521,7 +526,7 @@ export type TaskEventType = 'completion' | 'log'; // @public export class TaskManager implements TaskContext { // (undocumented) - complete(result: CompletedTaskState, metadata?: JsonObject): Promise; + complete(result: TaskCompletionState, metadata?: JsonObject): Promise; // (undocumented) static create( state: TaskState, @@ -561,6 +566,14 @@ export interface TaskState { taskId: string; } +// @public +export type TaskStatus = + | 'open' + | 'processing' + | 'failed' + | 'cancelled' + | 'completed'; + // @public export interface TaskStore { // (undocumented) @@ -568,16 +581,13 @@ export interface TaskStore { // (undocumented) completeTask(options: { taskId: string; - status: Status; + status: TaskStatus; eventBody: JsonObject; }): Promise; // (undocumented) createTask( - task: TaskSpec, - secrets?: TaskSecrets, - ): Promise<{ - taskId: string; - }>; + options: TaskStoreCreateTaskOptions, + ): Promise; // (undocumented) emitLogEvent({ taskId, body }: TaskStoreEmitOptions): Promise; // (undocumented) @@ -596,6 +606,17 @@ export interface TaskStore { }>; } +// @public +export type TaskStoreCreateTaskOptions = { + spec: TaskSpec; + secrets?: TaskSecrets; +}; + +// @public +export type TaskStoreCreateTaskResult = { + taskId: string; +}; + // @public export type TaskStoreEmitOptions = { taskId: string; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts index be1eaef643..89404d3390 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts @@ -38,5 +38,7 @@ export type { DispatchResult, TaskBrokerDispatchResult, TaskBrokerDispatchOptions, + TaskStoreCreateTaskOptions, + TaskStoreCreateTaskResult, TemplateMetadata, } from './types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 147fa359d2..6209c34796 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -131,6 +131,8 @@ export type TaskBrokerDispatchOptions = { /** * DispatchResult + * + * @public * @deprecated use TaskBrokerDispatchResult instead */ export type DispatchResult = TaskBrokerDispatchResult; From 2886e2c4486803119690dd91a3e0f4fe7f89c3ee Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 18 Feb 2022 13:48:30 +0100 Subject: [PATCH 5/6] chore: updating changeset text with actual changes Signed-off-by: blam --- .changeset/gentle-ghosts-love.md | 16 +++++++++++++++- .changeset/tender-apricots-fetch.md | 4 +++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.changeset/gentle-ghosts-love.md b/.changeset/gentle-ghosts-love.md index b0727512d6..34efebad84 100644 --- a/.changeset/gentle-ghosts-love.md +++ b/.changeset/gentle-ghosts-love.md @@ -2,4 +2,18 @@ '@backstage/plugin-scaffolder-backend': minor --- -breaking +- **BREAKING** - `DatabaseTaskStore()` constructor is now removed. Please use the `DatabaseTaskStore.create()` method instead. + +- **BREAKING** - `TaskStore.createTask()` method now only takes one argument of type `TaskStoreCreateTaskOptions` which encapsulates the `spec` and `secrets` + +```diff +- TaskStore.createTask(spec, secrets) ++ TaskStore.createTask({ spec, secrets}) +``` + +- **BREAKING** - `TaskBroker.dispatch()` method now only takes one argument of type `TaskBrokerDispatchOptions` which encapsulates the `spec` and `secrets` + +```diff +- TaskBroker.dispatch(spec, secrets) ++ TaskBroker.dispatch({ spec, secrets}) +``` diff --git a/.changeset/tender-apricots-fetch.md b/.changeset/tender-apricots-fetch.md index fe52e688da..5fe8bda4ef 100644 --- a/.changeset/tender-apricots-fetch.md +++ b/.changeset/tender-apricots-fetch.md @@ -2,4 +2,6 @@ '@backstage/plugin-scaffolder-backend': patch --- -smaller +- **DEPRECATED** - `Status` has been deprecated in favour of `TaskStatus` +- **DEPRECATED** - `CompletedTaskState` has been deprecated in favour of `TaskCompletionState` +- **DEPRECATED** - `DispatchResult` has been deprecated in favour of `TaskBrokerDispatchResult` From 3c1c6f55b93401e473f63091646ab8bb79b72a1d Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Fri, 18 Feb 2022 14:25:47 +0100 Subject: [PATCH 6/6] chore: code review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ben Lambert Co-authored-by: Fredrik Adelöw --- plugins/scaffolder-backend/src/scaffolder/tasks/types.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 6209c34796..c75b85f7b5 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -110,7 +110,7 @@ export type TaskSecrets = Record & { }; /** - * The result of the TaskBroker Dispatch + * The result of {@link TaskBroker.dispatch} * * @public */ @@ -119,7 +119,7 @@ export type TaskBrokerDispatchResult = { }; /** - * The options passed to TaskBroker Dispatch + * The options passed to {@link TaskBroker.dispatch} * Currently a spec and optional secrets * * @public @@ -196,7 +196,7 @@ export type TaskStoreListEventsOptions = { }; /** - * The options passed to TaskStore create + * The options passed to {@link TaskStore.createTask} * @public */ export type TaskStoreCreateTaskOptions = { @@ -205,7 +205,7 @@ export type TaskStoreCreateTaskOptions = { }; /** - * The response from TaskStoreCreate + * The response from {@link TaskStore.createTask} * @public */ export type TaskStoreCreateTaskResult = {