in ui/models/taskcluster.js [18:82]
static async submit({
action,
decisionTaskId,
taskId,
task,
input,
staticActionVariables,
currentRepo,
testMode = false,
}) {
const context = defaults(
{},
{
taskGroupId: decisionTaskId,
taskId: taskId || null,
input,
},
staticActionVariables,
);
const rootUrl = checkRootUrl(currentRepo.tc_root_url);
const queue = await taskcluster.getQueue(rootUrl, testMode);
if (action.kind === 'task') {
const actionTaskId = slugid();
context.task = task;
context.ownTaskId = actionTaskId;
const actionTask = jsone(action.task, context);
const decisionTask = await queue.task(decisionTaskId);
const submitQueue = queue.use({ authorizedScopes: decisionTask.scopes });
await submitQueue.createTask(actionTaskId, actionTask);
return actionTaskId;
}
if (action.kind === 'hook') {
const hookPayload = jsone(action.hookPayload, context);
const { hookId, hookGroupId } = action;
const auth = new Auth({ rootUrl });
const userCredentials = await (testMode
? taskcluster.getMockCredentials()
: taskcluster.getCredentials(currentRepo.tc_root_url));
const hooks = new Hooks({
rootUrl,
credentials: userCredentials.credentials,
});
const decisionTask = await queue.task(decisionTaskId);
const expansion = await auth.expandScopes({
scopes: decisionTask.scopes,
});
const expression = `in-tree:hook-action:${hookGroupId}/${hookId}`;
if (!satisfiesExpression(expansion.scopes, expression)) {
throw new Error(
`Action is misconfigured: decision task's scopes do not satisfy ${expression}`,
);
}
const result = await hooks.triggerHook(hookGroupId, hookId, hookPayload);
return result.status.taskId;
}
}