From c74c2de7827459c640f429d89c9b9f8cad4a64ef Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Sun, 24 Mar 2024 06:30:31 +0100 Subject: [PATCH 1/6] scaffolder-backend: fix retrieving credentials Signed-off-by: Vincenzo Scamporlino --- .changeset/light-squids-eat.md | 5 +++++ .../src/scaffolder/tasks/NunjucksWorkflowRunner.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/light-squids-eat.md diff --git a/.changeset/light-squids-eat.md b/.changeset/light-squids-eat.md new file mode 100644 index 0000000000..3676f94081 --- /dev/null +++ b/.changeset/light-squids-eat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Fixed an issue causing actions to fail when retrieving auth credentials diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index fbd3813163..81897a96f8 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -434,7 +434,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { user: task.spec.user, isDryRun: task.isDryRun, signal: task.cancelSignal, - getInitiatorCredentials: task.getInitiatorCredentials, + getInitiatorCredentials: () => task.getInitiatorCredentials(), }); } From 4241f674fc10949efb842e62ffeae04c028ca18c Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Sun, 24 Mar 2024 06:38:24 +0100 Subject: [PATCH 2/6] scaffolder-backend: fix property reference Signed-off-by: Vincenzo Scamporlino --- .../src/scaffolder/tasks/StorageTaskBroker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 29a22716ba..29973e0e94 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -179,8 +179,8 @@ export class TaskManager implements TaskContext { } async getInitiatorCredentials(): Promise { - if (this.task.secrets && '__initiatorCredentials' in this.task.secrets) { - return JSON.parse(this.task.secrets.__initiatorCredentials); + if (this.task.secrets && this.task.secrets.initiatorCredentials) { + return JSON.parse(this.task.secrets.initiatorCredentials); } if (!this.auth) { throw new Error( From 49c4f0fbb8a76d0e7b14291a142fc52fc20dea8a Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Sun, 24 Mar 2024 06:41:11 +0100 Subject: [PATCH 3/6] scaffolder-node: define initiatorCredentials Signed-off-by: Vincenzo Scamporlino --- .changeset/dirty-pears-jam.md | 5 +++++ plugins/scaffolder-node/api-report.md | 1 + plugins/scaffolder-node/src/tasks/types.ts | 1 + 3 files changed, 7 insertions(+) create mode 100644 .changeset/dirty-pears-jam.md diff --git a/.changeset/dirty-pears-jam.md b/.changeset/dirty-pears-jam.md new file mode 100644 index 0000000000..99168ca5b2 --- /dev/null +++ b/.changeset/dirty-pears-jam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +Add internal `initiatorCredentials` property to `TaskSecrets` diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index c757301249..40b46d81c1 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -390,6 +390,7 @@ export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; // @public export type TaskSecrets = Record & { backstageToken?: string; + initiatorCredentials?: string; }; // @public diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index aef2c5f360..dabea90269 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -25,6 +25,7 @@ import { JsonObject, JsonValue, Observable } from '@backstage/types'; */ export type TaskSecrets = Record & { backstageToken?: string; + initiatorCredentials?: string; }; /** From 6e5a2cc79a34e91e30b5c95adea6c86460b917e0 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 25 Mar 2024 19:35:50 +0100 Subject: [PATCH 4/6] scaffolder-node: rollback typings Signed-off-by: Vincenzo Scamporlino --- .changeset/dirty-pears-jam.md | 5 ----- plugins/scaffolder-node/api-report.md | 1 - plugins/scaffolder-node/src/tasks/types.ts | 1 - 3 files changed, 7 deletions(-) delete mode 100644 .changeset/dirty-pears-jam.md diff --git a/.changeset/dirty-pears-jam.md b/.changeset/dirty-pears-jam.md deleted file mode 100644 index 99168ca5b2..0000000000 --- a/.changeset/dirty-pears-jam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-node': patch ---- - -Add internal `initiatorCredentials` property to `TaskSecrets` diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 40b46d81c1..c757301249 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -390,7 +390,6 @@ export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; // @public export type TaskSecrets = Record & { backstageToken?: string; - initiatorCredentials?: string; }; // @public diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index dabea90269..aef2c5f360 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -25,7 +25,6 @@ import { JsonObject, JsonValue, Observable } from '@backstage/types'; */ export type TaskSecrets = Record & { backstageToken?: string; - initiatorCredentials?: string; }; /** From 70c74edf1fa25c7bfeac8141b8b2003b418131f8 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 25 Mar 2024 19:36:40 +0100 Subject: [PATCH 5/6] scaffolder-backend: add InternalTaskSecrets Signed-off-by: Vincenzo Scamporlino --- .../src/scaffolder/tasks/StorageTaskBroker.ts | 8 +++++--- .../src/scaffolder/tasks/types.ts | 7 +++++++ plugins/scaffolder-backend/src/service/router.ts | 13 ++++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 29973e0e94..e9a408d9d6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -28,7 +28,7 @@ import { TaskCompletionState, TaskContext, } from '@backstage/plugin-scaffolder-node'; -import { TaskStore } from './types'; +import { InternalTaskSecrets, TaskStore } from './types'; import { readDuration } from './helper'; import { AuthService, @@ -179,8 +179,10 @@ export class TaskManager implements TaskContext { } async getInitiatorCredentials(): Promise { - if (this.task.secrets && this.task.secrets.initiatorCredentials) { - return JSON.parse(this.task.secrets.initiatorCredentials); + const secrets = this.task.secrets as InternalTaskSecrets; + + if (secrets && secrets.__initiatorCredentials) { + return JSON.parse(secrets.__initiatorCredentials); } if (!this.auth) { throw new Error( diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index c0854af391..aa647d8bd6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -228,3 +228,10 @@ export type TaskTrackType = { action: TemplateAction, ) => Promise; }; + +/** + * @internal + */ +export type InternalTaskSecrets = TaskSecrets & { + __initiatorCredentials: string; +}; diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 50f6fc372f..43618ed5a7 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -88,6 +88,7 @@ import { IdentityApi, IdentityApiGetIdentityRequest, } from '@backstage/plugin-auth-node'; +import { InternalTaskSecrets } from '../scaffolder/tasks/types'; /** * @@ -523,14 +524,16 @@ export async function createRouter( }, }; + const secrets: InternalTaskSecrets = { + ...req.body.secrets, + backstageToken: token, + __initiatorCredentials: JSON.stringify(credentials), + }; + const result = await taskBroker.dispatch({ spec: taskSpec, createdBy: userEntityRef, - secrets: { - ...req.body.secrets, - backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), - }, + secrets, }); res.status(201).json({ id: result.taskId }); From 9d25fc59e4f64cc50e16bdf95fb5a05774f26eac Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 25 Mar 2024 23:28:45 +0100 Subject: [PATCH 6/6] scaffolder-backend: rename initiatorCredentials Signed-off-by: Vincenzo Scamporlino --- .../scaffolder-backend/src/service/router.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts index d3cb2d1897..2118f46b22 100644 --- a/plugins/scaffolder-backend/src/service/router.test.ts +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -316,7 +316,7 @@ describe('createRouter', () => { createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -455,7 +455,7 @@ describe('createRouter', () => { createdAt: '', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, createdBy: '', }); @@ -925,7 +925,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -995,7 +995,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -1084,7 +1084,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -1220,7 +1220,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdAt: '', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, createdBy: '', });