Merge pull request #23827 from backstage/fix/scaffolder-undefined-task

Scaffolder: fix auth credentials issue
This commit is contained in:
Ben Lambert
2024-03-26 15:19:26 +01:00
committed by GitHub
6 changed files with 32 additions and 15 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Fixed an issue causing actions to fail when retrieving auth credentials
@@ -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(),
});
}
@@ -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<BackstageCredentials> {
if (this.task.secrets && '__initiatorCredentials' in this.task.secrets) {
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(
@@ -228,3 +228,10 @@ export type TaskTrackType = {
action: TemplateAction<JsonObject>,
) => Promise<void>;
};
/**
* @internal
*/
export type InternalTaskSecrets = TaskSecrets & {
__initiatorCredentials: string;
};
@@ -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: '',
});
@@ -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 });