diff --git a/halconfig/settings.js b/halconfig/settings.js index e0c57a07bdc..84463c2296d 100644 --- a/halconfig/settings.js +++ b/halconfig/settings.js @@ -16,6 +16,7 @@ var fiatEnabled = '{%features.fiat%}' === 'true'; var manualJudgmentParentPipelineEnabled = '{%features.manualJudgmentParentPipeline%}' === 'true'; var mineCanaryEnabled = '{%features.mineCanary%}' === 'true'; var pipelineTemplatesEnabled = '{%features.pipelineTemplates%}' === 'true'; +var pipelineRefEnabled = '{%features.pipelineRefEnabled%}' === 'true'; var reduxLoggerEnabled = '{%canary.reduxLogger%}' === 'true'; var showAllConfigsEnabled = '{%canary.showAllCanaryConfigs%}' === 'true'; var dynamicRollbackTimeoutEnabled = '{%feature.dynamicRollbackTimeout%}' === 'true'; @@ -123,6 +124,7 @@ window.spinnakerSettings = { pipelineTemplates: pipelineTemplatesEnabled, roscoMode: true, dynamicRollbackTimeout: dynamicRollbackTimeoutEnabled, + pipelineRefEnabled: pipelineRefEnabled, }, gateUrl: gateHost, notifications: { diff --git a/packages/core/src/config/settings.ts b/packages/core/src/config/settings.ts index 8cfaea047ba..0dfc7e53aac 100644 --- a/packages/core/src/config/settings.ts +++ b/packages/core/src/config/settings.ts @@ -53,6 +53,7 @@ export interface IFeatures { functions?: boolean; kubernetesRawResources?: boolean; renderPipelineStageThreshold?: number; + pipelineRefEnabled?: boolean; } export interface IDockerInsightSettings { diff --git a/packages/core/src/domain/IExecutionTrigger.ts b/packages/core/src/domain/IExecutionTrigger.ts index 3d2382127cf..ddb816504fd 100644 --- a/packages/core/src/domain/IExecutionTrigger.ts +++ b/packages/core/src/domain/IExecutionTrigger.ts @@ -8,6 +8,7 @@ export interface IExecutionTrigger extends ITrigger { isPipeline?: boolean; parameters?: { [key: string]: string }; parentExecution?: IExecution; + parentExecutionId?: string; parentPipelineApplication?: string; parentPipelineId?: string; parentPipelineStageId?: string; diff --git a/packages/core/src/pipeline/details/SingleExecutionDetails.tsx b/packages/core/src/pipeline/details/SingleExecutionDetails.tsx index b56a1d2196d..3ae6ca03972 100644 --- a/packages/core/src/pipeline/details/SingleExecutionDetails.tsx +++ b/packages/core/src/pipeline/details/SingleExecutionDetails.tsx @@ -3,6 +3,7 @@ import { set } from 'lodash'; import React, { useEffect, useState } from 'react'; import type { Application } from '../../application/application.model'; +import { SETTINGS } from '../../config'; import type { IExecution, IPipeline } from '../../domain'; import { Execution } from '../executions/execution/Execution'; import { ManualExecutionModal } from '../manualExecution'; @@ -30,11 +31,17 @@ export interface ISingleExecutionRouterStateChange extends IStateChange { toParams: ISingleExecutionStateParams; } -export function getAndTransformExecution(id: string, app: Application) { - return ReactInjector.executionService.getExecution(id, app.pipelineConfigs?.data).then((execution) => { - ExecutionsTransformer.transformExecution(app, execution); - return execution; - }); +export async function getAndTransformExecution(id: string, app: Application) { + const execution = await ReactInjector.executionService.getExecution(id, app.pipelineConfigs?.data); + ExecutionsTransformer.transformExecution(app, execution); + + // Check if the execution has a trigger with a parentExecutionId + if (SETTINGS.feature.pipelineRefEnabled && execution?.trigger?.parentExecutionId) { + // Recursively get the parent execution and append it + const parentExecution = await getAndTransformExecution(execution.trigger.parentExecutionId, app); + execution.trigger.parentExecution = parentExecution; + } + return execution; } // 3 generations is probably the most reasonable window to render?