From 9d3473a75c310e645093ddba5e1a2aeaea6b660c Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 24 Jan 2025 08:01:25 +0530 Subject: [PATCH 01/43] oss changes for build worker status --- Wire.go | 7 + .../configure/BuildPipelineRestHandler.go | 4 +- .../pipelineConfig/CdWorfkflowRepository.go | 12 +- .../pipelineConfig/CiWorkflowRepository.go | 12 +- .../workflow/cdWorkflow/CdWorkflowBean.go | 3 +- pkg/app/AppService.go | 8 +- .../devtronApps/PostStageTriggerService.go | 6 +- .../devtronApps/PreStageTriggerService.go | 10 +- .../trigger/devtronApps/TriggerService.go | 8 +- pkg/pipeline/CdHandler.go | 94 +++- pkg/pipeline/CiHandler.go | 148 +++--- pkg/pipeline/CiService.go | 17 +- pkg/pipeline/WebhookService.go | 30 +- pkg/pipeline/bean/CdHandlerBean.go | 56 +- pkg/pipeline/constants/constants.go | 8 + pkg/pipeline/types/Workflow.go | 62 +-- .../WorkflowStageStatusService.go | 480 ++++++++++++++++++ .../workflowStatus/adapter/adapter.go | 164 ++++++ pkg/pipeline/workflowStatus/bean/bean.go | 61 +++ .../repository/WorkflowStageRepository.go | 106 ++++ pkg/workflow/cd/CdWorkflowCommonService.go | 10 +- pkg/workflow/cd/CdWorkflowRunnerService.go | 8 +- pkg/workflow/dag/WorkflowDagExecutor.go | 8 +- pkg/workflow/status/WorkflowStatusService.go | 8 +- .../sql/31802800_build_worker_status.down.sql | 3 + .../sql/31802800_build_worker_status.up.sql | 20 + .../workflow-stage-status.internal.yaml | 97 ++++ wire_gen.go | 88 ++-- 28 files changed, 1291 insertions(+), 247 deletions(-) create mode 100644 pkg/pipeline/workflowStatus/WorkflowStageStatusService.go create mode 100644 pkg/pipeline/workflowStatus/adapter/adapter.go create mode 100644 pkg/pipeline/workflowStatus/bean/bean.go create mode 100644 pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go create mode 100644 scripts/sql/31802800_build_worker_status.down.sql create mode 100644 scripts/sql/31802800_build_worker_status.up.sql create mode 100644 specs/workflow/workflow-stage-status.internal.yaml diff --git a/Wire.go b/Wire.go index 8d6b8d5a98..28e21c0a04 100644 --- a/Wire.go +++ b/Wire.go @@ -155,6 +155,8 @@ import ( repository3 "github.com/devtron-labs/devtron/pkg/pipeline/history/repository" repository5 "github.com/devtron-labs/devtron/pkg/pipeline/repository" "github.com/devtron-labs/devtron/pkg/pipeline/types" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" + repository6 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/repository" "github.com/devtron-labs/devtron/pkg/plugin" "github.com/devtron-labs/devtron/pkg/policyGovernance" resourceGroup2 "github.com/devtron-labs/devtron/pkg/resourceGroup" @@ -471,6 +473,11 @@ func InitializeApp() (*App, error) { pipeline.NewCiServiceImpl, wire.Bind(new(pipeline.CiService), new(*pipeline.CiServiceImpl)), + workflowStatus.NewWorkflowStageFlowStatusServiceImpl, + wire.Bind(new(workflowStatus.WorkFlowStageStatusService), new(*workflowStatus.WorkFlowStageStatusServiceImpl)), + repository6.NewWorkflowStageRepositoryImpl, + wire.Bind(new(repository6.WorkflowStageRepository), new(*repository6.WorkflowStageRepositoryImpl)), + pipelineConfig.NewCiWorkflowRepositoryImpl, wire.Bind(new(pipelineConfig.CiWorkflowRepository), new(*pipelineConfig.CiWorkflowRepositoryImpl)), diff --git a/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go b/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go index c6321b098c..1a1ec93c2b 100644 --- a/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go +++ b/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go @@ -25,6 +25,7 @@ import ( "github.com/devtron-labs/devtron/internal/sql/constants" "github.com/devtron-labs/devtron/pkg/build/artifacts/imageTagging" bean2 "github.com/devtron-labs/devtron/pkg/build/pipeline/bean" + constants2 "github.com/devtron-labs/devtron/pkg/pipeline/constants" "github.com/devtron-labs/devtron/util/stringsUtil" "golang.org/x/exp/maps" "io" @@ -45,7 +46,6 @@ import ( "github.com/devtron-labs/devtron/internal/util" "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" "github.com/devtron-labs/devtron/pkg/bean" - "github.com/devtron-labs/devtron/pkg/pipeline" bean1 "github.com/devtron-labs/devtron/pkg/pipeline/bean" "github.com/devtron-labs/devtron/pkg/pipeline/types" resourceGroup "github.com/devtron-labs/devtron/pkg/resourceGroup" @@ -663,7 +663,7 @@ func (handler *PipelineConfigRestHandlerImpl) validateCiTriggerRBAC(token string // This is being done for jobs, jobs execute in default-env (devtron-ci) namespace by default. so considering DefaultCiNamespace as env for rbac enforcement envName := "" if triggerEnvironmentId == 0 { - envName = pipeline.DefaultCiWorkflowNamespace + envName = constants2.DefaultCiWorkflowNamespace } appObject := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) workflowObject := handler.enforcerUtil.GetWorkflowRBACByCiPipelineId(ciPipelineId, workflowName) diff --git a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go index 906dd3d326..be91060cd0 100644 --- a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go @@ -41,8 +41,8 @@ type CdWorkflowRepository interface { FindCdWorkflowMetaByEnvironmentId(appId int, environmentId int, offset int, size int) ([]CdWorkflowRunner, error) FindCdWorkflowMetaByPipelineId(pipelineId int, offset int, size int) ([]CdWorkflowRunner, error) FindArtifactByPipelineIdAndRunnerType(pipelineId int, runnerType apiBean.WorkflowType, limit int, runnerStatuses []string) ([]CdWorkflowRunner, error) - SaveWorkFlowRunner(wfr *CdWorkflowRunner) (*CdWorkflowRunner, error) - UpdateWorkFlowRunner(wfr *CdWorkflowRunner) error + SaveWorkFlowRunnerWithTx(wfr *CdWorkflowRunner, tx *pg.Tx) (*CdWorkflowRunner, error) + UpdateWorkFlowRunnerWithTx(wfr *CdWorkflowRunner, tx *pg.Tx) error UpdateIsArtifactUploaded(wfrId int, isArtifactUploaded workflow.ArtifactUploadedType) error GetPreviousQueuedRunners(cdWfrId, pipelineId int) ([]*CdWorkflowRunner, error) UpdateRunnerStatusToFailedForIds(errMsg string, triggeredBy int32, cdWfrIds ...int) error @@ -452,14 +452,14 @@ func (impl *CdWorkflowRepositoryImpl) FindLastPreOrPostTriggeredByEnvironmentId( return wfr, err } -func (impl *CdWorkflowRepositoryImpl) SaveWorkFlowRunner(wfr *CdWorkflowRunner) (*CdWorkflowRunner, error) { - err := impl.dbConnection.Insert(wfr) +func (impl *CdWorkflowRepositoryImpl) SaveWorkFlowRunnerWithTx(wfr *CdWorkflowRunner, tx *pg.Tx) (*CdWorkflowRunner, error) { + err := tx.Insert(wfr) return wfr, err } -func (impl *CdWorkflowRepositoryImpl) UpdateWorkFlowRunner(wfr *CdWorkflowRunner) error { +func (impl *CdWorkflowRepositoryImpl) UpdateWorkFlowRunnerWithTx(wfr *CdWorkflowRunner, tx *pg.Tx) error { wfr.Message = util.GetTruncatedMessage(wfr.Message, 1000) - err := impl.dbConnection.Update(wfr) + err := tx.Update(wfr) return err } diff --git a/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go b/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go index f313bfe06b..35baa3850a 100644 --- a/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go @@ -28,9 +28,9 @@ import ( ) type CiWorkflowRepository interface { - SaveWorkFlow(wf *CiWorkflow) error + SaveWorkFlowWithTx(wf *CiWorkflow, tx *pg.Tx) error FindLastTriggeredWorkflow(pipelineId int) (*CiWorkflow, error) - UpdateWorkFlow(wf *CiWorkflow) error + UpdateWorkFlowWithTx(wf *CiWorkflow, tx *pg.Tx) error UpdateArtifactUploaded(id int, isUploaded workflow.ArtifactUploadedType) error FindByStatusesIn(activeStatuses []string) ([]*CiWorkflow, error) FindByPipelineId(pipelineId int, offset int, size int) ([]WorkflowWithArtifact, error) @@ -266,13 +266,13 @@ func (impl *CiWorkflowRepositoryImpl) FindCiWorkflowGitTriggersByIds(ids []int) return workflows, err } -func (impl *CiWorkflowRepositoryImpl) SaveWorkFlow(wf *CiWorkflow) error { - err := impl.dbConnection.Insert(wf) +func (impl *CiWorkflowRepositoryImpl) SaveWorkFlowWithTx(wf *CiWorkflow, tx *pg.Tx) error { + err := tx.Insert(wf) return err } -func (impl *CiWorkflowRepositoryImpl) UpdateWorkFlow(wf *CiWorkflow) error { - err := impl.dbConnection.Update(wf) +func (impl *CiWorkflowRepositoryImpl) UpdateWorkFlowWithTx(wf *CiWorkflow, tx *pg.Tx) error { + err := tx.Update(wf) return err } diff --git a/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go b/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go index 2568ea98ae..b5850f6e1b 100644 --- a/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go +++ b/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go @@ -6,7 +6,7 @@ import ( "github.com/devtron-labs/devtron/client/argocdServer/bean" ) -var WfrTerminalStatusList = []string{WorkflowAborted, WorkflowFailed, WorkflowSucceeded, bean.HIBERNATING, string(health.HealthStatusHealthy), string(health.HealthStatusDegraded)} +var WfrTerminalStatusList = []string{WorkflowAborted, WorkflowFailed, WorkflowSucceeded, bean.HIBERNATING, string(health.HealthStatusHealthy), string(health.HealthStatusDegraded), WorkflowTimedOut} type WorkflowStatus int @@ -34,6 +34,7 @@ const ( WorkflowTypeDeploy = "DEPLOY" WorkflowTypePre = "PRE" WorkflowTypePost = "POST" + WorkflowWaitingToStart = "WaitingToStart" ) func (a WorkflowStatus) String() string { diff --git a/pkg/app/AppService.go b/pkg/app/AppService.go index 541db8cc37..adf62c8d9c 100644 --- a/pkg/app/AppService.go +++ b/pkg/app/AppService.go @@ -38,6 +38,7 @@ import ( bean6 "github.com/devtron-labs/devtron/pkg/deployment/manifest/deploymentTemplate/bean" "github.com/devtron-labs/devtron/pkg/deployment/manifest/deploymentTemplate/read" bean4 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/bean" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" "io/ioutil" "net/url" "path" @@ -125,6 +126,7 @@ type AppServiceImpl struct { appListingService AppListingService deploymentConfigService common2.DeploymentConfigService envConfigOverrideReadService read.EnvConfigOverrideService + workflowStageService workflowStatus.WorkFlowStageStatusService } type AppService interface { @@ -164,7 +166,8 @@ func NewAppService( deploymentTemplateService deploymentTemplate.DeploymentTemplateService, appListingService AppListingService, deploymentConfigService common2.DeploymentConfigService, - envConfigOverrideReadService read.EnvConfigOverrideService) *AppServiceImpl { + envConfigOverrideReadService read.EnvConfigOverrideService, + workflowStageService workflowStatus.WorkFlowStageStatusService) *AppServiceImpl { appServiceImpl := &AppServiceImpl{ mergeUtil: mergeUtil, pipelineOverrideRepository: pipelineOverrideRepository, @@ -194,6 +197,7 @@ func NewAppService( appListingService: appListingService, deploymentConfigService: deploymentConfigService, envConfigOverrideReadService: envConfigOverrideReadService, + workflowStageService: workflowStageService, } return appServiceImpl } @@ -1005,7 +1009,7 @@ func (impl *AppServiceImpl) UpdateCdWorkflowRunnerByACDObject(app *v1alpha1.Appl } wfr.UpdatedBy = 1 wfr.UpdatedOn = time.Now() - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(wfr) + err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(wfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "wfr", wfr, "app", app, "err", err) return err diff --git a/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go b/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go index b22609e0a8..3f67c5b844 100644 --- a/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go +++ b/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go @@ -119,7 +119,7 @@ func (impl *TriggerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (* runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.cdWorkflowRepository.UpdateWorkFlowRunner(runner) + _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } @@ -129,7 +129,7 @@ func (impl *TriggerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (* runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.cdWorkflowRepository.UpdateWorkFlowRunner(runner) + _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } manifestPushTempate, err := impl.getManifestPushTemplateForPostStage(request, envDevploymentConfig, jobHelmPackagePath, cdStageWorkflowRequest, cdWf, runner, pipeline, triggeredBy, triggeredAt) @@ -143,7 +143,7 @@ func (impl *TriggerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (* return nil, err } wfr.ImagePathReservationIds = pluginImagePathReservationIds - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(&wfr) + err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(&wfr) if err != nil { impl.logger.Error("error in updating image path reservation ids in cd workflow runner", "err", "err") } diff --git a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go index 913bd9663d..a1e68b1e93 100644 --- a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go +++ b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go @@ -135,11 +135,11 @@ func (impl *TriggerServiceImpl) TriggerPreStage(request bean.TriggerRequest) (*b runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.cdWorkflowRepository.UpdateWorkFlowRunner(runner) + _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } else { runner.ImagePathReservationIds = imagePathReservationIds - _ = impl.cdWorkflowRepository.UpdateWorkFlowRunner(runner) + _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) } _, span = otel.Tracer("orchestrator").Start(ctx, "cdWorkflowService.SubmitWorkflow") @@ -152,7 +152,7 @@ func (impl *TriggerServiceImpl) TriggerPreStage(request bean.TriggerRequest) (*b runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.cdWorkflowRepository.UpdateWorkFlowRunner(runner) + _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } manifestPushTemplate, err := impl.getManifestPushTemplateForPreStage(ctx, envDeploymentConfig, pipeline, artifact, jobHelmPackagePath, cdWf, runner, triggeredBy, triggeredAt, request) @@ -262,7 +262,7 @@ func (impl *TriggerServiceImpl) createStartingWfAndRunner(request bean.TriggerRe ReferenceId: request.TriggerContext.ReferenceId, } _, span := otel.Tracer("orchestrator").Start(ctx, "cdWorkflowRepository.SaveWorkFlowRunner") - _, err = impl.cdWorkflowRepository.SaveWorkFlowRunner(runner) + _, err = impl.workflowStageService.SaveCDWorkflowRunnerWithStage(runner) span.End() if err != nil { return nil, nil, err @@ -311,7 +311,7 @@ func (impl *TriggerServiceImpl) checkVulnerabilityStatusAndFailWfIfNeeded(ctx co runner.FinishedOn = time.Now() runner.UpdatedOn = time.Now() runner.UpdatedBy = triggeredBy - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(runner) + err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) if err != nil { impl.logger.Errorw("error in updating wfr status due to vulnerable image", "err", err) return err diff --git a/pkg/deployment/trigger/devtronApps/TriggerService.go b/pkg/deployment/trigger/devtronApps/TriggerService.go index faf30adb53..12a84c2e4a 100644 --- a/pkg/deployment/trigger/devtronApps/TriggerService.go +++ b/pkg/deployment/trigger/devtronApps/TriggerService.go @@ -74,6 +74,7 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/history" "github.com/devtron-labs/devtron/pkg/pipeline/repository" "github.com/devtron-labs/devtron/pkg/pipeline/types" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" "github.com/devtron-labs/devtron/pkg/plugin" security2 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning" read2 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/read" @@ -172,6 +173,7 @@ type TriggerServiceImpl struct { gitOperationService git.GitOperationService attributeService attributes.AttributesService clusterRepository repository5.ClusterRepository + workflowStageService workflowStatus.WorkFlowStageStatusService } func NewTriggerServiceImpl(logger *zap.SugaredLogger, @@ -230,6 +232,7 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, gitOperationService git.GitOperationService, attributeService attributes.AttributesService, clusterRepository repository5.ClusterRepository, + workflowStageService workflowStatus.WorkFlowStageStatusService, ) (*TriggerServiceImpl, error) { impl := &TriggerServiceImpl{ logger: logger, @@ -292,6 +295,7 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, ciCdPipelineOrchestrator: ciCdPipelineOrchestrator, gitOperationService: gitOperationService, attributeService: attributeService, + workflowStageService: workflowStageService, clusterRepository: clusterRepository, } @@ -518,7 +522,7 @@ func (impl *TriggerServiceImpl) ManualCdTrigger(triggerContext bean.TriggerConte AuditLog: sql.AuditLog{CreatedOn: triggeredAt, CreatedBy: overrideRequest.UserId, UpdatedOn: triggeredAt, UpdatedBy: overrideRequest.UserId}, ReferenceId: triggerContext.ReferenceId, } - savedWfr, err := impl.cdWorkflowRepository.SaveWorkFlowRunner(runner) + savedWfr, err := impl.workflowStageService.SaveCDWorkflowRunnerWithStage(runner) if err != nil { impl.logger.Errorw("err in creating cdWorkflowRunner, ManualCdTrigger", "cdWorkflowId", cdWorkflowId, "err", err) return 0, "", nil, err @@ -649,7 +653,7 @@ func (impl *TriggerServiceImpl) TriggerAutomaticDeployment(request bean.TriggerR AuditLog: sql.AuditLog{CreatedOn: triggeredAt, CreatedBy: triggeredBy, UpdatedOn: triggeredAt, UpdatedBy: triggeredBy}, ReferenceId: request.TriggerContext.ReferenceId, } - savedWfr, err := impl.cdWorkflowRepository.SaveWorkFlowRunner(runner) + savedWfr, err := impl.workflowStageService.SaveCDWorkflowRunnerWithStage(runner) if err != nil { return err } diff --git a/pkg/pipeline/CdHandler.go b/pkg/pipeline/CdHandler.go index 89d24826e1..05f77db3dd 100644 --- a/pkg/pipeline/CdHandler.go +++ b/pkg/pipeline/CdHandler.go @@ -29,7 +29,11 @@ import ( bean3 "github.com/devtron-labs/devtron/pkg/cluster/bean" repository3 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" common2 "github.com/devtron-labs/devtron/pkg/deployment/common" + "github.com/devtron-labs/devtron/pkg/pipeline/constants" util2 "github.com/devtron-labs/devtron/pkg/pipeline/util" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" + adapter2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" + bean5 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" "os" "path/filepath" "strconv" @@ -97,6 +101,7 @@ type CdHandlerImpl struct { blobConfigStorageService BlobStorageConfigService customTagService CustomTagService deploymentConfigService common2.DeploymentConfigService + workflowStageStatusService workflowStatus.WorkFlowStageStatusService } func NewCdHandlerImpl(Logger *zap.SugaredLogger, userService user.UserService, @@ -110,6 +115,7 @@ func NewCdHandlerImpl(Logger *zap.SugaredLogger, userService user.UserService, workflowService WorkflowService, clusterService cluster.ClusterService, blobConfigStorageService BlobStorageConfigService, customTagService CustomTagService, deploymentConfigService common2.DeploymentConfigService, + workflowStageStatusService workflowStatus.WorkFlowStageStatusService, ) *CdHandlerImpl { cdh := &CdHandlerImpl{ Logger: Logger, @@ -130,6 +136,7 @@ func NewCdHandlerImpl(Logger *zap.SugaredLogger, userService user.UserService, blobConfigStorageService: blobConfigStorageService, customTagService: customTagService, deploymentConfigService: deploymentConfigService, + workflowStageStatusService: workflowStageStatusService, } config, err := types.GetCdConfig() if err != nil { @@ -216,7 +223,7 @@ func (impl *CdHandlerImpl) CancelStage(workflowRunnerId int, forceAbort bool, us workflowRunner.Status = executors.WorkflowCancel workflowRunner.UpdatedOn = time.Now() workflowRunner.UpdatedBy = userId - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(workflowRunner) + err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(workflowRunner) if err != nil { impl.Logger.Error("cannot update deleted workflow runner status, but wf deleted", "err", err) return 0, err @@ -227,8 +234,8 @@ func (impl *CdHandlerImpl) CancelStage(workflowRunnerId int, forceAbort bool, us func (impl *CdHandlerImpl) updateWorkflowRunnerForForceAbort(workflowRunner *pipelineConfig.CdWorkflowRunner) error { workflowRunner.Status = executors.WorkflowCancel workflowRunner.PodStatus = string(bean2.Failed) - workflowRunner.Message = FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE - err := impl.cdWorkflowRepository.UpdateWorkFlowRunner(workflowRunner) + workflowRunner.Message = constants.FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE + err := impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(workflowRunner) if err != nil { impl.Logger.Errorw("error in updating workflow status in cd workflow runner in force abort case", "err", err) return err @@ -286,7 +293,7 @@ func (impl *CdHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus savedWorkflow.PodName = podName savedWorkflow.UpdateAuditLog(1) impl.Logger.Debugw("updating workflow ", "workflow", savedWorkflow) - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(savedWorkflow) + err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(savedWorkflow) if err != nil { impl.Logger.Error("update wf failed for id " + strconv.Itoa(savedWorkflow.Id)) return 0, "", err @@ -475,6 +482,29 @@ func (impl *CdHandlerImpl) GetCdBuildHistory(appId int, environmentId int, pipel } cdWorkflowArtifact[i] = item } + + //process pre/post cd stage data + //prepare a map of wfId and wf type to pass to next function + wfIdToWfTypeMap := make(map[int]pipelineBean.CdWorkflowWithArtifact) + for _, item := range cdWorkflowArtifact { + if item.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE.String() || item.WorkflowType == bean.CD_WORKFLOW_TYPE_POST.String() { + wfIdToWfTypeMap[item.Id] = item + } + } + wfRunnerIdToStageDetailMap, err := impl.workflowStageStatusService.GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdToWfTypeMap) + if err != nil { + impl.Logger.Errorw("error in fetching pre/post stage data", "err", err) + return cdWorkflowArtifact, err + } + + //now for each cdWorkflowArtifact, set the workflowStage Data from wfRunnerIdToStageDetailMap using workflowId as key wfRunnerIdToStageDetailMap + if len(wfRunnerIdToStageDetailMap) > 0 { + for i, item := range cdWorkflowArtifact { + if val, ok := wfRunnerIdToStageDetailMap[item.Id]; ok { + cdWorkflowArtifact[i].WorkflowExecutionStage = val + } + } + } return cdWorkflowArtifact, nil } @@ -604,6 +634,19 @@ func (impl *CdHandlerImpl) FetchCdWorkflowDetails(appId int, environmentId int, } workflow := impl.converterWFR(*workflowR) + if workflowR.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || workflowR.WorkflowType == bean.CD_WORKFLOW_TYPE_POST { + //get execution stage data + impl.Logger.Infow("fetching pre/post workflow stages", "workflowId", workflowR.Id, "workflowType", workflowR.WorkflowType) + workflowStageData, err := impl.workflowStageStatusService.GetPrePostWorkflowStagesByWorkflowIdAndType(workflowR.Id, workflowR.WorkflowType.String()) + if err != nil { + impl.Logger.Errorw("error in fetching pre/post workflow stages", "err", err) + return types.WorkflowResponse{}, err + } + workflow.WorkflowExecutionStage = adapter2.ConvertDBWorkflowStageToMap(workflowStageData, workflow.Id, workflow.Status, workflow.PodStatus, workflow.Message, workflow.WorkflowType, workflow.StartedOn, workflow.FinishedOn) + } else { + workflow.WorkflowExecutionStage = map[string][]*bean5.WorkflowStageDto{} + } + triggeredByUserEmailId, err := impl.userService.GetActiveEmailById(workflow.TriggeredBy) if err != nil && !util.IsErrNoRows(err) { impl.Logger.Errorw("err", "err", err) @@ -658,27 +701,28 @@ func (impl *CdHandlerImpl) FetchCdWorkflowDetails(appId int, environmentId int, } workflowResponse := types.WorkflowResponse{ - Id: workflow.Id, - Name: workflow.Name, - Status: workflow.Status, - PodStatus: workflow.PodStatus, - Message: workflow.Message, - StartedOn: workflow.StartedOn, - FinishedOn: workflow.FinishedOn, - Namespace: workflow.Namespace, - CiMaterials: ciMaterialsArr, - TriggeredBy: workflow.TriggeredBy, - TriggeredByEmail: triggeredByUserEmailId, - Artifact: workflow.Image, - Stage: workflow.WorkflowType, - GitTriggers: gitTriggers, - BlobStorageEnabled: workflow.BlobStorageEnabled, - IsVirtualEnvironment: workflowR.CdWorkflow.Pipeline.Environment.IsVirtualEnvironment, - PodName: workflowR.PodName, - ArtifactId: workflow.CiArtifactId, - IsArtifactUploaded: workflow.IsArtifactUploaded, - CiPipelineId: ciWf.CiPipelineId, - TargetPlatforms: targetPlatforms, + Id: workflow.Id, + Name: workflow.Name, + Status: workflow.Status, + PodStatus: workflow.PodStatus, + Message: workflow.Message, + StartedOn: workflow.StartedOn, + FinishedOn: workflow.FinishedOn, + Namespace: workflow.Namespace, + CiMaterials: ciMaterialsArr, + TriggeredBy: workflow.TriggeredBy, + TriggeredByEmail: triggeredByUserEmailId, + Artifact: workflow.Image, + Stage: workflow.WorkflowType, + GitTriggers: gitTriggers, + BlobStorageEnabled: workflow.BlobStorageEnabled, + IsVirtualEnvironment: workflowR.CdWorkflow.Pipeline.Environment.IsVirtualEnvironment, + PodName: workflowR.PodName, + ArtifactId: workflow.CiArtifactId, + IsArtifactUploaded: workflow.IsArtifactUploaded, + CiPipelineId: ciWf.CiPipelineId, + TargetPlatforms: targetPlatforms, + WorkflowExecutionStage: workflow.WorkflowExecutionStage, } return workflowResponse, nil diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index b6b461f42a..a54c20695c 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -32,7 +32,10 @@ import ( bean5 "github.com/devtron-labs/devtron/pkg/cluster/bean" "github.com/devtron-labs/devtron/pkg/cluster/environment" repository2 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" + constants2 "github.com/devtron-labs/devtron/pkg/pipeline/constants" util3 "github.com/devtron-labs/devtron/pkg/pipeline/util" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" + adapter2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" "io/ioutil" "net/http" "os" @@ -123,13 +126,15 @@ type CiHandlerImpl struct { clusterService cluster.ClusterService blobConfigStorageService BlobStorageConfigService envService environment.EnvironmentService + workFlowStageStatusService workflowStatus.WorkFlowStageStatusService } func NewCiHandlerImpl(Logger *zap.SugaredLogger, ciService CiService, ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository, gitSensorClient gitSensor.Client, ciWorkflowRepository pipelineConfig.CiWorkflowRepository, workflowService WorkflowService, ciLogService CiLogService, ciArtifactRepository repository.CiArtifactRepository, userService user.UserService, eventClient client.EventClient, eventFactory client.EventFactory, ciPipelineRepository pipelineConfig.CiPipelineRepository, appListingRepository repository.AppListingRepository, K8sUtil *k8s.K8sServiceImpl, cdPipelineRepository pipelineConfig.PipelineRepository, enforcerUtil rbac.EnforcerUtil, resourceGroupService resourceGroup.ResourceGroupService, envRepository repository2.EnvironmentRepository, imageTaggingService imageTagging.ImageTaggingService, k8sCommonService k8s2.K8sCommonService, clusterService cluster.ClusterService, blobConfigStorageService BlobStorageConfigService, appWorkflowRepository appWorkflow.AppWorkflowRepository, customTagService CustomTagService, - envService environment.EnvironmentService) *CiHandlerImpl { + envService environment.EnvironmentService, + workFlowStageStatusService workflowStatus.WorkFlowStageStatusService) *CiHandlerImpl { cih := &CiHandlerImpl{ Logger: Logger, ciService: ciService, @@ -156,6 +161,7 @@ func NewCiHandlerImpl(Logger *zap.SugaredLogger, ciService CiService, ciPipeline clusterService: clusterService, blobConfigStorageService: blobConfigStorageService, envService: envService, + workFlowStageStatusService: workFlowStageStatusService, } config, err := types.GetCiConfig() if err != nil { @@ -166,13 +172,6 @@ func NewCiHandlerImpl(Logger *zap.SugaredLogger, ciService CiService, ciPipeline return cih } -const DefaultCiWorkflowNamespace = "devtron-ci" -const Running = "Running" -const Starting = "Starting" -const POD_DELETED_MESSAGE = "pod deleted" -const TERMINATE_MESSAGE = "workflow shutdown with strategy: Terminate" -const FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE = "workflow shutdown with strategy: Force Abort" - func (impl *CiHandlerImpl) CheckAndReTriggerCI(workflowStatus v1alpha1.WorkflowStatus) error { //return if re-trigger feature is disabled @@ -530,10 +529,19 @@ func (impl *CiHandlerImpl) GetBuildHistory(pipelineId int, appId int, offset int impl.Logger.Errorw("err", "err", err) return nil, err } + var workflowIds []int var artifactIds []int for _, w := range workFlows { artifactIds = append(artifactIds, w.CiArtifactId) + workflowIds = append(workflowIds, w.Id) + } + + allWfStagesDetail, err := impl.workFlowStageStatusService.GetCiWorkflowStagesByWorkflowIds(workflowIds) + if err != nil { + impl.Logger.Errorw("error in fetching allWfStagesDetail", "err", err, "workflowIds", workflowIds) + return nil, err } + //this map contains artifactId -> imageComment of that artifact imageCommetnsDataMap, err := impl.imageTaggingService.GetImageCommentsDataMapByArtifactIds(artifactIds) if err != nil { @@ -550,29 +558,30 @@ func (impl *CiHandlerImpl) GetBuildHistory(pipelineId int, appId int, offset int isArtifactUploaded = w.IsArtifactUploaded } wfResponse := types.WorkflowResponse{ - Id: w.Id, - Name: w.Name, - Status: w.Status, - PodStatus: w.PodStatus, - Message: w.Message, - StartedOn: w.StartedOn, - FinishedOn: w.FinishedOn, - CiPipelineId: w.CiPipelineId, - Namespace: w.Namespace, - LogLocation: w.LogFilePath, - GitTriggers: w.GitTriggers, - CiMaterials: ciPipelineMaterialResponses, - Artifact: w.Image, - TriggeredBy: w.TriggeredBy, - TriggeredByEmail: w.EmailId, - ArtifactId: w.CiArtifactId, - BlobStorageEnabled: w.BlobStorageEnabled, - IsArtifactUploaded: isArtifactUploaded, - EnvironmentId: w.EnvironmentId, - EnvironmentName: w.EnvironmentName, - ReferenceWorkflowId: w.RefCiWorkflowId, - PodName: w.PodName, - TargetPlatforms: utils.ConvertTargetPlatformStringToObject(w.TargetPlatforms), + Id: w.Id, + Name: w.Name, + Status: w.Status, + PodStatus: w.PodStatus, + Message: w.Message, + StartedOn: w.StartedOn, + FinishedOn: w.FinishedOn, + CiPipelineId: w.CiPipelineId, + Namespace: w.Namespace, + LogLocation: w.LogFilePath, + GitTriggers: w.GitTriggers, + CiMaterials: ciPipelineMaterialResponses, + Artifact: w.Image, + TriggeredBy: w.TriggeredBy, + TriggeredByEmail: w.EmailId, + ArtifactId: w.CiArtifactId, + BlobStorageEnabled: w.BlobStorageEnabled, + IsArtifactUploaded: isArtifactUploaded, + EnvironmentId: w.EnvironmentId, + EnvironmentName: w.EnvironmentName, + ReferenceWorkflowId: w.RefCiWorkflowId, + PodName: w.PodName, + TargetPlatforms: utils.ConvertTargetPlatformStringToObject(w.TargetPlatforms), + WorkflowExecutionStage: adapter2.ConvertDBWorkflowStageToMap(allWfStagesDetail, w.Id, w.Status, w.PodStatus, w.Message, bean2.CI_WORKFLOW_TYPE.String(), w.StartedOn, w.FinishedOn), } if w.Message == bean3.ImageTagUnavailableMessage { @@ -609,7 +618,7 @@ func (impl *CiHandlerImpl) CancelBuild(workflowId int, forceAbort bool) (int, er impl.Logger.Errorw("error in finding ci-workflow by workflow id", "ciWorkflowId", workflowId, "err", err) return 0, err } - isExt := workflow.Namespace != DefaultCiWorkflowNamespace + isExt := workflow.Namespace != constants2.DefaultCiWorkflowNamespace var env *repository2.Environment var restConfig *rest.Config if isExt { @@ -656,9 +665,9 @@ func (impl *CiHandlerImpl) CancelBuild(workflowId int, forceAbort bool) (int, er workflow.Status = executors.WorkflowCancel if workflow.ExecutorType == cdWorkflow.WORKFLOW_EXECUTOR_TYPE_SYSTEM { workflow.PodStatus = "Failed" - workflow.Message = TERMINATE_MESSAGE + workflow.Message = constants2.TERMINATE_MESSAGE } - err = impl.ciWorkflowRepository.UpdateWorkFlow(workflow) + err = impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(workflow) if err != nil { impl.Logger.Errorw("cannot update deleted workflow status, but wf deleted", "err", err) return 0, err @@ -699,8 +708,8 @@ func (impl *CiHandlerImpl) handleForceAbortCaseForCi(workflow *pipelineConfig.Ci func (impl *CiHandlerImpl) updateWorkflowForForceAbort(workflow *pipelineConfig.CiWorkflow) error { workflow.Status = executors.WorkflowCancel workflow.PodStatus = string(bean.Failed) - workflow.Message = FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE - err := impl.ciWorkflowRepository.UpdateWorkFlow(workflow) + workflow.Message = constants2.FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE + err := impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(workflow) if err != nil { impl.Logger.Errorw("error in updating workflow status", "err", err) return err @@ -783,30 +792,37 @@ func (impl *CiHandlerImpl) FetchWorkflowDetails(appId int, pipelineId int, build impl.ciWorkflowRepository.MigrateIsArtifactUploaded(workflow.Id, ciArtifact.IsArtifactUploaded) isArtifactUploaded = ciArtifact.IsArtifactUploaded } + wfStagesDetail, err := impl.workFlowStageStatusService.GetCiWorkflowStagesByWorkflowIds([]int{workflow.Id}) + if err != nil { + impl.Logger.Errorw("error in fetching allWfStagesDetail", "err", err, "workflowId", workflow.Id) + return types.WorkflowResponse{}, err + } + workflowResponse := types.WorkflowResponse{ - Id: workflow.Id, - Name: workflow.Name, - Status: workflow.Status, - PodStatus: workflow.PodStatus, - Message: workflow.Message, - StartedOn: workflow.StartedOn, - FinishedOn: workflow.FinishedOn, - CiPipelineId: workflow.CiPipelineId, - Namespace: workflow.Namespace, - LogLocation: workflow.LogLocation, - BlobStorageEnabled: workflow.BlobStorageEnabled, //TODO default value if value not found in db - GitTriggers: workflow.GitTriggers, - CiMaterials: ciMaterialsArr, - TriggeredBy: workflow.TriggeredBy, - TriggeredByEmail: triggeredByUserEmailId, - Artifact: ciArtifact.Image, - TargetPlatforms: utils.ConvertTargetPlatformStringToObject(ciArtifact.TargetPlatforms), - ArtifactId: ciArtifact.Id, - IsArtifactUploaded: isArtifactUploaded, - EnvironmentId: workflow.EnvironmentId, - EnvironmentName: environmentName, - PipelineType: workflow.CiPipeline.PipelineType, - PodName: workflow.PodName, + Id: workflow.Id, + Name: workflow.Name, + Status: workflow.Status, + PodStatus: workflow.PodStatus, + Message: workflow.Message, + StartedOn: workflow.StartedOn, + FinishedOn: workflow.FinishedOn, + CiPipelineId: workflow.CiPipelineId, + Namespace: workflow.Namespace, + LogLocation: workflow.LogLocation, + BlobStorageEnabled: workflow.BlobStorageEnabled, //TODO default value if value not found in db + GitTriggers: workflow.GitTriggers, + CiMaterials: ciMaterialsArr, + TriggeredBy: workflow.TriggeredBy, + TriggeredByEmail: triggeredByUserEmailId, + Artifact: ciArtifact.Image, + TargetPlatforms: utils.ConvertTargetPlatformStringToObject(ciArtifact.TargetPlatforms), + ArtifactId: ciArtifact.Id, + IsArtifactUploaded: isArtifactUploaded, + EnvironmentId: workflow.EnvironmentId, + EnvironmentName: environmentName, + PipelineType: workflow.CiPipeline.PipelineType, + PodName: workflow.PodName, + WorkflowExecutionStage: adapter2.ConvertDBWorkflowStageToMap(wfStagesDetail, workflow.Id, workflow.Status, workflow.PodStatus, workflow.Message, bean2.CI_WORKFLOW_TYPE.String(), workflow.StartedOn, workflow.FinishedOn), } return workflowResponse, nil } @@ -1192,7 +1208,7 @@ func (impl *CiHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus } if savedWorkflow.ExecutorType == cdWorkflow.WORKFLOW_EXECUTOR_TYPE_SYSTEM && savedWorkflow.Status == executors.WorkflowCancel { savedWorkflow.PodStatus = "Failed" - savedWorkflow.Message = TERMINATE_MESSAGE + savedWorkflow.Message = constants2.TERMINATE_MESSAGE } savedWorkflow.FinishedOn = workflowStatus.FinishedAt.Time savedWorkflow.Name = workflowName @@ -1201,7 +1217,7 @@ func (impl *CiHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus savedWorkflow.CiArtifactLocation = ciArtifactLocation savedWorkflow.PodName = podName impl.Logger.Debugw("updating workflow ", "workflow", savedWorkflow) - err = impl.ciWorkflowRepository.UpdateWorkFlow(savedWorkflow) + err = impl.workFlowStageStatusService.SaveCiWorkflowWithStage(savedWorkflow) if err != nil { impl.Logger.Error("update wf failed for id " + strconv.Itoa(savedWorkflow.Id)) return 0, err @@ -1606,7 +1622,7 @@ func (impl *CiHandlerImpl) FetchMaterialInfoByArtifactId(ciArtifactId int, envId } func (impl *CiHandlerImpl) UpdateCiWorkflowStatusFailure(timeoutForFailureCiBuild int) error { - ciWorkflows, err := impl.ciWorkflowRepository.FindByStatusesIn([]string{Starting, Running}) + ciWorkflows, err := impl.ciWorkflowRepository.FindByStatusesIn([]string{constants2.Starting, constants2.Running}) if err != nil { impl.Logger.Errorw("error on fetching ci workflows", "err", err) return err @@ -1621,7 +1637,7 @@ func (impl *CiHandlerImpl) UpdateCiWorkflowStatusFailure(timeoutForFailureCiBuil var isExt bool var env *repository2.Environment var restConfig *rest.Config - if ciWorkflow.Namespace != DefaultCiWorkflowNamespace { + if ciWorkflow.Namespace != constants2.DefaultCiWorkflowNamespace { isExt = true env, err = impl.envRepository.FindById(ciWorkflow.EnvironmentId) if err != nil { @@ -1654,7 +1670,7 @@ func (impl *CiHandlerImpl) UpdateCiWorkflowStatusFailure(timeoutForFailureCiBuil //if ci workflow is exists, check its pod if !isEligibleToMarkFailed { - ns := DefaultCiWorkflowNamespace + ns := constants2.DefaultCiWorkflowNamespace if isExt { _, client, err = impl.k8sCommonService.GetCoreClientByClusterId(env.ClusterId) if err != nil { @@ -1681,7 +1697,7 @@ func (impl *CiHandlerImpl) UpdateCiWorkflowStatusFailure(timeoutForFailureCiBuil } } else { //check workflow status,get the status - if wf.Status == string(v1alpha1.WorkflowFailed) && wf.Message == POD_DELETED_MESSAGE { + if wf.Status == string(v1alpha1.WorkflowFailed) && wf.Message == constants2.POD_DELETED_MESSAGE { isPodDeleted = true } } @@ -1697,7 +1713,7 @@ func (impl *CiHandlerImpl) UpdateCiWorkflowStatusFailure(timeoutForFailureCiBuil } else { ciWorkflow.Message = "marked failed by job" } - err := impl.ciWorkflowRepository.UpdateWorkFlow(ciWorkflow) + err := impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(ciWorkflow) if err != nil { impl.Logger.Errorw("unable to update ci workflow, its eligible to mark failed", "err", err) // skip this and process for next ci workflow diff --git a/pkg/pipeline/CiService.go b/pkg/pipeline/CiService.go index 7adfcd1430..d663985019 100644 --- a/pkg/pipeline/CiService.go +++ b/pkg/pipeline/CiService.go @@ -35,6 +35,7 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/adapter" pipelineConst "github.com/devtron-labs/devtron/pkg/pipeline/constants" "github.com/devtron-labs/devtron/pkg/pipeline/infraProviders" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" bean2 "github.com/devtron-labs/devtron/pkg/plugin/bean" "github.com/devtron-labs/devtron/util/sliceUtil" "path" @@ -84,7 +85,7 @@ type CiServiceImpl struct { Logger *zap.SugaredLogger workflowService WorkflowService ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository - ciWorkflowRepository pipelineConfig.CiWorkflowRepository + workflowStageStatusService workflowStatus.WorkFlowStageStatusService eventClient client.EventClient eventFactory client.EventFactory ciPipelineRepository pipelineConfig.CiPipelineRepository @@ -108,7 +109,7 @@ type CiServiceImpl struct { func NewCiServiceImpl(Logger *zap.SugaredLogger, workflowService WorkflowService, ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository, - ciWorkflowRepository pipelineConfig.CiWorkflowRepository, eventClient client.EventClient, + workflowStageStatusService workflowStatus.WorkFlowStageStatusService, eventClient client.EventClient, eventFactory client.EventFactory, ciPipelineRepository pipelineConfig.CiPipelineRepository, ciArtifactRepository repository5.CiArtifactRepository, @@ -131,7 +132,7 @@ func NewCiServiceImpl(Logger *zap.SugaredLogger, workflowService WorkflowService Logger: Logger, workflowService: workflowService, ciPipelineMaterialRepository: ciPipelineMaterialRepository, - ciWorkflowRepository: ciWorkflowRepository, + workflowStageStatusService: workflowStageStatusService, eventClient: eventClient, eventFactory: eventFactory, ciPipelineRepository: ciPipelineRepository, @@ -257,9 +258,9 @@ func (impl *CiServiceImpl) markCurrentCiWorkflowFailed(savedCiWf *pipelineConfig var dbErr error if savedCiWf.Id == 0 { - dbErr = impl.ciWorkflowRepository.SaveWorkFlow(savedCiWf) + dbErr = impl.workflowStageStatusService.SaveCiWorkflowWithStage(savedCiWf) } else { - dbErr = impl.ciWorkflowRepository.UpdateWorkFlow(savedCiWf) + dbErr = impl.workflowStageStatusService.UpdateCiWorkflowWithStage(savedCiWf) } if dbErr != nil { @@ -364,7 +365,7 @@ func (impl *CiServiceImpl) TriggerCiPipeline(trigger types.Trigger) (int, error) if err != nil { savedCiWf.Status = cdWorkflow.WorkflowAborted savedCiWf.Message = err.Error() - err1 := impl.ciWorkflowRepository.UpdateWorkFlow(savedCiWf) + err1 := impl.workflowStageStatusService.UpdateCiWorkflowWithStage(savedCiWf) if err1 != nil { impl.Logger.Errorw("could not save workflow, after failing due to conflicting image tag") } @@ -519,7 +520,7 @@ func (impl *CiServiceImpl) saveNewWorkflow(pipeline *pipelineConfig.CiPipeline, ciWorkflow.Namespace = ciWorkflowConfigNamespace ciWorkflow.EnvironmentId = EnvironmentId } - err := impl.ciWorkflowRepository.SaveWorkFlow(ciWorkflow) + err := impl.workflowStageStatusService.SaveCiWorkflowWithStage(ciWorkflow) if err != nil { impl.Logger.Errorw("saving workflow error", "err", err) return &pipelineConfig.CiWorkflow{}, err @@ -1086,7 +1087,7 @@ func (impl *CiServiceImpl) updateCiWorkflow(request *types.WorkflowRequest, save ciBuildConfig := request.CiBuildConfig ciBuildType := string(ciBuildConfig.CiBuildType) savedWf.CiBuildType = ciBuildType - return impl.ciWorkflowRepository.UpdateWorkFlow(savedWf) + return impl.workflowStageStatusService.UpdateCiWorkflowWithStage(savedWf) } func _getTruncatedImageTag(imageTag string) string { diff --git a/pkg/pipeline/WebhookService.go b/pkg/pipeline/WebhookService.go index 5b4b3446f6..d7a66a7bfb 100644 --- a/pkg/pipeline/WebhookService.go +++ b/pkg/pipeline/WebhookService.go @@ -27,6 +27,7 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/pkg/pipeline/bean" types2 "github.com/devtron-labs/devtron/pkg/pipeline/types" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" "github.com/devtron-labs/devtron/pkg/workflow/cd" util3 "github.com/devtron-labs/devtron/util" "go.uber.org/zap" @@ -76,24 +77,27 @@ type WebhookService interface { } type WebhookServiceImpl struct { - ciArtifactRepository repository.CiArtifactRepository - ciConfig *types2.CiConfig - logger *zap.SugaredLogger - ciPipelineRepository pipelineConfig.CiPipelineRepository - ciWorkflowRepository pipelineConfig.CiWorkflowRepository - cdWorkflowCommonService cd.CdWorkflowCommonService + ciArtifactRepository repository.CiArtifactRepository + ciConfig *types2.CiConfig + logger *zap.SugaredLogger + ciPipelineRepository pipelineConfig.CiPipelineRepository + ciWorkflowRepository pipelineConfig.CiWorkflowRepository + cdWorkflowCommonService cd.CdWorkflowCommonService + workFlowStageStatusService workflowStatus.WorkFlowStageStatusService } func NewWebhookServiceImpl(ciArtifactRepository repository.CiArtifactRepository, logger *zap.SugaredLogger, ciPipelineRepository pipelineConfig.CiPipelineRepository, ciWorkflowRepository pipelineConfig.CiWorkflowRepository, - cdWorkflowCommonService cd.CdWorkflowCommonService) *WebhookServiceImpl { + cdWorkflowCommonService cd.CdWorkflowCommonService, + workFlowStageStatusService workflowStatus.WorkFlowStageStatusService) *WebhookServiceImpl { webhookHandler := &WebhookServiceImpl{ - ciArtifactRepository: ciArtifactRepository, - logger: logger, - ciPipelineRepository: ciPipelineRepository, - ciWorkflowRepository: ciWorkflowRepository, - cdWorkflowCommonService: cdWorkflowCommonService, + ciArtifactRepository: ciArtifactRepository, + logger: logger, + ciPipelineRepository: ciPipelineRepository, + ciWorkflowRepository: ciWorkflowRepository, + cdWorkflowCommonService: cdWorkflowCommonService, + workFlowStageStatusService: workFlowStageStatusService, } config, err := types2.GetCiConfig() if err != nil { @@ -161,7 +165,7 @@ func (impl *WebhookServiceImpl) HandleMultipleImagesFromEvent(imageDetails []*re GitTriggers: ciWorkflow.GitTriggers, Message: ciWorkflow.Message, } - err = impl.ciWorkflowRepository.SaveWorkFlow(workflow) + err = impl.workFlowStageStatusService.SaveCiWorkflowWithStage(workflow) if err != nil { impl.logger.Errorw("error in saving workflow for child workflow", "err", err, "parentCiWorkflowId", ciWorkflowId) return nil, err diff --git a/pkg/pipeline/bean/CdHandlerBean.go b/pkg/pipeline/bean/CdHandlerBean.go index a3118943d6..4b6480e365 100644 --- a/pkg/pipeline/bean/CdHandlerBean.go +++ b/pkg/pipeline/bean/CdHandlerBean.go @@ -4,35 +4,37 @@ import ( "github.com/devtron-labs/common-lib/utils/bean" "github.com/devtron-labs/devtron/internal/sql/repository/imageTagging" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + bean2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" "time" ) type CdWorkflowWithArtifact struct { - Id int `json:"id"` - CdWorkflowId int `json:"cd_workflow_id"` - Name string `json:"name"` - Status string `json:"status"` - PodStatus string `json:"pod_status"` - Message string `json:"message"` - StartedOn time.Time `json:"started_on"` - FinishedOn time.Time `json:"finished_on"` - PipelineId int `json:"pipeline_id"` - Namespace string `json:"namespace"` - LogFilePath string `json:"log_file_path"` - TriggeredBy int32 `json:"triggered_by"` - EmailId string `json:"email_id"` - Image string `json:"image"` - TargetPlatforms []*bean.TargetPlatform `json:"targetPlatforms"` - MaterialInfo string `json:"material_info,omitempty"` - DataSource string `json:"data_source,omitempty"` - CiArtifactId int `json:"ci_artifact_id,omitempty"` - IsArtifactUploaded bool `json:"isArtifactUploaded"` - WorkflowType string `json:"workflow_type,omitempty"` - ExecutorType string `json:"executor_type,omitempty"` - BlobStorageEnabled bool `json:"blobStorageEnabled"` - GitTriggers map[int]pipelineConfig.GitCommit `json:"gitTriggers"` - CiMaterials []pipelineConfig.CiPipelineMaterialResponse `json:"ciMaterials"` - ImageReleaseTags []*repository.ImageTag `json:"imageReleaseTags"` - ImageComment *repository.ImageComment `json:"imageComment"` - RefCdWorkflowRunnerId int `json:"referenceCdWorkflowRunnerId"` + Id int `json:"id"` + CdWorkflowId int `json:"cd_workflow_id"` + Name string `json:"name"` + Status string `json:"status"` + PodStatus string `json:"pod_status"` + Message string `json:"message"` + StartedOn time.Time `json:"started_on"` + FinishedOn time.Time `json:"finished_on"` + PipelineId int `json:"pipeline_id"` + Namespace string `json:"namespace"` + LogFilePath string `json:"log_file_path"` + TriggeredBy int32 `json:"triggered_by"` + EmailId string `json:"email_id"` + Image string `json:"image"` + TargetPlatforms []*bean.TargetPlatform `json:"targetPlatforms"` + MaterialInfo string `json:"material_info,omitempty"` + DataSource string `json:"data_source,omitempty"` + CiArtifactId int `json:"ci_artifact_id,omitempty"` + IsArtifactUploaded bool `json:"isArtifactUploaded"` + WorkflowType string `json:"workflow_type,omitempty"` + ExecutorType string `json:"executor_type,omitempty"` + BlobStorageEnabled bool `json:"blobStorageEnabled"` + GitTriggers map[int]pipelineConfig.GitCommit `json:"gitTriggers"` + CiMaterials []pipelineConfig.CiPipelineMaterialResponse `json:"ciMaterials"` + ImageReleaseTags []*repository.ImageTag `json:"imageReleaseTags"` + ImageComment *repository.ImageComment `json:"imageComment"` + RefCdWorkflowRunnerId int `json:"referenceCdWorkflowRunnerId"` + WorkflowExecutionStage map[string][]*bean2.WorkflowStageDto `json:"workflowExecutionStages"` } diff --git a/pkg/pipeline/constants/constants.go b/pkg/pipeline/constants/constants.go index 823fbe1689..0d5cd5bcab 100644 --- a/pkg/pipeline/constants/constants.go +++ b/pkg/pipeline/constants/constants.go @@ -64,3 +64,11 @@ const ( ExtraEnvVarExternalCiArtifactKey = "externalCiArtifact" ExtraEnvVarImageDigestKey = "imageDigest" ) + +const DefaultCiWorkflowNamespace = "devtron-ci" +const Running = "Running" +const Starting = "Starting" +const POD_DELETED_MESSAGE = "pod deleted" +const TERMINATE_MESSAGE = "workflow shutdown with strategy: Terminate" +const FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE = "workflow shutdown with strategy: Force Abort" +const POD_TIMEOUT_MESSAGE = "Pod was active on the node longer than the specified deadline" diff --git a/pkg/pipeline/types/Workflow.go b/pkg/pipeline/types/Workflow.go index f2895ec043..1f13f0f0be 100644 --- a/pkg/pipeline/types/Workflow.go +++ b/pkg/pipeline/types/Workflow.go @@ -34,6 +34,7 @@ import ( repository4 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" infraBean "github.com/devtron-labs/devtron/pkg/infraConfig/bean/v1" "github.com/devtron-labs/devtron/pkg/pipeline/bean" + bean6 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" bean4 "github.com/devtron-labs/devtron/pkg/plugin/bean" "github.com/devtron-labs/devtron/pkg/resourceQualifiers" "k8s.io/api/core/v1" @@ -641,36 +642,37 @@ type ChildCdMetadata struct { } type WorkflowResponse struct { - Id int `json:"id"` - Name string `json:"name"` - Status string `json:"status"` - PodStatus string `json:"podStatus"` - Message string `json:"message"` - StartedOn time.Time `json:"startedOn"` - FinishedOn time.Time `json:"finishedOn"` - CiPipelineId int `json:"ciPipelineId"` - Namespace string `json:"namespace"` - LogLocation string `json:"logLocation"` - BlobStorageEnabled bool `json:"blobStorageEnabled"` - GitTriggers map[int]pipelineConfig.GitCommit `json:"gitTriggers"` - CiMaterials []pipelineConfig.CiPipelineMaterialResponse `json:"ciMaterials"` - TriggeredBy int32 `json:"triggeredBy"` - Artifact string `json:"artifact"` - TriggeredByEmail string `json:"triggeredByEmail"` - Stage string `json:"stage"` - ArtifactId int `json:"artifactId"` - IsArtifactUploaded bool `json:"isArtifactUploaded"` - IsVirtualEnvironment bool `json:"isVirtualEnvironment"` - PodName string `json:"podName"` - EnvironmentId int `json:"environmentId"` - EnvironmentName string `json:"environmentName"` - ImageReleaseTags []*repository3.ImageTag `json:"imageReleaseTags"` - ImageComment *repository3.ImageComment `json:"imageComment"` - AppWorkflowId int `json:"appWorkflowId"` - CustomTag *bean3.CustomTagErrorResponse `json:"customTag,omitempty"` - PipelineType string `json:"pipelineType"` - ReferenceWorkflowId int `json:"referenceWorkflowId"` - TargetPlatforms []*bean7.TargetPlatform `json:"targetPlatforms"` + Id int `json:"id"` + Name string `json:"name"` + Status string `json:"status"` + PodStatus string `json:"podStatus"` + Message string `json:"message"` + StartedOn time.Time `json:"startedOn"` + FinishedOn time.Time `json:"finishedOn"` + CiPipelineId int `json:"ciPipelineId"` + Namespace string `json:"namespace"` + LogLocation string `json:"logLocation"` + BlobStorageEnabled bool `json:"blobStorageEnabled"` + GitTriggers map[int]pipelineConfig.GitCommit `json:"gitTriggers"` + CiMaterials []pipelineConfig.CiPipelineMaterialResponse `json:"ciMaterials"` + TriggeredBy int32 `json:"triggeredBy"` + Artifact string `json:"artifact"` + TriggeredByEmail string `json:"triggeredByEmail"` + Stage string `json:"stage"` + ArtifactId int `json:"artifactId"` + IsArtifactUploaded bool `json:"isArtifactUploaded"` + IsVirtualEnvironment bool `json:"isVirtualEnvironment"` + PodName string `json:"podName"` + EnvironmentId int `json:"environmentId"` + EnvironmentName string `json:"environmentName"` + ImageReleaseTags []*repository3.ImageTag `json:"imageReleaseTags"` + ImageComment *repository3.ImageComment `json:"imageComment"` + AppWorkflowId int `json:"appWorkflowId"` + CustomTag *bean3.CustomTagErrorResponse `json:"customTag,omitempty"` + PipelineType string `json:"pipelineType"` + ReferenceWorkflowId int `json:"referenceWorkflowId"` + TargetPlatforms []*bean7.TargetPlatform `json:"targetPlatforms"` + WorkflowExecutionStage map[string][]*bean6.WorkflowStageDto `json:"workflowExecutionStages"` } type ConfigMapSecretDto struct { diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go new file mode 100644 index 0000000000..81bb8d6f7b --- /dev/null +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -0,0 +1,480 @@ +package workflowStatus + +import ( + "encoding/json" + "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" + bean3 "github.com/devtron-labs/devtron/pkg/bean" + bean4 "github.com/devtron-labs/devtron/pkg/pipeline/bean" + "github.com/devtron-labs/devtron/pkg/pipeline/constants" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" + bean2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/repository" + "github.com/devtron-labs/devtron/pkg/sql" + "go.uber.org/zap" + "slices" + "strings" + "time" +) + +type WorkFlowStageStatusService interface { + SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error + UpdateCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error + SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) + UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error + GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*repository.WorkflowExecutionStage, error) + GetPrePostWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) + GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean2.WorkflowStageDto, error) +} + +type WorkFlowStageStatusServiceImpl struct { + logger *zap.SugaredLogger + workflowStatusRepository repository.WorkflowStageRepository + ciWorkflowRepository pipelineConfig.CiWorkflowRepository + cdWorkflowRepository pipelineConfig.CdWorkflowRepository + transactionManager sql.TransactionWrapper +} + +func NewWorkflowStageFlowStatusServiceImpl(logger *zap.SugaredLogger, + workflowStatusRepository repository.WorkflowStageRepository, + ciWorkflowRepository pipelineConfig.CiWorkflowRepository, + cdWorkflowRepository pipelineConfig.CdWorkflowRepository, + transactionManager sql.TransactionWrapper) *WorkFlowStageStatusServiceImpl { + return &WorkFlowStageStatusServiceImpl{ + logger: logger, + workflowStatusRepository: workflowStatusRepository, + ciWorkflowRepository: ciWorkflowRepository, + cdWorkflowRepository: cdWorkflowRepository, + transactionManager: transactionManager, + } +} + +func (impl *WorkFlowStageStatusServiceImpl) SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wf.Name, "error", err) + return err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) + } + }() + wf.Status = cdWorkflow.WorkflowWaitingToStart + err = impl.ciWorkflowRepository.SaveWorkFlowWithTx(wf, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) + return err + } + pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String()) + pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) + return err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.logger.Errorw("error in committing transaction", "workflowName", wf.Name, "error", err) + return err + } + return nil + +} + +func (impl *WorkFlowStageStatusServiceImpl) UpdateCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wf.Name, "error", err) + return err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) + } + }() + + if checkIfWorkflowIsWaitingToStart(wf.Status, wf.PodStatus) { + wf.Status = cdWorkflow.WorkflowWaitingToStart + } + + pipelineStageStatus, updatedWfStatus := impl.getUpdatedPipelineStagesForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String(), wf.Status, wf.PodStatus, wf.Message, wf.PodName) + pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) + return err + } + + // update workflow with updated wf status + wf.Status = updatedWfStatus + err = impl.ciWorkflowRepository.UpdateWorkFlowWithTx(wf, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) + return err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.logger.Errorw("error in committing transaction", "workflowName", wf.Name, "error", err) + return err + } + return nil + +} + +func (impl *WorkFlowStageStatusServiceImpl) getUpdatedPipelineStagesForWorkflow(wfId int, wfType string, wfStatus string, podStatus string, message string, podName string) ([]*repository.WorkflowExecutionStage, string) { + // implementation + updatedWfStatus := wfStatus + currentWorkflowStages, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdAndType(wfId, wfType) + if err != nil { + impl.logger.Errorw("error in getting workflow stages", "workflowId", wfId, "error", err) + return nil, updatedWfStatus + } + if len(currentWorkflowStages) == 0 { + return []*repository.WorkflowExecutionStage{}, updatedWfStatus + } + impl.logger.Infow("step-1", "wfId", wfId, "wfType", wfType, "wfStatus", wfStatus, "podStatus", podStatus, "message", message) + currentWorkflowStages = impl.updatePodStages(currentWorkflowStages, podStatus, message, podName) + impl.logger.Infow("step-2", "updated pod stages", currentWorkflowStages) + currentWorkflowStages, updatedWfStatus = impl.updateWorkflowStagesToDevtronStatus(currentWorkflowStages, wfStatus, message, podStatus) + impl.logger.Infow("step-3", "updated workflow stages", currentWorkflowStages) + + if len(updatedWfStatus) == 0 { + //case when current wfStatus and received wfStatus both are terminal, then keep the status as it is in DB + dbWfr, err := impl.cdWorkflowRepository.FindWorkflowRunnerById(wfId) + if err != nil { + impl.logger.Errorw("error in getting workflow runner", "wfId", wfId, "error", err) + return nil, updatedWfStatus + } + updatedWfStatus = dbWfr.Status + } + + return currentWorkflowStages, updatedWfStatus +} + +func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStages []*repository.WorkflowExecutionStage, podStatus string, message string, podName string) []*repository.WorkflowExecutionStage { + //update pod stage status by using convertPodStatusToDevtronStatus + for _, stage := range currentWorkflowStages { + if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_POD { + // add pod name in stage metadata if not empty + if len(podName) > 0 { + marshalledMetadata, _ := json.Marshal(map[string]string{"podName": podName}) + stage.Metadata = string(marshalledMetadata) + } + switch podStatus { + case "Pending": + //only update message as we create this entry when pod is created + stage.Message = message + case "Running": + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { + stage.Message = message + stage.Status = bean2.WORKFLOW_STAGE_STATUS_RUNNING + stage.StartTime = time.Now().Format(bean3.LayoutRFC3339) + } + case "Succeeded": + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + stage.Message = message + stage.Status = bean2.WORKFLOW_STAGE_STATUS_SUCCEEDED + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + case "Failed", "Error": + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + + stage.Message = message + stage.Status = bean2.WORKFLOW_STAGE_STATUS_FAILED + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + default: + impl.logger.Errorw("unknown pod status", "podStatus", podStatus) + stage.Message = message + stage.Status = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + } + } + return currentWorkflowStages +} + +// Each case has 2 steps to do +// step-1: update latest status field if its not terminal already +// step-2: accordingly update stage status +func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus(currentWorkflowStages []*repository.WorkflowExecutionStage, wfStatus string, wfMessage string, podStatus string) ([]*repository.WorkflowExecutionStage, string) { + // implementation + updatedWfStatus := "" + //todo for switch case use enums + switch strings.ToLower(podStatus) { + case "pending": + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = cdWorkflow.WorkflowWaitingToStart + } + + // update workflow preparation stage and pod status if terminal + for _, stage := range currentWorkflowStages { + if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { + extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + if extractedStatus != bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { + stage.Status = extractedStatus + } + } + + //also mark pod status as terminal if wfstatus is terminal + if stage.StageName == bean2.POD_EXECUTION && slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + stage.Status = adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + } + case "running": + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = constants.Running + } + //if pod is running, update preparation and execution stages + for _, stage := range currentWorkflowStages { + if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + //mark preparation stage as completed + if stage.StageName == bean2.WORKFLOW_PREPARATION { + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + stage.Status = bean2.WORKFLOW_STAGE_STATUS_SUCCEEDED + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + } + + //mark execution stage as started + if stage.StageName == bean2.WORKFLOW_EXECUTION { + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { + stage.Status = bean2.WORKFLOW_STAGE_STATUS_RUNNING + stage.StartTime = time.Now().Format(bean3.LayoutRFC3339) + } else if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + if extractedStatus.IsTerminal() { + stage.Status = extractedStatus + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + } + } + } + } + case "succeeded": + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = cdWorkflow.WorkflowSucceeded + } + //if pod is succeeded, update execution stage + for _, stage := range currentWorkflowStages { + if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + //mark execution stage as completed + if stage.StageName == bean2.WORKFLOW_EXECUTION { + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + stage.Status = bean2.WORKFLOW_STAGE_STATUS_SUCCEEDED + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + } + } + } + case "failed", "error": + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = cdWorkflow.WorkflowFailed + } + + //if pod is failed, update execution stage + for _, stage := range currentWorkflowStages { + if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + //mark execution stage as completed + if stage.StageName == bean2.WORKFLOW_EXECUTION { + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + if extractedStatus.IsTerminal() { + stage.Status = extractedStatus + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { + updatedWfStatus = cdWorkflow.WorkflowTimedOut + } + } + } + } else if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { + extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + if extractedStatus.IsTerminal() { + stage.Status = extractedStatus + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + } + } + } + default: + impl.logger.Errorw("unknown pod status", "podStatus", podStatus) + //mark workflow stage status as unknown and end it + for _, stage := range currentWorkflowStages { + if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + //mark execution stage as completed + if stage.StageName == bean2.WORKFLOW_EXECUTION { + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + stage.Status = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } + } + } + } + } + + return currentWorkflowStages, updatedWfStatus +} + +func (impl *WorkFlowStageStatusServiceImpl) GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*repository.WorkflowExecutionStage, error) { + // implementation + + dbData, err := impl.workflowStatusRepository.GetCiWorkflowStagesByWorkflowIds(wfIds) + if err != nil { + impl.logger.Errorw("error in getting ci workflow stages", "error", err) + return nil, err + } + if len(dbData) == 0 { + return []*repository.WorkflowExecutionStage{}, nil + } else { + return dbData, nil + } +} + +func (impl *WorkFlowStageStatusServiceImpl) GetPrePostWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) { + // implementation + + dbData, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdAndWtype(wfId, wfType) + if err != nil { + impl.logger.Errorw("error in getting ci workflow stages", "error", err) + return nil, err + } + if len(dbData) == 0 { + return []*repository.WorkflowExecutionStage{}, nil + } else { + return dbData, nil + } +} + +func (impl *WorkFlowStageStatusServiceImpl) GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean2.WorkflowStageDto, error) { + // implementation + resp := map[int]map[string][]*bean2.WorkflowStageDto{} + if len(wfIdWfTypeMap) == 0 { + return resp, nil + } + //first create a map of pre-runner ids and post-runner ids + prePostRunnerIds := map[string][]int{} + for wfId, wf := range wfIdWfTypeMap { + if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE.String() { + prePostRunnerIds[bean.CD_WORKFLOW_TYPE_PRE.String()] = append(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_PRE.String()], wfId) + } else if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_POST.String() { + prePostRunnerIds[bean.CD_WORKFLOW_TYPE_POST.String()] = append(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_POST.String()], wfId) + } + } + + preCdDbData, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdsAndWtype(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_PRE.String()], bean.CD_WORKFLOW_TYPE_PRE.String()) + if err != nil { + impl.logger.Errorw("error in getting pre-ci workflow stages", "error", err) + return resp, err + } + //do the above for post cd + postCdDbData, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdsAndWtype(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_POST.String()], bean.CD_WORKFLOW_TYPE_POST.String()) + if err != nil { + impl.logger.Errorw("error in getting post-ci workflow stages", "error", err) + return resp, err + } + //iterate over prePostRunnerIds and create response structure using ConvertDBWorkflowStageToMap function + for wfId, wf := range wfIdWfTypeMap { + if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE.String() { + resp[wfId] = adapter.ConvertDBWorkflowStageToMap(preCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) + } else if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_POST.String() { + resp[wfId] = adapter.ConvertDBWorkflowStageToMap(postCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) + } + } + return resp, nil +} + +func (impl *WorkFlowStageStatusServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wfr.Name, "error", err) + return wfr, err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) + } + }() + wfr.Status = cdWorkflow.WorkflowWaitingToStart + wfr, err = impl.cdWorkflowRepository.SaveWorkFlowRunnerWithTx(wfr, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) + return wfr, err + } + pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wfr.Id, wfr.WorkflowType.String()) + pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) + return wfr, err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.logger.Errorw("error in committing transaction", "workflowName", wfr.Name, "error", err) + return wfr, err + } + return wfr, nil +} + +func (impl *WorkFlowStageStatusServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wfr.Name, "error", err) + return err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) + } + }() + + if (wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_POST) && checkIfWorkflowIsWaitingToStart(wfr.Status, wfr.PodStatus) { + wfr.Status = cdWorkflow.WorkflowWaitingToStart + } + + if wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_POST { + pipelineStageStatus, updatedWfStatus := impl.getUpdatedPipelineStagesForWorkflow(wfr.Id, wfr.WorkflowType.String(), wfr.Status, wfr.PodStatus, wfr.Message, wfr.PodName) + pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) + return err + } + wfr.Status = updatedWfStatus + } else { + impl.logger.Infow("workflow type not supported to update stage data", "workflowName", wfr.Name, "workflowType", wfr.WorkflowType) + } + + //update workflow runner now with updatedWfStatus if applicable + err = impl.cdWorkflowRepository.UpdateWorkFlowRunnerWithTx(wfr, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) + return err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.logger.Errorw("error in committing transaction", "workflowName", wfr.Name, "error", err) + return err + } + return nil + +} + +func checkIfWorkflowIsWaitingToStart(wfStatus string, podStatus string) bool { + // implementation + return strings.ToLower(podStatus) == "pending" && (strings.ToLower(wfStatus) == strings.ToLower(cdWorkflow.WorkflowWaitingToStart) || strings.ToLower(wfStatus) == "running" || strings.ToLower(wfStatus) == "starting") +} diff --git a/pkg/pipeline/workflowStatus/adapter/adapter.go b/pkg/pipeline/workflowStatus/adapter/adapter.go new file mode 100644 index 0000000000..6edbf905db --- /dev/null +++ b/pkg/pipeline/workflowStatus/adapter/adapter.go @@ -0,0 +1,164 @@ +package adapter + +import ( + "encoding/json" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" + bean3 "github.com/devtron-labs/devtron/pkg/bean" + "github.com/devtron-labs/devtron/pkg/pipeline/constants" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/repository" + "github.com/devtron-labs/devtron/pkg/sql" + "log" + "strings" + "time" +) + +func ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean.WorkflowStageDto { + wfMap := make(map[string][]*bean.WorkflowStageDto) + foundInDb := false + for _, wfStage := range workflowStages { + if wfStage.WorkflowId == wfId { + wfMap[wfStage.StatusType.ToString()] = append(wfMap[wfStage.StatusType.ToString()], convertDBWorkflowStageToDto(wfStage)) + foundInDb = true + } + } + + if !foundInDb { + return GetWfStageDataForOldRunners(wfId, status, message, podStatus, wfType, startTime, endTime) + } + + return wfMap + +} + +func convertDBWorkflowStageToDto(stage *repository.WorkflowExecutionStage) *bean.WorkflowStageDto { + if stage == nil { + return &bean.WorkflowStageDto{} + } + return &bean.WorkflowStageDto{ + Id: stage.Id, + StageName: stage.StageName, + Status: stage.Status, + Message: stage.Message, + Metadata: getMetadataJson(stage.Metadata), + WorkflowId: stage.WorkflowId, + WorkflowType: stage.WorkflowType, + StartTime: stage.StartTime, + EndTime: stage.EndTime, + } +} + +func getMetadataJson(metadata string) map[string]interface{} { + var response map[string]interface{} + //todo handle error + json.Unmarshal([]byte(metadata), &response) + //if err != nil { + // return nil, err + //} + return response +} + +func ConvertWfStatusToDevtronStatus(wfStatus string, wfMessage string) bean.WorkflowStageStatus { + // implementation + switch strings.ToLower(wfStatus) { + case "pending", strings.ToLower(cdWorkflow.WorkflowWaitingToStart): + return bean.WORKFLOW_STAGE_STATUS_NOT_STARTED + case "starting", "running": + return bean.WORKFLOW_STAGE_STATUS_RUNNING + case "succeeded": + return bean.WORKFLOW_STAGE_STATUS_SUCCEEDED + case "failed", "error", "errored": + if strings.ToLower(wfMessage) == strings.ToLower(constants.POD_TIMEOUT_MESSAGE) { + return bean.WORKFLOW_STAGE_STATUS_TIMEOUT + } else { + return bean.WORKFLOW_STAGE_STATUS_FAILED + } + case "aborted", "cancelled": + return bean.WORKFLOW_STAGE_STATUS_ABORTED + default: + log.Println("unknown wf status", "wf", wfStatus) + return bean.WORKFLOW_STAGE_STATUS_UNKNOWN + } +} + +func GetWfStageDataForOldRunners(wfId int, wfStatus, wfMessage, podStatus, wfType string, startTime, endTime time.Time) map[string][]*bean.WorkflowStageDto { + // implementation + resp := make(map[string][]*bean.WorkflowStageDto) + + executionStage := GetDefaultWorkflowExecutionStage(wfId, wfType) + executionStage.Status = ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + executionStage.StartTime = startTime.Format(bean3.LayoutRFC3339) + executionStage.EndTime = endTime.Format(bean3.LayoutRFC3339) + executionStage.Message = wfMessage + + resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()], convertDBWorkflowStageToDto(executionStage)) + + podStage := GetDefaultPodExecutionStage(wfId, wfType) + podStage.Status = ConvertWfStatusToDevtronStatus(podStatus, wfMessage) + podStage.StartTime = startTime.Format(bean3.LayoutRFC3339) + podStage.EndTime = endTime.Format(bean3.LayoutRFC3339) + podStage.Message = wfMessage + resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()], convertDBWorkflowStageToDto(executionStage)) + + return resp +} + +func GetDefaultPipelineStatusForWorkflow(wfId int, wfType string) []*repository.WorkflowExecutionStage { + // implementation + resp := []*repository.WorkflowExecutionStage{} + resp = append(resp, GetDefaultWorkflowPreparationStage(wfId, wfType)) + resp = append(resp, GetDefaultWorkflowExecutionStage(wfId, wfType)) + resp = append(resp, GetDefaultPodExecutionStage(wfId, wfType)) + return resp +} + +func GetDefaultWorkflowPreparationStage(workflowId int, workflowType string) *repository.WorkflowExecutionStage { + // implementation + return &repository.WorkflowExecutionStage{ + StageName: bean.WORKFLOW_PREPARATION, + Status: bean.WORKFLOW_STAGE_STATUS_RUNNING, + StatusType: bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW, + StartTime: time.Now().Format(bean3.LayoutRFC3339), + WorkflowId: workflowId, + WorkflowType: workflowType, + Message: "", + Metadata: "{}", + EndTime: "", + //todo do we need audit log since ci-workflow also doesn't have it ?? + AuditLog: sql.NewDefaultAuditLog(1), + } +} + +func GetDefaultWorkflowExecutionStage(workflowId int, workflowType string) *repository.WorkflowExecutionStage { + // implementation + return &repository.WorkflowExecutionStage{ + StageName: bean.WORKFLOW_EXECUTION, + Status: bean.WORKFLOW_STAGE_STATUS_NOT_STARTED, + StatusType: bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW, + StartTime: "", + WorkflowId: workflowId, + WorkflowType: workflowType, + Message: "", + Metadata: "{}", + EndTime: "", + //todo do we need audit log since ci-workflow also doesn't have it ?? + AuditLog: sql.NewDefaultAuditLog(1), + } +} + +func GetDefaultPodExecutionStage(workflowId int, workflowType string) *repository.WorkflowExecutionStage { + // implementation + return &repository.WorkflowExecutionStage{ + StageName: bean.POD_EXECUTION, + Status: bean.WORKFLOW_STAGE_STATUS_NOT_STARTED, + StatusType: bean.WORKFLOW_STAGE_STATUS_TYPE_POD, + StartTime: "", + WorkflowId: workflowId, + WorkflowType: workflowType, + Message: "", + Metadata: "{}", + EndTime: "", + //todo do we need audit log since ci-workflow also doesn't have it ?? + AuditLog: sql.NewDefaultAuditLog(1), + } +} diff --git a/pkg/pipeline/workflowStatus/bean/bean.go b/pkg/pipeline/workflowStatus/bean/bean.go new file mode 100644 index 0000000000..020964686b --- /dev/null +++ b/pkg/pipeline/workflowStatus/bean/bean.go @@ -0,0 +1,61 @@ +package bean + +type WorkflowStageName string + +const ( + WORKFLOW_PREPARATION WorkflowStageName = "Preparation" + WORKFLOW_EXECUTION WorkflowStageName = "Execution" + POD_EXECUTION WorkflowStageName = "Execution" +) + +func (n WorkflowStageName) ToString() string { + return string(n) +} + +type WorkflowStageStatusType string + +const ( + WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW WorkflowStageStatusType = "workflow" + WORKFLOW_STAGE_STATUS_TYPE_POD WorkflowStageStatusType = "pod" +) + +func (n WorkflowStageStatusType) ToString() string { + return string(n) +} + +type WorkflowStageStatus string + +const ( + WORKFLOW_STAGE_STATUS_NOT_STARTED WorkflowStageStatus = "NOT_STARTED" + WORKFLOW_STAGE_STATUS_UNKNOWN WorkflowStageStatus = "UNKNOWN" + WORKFLOW_STAGE_STATUS_RUNNING WorkflowStageStatus = "RUNNING" + WORKFLOW_STAGE_STATUS_SUCCEEDED WorkflowStageStatus = "SUCCEEDED" + WORKFLOW_STAGE_STATUS_FAILED WorkflowStageStatus = "FAILED" + WORKFLOW_STAGE_STATUS_ABORTED WorkflowStageStatus = "ABORTED" + WORKFLOW_STAGE_STATUS_TIMEOUT WorkflowStageStatus = "TIMEOUT" +) + +func (n WorkflowStageStatus) ToString() string { + return string(n) +} + +func (n WorkflowStageStatus) IsTerminal() bool { + switch n { + case WORKFLOW_STAGE_STATUS_SUCCEEDED, WORKFLOW_STAGE_STATUS_FAILED, WORKFLOW_STAGE_STATUS_ABORTED, WORKFLOW_STAGE_STATUS_TIMEOUT: + return true + default: + return false + } +} + +type WorkflowStageDto struct { + Id int `json:"id"` + StageName WorkflowStageName `json:"stageName"` + Status WorkflowStageStatus `json:"status"` + Message string `json:"message"` + Metadata map[string]interface{} `json:"metadata"` + WorkflowId int `json:"workflowId"` + WorkflowType string `json:"workflowType"` + StartTime string `json:"startTime"` + EndTime string `json:"endTime"` +} diff --git a/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go new file mode 100644 index 0000000000..4706d4b5f7 --- /dev/null +++ b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go @@ -0,0 +1,106 @@ +package repository + +import ( + bean2 "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" + "github.com/devtron-labs/devtron/pkg/sql" + "github.com/go-pg/pg" + "go.uber.org/zap" +) + +type WorkflowStageRepository interface { + SaveWorkflowStages(workflowStage []*WorkflowExecutionStage, tx *pg.Tx) ([]*WorkflowExecutionStage, error) + UpdateWorkflowStages(workflowStage []*WorkflowExecutionStage, tx *pg.Tx) ([]*WorkflowExecutionStage, error) + GetWorkflowStagesByWorkflowIdAndType(workflowId int, workflowType string) ([]*WorkflowExecutionStage, error) + GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*WorkflowExecutionStage, error) + GetWorkflowStagesByWorkflowIdAndWtype(wfId int, wfType string) ([]*WorkflowExecutionStage, error) + GetWorkflowStagesByWorkflowIdsAndWtype(wfIds []int, wfType string) ([]*WorkflowExecutionStage, error) +} + +type WorkflowStageRepositoryImpl struct { + logger *zap.SugaredLogger + dbConnection *pg.DB +} + +type WorkflowExecutionStage struct { + tableName struct{} `sql:"workflow_execution_stage" pg:",discard_unknown_columns"` + Id int `sql:"id,pk"` + StageName bean.WorkflowStageName `sql:"stage_name,notnull"` // same as app name + Status bean.WorkflowStageStatus `sql:"status"` + StatusType bean.WorkflowStageStatusType `sql:"status_type"` + Message string `sql:"message"` + Metadata string `sql:"metadata"` + WorkflowId int `sql:"workflow_id,notnull"` + WorkflowType string `sql:"workflow_type,notnull"` + StartTime string `sql:"start_time"` + EndTime string `sql:"end_time"` + + sql.AuditLog +} + +func NewWorkflowStageRepositoryImpl(logger *zap.SugaredLogger, + dbConnection *pg.DB) *WorkflowStageRepositoryImpl { + return &WorkflowStageRepositoryImpl{ + logger: logger, + dbConnection: dbConnection, + } +} + +func (impl *WorkflowStageRepositoryImpl) SaveWorkflowStages(workflowStages []*WorkflowExecutionStage, tx *pg.Tx) ([]*WorkflowExecutionStage, error) { + err := tx.Insert(&workflowStages) + return workflowStages, err +} + +func (impl *WorkflowStageRepositoryImpl) UpdateWorkflowStages(workflowStages []*WorkflowExecutionStage, tx *pg.Tx) ([]*WorkflowExecutionStage, error) { + if len(workflowStages) == 0 { + return workflowStages, nil + } + //todo optimise below for bulk update + for _, stage := range workflowStages { + _, err := tx.Model(stage).WherePK().Update() + if err != nil { + return workflowStages, err + } + } + //_, err := .WherePK().UpdateNotNull() + return workflowStages, nil +} + +func (impl *WorkflowStageRepositoryImpl) GetWorkflowStagesByWorkflowIdAndType(workflowId int, workflowType string) ([]*WorkflowExecutionStage, error) { + var workflowStages []*WorkflowExecutionStage + err := impl.dbConnection.Model(&workflowStages).Where("workflow_id = ?", workflowId).Where("workflow_type = ?", workflowType).Order("id ASC").Select() + return workflowStages, err +} + +func (impl *WorkflowStageRepositoryImpl) GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*WorkflowExecutionStage, error) { + var workflowStages []*WorkflowExecutionStage + err := impl.dbConnection.Model(&workflowStages).Where("workflow_id in (?)", pg.In(wfIds)).Where("workflow_type = ?", bean2.CI_WORKFLOW_TYPE).Order("id ASC").Select() + if err != nil { + impl.logger.Errorw("error in fetching ci workflow stages", "err", err) + return workflowStages, err + } + return workflowStages, err +} + +func (impl *WorkflowStageRepositoryImpl) GetWorkflowStagesByWorkflowIdAndWtype(wfId int, wfType string) ([]*WorkflowExecutionStage, error) { + var workflowStages []*WorkflowExecutionStage + err := impl.dbConnection.Model(&workflowStages).Where("workflow_id = ?", wfId).Where("workflow_type = ?", wfType).Order("id ASC").Select() + if err != nil { + impl.logger.Errorw("error in fetching ci workflow stages", "err", err) + return workflowStages, err + } + return workflowStages, err +} + +func (impl *WorkflowStageRepositoryImpl) GetWorkflowStagesByWorkflowIdsAndWtype(wfIds []int, wfType string) ([]*WorkflowExecutionStage, error) { + var workflowStages []*WorkflowExecutionStage + if len(wfIds) == 0 { + return []*WorkflowExecutionStage{}, nil + } + err := impl.dbConnection.Model(&workflowStages).Where("workflow_id in (?)", pg.In(wfIds)).Where("workflow_type = ?", wfType).Order("id ASC").Select() + if err != nil { + impl.logger.Errorw("error in fetching ci workflow stages", "err", err) + return workflowStages, err + } + return workflowStages, err +} diff --git a/pkg/workflow/cd/CdWorkflowCommonService.go b/pkg/workflow/cd/CdWorkflowCommonService.go index f84b891125..682b3608a0 100644 --- a/pkg/workflow/cd/CdWorkflowCommonService.go +++ b/pkg/workflow/cd/CdWorkflowCommonService.go @@ -31,6 +31,7 @@ import ( "github.com/devtron-labs/devtron/pkg/app/status" common2 "github.com/devtron-labs/devtron/pkg/deployment/common" "github.com/devtron-labs/devtron/pkg/pipeline/types" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" globalUtil "github.com/devtron-labs/devtron/util" "go.opentelemetry.io/otel" "go.uber.org/zap" @@ -58,6 +59,7 @@ type CdWorkflowCommonServiceImpl struct { pipelineRepository pipelineConfig.PipelineRepository pipelineStatusTimelineRepository pipelineConfig.PipelineStatusTimelineRepository deploymentConfigService common2.DeploymentConfigService + workflowStageService workflowStatus.WorkFlowStageStatusService } func NewCdWorkflowCommonServiceImpl(logger *zap.SugaredLogger, @@ -65,7 +67,8 @@ func NewCdWorkflowCommonServiceImpl(logger *zap.SugaredLogger, pipelineStatusTimelineService status.PipelineStatusTimelineService, pipelineRepository pipelineConfig.PipelineRepository, pipelineStatusTimelineRepository pipelineConfig.PipelineStatusTimelineRepository, - deploymentConfigService common2.DeploymentConfigService) (*CdWorkflowCommonServiceImpl, error) { + deploymentConfigService common2.DeploymentConfigService, + workflowStageService workflowStatus.WorkFlowStageStatusService) (*CdWorkflowCommonServiceImpl, error) { config, err := types.GetCdConfig() if err != nil { return nil, err @@ -78,6 +81,7 @@ func NewCdWorkflowCommonServiceImpl(logger *zap.SugaredLogger, pipelineRepository: pipelineRepository, pipelineStatusTimelineRepository: pipelineStatusTimelineRepository, deploymentConfigService: deploymentConfigService, + workflowStageService: workflowStageService, }, nil } @@ -171,7 +175,7 @@ func (impl *CdWorkflowCommonServiceImpl) MarkCurrentDeploymentFailed(runner *pip runner.Message = util.GetClientErrorDetailedMessage(releaseErr) runner.FinishedOn = time.Now() runner.UpdateAuditLog(triggeredBy) - err1 := impl.cdWorkflowRepository.UpdateWorkFlowRunner(runner) + err1 := impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) if err1 != nil { impl.logger.Errorw("error updating cd wf runner status", "err", releaseErr, "currentRunner", runner) return err1 @@ -223,7 +227,7 @@ func (impl *CdWorkflowCommonServiceImpl) UpdateNonTerminalStatusInRunner(ctx con } cdWfr.Status = status cdWfr.UpdateAuditLog(userId) - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(cdWfr) + err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(cdWfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner, UpdateNonTerminalStatusInRunner", "cdWfr", cdWfr, "err", err) return err diff --git a/pkg/workflow/cd/CdWorkflowRunnerService.go b/pkg/workflow/cd/CdWorkflowRunnerService.go index 511d694bc4..ac67daa398 100644 --- a/pkg/workflow/cd/CdWorkflowRunnerService.go +++ b/pkg/workflow/cd/CdWorkflowRunnerService.go @@ -19,6 +19,7 @@ package cd import ( "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" "github.com/devtron-labs/devtron/pkg/workflow/cd/adapter" "github.com/devtron-labs/devtron/pkg/workflow/cd/bean" "go.uber.org/zap" @@ -32,20 +33,23 @@ type CdWorkflowRunnerService interface { type CdWorkflowRunnerServiceImpl struct { logger *zap.SugaredLogger cdWorkflowRepository pipelineConfig.CdWorkflowRepository + workflowStageService workflowStatus.WorkFlowStageStatusService } func NewCdWorkflowRunnerServiceImpl(logger *zap.SugaredLogger, - cdWorkflowRepository pipelineConfig.CdWorkflowRepository) *CdWorkflowRunnerServiceImpl { + cdWorkflowRepository pipelineConfig.CdWorkflowRepository, + workflowStageService workflowStatus.WorkFlowStageStatusService) *CdWorkflowRunnerServiceImpl { return &CdWorkflowRunnerServiceImpl{ logger: logger, cdWorkflowRepository: cdWorkflowRepository, + workflowStageService: workflowStageService, } } func (impl *CdWorkflowRunnerServiceImpl) UpdateWfr(dto *bean.CdWorkflowRunnerDto, updatedBy int) error { runnerDbObj := adapter.ConvertCdWorkflowRunnerDtoToDbObj(dto) runnerDbObj.UpdateAuditLog(int32(updatedBy)) - err := impl.cdWorkflowRepository.UpdateWorkFlowRunner(runnerDbObj) + err := impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runnerDbObj) if err != nil { impl.logger.Errorw("error in updating runner status in db", "runnerId", runnerDbObj.Id, "err", err) return err diff --git a/pkg/workflow/dag/WorkflowDagExecutor.go b/pkg/workflow/dag/WorkflowDagExecutor.go index cfd6236c34..bb1b08100d 100644 --- a/pkg/workflow/dag/WorkflowDagExecutor.go +++ b/pkg/workflow/dag/WorkflowDagExecutor.go @@ -47,6 +47,7 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline" constants2 "github.com/devtron-labs/devtron/pkg/pipeline/constants" "github.com/devtron-labs/devtron/pkg/pipeline/executors" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" repository2 "github.com/devtron-labs/devtron/pkg/plugin/repository" "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning" repository3 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/repository" @@ -119,6 +120,7 @@ type WorkflowDagExecutorImpl struct { eventFactory client.EventFactory customTagService pipeline.CustomTagService pipelineStatusTimelineService status.PipelineStatusTimelineService + workFlowStageStatusService workflowStatus.WorkFlowStageStatusService helmAppService client2.HelmAppService @@ -148,6 +150,7 @@ func NewWorkflowDagExecutorImpl(Logger *zap.SugaredLogger, pipelineRepository pi eventFactory client.EventFactory, customTagService pipeline.CustomTagService, pipelineStatusTimelineService status.PipelineStatusTimelineService, + workFlowStageStatusService workflowStatus.WorkFlowStageStatusService, helmAppService client2.HelmAppService, cdWorkflowCommonService cd.CdWorkflowCommonService, cdTriggerService devtronApps.TriggerService, @@ -184,6 +187,7 @@ func NewWorkflowDagExecutorImpl(Logger *zap.SugaredLogger, pipelineRepository pi asyncRunnable: asyncRunnable, scanHistoryRepository: scanHistoryRepository, imageScanService: imageScanService, + workFlowStageStatusService: workFlowStageStatusService, } config, err := types.GetCdConfig() if err != nil { @@ -332,7 +336,7 @@ func (impl *WorkflowDagExecutorImpl) handleAsyncTriggerReleaseError(ctx context. } cdWfr.UpdatedBy = 1 cdWfr.UpdatedOn = time.Now() - err := impl.cdWorkflowRepository.UpdateWorkFlowRunner(cdWfr) + err := impl.workFlowStageStatusService.UpdateCdWorkflowRunnerWithStage(cdWfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "wfr", cdWfr, "err", err) return @@ -748,7 +752,7 @@ func (impl *WorkflowDagExecutorImpl) UpdateCiWorkflowForCiSuccess(request *bean2 savedWorkflow.Status = string(v1alpha1.NodeSucceeded) savedWorkflow.IsArtifactUploaded = workflow.GetArtifactUploadedType(request.IsArtifactUploaded) impl.logger.Debugw("updating workflow ", "savedWorkflow", savedWorkflow) - err = impl.ciWorkflowRepository.UpdateWorkFlow(savedWorkflow) + err = impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(savedWorkflow) if err != nil { impl.logger.Errorw("update wf failed for id ", "err", err) return err diff --git a/pkg/workflow/status/WorkflowStatusService.go b/pkg/workflow/status/WorkflowStatusService.go index e889a9c1a2..792c21e165 100644 --- a/pkg/workflow/status/WorkflowStatusService.go +++ b/pkg/workflow/status/WorkflowStatusService.go @@ -39,6 +39,7 @@ import ( bean3 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/bean" "github.com/devtron-labs/devtron/pkg/eventProcessor/out" "github.com/devtron-labs/devtron/pkg/pipeline/types" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/workflow/dag" util3 "github.com/devtron-labs/devtron/util" @@ -86,6 +87,7 @@ type WorkflowStatusServiceImpl struct { pipelineRepository pipelineConfig.PipelineRepository appListingService app.AppListingService deploymentConfigService common2.DeploymentConfigService + workflowStageStatusService workflowStatus.WorkFlowStageStatusService } func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, @@ -107,6 +109,7 @@ func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, pipelineRepository pipelineConfig.PipelineRepository, appListingService app.AppListingService, deploymentConfigService common2.DeploymentConfigService, + workflowStageStatusService workflowStatus.WorkFlowStageStatusService, ) (*WorkflowStatusServiceImpl, error) { impl := &WorkflowStatusServiceImpl{ logger: logger, @@ -130,6 +133,7 @@ func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, pipelineRepository: pipelineRepository, appListingService: appListingService, deploymentConfigService: deploymentConfigService, + workflowStageStatusService: workflowStageStatusService, } config, err := types.GetCdConfig() if err != nil { @@ -169,7 +173,7 @@ func (impl *WorkflowStatusServiceImpl) CheckHelmAppStatusPeriodicallyAndUpdateIn return err } } - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(wfr) + err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(wfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "wfr", wfr, "err", err) return err @@ -237,7 +241,7 @@ func (impl *WorkflowStatusServiceImpl) UpdatePipelineTimelineAndStatusByLiveAppl cdWfr.Status = cdWorkflow2.WorkflowUnableToFetchState cdWfr.UpdatedOn = time.Now() cdWfr.UpdatedBy = 1 - err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(&cdWfr) + err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(&cdWfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "cdWfr", cdWfr, "err", err) return err, isTimelineUpdated diff --git a/scripts/sql/31802800_build_worker_status.down.sql b/scripts/sql/31802800_build_worker_status.down.sql new file mode 100644 index 0000000000..43da0263a8 --- /dev/null +++ b/scripts/sql/31802800_build_worker_status.down.sql @@ -0,0 +1,3 @@ +DROP SEQUENCE IF EXISTS id_seq_workflow_execution_stage; + +DROP TABLE IF EXISTS public.workflow_execution_stage CASCADE; \ No newline at end of file diff --git a/scripts/sql/31802800_build_worker_status.up.sql b/scripts/sql/31802800_build_worker_status.up.sql new file mode 100644 index 0000000000..33278038ce --- /dev/null +++ b/scripts/sql/31802800_build_worker_status.up.sql @@ -0,0 +1,20 @@ +CREATE SEQUENCE IF NOT EXISTS id_seq_workflow_execution_stage; + + +CREATE TABLE public.workflow_execution_stage ( + id int4 NOT NULL DEFAULT nextval('id_seq_workflow_execution_stage'::regclass), + stage_name varchar(50) NULL, + status varchar(50) NULL, + status_type varchar(50) NULL, + message text NULL, + metadata text NULL, + workflow_id int4 NOT NULL, + workflow_type varchar(50) NOT NULL, + start_time timestamptz, + end_time timestamptz, + created_on timestamptz NOT NULL, + created_by int4 NOT NULL, + updated_on timestamptz NOT NULL, + updated_by int4 NOT null, + PRIMARY KEY ("id") +); diff --git a/specs/workflow/workflow-stage-status.internal.yaml b/specs/workflow/workflow-stage-status.internal.yaml new file mode 100644 index 0000000000..549951a0f9 --- /dev/null +++ b/specs/workflow/workflow-stage-status.internal.yaml @@ -0,0 +1,97 @@ +openapi: 3.0.0 +info: + title: Workflow Status API for showing execution stage + version: 1.0.0 +paths: + /workflow/status: #this is not real API, only for sharing purpose + get: + summary: Get Workflow Status + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/GetWorkflowStatusResponse' + example: '{"status":"In progress","startTime":"1","endTime":"","message":"e-message","podStatus":"Running","podName":"pod-name","workflowExecutionStages":{"workflow":[{"stageName":"Preparation","status":"SUCCESS","startTime":"1","endTime":"2","message":"p-message","metadata":{}},{"stageName":"Execution","status":"STARTED","startTime":"2","endTime":"","message":"e-message","metadata":{}}],"pod":[{"stageName":"Execution","status":"STARTED","startTime":"2","endTime":"","message":"e-message","metadata":{"ClusterID":"?? (possible?)","podName":"pod-name"}}]}}' + +components: + schemas: + GetWorkflowStatusResponse: + type: object + properties: + status: + type: string + description: Workflow current status - for backward compatibility + startTime: + type: string + format: date-time + description: Workflow start time + endTime: + type: string + format: date-time + description: Workflow end time + message: + type: string + description: Workflow message + podStatus: + type: string + description: Pod status + podName: + type: string + description: Pod name + workflowExecutionStages: + $ref: '#/components/schemas/WorkflowStages' + + WorkflowStages: + type: object + properties: + workflow: + type: array + items: + type: object + properties: + stageName: + type: string + description: Preparation/Execution + status: + type: string + enum: [NOT_STARTED, RUNNING, SUCCEEDED, FAILED, ABORTED, TIMEOUT, UNKNOWN] + startTime: + type: string + format: date-time + endTime: + type: string + format: date-time + message: + type: string + metadata: + type: object + pod: + type: array + items: + type: object + properties: + stageName: + type: string + description: Execution + status: + type: string + enum: [NOT_STARTED, RUNNING, SUCCEEDED, FAILED, ABORTED, TIMEOUT, UNKNOWN] + startTime: + type: string + format: date-time + endTime: + type: string + format: date-time + message: + type: string + metadata: + type: object + properties: + ClusterID: + type: string + description: Cluster ID + podName: + type: string + description: Pod name \ No newline at end of file diff --git a/wire_gen.go b/wire_gen.go index 3b8e6626cf..9e31395156 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -99,7 +99,7 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/deploymentConfig" repository9 "github.com/devtron-labs/devtron/internal/sql/repository/dockerRegistry" "github.com/devtron-labs/devtron/internal/sql/repository/helper" - repository21 "github.com/devtron-labs/devtron/internal/sql/repository/imageTagging" + repository22 "github.com/devtron-labs/devtron/internal/sql/repository/imageTagging" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/sql/repository/resourceGroup" "github.com/devtron-labs/devtron/internal/util" @@ -111,7 +111,7 @@ import ( "github.com/devtron-labs/devtron/pkg/appClone/batch" appStatus2 "github.com/devtron-labs/devtron/pkg/appStatus" "github.com/devtron-labs/devtron/pkg/appStore/chartGroup" - repository26 "github.com/devtron-labs/devtron/pkg/appStore/chartGroup/repository" + repository27 "github.com/devtron-labs/devtron/pkg/appStore/chartGroup/repository" "github.com/devtron-labs/devtron/pkg/appStore/chartProvider" "github.com/devtron-labs/devtron/pkg/appStore/discover/repository" service6 "github.com/devtron-labs/devtron/pkg/appStore/discover/service" @@ -143,14 +143,14 @@ import ( read12 "github.com/devtron-labs/devtron/pkg/build/artifacts/imageTagging/read" "github.com/devtron-labs/devtron/pkg/build/git/gitHost" read16 "github.com/devtron-labs/devtron/pkg/build/git/gitHost/read" - repository24 "github.com/devtron-labs/devtron/pkg/build/git/gitHost/repository" + repository25 "github.com/devtron-labs/devtron/pkg/build/git/gitHost/repository" read11 "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/read" - repository19 "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository" + repository20 "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository" "github.com/devtron-labs/devtron/pkg/build/git/gitProvider" read6 "github.com/devtron-labs/devtron/pkg/build/git/gitProvider/read" repository12 "github.com/devtron-labs/devtron/pkg/build/git/gitProvider/repository" "github.com/devtron-labs/devtron/pkg/build/git/gitWebhook" - repository22 "github.com/devtron-labs/devtron/pkg/build/git/gitWebhook/repository" + repository23 "github.com/devtron-labs/devtron/pkg/build/git/gitWebhook/repository" pipeline2 "github.com/devtron-labs/devtron/pkg/build/pipeline" read9 "github.com/devtron-labs/devtron/pkg/build/pipeline/read" "github.com/devtron-labs/devtron/pkg/bulkAction" @@ -187,7 +187,7 @@ import ( "github.com/devtron-labs/devtron/pkg/deployment/manifest/publish" "github.com/devtron-labs/devtron/pkg/deployment/providerConfig" "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps" - repository23 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/userDeploymentRequest/repository" + repository24 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/userDeploymentRequest/repository" service3 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/userDeploymentRequest/service" "github.com/devtron-labs/devtron/pkg/deploymentGroup" "github.com/devtron-labs/devtron/pkg/devtronResource" @@ -207,7 +207,7 @@ import ( "github.com/devtron-labs/devtron/pkg/gitops" "github.com/devtron-labs/devtron/pkg/imageDigestPolicy" config4 "github.com/devtron-labs/devtron/pkg/infraConfig/config" - repository16 "github.com/devtron-labs/devtron/pkg/infraConfig/repository" + repository17 "github.com/devtron-labs/devtron/pkg/infraConfig/repository" "github.com/devtron-labs/devtron/pkg/infraConfig/repository/audit" service2 "github.com/devtron-labs/devtron/pkg/infraConfig/service" audit2 "github.com/devtron-labs/devtron/pkg/infraConfig/service/audit" @@ -216,7 +216,7 @@ import ( "github.com/devtron-labs/devtron/pkg/k8s/capacity" "github.com/devtron-labs/devtron/pkg/k8s/informer" "github.com/devtron-labs/devtron/pkg/kubernetesResourceAuditLogs" - repository25 "github.com/devtron-labs/devtron/pkg/kubernetesResourceAuditLogs/repository" + repository26 "github.com/devtron-labs/devtron/pkg/kubernetesResourceAuditLogs/repository" "github.com/devtron-labs/devtron/pkg/module" "github.com/devtron-labs/devtron/pkg/module/repo" "github.com/devtron-labs/devtron/pkg/module/store" @@ -224,14 +224,16 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/pipeline/executors" "github.com/devtron-labs/devtron/pkg/pipeline/history" - repository20 "github.com/devtron-labs/devtron/pkg/pipeline/history/repository" + repository21 "github.com/devtron-labs/devtron/pkg/pipeline/history/repository" "github.com/devtron-labs/devtron/pkg/pipeline/infraProviders" "github.com/devtron-labs/devtron/pkg/pipeline/infraProviders/infraGetters/ci" "github.com/devtron-labs/devtron/pkg/pipeline/infraProviders/infraGetters/job" - repository17 "github.com/devtron-labs/devtron/pkg/pipeline/repository" + repository18 "github.com/devtron-labs/devtron/pkg/pipeline/repository" "github.com/devtron-labs/devtron/pkg/pipeline/types" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" + repository16 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/repository" "github.com/devtron-labs/devtron/pkg/plugin" - repository18 "github.com/devtron-labs/devtron/pkg/plugin/repository" + repository19 "github.com/devtron-labs/devtron/pkg/plugin/repository" "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning" read13 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/read" repository11 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/repository" @@ -571,7 +573,9 @@ func InitializeApp() (*App, error) { envLevelAppMetricsRepositoryImpl := repository15.NewEnvLevelAppMetricsRepositoryImpl(db, sugaredLogger) deployedAppMetricsServiceImpl := deployedAppMetrics.NewDeployedAppMetricsServiceImpl(sugaredLogger, appLevelMetricsRepositoryImpl, envLevelAppMetricsRepositoryImpl, chartRefServiceImpl) appListingServiceImpl := app2.NewAppListingServiceImpl(sugaredLogger, appListingRepositoryImpl, appRepositoryImpl, appListingViewBuilderImpl, pipelineRepositoryImpl, linkoutsRepositoryImpl, cdWorkflowRepositoryImpl, pipelineOverrideRepositoryImpl, environmentRepositoryImpl, chartRepositoryImpl, ciPipelineRepositoryImpl, dockerRegistryIpsConfigServiceImpl, userRepositoryImpl, deployedAppMetricsServiceImpl, ciArtifactRepositoryImpl, envConfigOverrideReadServiceImpl, ciPipelineConfigReadServiceImpl) - appServiceImpl := app2.NewAppService(pipelineOverrideRepositoryImpl, mergeUtil, sugaredLogger, pipelineRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, appRepositoryImpl, configMapRepositoryImpl, chartRepositoryImpl, cdWorkflowRepositoryImpl, commonServiceImpl, chartTemplateServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineStatusTimelineResourcesServiceImpl, pipelineStatusSyncDetailServiceImpl, pipelineStatusTimelineServiceImpl, appServiceConfig, appStatusServiceImpl, installedAppReadServiceImpl, installedAppVersionHistoryRepositoryImpl, scopedVariableCMCSManagerImpl, acdConfig, gitOpsConfigReadServiceImpl, gitOperationServiceImpl, deploymentTemplateServiceImpl, appListingServiceImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl) + workflowStageRepositoryImpl := repository16.NewWorkflowStageRepositoryImpl(sugaredLogger, db) + workFlowStageStatusServiceImpl := workflowStatus.NewWorkflowStageFlowStatusServiceImpl(sugaredLogger, workflowStageRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowRepositoryImpl, transactionUtilImpl) + appServiceImpl := app2.NewAppService(pipelineOverrideRepositoryImpl, mergeUtil, sugaredLogger, pipelineRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, appRepositoryImpl, configMapRepositoryImpl, chartRepositoryImpl, cdWorkflowRepositoryImpl, commonServiceImpl, chartTemplateServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineStatusTimelineResourcesServiceImpl, pipelineStatusSyncDetailServiceImpl, pipelineStatusTimelineServiceImpl, appServiceConfig, appStatusServiceImpl, installedAppReadServiceImpl, installedAppVersionHistoryRepositoryImpl, scopedVariableCMCSManagerImpl, acdConfig, gitOpsConfigReadServiceImpl, gitOperationServiceImpl, deploymentTemplateServiceImpl, appListingServiceImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl, workFlowStageStatusServiceImpl) globalCMCSRepositoryImpl := repository2.NewGlobalCMCSRepositoryImpl(sugaredLogger, db) globalCMCSServiceImpl := pipeline.NewGlobalCMCSServiceImpl(sugaredLogger, globalCMCSRepositoryImpl) argoWorkflowExecutorImpl := executors.NewArgoWorkflowExecutorImpl(sugaredLogger) @@ -583,7 +587,7 @@ func InitializeApp() (*App, error) { if err != nil { return nil, err } - infraConfigRepositoryImpl := repository16.NewInfraProfileRepositoryImpl(db, transactionUtilImpl) + infraConfigRepositoryImpl := repository17.NewInfraProfileRepositoryImpl(db, transactionUtilImpl) scopedVariableManagerImpl, err := variables.NewScopedVariableManagerImpl(sugaredLogger, scopedVariableServiceImpl, variableEntityMappingServiceImpl, variableSnapshotHistoryServiceImpl, variableTemplateParserImpl) if err != nil { return nil, err @@ -599,8 +603,8 @@ func InitializeApp() (*App, error) { if err != nil { return nil, err } - pipelineStageRepositoryImpl := repository17.NewPipelineStageRepository(sugaredLogger, db) - globalPluginRepositoryImpl := repository18.NewGlobalPluginRepository(sugaredLogger, db) + pipelineStageRepositoryImpl := repository18.NewPipelineStageRepository(sugaredLogger, db) + globalPluginRepositoryImpl := repository19.NewGlobalPluginRepository(sugaredLogger, db) globalPluginServiceImpl := plugin.NewGlobalPluginService(sugaredLogger, globalPluginRepositoryImpl, pipelineStageRepositoryImpl, userServiceImpl) pipelineStageServiceImpl := pipeline.NewPipelineStageService(sugaredLogger, pipelineStageRepositoryImpl, globalPluginRepositoryImpl, pipelineRepositoryImpl, scopedVariableManagerImpl, globalPluginServiceImpl) ciTemplateRepositoryImpl := pipelineConfig.NewCiTemplateRepositoryImpl(db, sugaredLogger) @@ -611,7 +615,7 @@ func InitializeApp() (*App, error) { if err != nil { return nil, err } - materialRepositoryImpl := repository19.NewMaterialRepositoryImpl(db) + materialRepositoryImpl := repository20.NewMaterialRepositoryImpl(db) gitMaterialReadServiceImpl := read11.NewGitMaterialReadServiceImpl(sugaredLogger, materialRepositoryImpl) appCrudOperationServiceImpl := app2.NewAppCrudOperationServiceImpl(appLabelRepositoryImpl, sugaredLogger, appRepositoryImpl, userRepositoryImpl, installedAppRepositoryImpl, genericNoteServiceImpl, installedAppDBServiceImpl, crudOperationServiceConfig, dbMigrationServiceImpl, gitMaterialReadServiceImpl) imageTagRepositoryImpl := repository2.NewImageTagRepository(db, sugaredLogger) @@ -625,24 +629,24 @@ func InitializeApp() (*App, error) { if err != nil { return nil, err } - prePostCdScriptHistoryRepositoryImpl := repository20.NewPrePostCdScriptHistoryRepositoryImpl(sugaredLogger, db) - configMapHistoryRepositoryImpl := repository20.NewConfigMapHistoryRepositoryImpl(sugaredLogger, db, transactionUtilImpl) + prePostCdScriptHistoryRepositoryImpl := repository21.NewPrePostCdScriptHistoryRepositoryImpl(sugaredLogger, db) + configMapHistoryRepositoryImpl := repository21.NewConfigMapHistoryRepositoryImpl(sugaredLogger, db, transactionUtilImpl) configMapHistoryServiceImpl := configMapAndSecret.NewConfigMapHistoryServiceImpl(sugaredLogger, configMapHistoryRepositoryImpl, pipelineRepositoryImpl, configMapRepositoryImpl, userServiceImpl, scopedVariableCMCSManagerImpl) prePostCdScriptHistoryServiceImpl := history.NewPrePostCdScriptHistoryServiceImpl(sugaredLogger, prePostCdScriptHistoryRepositoryImpl, configMapRepositoryImpl, configMapHistoryServiceImpl) - gitMaterialHistoryRepositoryImpl := repository20.NewGitMaterialHistoryRepositoyImpl(db) + gitMaterialHistoryRepositoryImpl := repository21.NewGitMaterialHistoryRepositoyImpl(db) gitMaterialHistoryServiceImpl := history.NewGitMaterialHistoryServiceImpl(gitMaterialHistoryRepositoryImpl, sugaredLogger) - ciPipelineHistoryRepositoryImpl := repository20.NewCiPipelineHistoryRepositoryImpl(db, sugaredLogger) + ciPipelineHistoryRepositoryImpl := repository21.NewCiPipelineHistoryRepositoryImpl(db, sugaredLogger) ciPipelineHistoryServiceImpl := history.NewCiPipelineHistoryServiceImpl(ciPipelineHistoryRepositoryImpl, sugaredLogger, ciPipelineRepositoryImpl) ciBuildConfigRepositoryImpl := pipelineConfig.NewCiBuildConfigRepositoryImpl(db, sugaredLogger) ciBuildConfigServiceImpl := pipeline.NewCiBuildConfigServiceImpl(sugaredLogger, ciBuildConfigRepositoryImpl) ciTemplateServiceImpl := pipeline.NewCiTemplateServiceImpl(sugaredLogger, ciBuildConfigServiceImpl, ciTemplateRepositoryImpl, ciTemplateOverrideRepositoryImpl) pipelineConfigRepositoryImpl := chartConfig.NewPipelineConfigRepository(db) configMapServiceImpl := pipeline.NewConfigMapServiceImpl(chartRepositoryImpl, sugaredLogger, chartRepoRepositoryImpl, utilMergeUtil, pipelineConfigRepositoryImpl, configMapRepositoryImpl, envConfigOverrideRepositoryImpl, commonServiceImpl, appRepositoryImpl, configMapHistoryServiceImpl, environmentRepositoryImpl, scopedVariableCMCSManagerImpl) - deploymentTemplateHistoryRepositoryImpl := repository20.NewDeploymentTemplateHistoryRepositoryImpl(sugaredLogger, db) + deploymentTemplateHistoryRepositoryImpl := repository21.NewDeploymentTemplateHistoryRepositoryImpl(sugaredLogger, db) deploymentTemplateHistoryServiceImpl := deploymentTemplate.NewDeploymentTemplateHistoryServiceImpl(sugaredLogger, deploymentTemplateHistoryRepositoryImpl, pipelineRepositoryImpl, chartRepositoryImpl, userServiceImpl, cdWorkflowRepositoryImpl, scopedVariableManagerImpl, deployedAppMetricsServiceImpl, chartRefServiceImpl) chartServiceImpl := chart.NewChartServiceImpl(chartRepositoryImpl, sugaredLogger, chartTemplateServiceImpl, chartRepoRepositoryImpl, appRepositoryImpl, utilMergeUtil, envConfigOverrideRepositoryImpl, pipelineConfigRepositoryImpl, environmentRepositoryImpl, deploymentTemplateHistoryServiceImpl, scopedVariableManagerImpl, deployedAppMetricsServiceImpl, chartRefServiceImpl, gitOpsConfigReadServiceImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl) ciCdPipelineOrchestratorImpl := pipeline.NewCiCdPipelineOrchestrator(appRepositoryImpl, sugaredLogger, materialRepositoryImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, ciPipelineMaterialRepositoryImpl, cdWorkflowRepositoryImpl, clientImpl, ciCdConfig, appWorkflowRepositoryImpl, environmentRepositoryImpl, attributesServiceImpl, appCrudOperationServiceImpl, userAuthServiceImpl, prePostCdScriptHistoryServiceImpl, pipelineStageServiceImpl, gitMaterialHistoryServiceImpl, ciPipelineHistoryServiceImpl, ciTemplateReadServiceImpl, ciTemplateServiceImpl, dockerArtifactStoreRepositoryImpl, ciArtifactRepositoryImpl, configMapServiceImpl, customTagServiceImpl, genericNoteServiceImpl, chartServiceImpl, transactionUtilImpl, gitOpsConfigReadServiceImpl, deploymentConfigServiceImpl) - ciServiceImpl := pipeline.NewCiServiceImpl(sugaredLogger, workflowServiceImpl, ciPipelineMaterialRepositoryImpl, ciWorkflowRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, ciPipelineRepositoryImpl, ciArtifactRepositoryImpl, pipelineStageServiceImpl, userServiceImpl, ciTemplateReadServiceImpl, appCrudOperationServiceImpl, environmentRepositoryImpl, appRepositoryImpl, scopedVariableManagerImpl, customTagServiceImpl, pluginInputVariableParserImpl, globalPluginServiceImpl, infraProviderImpl, ciCdPipelineOrchestratorImpl, attributesServiceImpl) + ciServiceImpl := pipeline.NewCiServiceImpl(sugaredLogger, workflowServiceImpl, ciPipelineMaterialRepositoryImpl, workFlowStageStatusServiceImpl, eventRESTClientImpl, eventSimpleFactoryImpl, ciPipelineRepositoryImpl, ciArtifactRepositoryImpl, pipelineStageServiceImpl, userServiceImpl, ciTemplateReadServiceImpl, appCrudOperationServiceImpl, environmentRepositoryImpl, appRepositoryImpl, scopedVariableManagerImpl, customTagServiceImpl, pluginInputVariableParserImpl, globalPluginServiceImpl, infraProviderImpl, ciCdPipelineOrchestratorImpl, attributesServiceImpl) ciLogServiceImpl, err := pipeline.NewCiLogServiceImpl(sugaredLogger, ciServiceImpl, k8sServiceImpl) if err != nil { return nil, err @@ -650,28 +654,28 @@ func InitializeApp() (*App, error) { resourceGroupRepositoryImpl := resourceGroup.NewResourceGroupRepositoryImpl(db) resourceGroupMappingRepositoryImpl := resourceGroup.NewResourceGroupMappingRepositoryImpl(db) resourceGroupServiceImpl := resourceGroup2.NewResourceGroupServiceImpl(sugaredLogger, resourceGroupRepositoryImpl, resourceGroupMappingRepositoryImpl, enforcerUtilImpl, devtronResourceSearchableKeyServiceImpl, appStatusRepositoryImpl) - imageTaggingRepositoryImpl := repository21.NewImageTaggingRepositoryImpl(db, transactionUtilImpl) + imageTaggingRepositoryImpl := repository22.NewImageTaggingRepositoryImpl(db, transactionUtilImpl) imageTaggingReadServiceImpl, err := read12.NewImageTaggingReadServiceImpl(imageTaggingRepositoryImpl, sugaredLogger) if err != nil { return nil, err } imageTaggingServiceImpl := imageTagging.NewImageTaggingServiceImpl(imageTaggingRepositoryImpl, imageTaggingReadServiceImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, environmentRepositoryImpl, sugaredLogger) blobStorageConfigServiceImpl := pipeline.NewBlobStorageConfigServiceImpl(sugaredLogger, k8sServiceImpl, ciCdConfig) - ciHandlerImpl := pipeline.NewCiHandlerImpl(sugaredLogger, ciServiceImpl, ciPipelineMaterialRepositoryImpl, clientImpl, ciWorkflowRepositoryImpl, workflowServiceImpl, ciLogServiceImpl, ciArtifactRepositoryImpl, userServiceImpl, eventRESTClientImpl, eventSimpleFactoryImpl, ciPipelineRepositoryImpl, appListingRepositoryImpl, k8sServiceImpl, pipelineRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, environmentRepositoryImpl, imageTaggingServiceImpl, k8sCommonServiceImpl, clusterServiceImplExtended, blobStorageConfigServiceImpl, appWorkflowRepositoryImpl, customTagServiceImpl, environmentServiceImpl) - gitWebhookRepositoryImpl := repository22.NewGitWebhookRepositoryImpl(db) + ciHandlerImpl := pipeline.NewCiHandlerImpl(sugaredLogger, ciServiceImpl, ciPipelineMaterialRepositoryImpl, clientImpl, ciWorkflowRepositoryImpl, workflowServiceImpl, ciLogServiceImpl, ciArtifactRepositoryImpl, userServiceImpl, eventRESTClientImpl, eventSimpleFactoryImpl, ciPipelineRepositoryImpl, appListingRepositoryImpl, k8sServiceImpl, pipelineRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, environmentRepositoryImpl, imageTaggingServiceImpl, k8sCommonServiceImpl, clusterServiceImplExtended, blobStorageConfigServiceImpl, appWorkflowRepositoryImpl, customTagServiceImpl, environmentServiceImpl, workFlowStageStatusServiceImpl) + gitWebhookRepositoryImpl := repository23.NewGitWebhookRepositoryImpl(db) gitWebhookServiceImpl := gitWebhook.NewGitWebhookServiceImpl(sugaredLogger, ciHandlerImpl, gitWebhookRepositoryImpl) gitWebhookRestHandlerImpl := restHandler.NewGitWebhookRestHandlerImpl(sugaredLogger, gitWebhookServiceImpl) ecrConfig, err := pipeline.GetEcrConfig() if err != nil { return nil, err } - ciTemplateHistoryRepositoryImpl := repository20.NewCiTemplateHistoryRepositoryImpl(db, sugaredLogger) + ciTemplateHistoryRepositoryImpl := repository21.NewCiTemplateHistoryRepositoryImpl(db, sugaredLogger) ciTemplateHistoryServiceImpl := history.NewCiTemplateHistoryServiceImpl(ciTemplateHistoryRepositoryImpl, sugaredLogger) buildPipelineSwitchServiceImpl := pipeline.NewBuildPipelineSwitchServiceImpl(sugaredLogger, ciPipelineConfigReadServiceImpl, ciPipelineRepositoryImpl, ciCdPipelineOrchestratorImpl, pipelineRepositoryImpl, ciWorkflowRepositoryImpl, appWorkflowRepositoryImpl, ciPipelineHistoryServiceImpl, ciTemplateOverrideRepositoryImpl, ciPipelineMaterialRepositoryImpl) ciPipelineConfigServiceImpl := pipeline.NewCiPipelineConfigServiceImpl(sugaredLogger, ciCdPipelineOrchestratorImpl, dockerArtifactStoreRepositoryImpl, gitMaterialReadServiceImpl, appRepositoryImpl, pipelineRepositoryImpl, ciPipelineConfigReadServiceImpl, ciPipelineRepositoryImpl, ecrConfig, appWorkflowRepositoryImpl, ciCdConfig, attributesServiceImpl, pipelineStageServiceImpl, ciPipelineMaterialRepositoryImpl, ciTemplateServiceImpl, ciTemplateReadServiceImpl, ciTemplateOverrideRepositoryImpl, ciTemplateHistoryServiceImpl, enforcerUtilImpl, ciWorkflowRepositoryImpl, resourceGroupServiceImpl, customTagServiceImpl, cdWorkflowRepositoryImpl, buildPipelineSwitchServiceImpl, pipelineStageRepositoryImpl, globalPluginRepositoryImpl) ciMaterialConfigServiceImpl := pipeline.NewCiMaterialConfigServiceImpl(sugaredLogger, materialRepositoryImpl, ciTemplateReadServiceImpl, ciCdPipelineOrchestratorImpl, ciPipelineRepositoryImpl, gitMaterialHistoryServiceImpl, pipelineRepositoryImpl, ciPipelineMaterialRepositoryImpl, transactionUtilImpl, gitMaterialReadServiceImpl) deploymentGroupRepositoryImpl := repository2.NewDeploymentGroupRepositoryImpl(sugaredLogger, db) - pipelineStrategyHistoryRepositoryImpl := repository20.NewPipelineStrategyHistoryRepositoryImpl(sugaredLogger, db) + pipelineStrategyHistoryRepositoryImpl := repository21.NewPipelineStrategyHistoryRepositoryImpl(sugaredLogger, db) pipelineStrategyHistoryServiceImpl := history.NewPipelineStrategyHistoryServiceImpl(sugaredLogger, pipelineStrategyHistoryRepositoryImpl, userServiceImpl) propertiesConfigServiceImpl := pipeline.NewPropertiesConfigServiceImpl(sugaredLogger, envConfigOverrideRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, deploymentTemplateHistoryServiceImpl, scopedVariableManagerImpl, deployedAppMetricsServiceImpl, envConfigOverrideReadServiceImpl) imageDigestPolicyServiceImpl := imageDigestPolicy.NewImageDigestPolicyServiceImpl(sugaredLogger, qualifierMappingServiceImpl, devtronResourceSearchableKeyServiceImpl) @@ -682,7 +686,7 @@ func InitializeApp() (*App, error) { devtronAppCMCSServiceImpl := pipeline.NewDevtronAppCMCSServiceImpl(sugaredLogger, appServiceImpl, attributesRepositoryImpl) globalStrategyMetadataChartRefMappingRepositoryImpl := chartRepoRepository.NewGlobalStrategyMetadataChartRefMappingRepositoryImpl(db, sugaredLogger) devtronAppStrategyServiceImpl := pipeline.NewDevtronAppStrategyServiceImpl(sugaredLogger, chartRepositoryImpl, globalStrategyMetadataChartRefMappingRepositoryImpl, ciCdPipelineOrchestratorImpl, cdPipelineConfigServiceImpl) - cdWorkflowCommonServiceImpl, err := cd.NewCdWorkflowCommonServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, pipelineStatusTimelineServiceImpl, pipelineRepositoryImpl, pipelineStatusTimelineRepositoryImpl, deploymentConfigServiceImpl) + cdWorkflowCommonServiceImpl, err := cd.NewCdWorkflowCommonServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, pipelineStatusTimelineServiceImpl, pipelineRepositoryImpl, pipelineStatusTimelineRepositoryImpl, deploymentConfigServiceImpl, workFlowStageStatusServiceImpl) if err != nil { return nil, err } @@ -702,7 +706,7 @@ func InitializeApp() (*App, error) { installedAppDBExtendedServiceImpl := FullMode.NewInstalledAppDBExtendedServiceImpl(installedAppDBServiceImpl, appStatusServiceImpl, gitOpsConfigReadServiceImpl) gitOpsValidationServiceImpl := validation.NewGitOpsValidationServiceImpl(sugaredLogger, gitFactory, gitOperationServiceImpl, gitOpsConfigReadServiceImpl, chartTemplateServiceImpl, chartServiceImpl, installedAppDBExtendedServiceImpl) devtronAppGitOpConfigServiceImpl := gitOpsConfig.NewDevtronAppGitOpConfigServiceImpl(sugaredLogger, chartRepositoryImpl, chartServiceImpl, gitOpsConfigReadServiceImpl, gitOpsValidationServiceImpl, argoClientWrapperServiceImpl, deploymentConfigServiceImpl) - cdHandlerImpl := pipeline.NewCdHandlerImpl(sugaredLogger, userServiceImpl, cdWorkflowRepositoryImpl, ciLogServiceImpl, ciArtifactRepositoryImpl, ciPipelineMaterialRepositoryImpl, pipelineRepositoryImpl, environmentRepositoryImpl, ciWorkflowRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, imageTaggingServiceImpl, k8sServiceImpl, workflowServiceImpl, clusterServiceImplExtended, blobStorageConfigServiceImpl, customTagServiceImpl, deploymentConfigServiceImpl) + cdHandlerImpl := pipeline.NewCdHandlerImpl(sugaredLogger, userServiceImpl, cdWorkflowRepositoryImpl, ciLogServiceImpl, ciArtifactRepositoryImpl, ciPipelineMaterialRepositoryImpl, pipelineRepositoryImpl, environmentRepositoryImpl, ciWorkflowRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, imageTaggingServiceImpl, k8sServiceImpl, workflowServiceImpl, clusterServiceImplExtended, blobStorageConfigServiceImpl, customTagServiceImpl, deploymentConfigServiceImpl, workFlowStageStatusServiceImpl) appWorkflowServiceImpl := appWorkflow2.NewAppWorkflowServiceImpl(sugaredLogger, appWorkflowRepositoryImpl, ciCdPipelineOrchestratorImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, appRepositoryImpl, userAuthServiceImpl, chartServiceImpl, deploymentConfigServiceImpl) appCloneServiceImpl := appClone.NewAppCloneServiceImpl(sugaredLogger, pipelineBuilderImpl, attributesServiceImpl, chartServiceImpl, configMapServiceImpl, appWorkflowServiceImpl, appListingServiceImpl, propertiesConfigServiceImpl, pipelineStageServiceImpl, ciTemplateReadServiceImpl, appRepositoryImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, ciPipelineConfigServiceImpl, gitOpsConfigReadServiceImpl) deploymentTemplateRepositoryImpl := repository2.NewDeploymentTemplateRepositoryImpl(db, sugaredLogger) @@ -726,20 +730,20 @@ func InitializeApp() (*App, error) { manifestCreationServiceImpl := manifest.NewManifestCreationServiceImpl(sugaredLogger, dockerRegistryIpsConfigServiceImpl, chartRefServiceImpl, scopedVariableCMCSManagerImpl, k8sCommonServiceImpl, deployedAppMetricsServiceImpl, imageDigestPolicyServiceImpl, mergeUtil, appCrudOperationServiceImpl, deploymentTemplateServiceImpl, argoClientWrapperServiceImpl, configMapHistoryRepositoryImpl, configMapRepositoryImpl, chartRepositoryImpl, envConfigOverrideRepositoryImpl, environmentRepositoryImpl, pipelineRepositoryImpl, ciArtifactRepositoryImpl, pipelineOverrideRepositoryImpl, pipelineStrategyHistoryRepositoryImpl, pipelineConfigRepositoryImpl, deploymentTemplateHistoryRepositoryImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl) configMapHistoryReadServiceImpl := read14.NewConfigMapHistoryReadService(sugaredLogger, configMapHistoryRepositoryImpl, scopedVariableCMCSManagerImpl) deployedConfigurationHistoryServiceImpl := history.NewDeployedConfigurationHistoryServiceImpl(sugaredLogger, userServiceImpl, deploymentTemplateHistoryServiceImpl, pipelineStrategyHistoryServiceImpl, configMapHistoryServiceImpl, cdWorkflowRepositoryImpl, scopedVariableCMCSManagerImpl, deploymentTemplateHistoryReadServiceImpl, configMapHistoryReadServiceImpl) - userDeploymentRequestRepositoryImpl := repository23.NewUserDeploymentRequestRepositoryImpl(db, transactionUtilImpl) + userDeploymentRequestRepositoryImpl := repository24.NewUserDeploymentRequestRepositoryImpl(db, transactionUtilImpl) userDeploymentRequestServiceImpl := service3.NewUserDeploymentRequestServiceImpl(sugaredLogger, userDeploymentRequestRepositoryImpl) imageScanDeployInfoReadServiceImpl := read13.NewImageScanDeployInfoReadService(sugaredLogger, imageScanDeployInfoRepositoryImpl) imageScanDeployInfoServiceImpl := imageScanning.NewImageScanDeployInfoService(sugaredLogger, imageScanDeployInfoRepositoryImpl) - manifestPushConfigRepositoryImpl := repository17.NewManifestPushConfigRepository(sugaredLogger, db) + manifestPushConfigRepositoryImpl := repository18.NewManifestPushConfigRepository(sugaredLogger, db) scanToolExecutionHistoryMappingRepositoryImpl := repository11.NewScanToolExecutionHistoryMappingRepositoryImpl(db, sugaredLogger) cdWorkflowReadServiceImpl := read15.NewCdWorkflowReadServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) imageScanServiceImpl := imageScanning.NewImageScanServiceImpl(sugaredLogger, imageScanHistoryRepositoryImpl, imageScanResultRepositoryImpl, imageScanObjectMetaRepositoryImpl, cveStoreRepositoryImpl, imageScanDeployInfoRepositoryImpl, userServiceImpl, appRepositoryImpl, environmentServiceImpl, ciArtifactRepositoryImpl, policyServiceImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, scanToolMetadataRepositoryImpl, scanToolExecutionHistoryMappingRepositoryImpl, cvePolicyRepositoryImpl, cdWorkflowReadServiceImpl) - triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl) + triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl, workFlowStageStatusServiceImpl) if err != nil { return nil, err } commonArtifactServiceImpl := artifacts.NewCommonArtifactServiceImpl(sugaredLogger, ciArtifactRepositoryImpl) - workflowDagExecutorImpl := dag.NewWorkflowDagExecutorImpl(sugaredLogger, pipelineRepositoryImpl, cdWorkflowRepositoryImpl, ciArtifactRepositoryImpl, enforcerUtilImpl, appWorkflowRepositoryImpl, pipelineStageServiceImpl, ciWorkflowRepositoryImpl, ciPipelineRepositoryImpl, pipelineStageRepositoryImpl, globalPluginRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, customTagServiceImpl, pipelineStatusTimelineServiceImpl, helmAppServiceImpl, cdWorkflowCommonServiceImpl, triggerServiceImpl, userDeploymentRequestServiceImpl, manifestCreationServiceImpl, commonArtifactServiceImpl, deploymentConfigServiceImpl, runnable, imageScanHistoryRepositoryImpl, imageScanServiceImpl) + workflowDagExecutorImpl := dag.NewWorkflowDagExecutorImpl(sugaredLogger, pipelineRepositoryImpl, cdWorkflowRepositoryImpl, ciArtifactRepositoryImpl, enforcerUtilImpl, appWorkflowRepositoryImpl, pipelineStageServiceImpl, ciWorkflowRepositoryImpl, ciPipelineRepositoryImpl, pipelineStageRepositoryImpl, globalPluginRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, customTagServiceImpl, pipelineStatusTimelineServiceImpl, workFlowStageStatusServiceImpl, helmAppServiceImpl, cdWorkflowCommonServiceImpl, triggerServiceImpl, userDeploymentRequestServiceImpl, manifestCreationServiceImpl, commonArtifactServiceImpl, deploymentConfigServiceImpl, runnable, imageScanHistoryRepositoryImpl, imageScanServiceImpl) externalCiRestHandlerImpl := restHandler.NewExternalCiRestHandlerImpl(sugaredLogger, validate, userServiceImpl, enforcerImpl, workflowDagExecutorImpl) pubSubClientRestHandlerImpl := restHandler.NewPubSubClientRestHandlerImpl(pubSubClientServiceImpl, sugaredLogger, ciCdConfig) webhookRouterImpl := router.NewWebhookRouterImpl(gitWebhookRestHandlerImpl, pipelineConfigRestHandlerImpl, externalCiRestHandlerImpl, pubSubClientRestHandlerImpl) @@ -755,7 +759,7 @@ func InitializeApp() (*App, error) { deleteServiceFullModeImpl := delete2.NewDeleteServiceFullModeImpl(sugaredLogger, gitMaterialReadServiceImpl, gitRegistryConfigImpl, ciTemplateRepositoryImpl, dockerRegistryConfigImpl, dockerArtifactStoreRepositoryImpl) gitProviderRestHandlerImpl := restHandler.NewGitProviderRestHandlerImpl(dockerRegistryConfigImpl, sugaredLogger, gitRegistryConfigImpl, userServiceImpl, validate, enforcerImpl, teamServiceImpl, deleteServiceFullModeImpl, gitProviderReadServiceImpl) gitProviderRouterImpl := router.NewGitProviderRouterImpl(gitProviderRestHandlerImpl) - gitHostRepositoryImpl := repository24.NewGitHostRepositoryImpl(db) + gitHostRepositoryImpl := repository25.NewGitHostRepositoryImpl(db) gitHostConfigImpl := gitHost.NewGitHostConfigImpl(gitHostRepositoryImpl, sugaredLogger) gitHostReadServiceImpl := read16.NewGitHostReadServiceImpl(sugaredLogger, gitHostRepositoryImpl, attributesServiceImpl) gitHostRestHandlerImpl := restHandler.NewGitHostRestHandlerImpl(sugaredLogger, gitHostConfigImpl, userServiceImpl, validate, enforcerImpl, clientImpl, gitProviderReadServiceImpl, gitHostReadServiceImpl) @@ -785,7 +789,7 @@ func InitializeApp() (*App, error) { chartRefRouterImpl := router.NewChartRefRouterImpl(chartRefRestHandlerImpl) configMapRestHandlerImpl := restHandler.NewConfigMapRestHandlerImpl(pipelineBuilderImpl, sugaredLogger, chartServiceImpl, userServiceImpl, teamServiceImpl, enforcerImpl, pipelineRepositoryImpl, enforcerUtilImpl, configMapServiceImpl) configMapRouterImpl := router.NewConfigMapRouterImpl(configMapRestHandlerImpl) - k8sResourceHistoryRepositoryImpl := repository25.NewK8sResourceHistoryRepositoryImpl(db, sugaredLogger) + k8sResourceHistoryRepositoryImpl := repository26.NewK8sResourceHistoryRepositoryImpl(db, sugaredLogger) k8sResourceHistoryServiceImpl := kubernetesResourceAuditLogs.Newk8sResourceHistoryServiceImpl(k8sResourceHistoryRepositoryImpl, sugaredLogger, appRepositoryImpl, environmentRepositoryImpl) ephemeralContainersRepositoryImpl := repository5.NewEphemeralContainersRepositoryImpl(db, transactionUtilImpl) ephemeralContainerServiceImpl := cluster.NewEphemeralContainerServiceImpl(ephemeralContainersRepositoryImpl, sugaredLogger) @@ -797,9 +801,9 @@ func InitializeApp() (*App, error) { } argoApplicationServiceExtendedImpl := argoApplication.NewArgoApplicationServiceExtendedServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, helmAppClientImpl, helmAppServiceImpl, k8sApplicationServiceImpl, argoApplicationConfigServiceImpl, argoClientWrapperServiceImpl) installedAppResourceServiceImpl := resource.NewInstalledAppResourceServiceImpl(sugaredLogger, installedAppRepositoryImpl, appStoreApplicationVersionRepositoryImpl, argoClientWrapperServiceImpl, acdAuthConfig, installedAppVersionHistoryRepositoryImpl, helmAppServiceImpl, helmAppReadServiceImpl, appStatusServiceImpl, k8sCommonServiceImpl, k8sApplicationServiceImpl, k8sServiceImpl, deploymentConfigServiceImpl, ociRegistryConfigRepositoryImpl, argoApplicationServiceExtendedImpl) - chartGroupEntriesRepositoryImpl := repository26.NewChartGroupEntriesRepositoryImpl(db, sugaredLogger) - chartGroupReposotoryImpl := repository26.NewChartGroupReposotoryImpl(db, sugaredLogger) - chartGroupDeploymentRepositoryImpl := repository26.NewChartGroupDeploymentRepositoryImpl(db, sugaredLogger) + chartGroupEntriesRepositoryImpl := repository27.NewChartGroupEntriesRepositoryImpl(db, sugaredLogger) + chartGroupReposotoryImpl := repository27.NewChartGroupReposotoryImpl(db, sugaredLogger) + chartGroupDeploymentRepositoryImpl := repository27.NewChartGroupDeploymentRepositoryImpl(db, sugaredLogger) appStoreVersionValuesRepositoryImpl := appStoreValuesRepository.NewAppStoreVersionValuesRepositoryImpl(sugaredLogger, db) appStoreRepositoryImpl := appStoreDiscoverRepository.NewAppStoreRepositoryImpl(sugaredLogger, db) clusterInstalledAppsRepositoryImpl := repository3.NewClusterInstalledAppsRepositoryImpl(db, sugaredLogger) @@ -817,7 +821,7 @@ func InitializeApp() (*App, error) { return nil, err } cdPipelineEventPublishServiceImpl := out.NewCDPipelineEventPublishServiceImpl(sugaredLogger, pubSubClientServiceImpl) - workflowStatusServiceImpl, err := status2.NewWorkflowStatusServiceImpl(sugaredLogger, workflowDagExecutorImpl, pipelineStatusTimelineServiceImpl, appServiceImpl, appStatusServiceImpl, acdConfig, appServiceConfig, pipelineStatusSyncDetailServiceImpl, argoClientWrapperServiceImpl, cdPipelineEventPublishServiceImpl, cdWorkflowRepositoryImpl, pipelineOverrideRepositoryImpl, installedAppVersionHistoryRepositoryImpl, appRepositoryImpl, environmentRepositoryImpl, installedAppRepositoryImpl, installedAppReadServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineRepositoryImpl, appListingServiceImpl, deploymentConfigServiceImpl) + workflowStatusServiceImpl, err := status2.NewWorkflowStatusServiceImpl(sugaredLogger, workflowDagExecutorImpl, pipelineStatusTimelineServiceImpl, appServiceImpl, appStatusServiceImpl, acdConfig, appServiceConfig, pipelineStatusSyncDetailServiceImpl, argoClientWrapperServiceImpl, cdPipelineEventPublishServiceImpl, cdWorkflowRepositoryImpl, pipelineOverrideRepositoryImpl, installedAppVersionHistoryRepositoryImpl, appRepositoryImpl, environmentRepositoryImpl, installedAppRepositoryImpl, installedAppReadServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineRepositoryImpl, appListingServiceImpl, deploymentConfigServiceImpl, workFlowStageStatusServiceImpl) if err != nil { return nil, err } @@ -931,7 +935,7 @@ func InitializeApp() (*App, error) { pipelineTriggerRouterImpl := trigger2.NewPipelineTriggerRouter(pipelineTriggerRestHandlerImpl, sseSSE) webhookDataRestHandlerImpl := webhook.NewWebhookDataRestHandlerImpl(sugaredLogger, userServiceImpl, ciPipelineMaterialRepositoryImpl, enforcerUtilImpl, enforcerImpl, clientImpl, webhookEventDataConfigImpl) pipelineConfigRouterImpl := configure2.NewPipelineRouterImpl(pipelineConfigRestHandlerImpl, webhookDataRestHandlerImpl) - prePostCiScriptHistoryRepositoryImpl := repository20.NewPrePostCiScriptHistoryRepositoryImpl(sugaredLogger, db) + prePostCiScriptHistoryRepositoryImpl := repository21.NewPrePostCiScriptHistoryRepositoryImpl(sugaredLogger, db) prePostCiScriptHistoryServiceImpl := history.NewPrePostCiScriptHistoryServiceImpl(sugaredLogger, prePostCiScriptHistoryRepositoryImpl) pipelineHistoryRestHandlerImpl := history2.NewPipelineHistoryRestHandlerImpl(sugaredLogger, userServiceImpl, enforcerImpl, pipelineStrategyHistoryServiceImpl, deploymentTemplateHistoryServiceImpl, configMapHistoryServiceImpl, prePostCiScriptHistoryServiceImpl, prePostCdScriptHistoryServiceImpl, enforcerUtilImpl, deployedConfigurationHistoryServiceImpl) pipelineHistoryRouterImpl := history3.NewPipelineHistoryRouterImpl(pipelineHistoryRestHandlerImpl) @@ -1046,9 +1050,9 @@ func InitializeApp() (*App, error) { muxRouter := router.NewMuxRouter(sugaredLogger, environmentRouterImpl, clusterRouterImpl, webhookRouterImpl, userAuthRouterImpl, gitProviderRouterImpl, gitHostRouterImpl, dockerRegRouterImpl, notificationRouterImpl, teamRouterImpl, userRouterImpl, chartRefRouterImpl, configMapRouterImpl, appStoreRouterImpl, chartRepositoryRouterImpl, releaseMetricsRouterImpl, deploymentGroupRouterImpl, batchOperationRouterImpl, chartGroupRouterImpl, imageScanRouterImpl, policyRouterImpl, gitOpsConfigRouterImpl, dashboardRouterImpl, attributesRouterImpl, userAttributesRouterImpl, commonRouterImpl, grafanaRouterImpl, ssoLoginRouterImpl, telemetryRouterImpl, telemetryEventClientImplExtended, bulkUpdateRouterImpl, webhookListenerRouterImpl, appRouterImpl, coreAppRouterImpl, helmAppRouterImpl, k8sApplicationRouterImpl, pProfRouterImpl, deploymentConfigRouterImpl, dashboardTelemetryRouterImpl, commonDeploymentRouterImpl, externalLinkRouterImpl, globalPluginRouterImpl, moduleRouterImpl, serverRouterImpl, apiTokenRouterImpl, cdApplicationStatusUpdateHandlerImpl, k8sCapacityRouterImpl, webhookHelmRouterImpl, globalCMCSRouterImpl, userTerminalAccessRouterImpl, jobRouterImpl, ciStatusUpdateCronImpl, resourceGroupingRouterImpl, rbacRoleRouterImpl, scopedVariableRouterImpl, ciTriggerCronImpl, proxyRouterImpl, deploymentConfigurationRouterImpl, infraConfigRouterImpl, argoApplicationRouterImpl, devtronResourceRouterImpl, fluxApplicationRouterImpl, scanningResultRouterImpl) loggingMiddlewareImpl := util4.NewLoggingMiddlewareImpl(userServiceImpl) cdWorkflowServiceImpl := cd.NewCdWorkflowServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) - cdWorkflowRunnerServiceImpl := cd.NewCdWorkflowRunnerServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) + cdWorkflowRunnerServiceImpl := cd.NewCdWorkflowRunnerServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, workFlowStageStatusServiceImpl) cdWorkflowRunnerReadServiceImpl := read15.NewCdWorkflowRunnerReadServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) - webhookServiceImpl := pipeline.NewWebhookServiceImpl(ciArtifactRepositoryImpl, sugaredLogger, ciPipelineRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowCommonServiceImpl) + webhookServiceImpl := pipeline.NewWebhookServiceImpl(ciArtifactRepositoryImpl, sugaredLogger, ciPipelineRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowCommonServiceImpl, workFlowStageStatusServiceImpl) workflowEventProcessorImpl, err := in.NewWorkflowEventProcessorImpl(sugaredLogger, pubSubClientServiceImpl, cdWorkflowServiceImpl, cdWorkflowReadServiceImpl, cdWorkflowRunnerServiceImpl, cdWorkflowRunnerReadServiceImpl, workflowDagExecutorImpl, ciHandlerImpl, cdHandlerImpl, eventSimpleFactoryImpl, eventRESTClientImpl, triggerServiceImpl, deployedAppServiceImpl, webhookServiceImpl, validate, environmentVariables, cdWorkflowCommonServiceImpl, cdPipelineConfigServiceImpl, userDeploymentRequestServiceImpl, pipelineRepositoryImpl, ciArtifactRepositoryImpl, cdWorkflowRepositoryImpl, deploymentConfigServiceImpl) if err != nil { return nil, err From 56d3a3bce8fda332754c806b7fc1e6a1b028b209 Mon Sep 17 00:00:00 2001 From: kartik-579 Date: Fri, 24 Jan 2025 20:44:34 +0530 Subject: [PATCH 02/43] wip --- .../sql/repository/AppListingRepository.go | 4 +-- .../CiArtifactsListingQueryBuilder.go | 27 ++++++++++++------- .../AppListingRepositoryQueryBuilder.go | 8 +++--- .../pipelineConfig/CdWorfkflowRepository.go | 6 ++--- .../pipelineConfig/CiWorkflowRepository.go | 12 +++------ pkg/auth/user/repository/UserRepository.go | 10 ++++--- .../helper/UserRepositoryQueryBuilder.go | 15 ++++++----- 7 files changed, 46 insertions(+), 36 deletions(-) diff --git a/internal/sql/repository/AppListingRepository.go b/internal/sql/repository/AppListingRepository.go index 864f87921e..f8456932b2 100644 --- a/internal/sql/repository/AppListingRepository.go +++ b/internal/sql/repository/AppListingRepository.go @@ -308,10 +308,10 @@ func (impl AppListingRepositoryImpl) FetchAppsByEnvironmentV2(appListingFilter h // if any pipeline found get the latest deployment time if len(pipelineIds) > 0 { - query := impl.appListingRepositoryQueryBuilder.BuildAppListingQueryLastDeploymentTimeV2(pipelineIds) + query, queryParams := impl.appListingRepositoryQueryBuilder.BuildAppListingQueryLastDeploymentTimeV2(pipelineIds) impl.Logger.Debugw("basic app detail query: ", query) start := time.Now() - _, err := impl.dbConnection.Query(&lastDeployedTimeDTO, query) + _, err := impl.dbConnection.Query(&lastDeployedTimeDTO, query, queryParams...) middleware.AppListingDuration.WithLabelValues("buildAppListingQueryLastDeploymentTime", "devtron").Observe(time.Since(start).Seconds()) if err != nil { impl.Logger.Errorw("error in getting latest deployment time for given pipelines", "err", err, "pipelines", pipelineIds, "query", query) diff --git a/internal/sql/repository/CiArtifactsListingQueryBuilder.go b/internal/sql/repository/CiArtifactsListingQueryBuilder.go index f262fc3732..1227ade98a 100644 --- a/internal/sql/repository/CiArtifactsListingQueryBuilder.go +++ b/internal/sql/repository/CiArtifactsListingQueryBuilder.go @@ -20,24 +20,28 @@ import ( "fmt" "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/internal/sql/repository/helper" + "github.com/go-pg/pg" ) const EmptyLikeRegex = "%%" func BuildQueryForParentTypeCIOrWebhook(listingFilterOpts bean.ArtifactsListFilterOptions) string { - commonPaginatedQueryPart := fmt.Sprintf(" cia.image LIKE '%v'", listingFilterOpts.SearchString) + commonPaginatedQueryPart, commonPaginatedQueryParams := " cia.image LIKE '?'", []interface{}{listingFilterOpts.SearchString} orderByClause := " ORDER BY cia.id DESC" - limitOffsetQueryPart := fmt.Sprintf(" LIMIT %v OFFSET %v", listingFilterOpts.Limit, listingFilterOpts.Offset) + limitOffsetQueryPart, limitOffsetQueryParams := fmt.Sprintf(" LIMIT ? OFFSET ?"), []interface{}{listingFilterOpts.Limit, listingFilterOpts.Offset} finalQuery := "" + var finalQueryParams []interface{} + var remainingQueryParams []interface{} if listingFilterOpts.ParentStageType == bean.CI_WORKFLOW_TYPE { selectQuery := " SELECT cia.* " remainingQuery := " FROM ci_artifact cia" + " INNER JOIN ci_pipeline cp ON (cp.id=cia.pipeline_id or (cp.id=cia.component_id and cia.data_source='post_ci' ) )" + - " INNER JOIN pipeline p ON (p.ci_pipeline_id = cp.id and p.id=%v )" + + " INNER JOIN pipeline p ON (p.ci_pipeline_id = cp.id and p.id=? )" + " WHERE " - remainingQuery = fmt.Sprintf(remainingQuery, listingFilterOpts.PipelineId) + remainingQueryParams = []interface{}{listingFilterOpts.PipelineId} if len(listingFilterOpts.ExcludeArtifactIds) > 0 { - remainingQuery += fmt.Sprintf("cia.id NOT IN (%s) AND ", helper.GetCommaSepratedString(listingFilterOpts.ExcludeArtifactIds)) + remainingQuery += "cia.id NOT IN (?) AND " + remainingQueryParams = append(remainingQueryParams, pg.In(listingFilterOpts.ExcludeArtifactIds)) } countQuery := " SELECT count(cia.id) as total_count" @@ -47,18 +51,23 @@ func BuildQueryForParentTypeCIOrWebhook(listingFilterOpts bean.ArtifactsListFilt } else if listingFilterOpts.ParentStageType == bean.WEBHOOK_WORKFLOW_TYPE { selectQuery := " SELECT cia.* " remainingQuery := " FROM ci_artifact cia " + - " WHERE cia.external_ci_pipeline_id = %v AND " - remainingQuery = fmt.Sprintf(remainingQuery, listingFilterOpts.ParentId) + " WHERE cia.external_ci_pipeline_id = ? AND " + remainingQueryParams = []interface{}{listingFilterOpts.ParentId} if len(listingFilterOpts.ExcludeArtifactIds) > 0 { - remainingQuery += fmt.Sprintf("cia.id NOT IN (%s) AND ", helper.GetCommaSepratedString(listingFilterOpts.ExcludeArtifactIds)) + remainingQuery += "cia.id NOT IN (?) AND " + remainingQueryParams = append(remainingQueryParams, pg.In(listingFilterOpts.ExcludeArtifactIds)) } countQuery := " SELECT count(cia.id) as total_count" totalCountQuery := countQuery + remainingQuery + commonPaginatedQueryPart selectQuery = fmt.Sprintf("%s,(%s) ", selectQuery, totalCountQuery) finalQuery = selectQuery + remainingQuery + commonPaginatedQueryPart + orderByClause + limitOffsetQueryPart - } + finalQueryParams = append(finalQueryParams, remainingQueryParams...) + finalQueryParams = append(finalQueryParams, commonPaginatedQueryParams...) + finalQueryParams = append(finalQueryParams, remainingQueryParams...) + finalQueryParams = append(finalQueryParams, commonPaginatedQueryParams...) + finalQueryParams = append(finalQueryParams, limitOffsetQueryParams...) return finalQuery } diff --git a/internal/sql/repository/helper/AppListingRepositoryQueryBuilder.go b/internal/sql/repository/helper/AppListingRepositoryQueryBuilder.go index ae7d013696..b527185e19 100644 --- a/internal/sql/repository/helper/AppListingRepositoryQueryBuilder.go +++ b/internal/sql/repository/helper/AppListingRepositoryQueryBuilder.go @@ -160,15 +160,17 @@ func (impl AppListingRepositoryQueryBuilder) TestForCommonAppFilter(appListingFi return query, queryParams } -func (impl AppListingRepositoryQueryBuilder) BuildAppListingQueryLastDeploymentTimeV2(pipelineIDs []int) string { +func (impl AppListingRepositoryQueryBuilder) BuildAppListingQueryLastDeploymentTimeV2(pipelineIDs []int) (string, []interface{}) { whereCondition := "" + queryParams := []interface{}{} if len(pipelineIDs) > 0 { - whereCondition += fmt.Sprintf(" Where pco.pipeline_id IN (%s) ", GetCommaSepratedString(pipelineIDs)) + whereCondition += " Where pco.pipeline_id IN (?) " + queryParams = append(queryParams, pg.In(pipelineIDs)) } query := "select pco.pipeline_id , MAX(pco.created_on) as last_deployed_time" + " from pipeline_config_override pco" + whereCondition + " GROUP BY pco.pipeline_id;" - return query + return query, queryParams } func (impl AppListingRepositoryQueryBuilder) GetAppIdsQueryWithPaginationForLastDeployedSearch(appListingFilter AppListingFilter) (string, []interface{}) { diff --git a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go index 906dd3d326..6802285c73 100644 --- a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go @@ -19,7 +19,6 @@ package pipelineConfig import ( "context" "errors" - "fmt" apiBean "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/client/gitSensor" "github.com/devtron-labs/devtron/internal/sql/repository" @@ -539,10 +538,9 @@ func (impl *CdWorkflowRepositoryImpl) FindBasicWorkflowRunnerById(wfrId int) (*C func (impl *CdWorkflowRepositoryImpl) FindRetriedWorkflowCountByReferenceId(wfrId int) (int, error) { retryCount := 0 - query := fmt.Sprintf("select count(id) "+ - "from cd_workflow_runner where ref_cd_workflow_runner_id = %v", wfrId) + query := "select count(id) from cd_workflow_runner where ref_cd_workflow_runner_id = ?" - _, err := impl.dbConnection.Query(&retryCount, query) + _, err := impl.dbConnection.Query(&retryCount, query, wfrId) return retryCount, err } diff --git a/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go b/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go index 9593094a1f..5376228a3f 100644 --- a/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CiWorkflowRepository.go @@ -17,9 +17,7 @@ package pipelineConfig import ( - "fmt" "github.com/devtron-labs/devtron/internal/sql/constants" - "github.com/devtron-labs/devtron/internal/sql/repository/helper" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" "github.com/go-pg/pg" @@ -234,10 +232,9 @@ func (impl *CiWorkflowRepositoryImpl) FindById(id int) (*CiWorkflow, error) { func (impl *CiWorkflowRepositoryImpl) FindRetriedWorkflowCountByReferenceId(id int) (int, error) { retryCount := 0 - query := fmt.Sprintf("select count(*) "+ - "from ci_workflow where ref_ci_workflow_id = %v", id) + query := "select count(*) from ci_workflow where ref_ci_workflow_id = ?" - _, err := impl.dbConnection.Query(&retryCount, query) + _, err := impl.dbConnection.Query(&retryCount, query, id) return retryCount, err } @@ -337,9 +334,8 @@ func (impl *CiWorkflowRepositoryImpl) FindLastTriggeredWorkflowGitTriggersByArti } query := "SELECT cw.git_triggers,cw.id,cw.triggered_by,cw.ci_pipeline_id,cia.id as ci_artifact_id" + " FROM ci_workflow cw INNER JOIN ci_artifact cia on cia.ci_workflow_id = cw.id " + - " WHERE cia.id IN (%s)" - query = fmt.Sprintf(query, helper.GetCommaSepratedString(ciArtifactIds)) - _, err := impl.dbConnection.Query(&workflows, query) + " WHERE cia.id IN (?)" + _, err := impl.dbConnection.Query(&workflows, query, pg.In(ciArtifactIds)) return workflows, err } diff --git a/pkg/auth/user/repository/UserRepository.go b/pkg/auth/user/repository/UserRepository.go index 99274d9221..b5c3cc625b 100644 --- a/pkg/auth/user/repository/UserRepository.go +++ b/pkg/auth/user/repository/UserRepository.go @@ -181,9 +181,10 @@ func (impl UserRepositoryImpl) GetAllExecutingQuery(query string, queryParams [] func (impl UserRepositoryImpl) FetchActiveUserByEmail(email string) (bean.UserInfo, error) { var users bean.UserInfo + emailSearchQuery, queryParams := helper.GetEmailSearchQuery("u", email) query := fmt.Sprintf("SELECT u.id, u.email_id, u.access_token, u.user_type FROM users u"+ - " WHERE u.active = true and %s order by u.updated_on desc", helper.GetEmailSearchQuery("u", email)) - _, err := impl.dbConnection.Query(&users, query, email) + " WHERE u.active = true and %s order by u.updated_on desc", emailSearchQuery) + _, err := impl.dbConnection.Query(&users, query, queryParams...) if err != nil { impl.Logger.Errorw("Exception caught:", "err", err) return users, err @@ -197,12 +198,13 @@ func (impl UserRepositoryImpl) FetchUserDetailByEmail(email string) (bean.UserIn var users []bean.UserRole var userFinal bean.UserInfo + emailSearchQuery, queryParams := helper.GetEmailSearchQuery("u", email) query := fmt.Sprintf("SELECT u.id, u.email_id, u.user_type, r.role FROM users u"+ " INNER JOIN user_roles ur ON ur.user_id=u.id"+ " INNER JOIN roles r ON r.id=ur.role_id"+ " WHERE %s and u.active = true"+ - " ORDER BY u.updated_on desc;", helper.GetEmailSearchQuery("u", email)) - _, err := impl.dbConnection.Query(&users, query, email) + " ORDER BY u.updated_on desc;", emailSearchQuery) + _, err := impl.dbConnection.Query(&users, query, queryParams...) if err != nil { return userFinal, err } diff --git a/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go b/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go index 9dbf55d439..27a868770b 100644 --- a/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go +++ b/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go @@ -84,9 +84,11 @@ func GetQueryForGroupListingWithFilters(req *bean.ListingRequest) (string, []int orderCondition := "" if len(req.SortBy) > 0 && !req.CountCheck { - orderCondition += fmt.Sprintf(" order by %s ", req.SortBy) + orderCondition += " order by ? " + queryParams = append(queryParams, req.SortBy) if req.SortOrder == bean2.Desc { - orderCondition += fmt.Sprintf(" %s ", bean2.Desc) + orderCondition += " ? " + queryParams = append(queryParams, bean2.Desc) } } if req.Size > 0 && !req.CountCheck && !req.ShowAll { @@ -103,9 +105,10 @@ func GetQueryForGroupListingWithFilters(req *bean.ListingRequest) (string, []int } -func GetEmailSearchQuery(usersTableAlias string, emailId string) string { +func GetEmailSearchQuery(usersTableAlias string, emailId string) (string, []interface{}) { + queryParams := []interface{}{emailId, emailId} expression := fmt.Sprintf( - "( (%s.user_type is NULL and %s.email_id ILIKE '%s' ) or (%s.user_type='apiToken' and %s.email_id='%s') )", - usersTableAlias, usersTableAlias, emailId, usersTableAlias, usersTableAlias, emailId) - return expression + "( (%s.user_type is NULL and %s.email_id ILIKE '?' ) or (%s.user_type='apiToken' and %s.email_id='?') )", + usersTableAlias, usersTableAlias, usersTableAlias, usersTableAlias) + return expression, queryParams } From ad4f89f157d2202671176d517d18e966edc0062d Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 27 Jan 2025 15:39:10 +0530 Subject: [PATCH 03/43] oss code changes for ent --- pkg/pipeline/CiHandler.go | 2 + pkg/pipeline/executors/WorkflowUtils.go | 3 +- .../WorkflowStageStatusService.go | 139 +++++++++++------- 3 files changed, 93 insertions(+), 51 deletions(-) diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index a54c20695c..518ea6a0dc 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -191,6 +191,8 @@ func (impl *CiHandlerImpl) CheckAndReTriggerCI(workflowStatus v1alpha1.WorkflowS return nil } + impl.Logger.Debugw("re-triggering ci", "status", status, "message", message, "ciWorkflowStatus", ciWorkFlow.Status, "ciWorkFlowId", ciWorkFlow.Id) + retryCount, refCiWorkflow, err := impl.getRefWorkflowAndCiRetryCount(ciWorkFlow) if err != nil { impl.Logger.Errorw("error while getting retry count value for a ciWorkflow", "ciWorkFlowId", ciWorkFlow.Id) diff --git a/pkg/pipeline/executors/WorkflowUtils.go b/pkg/pipeline/executors/WorkflowUtils.go index 2933356f29..c06b0703fc 100644 --- a/pkg/pipeline/executors/WorkflowUtils.go +++ b/pkg/pipeline/executors/WorkflowUtils.go @@ -23,6 +23,7 @@ import ( v1alpha12 "github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned/typed/workflow/v1alpha1" bean2 "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/internal/sql/repository" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" "github.com/devtron-labs/devtron/pkg/pipeline/bean" "github.com/devtron-labs/devtron/pkg/pipeline/types" "github.com/devtron-labs/devtron/util" @@ -250,7 +251,7 @@ func GetClientInstance(config *rest.Config, namespace string) (v1alpha12.Workflo func CheckIfReTriggerRequired(status, message, workflowRunnerStatus string) bool { return ((status == string(v1alpha1.NodeError) || status == string(v1alpha1.NodeFailed)) && - message == POD_DELETED_MESSAGE) && workflowRunnerStatus != WorkflowCancel + message == POD_DELETED_MESSAGE) && (workflowRunnerStatus != WorkflowCancel && workflowRunnerStatus != cdWorkflow.WorkflowAborted) } diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 81bb8d6f7b..aa690ddebe 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -101,11 +101,7 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCiWorkflowWithStage(wf *pipeli } }() - if checkIfWorkflowIsWaitingToStart(wf.Status, wf.PodStatus) { - wf.Status = cdWorkflow.WorkflowWaitingToStart - } - - pipelineStageStatus, updatedWfStatus := impl.getUpdatedPipelineStagesForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String(), wf.Status, wf.PodStatus, wf.Message, wf.PodName) + pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String(), wf.Status, wf.PodStatus, wf.Message, wf.PodName) pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) if err != nil { impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) @@ -114,6 +110,7 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCiWorkflowWithStage(wf *pipeli // update workflow with updated wf status wf.Status = updatedWfStatus + wf.PodStatus = updatedPodStatus err = impl.ciWorkflowRepository.UpdateWorkFlowWithTx(wf, tx) if err != nil { impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) @@ -129,37 +126,52 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCiWorkflowWithStage(wf *pipeli } -func (impl *WorkFlowStageStatusServiceImpl) getUpdatedPipelineStagesForWorkflow(wfId int, wfType string, wfStatus string, podStatus string, message string, podName string) ([]*repository.WorkflowExecutionStage, string) { +func (impl *WorkFlowStageStatusServiceImpl) getUpdatedPipelineStagesForWorkflow(wfId int, wfType string, wfStatus string, podStatus string, message string, podName string) ([]*repository.WorkflowExecutionStage, string, string) { // implementation - updatedWfStatus := wfStatus currentWorkflowStages, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdAndType(wfId, wfType) if err != nil { impl.logger.Errorw("error in getting workflow stages", "workflowId", wfId, "error", err) - return nil, updatedWfStatus + return nil, wfStatus, podStatus } if len(currentWorkflowStages) == 0 { - return []*repository.WorkflowExecutionStage{}, updatedWfStatus + return []*repository.WorkflowExecutionStage{}, wfStatus, podStatus } - impl.logger.Infow("step-1", "wfId", wfId, "wfType", wfType, "wfStatus", wfStatus, "podStatus", podStatus, "message", message) - currentWorkflowStages = impl.updatePodStages(currentWorkflowStages, podStatus, message, podName) - impl.logger.Infow("step-2", "updated pod stages", currentWorkflowStages) - currentWorkflowStages, updatedWfStatus = impl.updateWorkflowStagesToDevtronStatus(currentWorkflowStages, wfStatus, message, podStatus) - impl.logger.Infow("step-3", "updated workflow stages", currentWorkflowStages) - if len(updatedWfStatus) == 0 { - //case when current wfStatus and received wfStatus both are terminal, then keep the status as it is in DB + var currentWfDBstatus, currentPodStatus string + + if wfType == bean.CI_WORKFLOW_TYPE.String() { + //get current status from db + dbWf, err := impl.ciWorkflowRepository.FindById(wfId) + if err != nil { + impl.logger.Errorw("error in getting workflow", "wfId", wfId, "error", err) + return nil, wfStatus, podStatus + } + currentWfDBstatus = dbWf.Status + currentPodStatus = dbWf.PodStatus + } else { dbWfr, err := impl.cdWorkflowRepository.FindWorkflowRunnerById(wfId) if err != nil { impl.logger.Errorw("error in getting workflow runner", "wfId", wfId, "error", err) - return nil, updatedWfStatus + return nil, wfStatus, podStatus } - updatedWfStatus = dbWfr.Status + currentWfDBstatus = dbWfr.Status + currentPodStatus = dbWfr.PodStatus } - return currentWorkflowStages, updatedWfStatus + impl.logger.Infow("step-1", "wfId", wfId, "wfType", wfType, "wfStatus", wfStatus, "currentWfDBstatus", currentWfDBstatus, "podStatus", podStatus, "currentPodStatus", currentPodStatus, "message", message) + currentWorkflowStages, updatedPodStatus := impl.updatePodStages(currentWorkflowStages, podStatus, currentPodStatus, message, podName) + impl.logger.Infow("step-2", "updatedPodStatus", updatedPodStatus, "updated pod stages", currentWorkflowStages) + currentWorkflowStages, updatedWfStatus := impl.updateWorkflowStagesToDevtronStatus(currentWorkflowStages, wfStatus, currentWfDBstatus, message, podStatus) + impl.logger.Infow("step-3", "updatedWfStatus", updatedWfStatus, "updatedPodStatus", updatedPodStatus, "updated workflow stages", currentWorkflowStages) + + return currentWorkflowStages, updatedWfStatus, updatedPodStatus } -func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStages []*repository.WorkflowExecutionStage, podStatus string, message string, podName string) []*repository.WorkflowExecutionStage { +func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStages []*repository.WorkflowExecutionStage, podStatus string, currentPodStatus string, message string, podName string) ([]*repository.WorkflowExecutionStage, string) { + updatedPodStatus := currentPodStatus + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentPodStatus) { + updatedPodStatus = podStatus + } //update pod stage status by using convertPodStatusToDevtronStatus for _, stage := range currentWorkflowStages { if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_POD { @@ -170,49 +182,61 @@ func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStage } switch podStatus { case "Pending": - //only update message as we create this entry when pod is created - stage.Message = message + if !stage.Status.IsTerminal() { + stage.Message = message + stage.Status = bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED + } case "Running": - if stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED || + stage.Status == bean2.WORKFLOW_STAGE_STATUS_UNKNOWN { stage.Message = message stage.Status = bean2.WORKFLOW_STAGE_STATUS_RUNNING stage.StartTime = time.Now().Format(bean3.LayoutRFC3339) } case "Succeeded": - if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING || + stage.Status == bean2.WORKFLOW_STAGE_STATUS_UNKNOWN { stage.Message = message stage.Status = bean2.WORKFLOW_STAGE_STATUS_SUCCEEDED stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) } case "Failed", "Error": - if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { - + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING || + stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED || + stage.Status == bean2.WORKFLOW_STAGE_STATUS_UNKNOWN { stage.Message = message stage.Status = bean2.WORKFLOW_STAGE_STATUS_FAILED stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { + stage.StartTime = time.Now().Format(bean3.LayoutRFC3339) + } } default: - impl.logger.Errorw("unknown pod status", "podStatus", podStatus) + impl.logger.Errorw("unknown pod status", "podStatus", podStatus, "message", message) stage.Message = message stage.Status = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) } } } - return currentWorkflowStages + return currentWorkflowStages, updatedPodStatus } // Each case has 2 steps to do // step-1: update latest status field if its not terminal already // step-2: accordingly update stage status -func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus(currentWorkflowStages []*repository.WorkflowExecutionStage, wfStatus string, wfMessage string, podStatus string) ([]*repository.WorkflowExecutionStage, string) { +func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus(currentWorkflowStages []*repository.WorkflowExecutionStage, wfStatus string, currentWfDBstatus, wfMessage string, podStatus string) ([]*repository.WorkflowExecutionStage, string) { // implementation - updatedWfStatus := "" + updatedWfStatus := currentWfDBstatus //todo for switch case use enums switch strings.ToLower(podStatus) { case "pending": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = cdWorkflow.WorkflowWaitingToStart + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = cdWorkflow.WorkflowWaitingToStart + } else { + updatedWfStatus = wfStatus + } } // update workflow preparation stage and pod status if terminal @@ -231,9 +255,14 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( } } case "running": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = constants.Running + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = constants.Running + } else { + updatedWfStatus = wfStatus + } } + //if pod is running, update preparation and execution stages for _, stage := range currentWorkflowStages { if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { @@ -261,9 +290,14 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( } } case "succeeded": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = cdWorkflow.WorkflowSucceeded + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = cdWorkflow.WorkflowSucceeded + } else { + updatedWfStatus = wfStatus + } } + //if pod is succeeded, update execution stage for _, stage := range currentWorkflowStages { if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { @@ -277,8 +311,12 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( } } case "failed", "error": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = cdWorkflow.WorkflowFailed + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = cdWorkflow.WorkflowFailed + } else { + updatedWfStatus = wfStatus + } } //if pod is failed, update execution stage @@ -294,6 +332,9 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { updatedWfStatus = cdWorkflow.WorkflowTimedOut } + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { + updatedWfStatus = cdWorkflow.WorkflowAborted + } } } } else if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { @@ -301,20 +342,26 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( if extractedStatus.IsTerminal() { stage.Status = extractedStatus stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { + updatedWfStatus = cdWorkflow.WorkflowTimedOut + } + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { + updatedWfStatus = cdWorkflow.WorkflowAborted + } } } } } default: impl.logger.Errorw("unknown pod status", "podStatus", podStatus) - //mark workflow stage status as unknown and end it + //mark workflow stage status as unknown for _, stage := range currentWorkflowStages { if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { //mark execution stage as completed if stage.StageName == bean2.WORKFLOW_EXECUTION { if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { stage.Status = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN - stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + updatedWfStatus = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN.ToString() } } } @@ -442,18 +489,15 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr } }() - if (wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_POST) && checkIfWorkflowIsWaitingToStart(wfr.Status, wfr.PodStatus) { - wfr.Status = cdWorkflow.WorkflowWaitingToStart - } - if wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_POST { - pipelineStageStatus, updatedWfStatus := impl.getUpdatedPipelineStagesForWorkflow(wfr.Id, wfr.WorkflowType.String(), wfr.Status, wfr.PodStatus, wfr.Message, wfr.PodName) + pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wfr.Id, wfr.WorkflowType.String(), wfr.Status, wfr.PodStatus, wfr.Message, wfr.PodName) pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) if err != nil { impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) return err } wfr.Status = updatedWfStatus + wfr.PodStatus = updatedPodStatus } else { impl.logger.Infow("workflow type not supported to update stage data", "workflowName", wfr.Name, "workflowType", wfr.WorkflowType) } @@ -473,8 +517,3 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr return nil } - -func checkIfWorkflowIsWaitingToStart(wfStatus string, podStatus string) bool { - // implementation - return strings.ToLower(podStatus) == "pending" && (strings.ToLower(wfStatus) == strings.ToLower(cdWorkflow.WorkflowWaitingToStart) || strings.ToLower(wfStatus) == "running" || strings.ToLower(wfStatus) == "starting") -} From bbec402bcd7050ecfe872d7a5dfe87ab5d450d46 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 27 Jan 2025 18:34:33 +0530 Subject: [PATCH 04/43] update sql script number --- ...atus.down.sql => 31902800_build_worker_status.down.sql} | 0 ...r_status.up.sql => 31902800_build_worker_status.up.sql} | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) rename scripts/sql/{31802800_build_worker_status.down.sql => 31902800_build_worker_status.down.sql} (100%) rename scripts/sql/{31802800_build_worker_status.up.sql => 31902800_build_worker_status.up.sql} (88%) diff --git a/scripts/sql/31802800_build_worker_status.down.sql b/scripts/sql/31902800_build_worker_status.down.sql similarity index 100% rename from scripts/sql/31802800_build_worker_status.down.sql rename to scripts/sql/31902800_build_worker_status.down.sql diff --git a/scripts/sql/31802800_build_worker_status.up.sql b/scripts/sql/31902800_build_worker_status.up.sql similarity index 88% rename from scripts/sql/31802800_build_worker_status.up.sql rename to scripts/sql/31902800_build_worker_status.up.sql index 33278038ce..886f18bc03 100644 --- a/scripts/sql/31802800_build_worker_status.up.sql +++ b/scripts/sql/31902800_build_worker_status.up.sql @@ -1,6 +1,5 @@ CREATE SEQUENCE IF NOT EXISTS id_seq_workflow_execution_stage; - CREATE TABLE public.workflow_execution_stage ( id int4 NOT NULL DEFAULT nextval('id_seq_workflow_execution_stage'::regclass), stage_name varchar(50) NULL, @@ -10,11 +9,11 @@ CREATE TABLE public.workflow_execution_stage ( metadata text NULL, workflow_id int4 NOT NULL, workflow_type varchar(50) NOT NULL, - start_time timestamptz, - end_time timestamptz, + start_time text, + end_time text, created_on timestamptz NOT NULL, created_by int4 NOT NULL, updated_on timestamptz NOT NULL, updated_by int4 NOT null, PRIMARY KEY ("id") -); +); \ No newline at end of file From 063a657311ec1346dded02906e21840516da5043 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 27 Jan 2025 18:39:47 +0530 Subject: [PATCH 05/43] update sql script --- scripts/sql/31902800_build_worker_status.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sql/31902800_build_worker_status.up.sql b/scripts/sql/31902800_build_worker_status.up.sql index 886f18bc03..0b7e5b1942 100644 --- a/scripts/sql/31902800_build_worker_status.up.sql +++ b/scripts/sql/31902800_build_worker_status.up.sql @@ -1,6 +1,6 @@ CREATE SEQUENCE IF NOT EXISTS id_seq_workflow_execution_stage; -CREATE TABLE public.workflow_execution_stage ( +CREATE TABLE IF NOT EXISTS public.workflow_execution_stage ( id int4 NOT NULL DEFAULT nextval('id_seq_workflow_execution_stage'::regclass), stage_name varchar(50) NULL, status varchar(50) NULL, From 74adbb70a7e6e6942ab5b7e64ff569b31dbdd496 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 14:21:15 +0530 Subject: [PATCH 06/43] add flag to enable new workflow stage history --- env_gen.json | 2 +- env_gen.md | 1 + pkg/pipeline/CdHandler.go | 3 +- pkg/pipeline/CiHandler.go | 5 +- pkg/pipeline/types/CiCdConfig.go | 1 + .../WorkflowStageStatusService.go | 118 ++++++++++++------ .../workflowStatus/adapter/adapter.go | 24 +--- wire_gen.go | 2 +- 8 files changed, 92 insertions(+), 64 deletions(-) diff --git a/env_gen.json b/env_gen.json index 3217f28913..52d2c579c0 100644 --- a/env_gen.json +++ b/env_gen.json @@ -1 +1 @@ -[{"Category":"CD","Fields":[{"Env":"ARGO_APP_MANUAL_SYNC_TIME","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HELM_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_TIMEOUT_DURATION","EnvType":"string","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS","EnvType":"int","EnvValue":"12","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"6","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CD_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PIPELINE_DEGRADED_TIME","EnvType":"string","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_DEVTRON_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_EXTERNAL_HELM_APP","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_HELM_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"CI_RUNNER","Fields":[{"Env":"AZURE_ACCOUNT_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_ACCOUNT_NAME","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_CACHE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_LOG","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_CONNECTION_INSECURE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_URL","EnvType":"string","EnvValue":"http://devtron-minio.devtroncd:9000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BASE_LOG_LOCATION_PATH","EnvType":"string","EnvValue":"/home/devtron/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_GCP_CREDENTIALS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_PROVIDER","EnvType":"","EnvValue":"S3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ACCESS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_BUCKET_VERSIONED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT_INSECURE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_SECRET_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/devtron/buildx","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_K8S_DRIVER_OPTIONS","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_PROVENANCE_MODE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILD_LOG_TTL_VALUE_IN_SECS","EnvType":"int","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CACHE_LIMIT","EnvType":"int64","EnvValue":"5000000000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"cd-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_IGNORE_DOCKER_CACHE","EnvType":"bool","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_RUNNER_DOCKER_MTU_VALUE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_SUCCESS_AUTO_TRIGGER_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_VOLUME_MOUNTS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"arsenal-v1/ci-artifacts","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_BUCKET","EnvType":"string","EnvValue":"devtron-pro-ci-logs","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"arsenal-v1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET","EnvType":"string","EnvValue":"ci-caching","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_LOGS_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_NAMESPACE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_TIMEOUT","EnvType":"int64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CI_IMAGE","EnvType":"string","EnvValue":"686244538589.dkr.ecr.us-east-2.amazonaws.com/cirunner:47","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtron-ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TARGET_PLATFORM","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DOCKER_BUILD_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/docker","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_BUILD_CONTEXT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_CM_NAME","EnvType":"string","EnvValue":"blob-storage-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_SECRET_NAME","EnvType":"string","EnvValue":"blob-storage-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_API_SECRET","EnvType":"string","EnvValue":"devtroncd-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_PAYLOAD","EnvType":"string","EnvValue":"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/vikram1601/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2022-10-30T20:00:00\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"User Name \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\"}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_WEB_HOOK_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_CM_CS_IN_CI_JOB","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_COUNT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_INTERVAL","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCANNER_ENDPOINT","EnvType":"string","EnvValue":"http://image-scanner-new-demo-devtroncd-service.devtroncd:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_MAX_RETRIES","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_RETRY_DELAY","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IN_APP_LOGGING_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CD_WORKFLOW_RUNNER_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CI_WORKFLOW_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODE","EnvType":"string","EnvValue":"DEV","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_SERVER_HOST","EnvType":"string","EnvValue":"localhost:4222","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_HOST","EnvType":"string","EnvValue":"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PRE_CI_CACHE_PATH","EnvType":"string","EnvValue":"/devtroncd-cache","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOW_DOCKER_BUILD_ARGS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CI_JOB_BUILD_CACHE_PUSH_PULL","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CREATING_ECR_REPO","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINATION_GRACE_PERIOD_SECS","EnvType":"int","EnvValue":"180","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_QUERY_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CD_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CI_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BUILDX","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DOCKER_API_TO_GET_DIGEST","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_EXTERNAL_NODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WF_CONTROLLER_INSTANCE_ID","EnvType":"string","EnvValue":"devtron-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_CACHE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"ci-runner","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"DEVTRON","Fields":[{"Env":"-","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_IMAGE","EnvType":"string","EnvValue":"quay.io/devtron/chart-sync:1227622d-132-3775","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_JOB_RESOURCES_OBJ","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"chart-sync","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_AUTO_SYNC_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_COUNT_ON_CONFLICT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_DELAY_ON_CONFLICT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_COUNT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_DELAY","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ASYNC_BUILDX_CACHE_EXPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_MODE_MIN","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PORT","EnvType":"string","EnvValue":"8000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CExpirationTime","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_TRIGGER_CRON_TIME","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_STATUS_UPDATE_CRON","EnvType":"string","EnvValue":"*/5 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLI_CMD_TIMEOUT_GLOBAL_SECONDS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLUSTER_STATUS_CRON_TIME","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CONSUMER_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_LOG_TIME_LIMIT","EnvType":"int64","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TIMEOUT","EnvType":"float64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_BOM_URL","EnvType":"string","EnvValue":"https://raw.githubusercontent.com/devtron-labs/devtron/%s/charts/devtron/devtron-bom.yaml","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEX_SECRET_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_CHART_NAME","EnvType":"string","EnvValue":"devtron-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_URL","EnvType":"string","EnvValue":"https://helm.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_INSTALLATION_TYPE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_MODULES_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.modules","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_SECRET_NAME","EnvType":"string","EnvValue":"devtron-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_VERSION_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.release","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CID","EnvType":"string","EnvValue":"example-app","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CLIENT_ID","EnvType":"string","EnvValue":"argo-cd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CSTOREKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_JWTKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_RURL","EnvType":"string","EnvValue":"http://127.0.0.1:8080/callback","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_SECRET","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ECR_REPO_NAME_PREFIX","EnvType":"string","EnvValue":"test/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_ARGO_CD_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EPHEMERAL_SERVER_VERSION_REGEX","EnvType":"string","EnvValue":"v[1-9]\\.\\b(2[3-9]\\|[3-9][0-9])\\b.*","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EVENT_URL","EnvType":"string","EnvValue":"http://localhost:3000/notify","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXECUTE_WIRE_NIL_CHECKER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CI_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_WORKER_POOL_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FORCE_SECURITY_SCANNING","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_REPO_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GO_RUNTIME_ENV","EnvType":"string","EnvValue":"production","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_ORG_ID","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PASSWORD","EnvType":"string","EnvValue":"prom-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PORT","EnvType":"string","EnvValue":"8090","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HIDE_IMAGE_TAGGING_HARD_DELETE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_AUTOCOMPLETE_AUTH_CHECK","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_GROUP_NAME","EnvType":"string","EnvValue":"installer.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_RESOURCE","EnvType":"string","EnvValue":"installers","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_VERSION","EnvType":"string","EnvValue":"v1alpha1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"JwtExpirationTime","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_CLIENT_MAX_IDLE_CONNS_PER_HOST","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_IDLE_CONN_TIMEOUT","EnvType":"int","EnvValue":"300","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_KEEPALIVE","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_TIMEOUT","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TLS_HANDSHAKE_TIMEOUT","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_RECEIVE_MSG_SIZE","EnvType":"int","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_SEND_MSG_SIZE","EnvType":"int","EnvValue":"4","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_URL","EnvType":"string","EnvValue":"http://lens-milandevtron-service:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOGGER_DEV_MODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOG_LEVEL","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_SESSION_PER_USER","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_METADATA_API_URL","EnvType":"string","EnvValue":"https://api.devtron.ai/module?name=%s","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_STATUS_HANDLING_CRON_DURATION_MIN","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_ACK_WAIT_IN_SECS","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_BUFFER_SIZE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_MAX_AGE","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_PROCESSING_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_REPLICAS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NOTIFICATION_MEDIUM","EnvType":"NotificationMedium","EnvValue":"rest","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"OTEL_COLLECTOR_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PARALLELISM_LIMIT_FOR_TAG_PROCESSING","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_EXPORT_PROM_METRICS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_FAILURE_QUERIES","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_QUERY","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_SLOW_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_QUERY_DUR_THRESHOLD","EnvType":"int64","EnvValue":"5000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PLUGIN_NAME","EnvType":"string","EnvValue":"Pull images from container repository","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROPAGATE_EXTRA_LABELS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROXY_SERVICE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESTRICT_TERMINAL_ACCESS_FOR_NON_SUPER_USER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUNTIME_CONFIG_LOCAL_DEV","EnvType":"LocalDevMode","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_FORMAT","EnvType":"string","EnvValue":"@{{%s}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_HANDLE_PRIMITIVES","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_NAME_REGEX","EnvType":"string","EnvValue":"^[a-zA-Z][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9]$","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOULD_CHECK_NAMESPACE_ON_CLONE","EnvType":"bool","EnvValue":"false","EnvDescription":"should we check if namespace exists or not while cloning app","Example":"","Deprecated":"false"},{"Env":"SOCKET_DISCONNECT_DELAY_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SOCKET_HEARTBEAT_SECONDS","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"STREAM_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SYSTEM_VAR_PREFIX","EnvType":"string","EnvValue":"DEVTRON_","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"default","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_INACTIVE_DURATION_IN_MINS","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_STATUS_SYNC_In_SECS","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_LOG_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PASSWORD","EnvType":"string","EnvValue":"postgrespw","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PORT","EnvType":"string","EnvValue":"55000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_FOR_FAILED_CI_BUILD","EnvType":"string","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_IN_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USER_SESSION_DURATION_SECONDS","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_API_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CUSTOM_HTTP_TRANSPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_GIT_CLI","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_RBAC_CREATION_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_CACHE_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_EXPRESSION_REGEX","EnvType":"string","EnvValue":"@{{([^}]+)}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WEBHOOK_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"GITOPS","Fields":[{"Env":"ACD_CM","EnvType":"string","EnvValue":"argocd-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_PASSWORD","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_SECRET_NAME","EnvType":"string","EnvValue":"devtron-gitops-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS","EnvType":"string","EnvValue":"Deployment,Rollout,StatefulSet,ReplicaSet","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS_BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"INFRA_SETUP","Fields":[{"Env":"DASHBOARD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_PORT","EnvType":"string","EnvValue":"3000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_HOST","EnvType":"string","EnvValue":"http://localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_PORT","EnvType":"string","EnvValue":"5556","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_PROTOCOL","EnvType":"string","EnvValue":"REST","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_URL","EnvType":"string","EnvValue":"127.0.0.1:7070","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_CLIENT_URL","EnvType":"string","EnvValue":"127.0.0.1:50051","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"POSTGRES","Fields":[{"Env":"APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"Application name","Example":"","Deprecated":"false"},{"Env":"CASBIN_DATABASE","EnvType":"string","EnvValue":"casbin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"address of postgres service","Example":"postgresql-postgresql.devtroncd","Deprecated":"false"},{"Env":"PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"postgres database to be made connection with","Example":"orchestrator, casbin, git_sensor, lens","Deprecated":"false"},{"Env":"PG_PASSWORD","EnvType":"string","EnvValue":"{password}","EnvDescription":"password for postgres, associated with PG_USER","Example":"confidential ;)","Deprecated":"false"},{"Env":"PG_PORT","EnvType":"string","EnvValue":"5432","EnvDescription":"port of postgresql service","Example":"5432","Deprecated":"false"},{"Env":"PG_READ_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"user for postgres","Example":"postgres","Deprecated":"false"},{"Env":"PG_WRITE_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"RBAC","Fields":[{"Env":"ENFORCER_CACHE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_CACHE_EXPIRATION_IN_SEC","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_MAX_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CASBIN_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"}]}] \ No newline at end of file +[{"Category":"CD","Fields":[{"Env":"ARGO_APP_MANUAL_SYNC_TIME","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HELM_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_TIMEOUT_DURATION","EnvType":"string","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS","EnvType":"int","EnvValue":"12","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"6","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CD_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PIPELINE_DEGRADED_TIME","EnvType":"string","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_DEVTRON_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_EXTERNAL_HELM_APP","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_HELM_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"CI_RUNNER","Fields":[{"Env":"AZURE_ACCOUNT_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_ACCOUNT_NAME","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_CACHE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_LOG","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_CONNECTION_INSECURE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_URL","EnvType":"string","EnvValue":"http://devtron-minio.devtroncd:9000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BASE_LOG_LOCATION_PATH","EnvType":"string","EnvValue":"/home/devtron/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_GCP_CREDENTIALS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_PROVIDER","EnvType":"","EnvValue":"S3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ACCESS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_BUCKET_VERSIONED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT_INSECURE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_SECRET_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/devtron/buildx","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_K8S_DRIVER_OPTIONS","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_PROVENANCE_MODE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILD_LOG_TTL_VALUE_IN_SECS","EnvType":"int","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CACHE_LIMIT","EnvType":"int64","EnvValue":"5000000000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"cd-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_IGNORE_DOCKER_CACHE","EnvType":"bool","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_RUNNER_DOCKER_MTU_VALUE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_SUCCESS_AUTO_TRIGGER_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_VOLUME_MOUNTS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"arsenal-v1/ci-artifacts","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_BUCKET","EnvType":"string","EnvValue":"devtron-pro-ci-logs","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"arsenal-v1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET","EnvType":"string","EnvValue":"ci-caching","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_LOGS_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_NAMESPACE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_TIMEOUT","EnvType":"int64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CI_IMAGE","EnvType":"string","EnvValue":"686244538589.dkr.ecr.us-east-2.amazonaws.com/cirunner:47","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtron-ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TARGET_PLATFORM","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DOCKER_BUILD_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/docker","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_BUILD_CONTEXT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_WORKFLOW_EXECUTION_STAGE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_CM_NAME","EnvType":"string","EnvValue":"blob-storage-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_SECRET_NAME","EnvType":"string","EnvValue":"blob-storage-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_API_SECRET","EnvType":"string","EnvValue":"devtroncd-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_PAYLOAD","EnvType":"string","EnvValue":"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/vikram1601/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2022-10-30T20:00:00\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"User Name \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\"}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_WEB_HOOK_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_CM_CS_IN_CI_JOB","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_COUNT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_INTERVAL","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCANNER_ENDPOINT","EnvType":"string","EnvValue":"http://image-scanner-new-demo-devtroncd-service.devtroncd:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_MAX_RETRIES","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_RETRY_DELAY","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IN_APP_LOGGING_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CD_WORKFLOW_RUNNER_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CI_WORKFLOW_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODE","EnvType":"string","EnvValue":"DEV","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_SERVER_HOST","EnvType":"string","EnvValue":"localhost:4222","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_HOST","EnvType":"string","EnvValue":"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PRE_CI_CACHE_PATH","EnvType":"string","EnvValue":"/devtroncd-cache","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOW_DOCKER_BUILD_ARGS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CI_JOB_BUILD_CACHE_PUSH_PULL","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CREATING_ECR_REPO","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINATION_GRACE_PERIOD_SECS","EnvType":"int","EnvValue":"180","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_QUERY_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CD_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CI_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BUILDX","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DOCKER_API_TO_GET_DIGEST","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_EXTERNAL_NODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WF_CONTROLLER_INSTANCE_ID","EnvType":"string","EnvValue":"devtron-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_CACHE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"ci-runner","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"DEVTRON","Fields":[{"Env":"-","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_IMAGE","EnvType":"string","EnvValue":"quay.io/devtron/chart-sync:1227622d-132-3775","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_JOB_RESOURCES_OBJ","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"chart-sync","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_AUTO_SYNC_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_COUNT_ON_CONFLICT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_DELAY_ON_CONFLICT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_COUNT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_DELAY","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ASYNC_BUILDX_CACHE_EXPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_MODE_MIN","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PORT","EnvType":"string","EnvValue":"8000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CExpirationTime","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_TRIGGER_CRON_TIME","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_STATUS_UPDATE_CRON","EnvType":"string","EnvValue":"*/5 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLI_CMD_TIMEOUT_GLOBAL_SECONDS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLUSTER_STATUS_CRON_TIME","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CONSUMER_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_LOG_TIME_LIMIT","EnvType":"int64","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TIMEOUT","EnvType":"float64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_BOM_URL","EnvType":"string","EnvValue":"https://raw.githubusercontent.com/devtron-labs/devtron/%s/charts/devtron/devtron-bom.yaml","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEX_SECRET_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_CHART_NAME","EnvType":"string","EnvValue":"devtron-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_URL","EnvType":"string","EnvValue":"https://helm.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_INSTALLATION_TYPE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_MODULES_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.modules","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_SECRET_NAME","EnvType":"string","EnvValue":"devtron-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_VERSION_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.release","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CID","EnvType":"string","EnvValue":"example-app","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CLIENT_ID","EnvType":"string","EnvValue":"argo-cd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CSTOREKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_JWTKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_RURL","EnvType":"string","EnvValue":"http://127.0.0.1:8080/callback","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_SECRET","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ECR_REPO_NAME_PREFIX","EnvType":"string","EnvValue":"test/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_ARGO_CD_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EPHEMERAL_SERVER_VERSION_REGEX","EnvType":"string","EnvValue":"v[1-9]\\.\\b(2[3-9]\\|[3-9][0-9])\\b.*","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EVENT_URL","EnvType":"string","EnvValue":"http://localhost:3000/notify","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXECUTE_WIRE_NIL_CHECKER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CI_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_WORKER_POOL_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FORCE_SECURITY_SCANNING","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_REPO_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GO_RUNTIME_ENV","EnvType":"string","EnvValue":"production","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_ORG_ID","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PASSWORD","EnvType":"string","EnvValue":"prom-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PORT","EnvType":"string","EnvValue":"8090","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HIDE_IMAGE_TAGGING_HARD_DELETE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_AUTOCOMPLETE_AUTH_CHECK","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_GROUP_NAME","EnvType":"string","EnvValue":"installer.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_RESOURCE","EnvType":"string","EnvValue":"installers","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_VERSION","EnvType":"string","EnvValue":"v1alpha1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"JwtExpirationTime","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_CLIENT_MAX_IDLE_CONNS_PER_HOST","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_IDLE_CONN_TIMEOUT","EnvType":"int","EnvValue":"300","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_KEEPALIVE","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_TIMEOUT","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TLS_HANDSHAKE_TIMEOUT","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_RECEIVE_MSG_SIZE","EnvType":"int","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_SEND_MSG_SIZE","EnvType":"int","EnvValue":"4","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_URL","EnvType":"string","EnvValue":"http://lens-milandevtron-service:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOGGER_DEV_MODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOG_LEVEL","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_SESSION_PER_USER","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_METADATA_API_URL","EnvType":"string","EnvValue":"https://api.devtron.ai/module?name=%s","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_STATUS_HANDLING_CRON_DURATION_MIN","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_ACK_WAIT_IN_SECS","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_BUFFER_SIZE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_MAX_AGE","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_PROCESSING_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_REPLICAS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NOTIFICATION_MEDIUM","EnvType":"NotificationMedium","EnvValue":"rest","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"OTEL_COLLECTOR_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PARALLELISM_LIMIT_FOR_TAG_PROCESSING","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_EXPORT_PROM_METRICS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_FAILURE_QUERIES","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_QUERY","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_SLOW_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_QUERY_DUR_THRESHOLD","EnvType":"int64","EnvValue":"5000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PLUGIN_NAME","EnvType":"string","EnvValue":"Pull images from container repository","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROPAGATE_EXTRA_LABELS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROXY_SERVICE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESTRICT_TERMINAL_ACCESS_FOR_NON_SUPER_USER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUNTIME_CONFIG_LOCAL_DEV","EnvType":"LocalDevMode","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_FORMAT","EnvType":"string","EnvValue":"@{{%s}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_HANDLE_PRIMITIVES","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_NAME_REGEX","EnvType":"string","EnvValue":"^[a-zA-Z][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9]$","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOULD_CHECK_NAMESPACE_ON_CLONE","EnvType":"bool","EnvValue":"false","EnvDescription":"should we check if namespace exists or not while cloning app","Example":"","Deprecated":"false"},{"Env":"SOCKET_DISCONNECT_DELAY_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SOCKET_HEARTBEAT_SECONDS","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"STREAM_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SYSTEM_VAR_PREFIX","EnvType":"string","EnvValue":"DEVTRON_","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"default","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_INACTIVE_DURATION_IN_MINS","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_STATUS_SYNC_In_SECS","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_LOG_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PASSWORD","EnvType":"string","EnvValue":"postgrespw","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PORT","EnvType":"string","EnvValue":"55000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_FOR_FAILED_CI_BUILD","EnvType":"string","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_IN_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USER_SESSION_DURATION_SECONDS","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_API_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CUSTOM_HTTP_TRANSPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_GIT_CLI","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_RBAC_CREATION_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_CACHE_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_EXPRESSION_REGEX","EnvType":"string","EnvValue":"@{{([^}]+)}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WEBHOOK_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"GITOPS","Fields":[{"Env":"ACD_CM","EnvType":"string","EnvValue":"argocd-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_PASSWORD","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_SECRET_NAME","EnvType":"string","EnvValue":"devtron-gitops-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS","EnvType":"string","EnvValue":"Deployment,Rollout,StatefulSet,ReplicaSet","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS_BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"INFRA_SETUP","Fields":[{"Env":"DASHBOARD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_PORT","EnvType":"string","EnvValue":"3000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_HOST","EnvType":"string","EnvValue":"http://localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_PORT","EnvType":"string","EnvValue":"5556","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_PROTOCOL","EnvType":"string","EnvValue":"REST","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_URL","EnvType":"string","EnvValue":"127.0.0.1:7070","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_CLIENT_URL","EnvType":"string","EnvValue":"127.0.0.1:50051","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"POSTGRES","Fields":[{"Env":"APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"Application name","Example":"","Deprecated":"false"},{"Env":"CASBIN_DATABASE","EnvType":"string","EnvValue":"casbin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"address of postgres service","Example":"postgresql-postgresql.devtroncd","Deprecated":"false"},{"Env":"PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"postgres database to be made connection with","Example":"orchestrator, casbin, git_sensor, lens","Deprecated":"false"},{"Env":"PG_PASSWORD","EnvType":"string","EnvValue":"{password}","EnvDescription":"password for postgres, associated with PG_USER","Example":"confidential ;)","Deprecated":"false"},{"Env":"PG_PORT","EnvType":"string","EnvValue":"5432","EnvDescription":"port of postgresql service","Example":"5432","Deprecated":"false"},{"Env":"PG_READ_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"user for postgres","Example":"postgres","Deprecated":"false"},{"Env":"PG_WRITE_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"RBAC","Fields":[{"Env":"ENFORCER_CACHE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_CACHE_EXPIRATION_IN_SEC","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_MAX_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CASBIN_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"}]}] \ No newline at end of file diff --git a/env_gen.md b/env_gen.md index 99d49b535d..c456264bfe 100644 --- a/env_gen.md +++ b/env_gen.md @@ -76,6 +76,7 @@ | DEFAULT_TARGET_PLATFORM | string | | | | false | | DOCKER_BUILD_CACHE_PATH | string |/var/lib/docker | | | false | | ENABLE_BUILD_CONTEXT | bool |false | | | false | + | ENABLE_WORKFLOW_EXECUTION_STAGE | bool |false | | | false | | EXTERNAL_BLOB_STORAGE_CM_NAME | string |blob-storage-cm | | | false | | EXTERNAL_BLOB_STORAGE_SECRET_NAME | string |blob-storage-secret | | | false | | EXTERNAL_CD_NODE_LABEL_SELECTOR | | | | | false | diff --git a/pkg/pipeline/CdHandler.go b/pkg/pipeline/CdHandler.go index 05f77db3dd..f232464773 100644 --- a/pkg/pipeline/CdHandler.go +++ b/pkg/pipeline/CdHandler.go @@ -32,7 +32,6 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/constants" util2 "github.com/devtron-labs/devtron/pkg/pipeline/util" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" - adapter2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" bean5 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" "os" "path/filepath" @@ -642,7 +641,7 @@ func (impl *CdHandlerImpl) FetchCdWorkflowDetails(appId int, environmentId int, impl.Logger.Errorw("error in fetching pre/post workflow stages", "err", err) return types.WorkflowResponse{}, err } - workflow.WorkflowExecutionStage = adapter2.ConvertDBWorkflowStageToMap(workflowStageData, workflow.Id, workflow.Status, workflow.PodStatus, workflow.Message, workflow.WorkflowType, workflow.StartedOn, workflow.FinishedOn) + workflow.WorkflowExecutionStage = impl.workflowStageStatusService.ConvertDBWorkflowStageToMap(workflowStageData, workflow.Id, workflow.Status, workflow.PodStatus, workflow.Message, workflow.WorkflowType, workflow.StartedOn, workflow.FinishedOn) } else { workflow.WorkflowExecutionStage = map[string][]*bean5.WorkflowStageDto{} } diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index 518ea6a0dc..4558e5db74 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -35,7 +35,6 @@ import ( constants2 "github.com/devtron-labs/devtron/pkg/pipeline/constants" util3 "github.com/devtron-labs/devtron/pkg/pipeline/util" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" - adapter2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" "io/ioutil" "net/http" "os" @@ -583,7 +582,7 @@ func (impl *CiHandlerImpl) GetBuildHistory(pipelineId int, appId int, offset int ReferenceWorkflowId: w.RefCiWorkflowId, PodName: w.PodName, TargetPlatforms: utils.ConvertTargetPlatformStringToObject(w.TargetPlatforms), - WorkflowExecutionStage: adapter2.ConvertDBWorkflowStageToMap(allWfStagesDetail, w.Id, w.Status, w.PodStatus, w.Message, bean2.CI_WORKFLOW_TYPE.String(), w.StartedOn, w.FinishedOn), + WorkflowExecutionStage: impl.workFlowStageStatusService.ConvertDBWorkflowStageToMap(allWfStagesDetail, w.Id, w.Status, w.PodStatus, w.Message, bean2.CI_WORKFLOW_TYPE.String(), w.StartedOn, w.FinishedOn), } if w.Message == bean3.ImageTagUnavailableMessage { @@ -824,7 +823,7 @@ func (impl *CiHandlerImpl) FetchWorkflowDetails(appId int, pipelineId int, build EnvironmentName: environmentName, PipelineType: workflow.CiPipeline.PipelineType, PodName: workflow.PodName, - WorkflowExecutionStage: adapter2.ConvertDBWorkflowStageToMap(wfStagesDetail, workflow.Id, workflow.Status, workflow.PodStatus, workflow.Message, bean2.CI_WORKFLOW_TYPE.String(), workflow.StartedOn, workflow.FinishedOn), + WorkflowExecutionStage: impl.workFlowStageStatusService.ConvertDBWorkflowStageToMap(wfStagesDetail, workflow.Id, workflow.Status, workflow.PodStatus, workflow.Message, bean2.CI_WORKFLOW_TYPE.String(), workflow.StartedOn, workflow.FinishedOn), } return workflowResponse, nil } diff --git a/pkg/pipeline/types/CiCdConfig.go b/pkg/pipeline/types/CiCdConfig.go index e404009518..f96cbd145c 100644 --- a/pkg/pipeline/types/CiCdConfig.go +++ b/pkg/pipeline/types/CiCdConfig.go @@ -160,6 +160,7 @@ type CiCdConfig struct { UseArtifactListingQueryV2 bool `env:"USE_ARTIFACT_LISTING_QUERY_V2" envDefault:"true"` UseImageTagFromGitProviderForTagBasedBuild bool `env:"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD" envDefault:"false"` // this is being done for https://github.com/devtron-labs/devtron/issues/4263 UseDockerApiToGetDigest bool `env:"USE_DOCKER_API_TO_GET_DIGEST" envDefault:"false"` + EnableWorkflowExecutionStage bool `env:"ENABLE_WORKFLOW_EXECUTION_STAGE" envDefault:"false"` } type CiConfig struct { diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index aa690ddebe..b0ad13ba05 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -8,6 +8,7 @@ import ( bean3 "github.com/devtron-labs/devtron/pkg/bean" bean4 "github.com/devtron-labs/devtron/pkg/pipeline/bean" "github.com/devtron-labs/devtron/pkg/pipeline/constants" + "github.com/devtron-labs/devtron/pkg/pipeline/types" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" bean2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/repository" @@ -26,6 +27,7 @@ type WorkFlowStageStatusService interface { GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*repository.WorkflowExecutionStage, error) GetPrePostWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean2.WorkflowStageDto, error) + ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean2.WorkflowStageDto } type WorkFlowStageStatusServiceImpl struct { @@ -34,20 +36,29 @@ type WorkFlowStageStatusServiceImpl struct { ciWorkflowRepository pipelineConfig.CiWorkflowRepository cdWorkflowRepository pipelineConfig.CdWorkflowRepository transactionManager sql.TransactionWrapper + config *types.CiCdConfig } func NewWorkflowStageFlowStatusServiceImpl(logger *zap.SugaredLogger, workflowStatusRepository repository.WorkflowStageRepository, ciWorkflowRepository pipelineConfig.CiWorkflowRepository, cdWorkflowRepository pipelineConfig.CdWorkflowRepository, - transactionManager sql.TransactionWrapper) *WorkFlowStageStatusServiceImpl { - return &WorkFlowStageStatusServiceImpl{ + transactionManager sql.TransactionWrapper, + config *types.CiCdConfig, +) *WorkFlowStageStatusServiceImpl { + wfStageServiceImpl := &WorkFlowStageStatusServiceImpl{ logger: logger, workflowStatusRepository: workflowStatusRepository, ciWorkflowRepository: ciWorkflowRepository, cdWorkflowRepository: cdWorkflowRepository, transactionManager: transactionManager, } + ciCdConfig, err := types.GetCiCdConfig() + if err != nil { + return nil + } + wfStageServiceImpl.config = ciCdConfig + return wfStageServiceImpl } func (impl *WorkFlowStageStatusServiceImpl) SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error { @@ -64,18 +75,22 @@ func (impl *WorkFlowStageStatusServiceImpl) SaveCiWorkflowWithStage(wf *pipeline impl.logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) } }() - wf.Status = cdWorkflow.WorkflowWaitingToStart + if impl.config.EnableWorkflowExecutionStage { + wf.Status = cdWorkflow.WorkflowWaitingToStart + + pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String()) + pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) + return err + } + } + err = impl.ciWorkflowRepository.SaveWorkFlowWithTx(wf, tx) if err != nil { impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) return err } - pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String()) - pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) - return err - } err = impl.transactionManager.CommitTx(tx) if err != nil { @@ -101,16 +116,19 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCiWorkflowWithStage(wf *pipeli } }() - pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String(), wf.Status, wf.PodStatus, wf.Message, wf.PodName) - pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) - return err + if impl.config.EnableWorkflowExecutionStage { + pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String(), wf.Status, wf.PodStatus, wf.Message, wf.PodName) + pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) + return err + } + + // update workflow with updated wf status + wf.Status = updatedWfStatus + wf.PodStatus = updatedPodStatus } - // update workflow with updated wf status - wf.Status = updatedWfStatus - wf.PodStatus = updatedPodStatus err = impl.ciWorkflowRepository.UpdateWorkFlowWithTx(wf, tx) if err != nil { impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) @@ -431,9 +449,9 @@ func (impl *WorkFlowStageStatusServiceImpl) GetPrePostWorkflowStagesByWorkflowRu //iterate over prePostRunnerIds and create response structure using ConvertDBWorkflowStageToMap function for wfId, wf := range wfIdWfTypeMap { if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE.String() { - resp[wfId] = adapter.ConvertDBWorkflowStageToMap(preCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) + resp[wfId] = impl.ConvertDBWorkflowStageToMap(preCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) } else if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_POST.String() { - resp[wfId] = adapter.ConvertDBWorkflowStageToMap(postCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) + resp[wfId] = impl.ConvertDBWorkflowStageToMap(postCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) } } return resp, nil @@ -453,18 +471,21 @@ func (impl *WorkFlowStageStatusServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *p impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) } }() - wfr.Status = cdWorkflow.WorkflowWaitingToStart + if impl.config.EnableWorkflowExecutionStage { + wfr.Status = cdWorkflow.WorkflowWaitingToStart + + pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wfr.Id, wfr.WorkflowType.String()) + pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) + return wfr, err + } + } wfr, err = impl.cdWorkflowRepository.SaveWorkFlowRunnerWithTx(wfr, tx) if err != nil { impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) return wfr, err } - pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wfr.Id, wfr.WorkflowType.String()) - pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) - return wfr, err - } err = impl.transactionManager.CommitTx(tx) if err != nil { @@ -489,17 +510,19 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr } }() - if wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_POST { - pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wfr.Id, wfr.WorkflowType.String(), wfr.Status, wfr.PodStatus, wfr.Message, wfr.PodName) - pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) - return err + if impl.config.EnableWorkflowExecutionStage { + if wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_POST { + pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wfr.Id, wfr.WorkflowType.String(), wfr.Status, wfr.PodStatus, wfr.Message, wfr.PodName) + pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) + return err + } + wfr.Status = updatedWfStatus + wfr.PodStatus = updatedPodStatus + } else { + impl.logger.Infow("workflow type not supported to update stage data", "workflowName", wfr.Name, "workflowType", wfr.WorkflowType) } - wfr.Status = updatedWfStatus - wfr.PodStatus = updatedPodStatus - } else { - impl.logger.Infow("workflow type not supported to update stage data", "workflowName", wfr.Name, "workflowType", wfr.WorkflowType) } //update workflow runner now with updatedWfStatus if applicable @@ -517,3 +540,26 @@ func (impl *WorkFlowStageStatusServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr return nil } + +func (impl *WorkFlowStageStatusServiceImpl) ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean2.WorkflowStageDto { + wfMap := make(map[string][]*bean2.WorkflowStageDto) + foundInDb := false + if !impl.config.EnableWorkflowExecutionStage { + // if flag is not enabled then return empty map + return map[string][]*bean2.WorkflowStageDto{} + } + for _, wfStage := range workflowStages { + if wfStage.WorkflowId == wfId { + wfMap[wfStage.StatusType.ToString()] = append(wfMap[wfStage.StatusType.ToString()], adapter.ConvertDBWorkflowStageToDto(wfStage)) + foundInDb = true + } + } + + if !foundInDb { + //for old data where stages are not saved in db return empty map + return map[string][]*bean2.WorkflowStageDto{} + } + + return wfMap + +} diff --git a/pkg/pipeline/workflowStatus/adapter/adapter.go b/pkg/pipeline/workflowStatus/adapter/adapter.go index 6edbf905db..a91a226cea 100644 --- a/pkg/pipeline/workflowStatus/adapter/adapter.go +++ b/pkg/pipeline/workflowStatus/adapter/adapter.go @@ -13,25 +13,7 @@ import ( "time" ) -func ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean.WorkflowStageDto { - wfMap := make(map[string][]*bean.WorkflowStageDto) - foundInDb := false - for _, wfStage := range workflowStages { - if wfStage.WorkflowId == wfId { - wfMap[wfStage.StatusType.ToString()] = append(wfMap[wfStage.StatusType.ToString()], convertDBWorkflowStageToDto(wfStage)) - foundInDb = true - } - } - - if !foundInDb { - return GetWfStageDataForOldRunners(wfId, status, message, podStatus, wfType, startTime, endTime) - } - - return wfMap - -} - -func convertDBWorkflowStageToDto(stage *repository.WorkflowExecutionStage) *bean.WorkflowStageDto { +func ConvertDBWorkflowStageToDto(stage *repository.WorkflowExecutionStage) *bean.WorkflowStageDto { if stage == nil { return &bean.WorkflowStageDto{} } @@ -91,14 +73,14 @@ func GetWfStageDataForOldRunners(wfId int, wfStatus, wfMessage, podStatus, wfTyp executionStage.EndTime = endTime.Format(bean3.LayoutRFC3339) executionStage.Message = wfMessage - resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()], convertDBWorkflowStageToDto(executionStage)) + resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()], ConvertDBWorkflowStageToDto(executionStage)) podStage := GetDefaultPodExecutionStage(wfId, wfType) podStage.Status = ConvertWfStatusToDevtronStatus(podStatus, wfMessage) podStage.StartTime = startTime.Format(bean3.LayoutRFC3339) podStage.EndTime = endTime.Format(bean3.LayoutRFC3339) podStage.Message = wfMessage - resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()], convertDBWorkflowStageToDto(executionStage)) + resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()], ConvertDBWorkflowStageToDto(executionStage)) return resp } diff --git a/wire_gen.go b/wire_gen.go index 9e31395156..1e08f76ff2 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -574,7 +574,7 @@ func InitializeApp() (*App, error) { deployedAppMetricsServiceImpl := deployedAppMetrics.NewDeployedAppMetricsServiceImpl(sugaredLogger, appLevelMetricsRepositoryImpl, envLevelAppMetricsRepositoryImpl, chartRefServiceImpl) appListingServiceImpl := app2.NewAppListingServiceImpl(sugaredLogger, appListingRepositoryImpl, appRepositoryImpl, appListingViewBuilderImpl, pipelineRepositoryImpl, linkoutsRepositoryImpl, cdWorkflowRepositoryImpl, pipelineOverrideRepositoryImpl, environmentRepositoryImpl, chartRepositoryImpl, ciPipelineRepositoryImpl, dockerRegistryIpsConfigServiceImpl, userRepositoryImpl, deployedAppMetricsServiceImpl, ciArtifactRepositoryImpl, envConfigOverrideReadServiceImpl, ciPipelineConfigReadServiceImpl) workflowStageRepositoryImpl := repository16.NewWorkflowStageRepositoryImpl(sugaredLogger, db) - workFlowStageStatusServiceImpl := workflowStatus.NewWorkflowStageFlowStatusServiceImpl(sugaredLogger, workflowStageRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowRepositoryImpl, transactionUtilImpl) + workFlowStageStatusServiceImpl := workflowStatus.NewWorkflowStageFlowStatusServiceImpl(sugaredLogger, workflowStageRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowRepositoryImpl, transactionUtilImpl, ciCdConfig) appServiceImpl := app2.NewAppService(pipelineOverrideRepositoryImpl, mergeUtil, sugaredLogger, pipelineRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, appRepositoryImpl, configMapRepositoryImpl, chartRepositoryImpl, cdWorkflowRepositoryImpl, commonServiceImpl, chartTemplateServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineStatusTimelineResourcesServiceImpl, pipelineStatusSyncDetailServiceImpl, pipelineStatusTimelineServiceImpl, appServiceConfig, appStatusServiceImpl, installedAppReadServiceImpl, installedAppVersionHistoryRepositoryImpl, scopedVariableCMCSManagerImpl, acdConfig, gitOpsConfigReadServiceImpl, gitOperationServiceImpl, deploymentTemplateServiceImpl, appListingServiceImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl, workFlowStageStatusServiceImpl) globalCMCSRepositoryImpl := repository2.NewGlobalCMCSRepositoryImpl(sugaredLogger, db) globalCMCSServiceImpl := pipeline.NewGlobalCMCSServiceImpl(sugaredLogger, globalCMCSRepositoryImpl) From 11c2f507a8006294fdc4b45b225aadf16faf5ec2 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 14:33:15 +0530 Subject: [PATCH 07/43] save workflow before stage in saving --- .../WorkflowStageStatusService.go | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index b0ad13ba05..cf2eb6792a 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -77,7 +77,14 @@ func (impl *WorkFlowStageStatusServiceImpl) SaveCiWorkflowWithStage(wf *pipeline }() if impl.config.EnableWorkflowExecutionStage { wf.Status = cdWorkflow.WorkflowWaitingToStart + } + err = impl.ciWorkflowRepository.SaveWorkFlowWithTx(wf, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) + return err + } + if impl.config.EnableWorkflowExecutionStage { pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String()) pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) if err != nil { @@ -86,12 +93,6 @@ func (impl *WorkFlowStageStatusServiceImpl) SaveCiWorkflowWithStage(wf *pipeline } } - err = impl.ciWorkflowRepository.SaveWorkFlowWithTx(wf, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) - return err - } - err = impl.transactionManager.CommitTx(tx) if err != nil { impl.logger.Errorw("error in committing transaction", "workflowName", wf.Name, "error", err) @@ -473,7 +474,14 @@ func (impl *WorkFlowStageStatusServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *p }() if impl.config.EnableWorkflowExecutionStage { wfr.Status = cdWorkflow.WorkflowWaitingToStart - + } + wfr, err = impl.cdWorkflowRepository.SaveWorkFlowRunnerWithTx(wfr, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) + return wfr, err + } + + if impl.config.EnableWorkflowExecutionStage { pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wfr.Id, wfr.WorkflowType.String()) pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) if err != nil { @@ -481,11 +489,6 @@ func (impl *WorkFlowStageStatusServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *p return wfr, err } } - wfr, err = impl.cdWorkflowRepository.SaveWorkFlowRunnerWithTx(wfr, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) - return wfr, err - } err = impl.transactionManager.CommitTx(tx) if err != nil { From 249ae532bb8d04c2b6a44eed23c7896fab90b2a7 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 15:24:04 +0530 Subject: [PATCH 08/43] return cancelled for wf status in case of aborted --- .../WorkflowStageStatusService.go | 12 +++---- .../workflowStatus/adapter/adapter.go | 31 +++++-------------- pkg/pipeline/workflowStatus/bean/bean.go | 1 + 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index cf2eb6792a..0a7206d47e 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -261,7 +261,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( // update workflow preparation stage and pod status if terminal for _, stage := range currentWorkflowStages { if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { - extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) if extractedStatus != bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { stage.Status = extractedStatus } @@ -269,7 +269,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( //also mark pod status as terminal if wfstatus is terminal if stage.StageName == bean2.POD_EXECUTION && slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - stage.Status = adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + stage.Status = adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, false) stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) } } @@ -299,7 +299,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( stage.Status = bean2.WORKFLOW_STAGE_STATUS_RUNNING stage.StartTime = time.Now().Format(bean3.LayoutRFC3339) } else if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { - extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) if extractedStatus.IsTerminal() { stage.Status = extractedStatus stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) @@ -344,7 +344,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( //mark execution stage as completed if stage.StageName == bean2.WORKFLOW_EXECUTION { if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { - extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) if extractedStatus.IsTerminal() { stage.Status = extractedStatus stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) @@ -357,7 +357,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( } } } else if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { - extractedStatus := adapter.ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) if extractedStatus.IsTerminal() { stage.Status = extractedStatus stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) @@ -480,7 +480,7 @@ func (impl *WorkFlowStageStatusServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *p impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) return wfr, err } - + if impl.config.EnableWorkflowExecutionStage { pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wfr.Id, wfr.WorkflowType.String()) pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) diff --git a/pkg/pipeline/workflowStatus/adapter/adapter.go b/pkg/pipeline/workflowStatus/adapter/adapter.go index a91a226cea..fad5b54bf4 100644 --- a/pkg/pipeline/workflowStatus/adapter/adapter.go +++ b/pkg/pipeline/workflowStatus/adapter/adapter.go @@ -40,7 +40,8 @@ func getMetadataJson(metadata string) map[string]interface{} { return response } -func ConvertWfStatusToDevtronStatus(wfStatus string, wfMessage string) bean.WorkflowStageStatus { +// for workflow there can be other status map than for pod status like in aborted case +func ConvertStatusToDevtronStatus(wfStatus string, wfMessage string, isWorkflow bool) bean.WorkflowStageStatus { // implementation switch strings.ToLower(wfStatus) { case "pending", strings.ToLower(cdWorkflow.WorkflowWaitingToStart): @@ -56,35 +57,17 @@ func ConvertWfStatusToDevtronStatus(wfStatus string, wfMessage string) bean.Work return bean.WORKFLOW_STAGE_STATUS_FAILED } case "aborted", "cancelled": - return bean.WORKFLOW_STAGE_STATUS_ABORTED + if isWorkflow { + return bean.WORKFLOW_STAGE_STATUS_CANCELLED + } else { + return bean.WORKFLOW_STAGE_STATUS_ABORTED + } default: log.Println("unknown wf status", "wf", wfStatus) return bean.WORKFLOW_STAGE_STATUS_UNKNOWN } } -func GetWfStageDataForOldRunners(wfId int, wfStatus, wfMessage, podStatus, wfType string, startTime, endTime time.Time) map[string][]*bean.WorkflowStageDto { - // implementation - resp := make(map[string][]*bean.WorkflowStageDto) - - executionStage := GetDefaultWorkflowExecutionStage(wfId, wfType) - executionStage.Status = ConvertWfStatusToDevtronStatus(wfStatus, wfMessage) - executionStage.StartTime = startTime.Format(bean3.LayoutRFC3339) - executionStage.EndTime = endTime.Format(bean3.LayoutRFC3339) - executionStage.Message = wfMessage - - resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW.ToString()], ConvertDBWorkflowStageToDto(executionStage)) - - podStage := GetDefaultPodExecutionStage(wfId, wfType) - podStage.Status = ConvertWfStatusToDevtronStatus(podStatus, wfMessage) - podStage.StartTime = startTime.Format(bean3.LayoutRFC3339) - podStage.EndTime = endTime.Format(bean3.LayoutRFC3339) - podStage.Message = wfMessage - resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()] = append(resp[bean.WORKFLOW_STAGE_STATUS_TYPE_POD.ToString()], ConvertDBWorkflowStageToDto(executionStage)) - - return resp -} - func GetDefaultPipelineStatusForWorkflow(wfId int, wfType string) []*repository.WorkflowExecutionStage { // implementation resp := []*repository.WorkflowExecutionStage{} diff --git a/pkg/pipeline/workflowStatus/bean/bean.go b/pkg/pipeline/workflowStatus/bean/bean.go index 020964686b..0402b1de7b 100644 --- a/pkg/pipeline/workflowStatus/bean/bean.go +++ b/pkg/pipeline/workflowStatus/bean/bean.go @@ -32,6 +32,7 @@ const ( WORKFLOW_STAGE_STATUS_SUCCEEDED WorkflowStageStatus = "SUCCEEDED" WORKFLOW_STAGE_STATUS_FAILED WorkflowStageStatus = "FAILED" WORKFLOW_STAGE_STATUS_ABORTED WorkflowStageStatus = "ABORTED" + WORKFLOW_STAGE_STATUS_CANCELLED WorkflowStageStatus = "CANCELLED" WORKFLOW_STAGE_STATUS_TIMEOUT WorkflowStageStatus = "TIMEOUT" ) From fe0250bb56393bb1ef5d283c4323ef8b45b54ebd Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 15:39:02 +0530 Subject: [PATCH 09/43] add in terminal state for cancelled --- pkg/pipeline/workflowStatus/bean/bean.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/pipeline/workflowStatus/bean/bean.go b/pkg/pipeline/workflowStatus/bean/bean.go index 0402b1de7b..acc6d236aa 100644 --- a/pkg/pipeline/workflowStatus/bean/bean.go +++ b/pkg/pipeline/workflowStatus/bean/bean.go @@ -42,7 +42,7 @@ func (n WorkflowStageStatus) ToString() string { func (n WorkflowStageStatus) IsTerminal() bool { switch n { - case WORKFLOW_STAGE_STATUS_SUCCEEDED, WORKFLOW_STAGE_STATUS_FAILED, WORKFLOW_STAGE_STATUS_ABORTED, WORKFLOW_STAGE_STATUS_TIMEOUT: + case WORKFLOW_STAGE_STATUS_SUCCEEDED, WORKFLOW_STAGE_STATUS_FAILED, WORKFLOW_STAGE_STATUS_ABORTED, WORKFLOW_STAGE_STATUS_TIMEOUT, WORKFLOW_STAGE_STATUS_CANCELLED: return true default: return false From 7e83ea360dc156add1b10fb7570c3f7772afe0a2 Mon Sep 17 00:00:00 2001 From: prakhar katiyar Date: Tue, 28 Jan 2025 17:07:07 +0530 Subject: [PATCH 10/43] default check --- pkg/notifier/SESNotificationService.go | 4 ++++ pkg/notifier/beans/beans.go | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/notifier/SESNotificationService.go b/pkg/notifier/SESNotificationService.go index 7e5aee3bd7..60f7244fb7 100644 --- a/pkg/notifier/SESNotificationService.go +++ b/pkg/notifier/SESNotificationService.go @@ -175,6 +175,10 @@ func (impl *SESNotificationServiceImpl) DeleteNotificationConfig(deleteReq *bean impl.logger.Errorw("found notifications using this config, cannot delete", "config", deleteReq) return fmt.Errorf(" Please delete all notifications using this config before deleting") } + // check if default then dont delete + if existingConfig.Default { + return fmt.Errorf("default configuration cannot be deleted") + } existingConfig.UpdatedOn = time.Now() existingConfig.UpdatedBy = userId //deleting slack config diff --git a/pkg/notifier/beans/beans.go b/pkg/notifier/beans/beans.go index 16c000ab86..5fc07dc32b 100644 --- a/pkg/notifier/beans/beans.go +++ b/pkg/notifier/beans/beans.go @@ -224,7 +224,6 @@ type NSDeleteRequest struct { type NotificationRequest struct { UpdateType util.UpdateType `json:"updateType,omitempty"` - SesConfigId int `json:"sesConfigId,omitempty"` Providers []*bean.Provider `json:"providers"` NotificationConfigRequest []*NotificationConfigRequest `json:"notificationConfigRequest" validate:"required"` } From 941a95d2577d302f94e25932c0c96f0913135c7e Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 16:32:24 +0530 Subject: [PATCH 11/43] add comment and flag description --- env_gen.json | 2 +- env_gen.md | 2 +- pkg/pipeline/types/CiCdConfig.go | 2 +- pkg/pipeline/workflowStatus/bean/bean.go | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/env_gen.json b/env_gen.json index 52d2c579c0..e59bfb7d58 100644 --- a/env_gen.json +++ b/env_gen.json @@ -1 +1 @@ -[{"Category":"CD","Fields":[{"Env":"ARGO_APP_MANUAL_SYNC_TIME","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HELM_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_TIMEOUT_DURATION","EnvType":"string","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS","EnvType":"int","EnvValue":"12","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"6","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CD_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PIPELINE_DEGRADED_TIME","EnvType":"string","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_DEVTRON_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_EXTERNAL_HELM_APP","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_HELM_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"CI_RUNNER","Fields":[{"Env":"AZURE_ACCOUNT_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_ACCOUNT_NAME","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_CACHE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_LOG","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_CONNECTION_INSECURE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_URL","EnvType":"string","EnvValue":"http://devtron-minio.devtroncd:9000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BASE_LOG_LOCATION_PATH","EnvType":"string","EnvValue":"/home/devtron/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_GCP_CREDENTIALS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_PROVIDER","EnvType":"","EnvValue":"S3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ACCESS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_BUCKET_VERSIONED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT_INSECURE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_SECRET_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/devtron/buildx","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_K8S_DRIVER_OPTIONS","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_PROVENANCE_MODE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILD_LOG_TTL_VALUE_IN_SECS","EnvType":"int","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CACHE_LIMIT","EnvType":"int64","EnvValue":"5000000000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"cd-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_IGNORE_DOCKER_CACHE","EnvType":"bool","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_RUNNER_DOCKER_MTU_VALUE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_SUCCESS_AUTO_TRIGGER_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_VOLUME_MOUNTS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"arsenal-v1/ci-artifacts","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_BUCKET","EnvType":"string","EnvValue":"devtron-pro-ci-logs","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"arsenal-v1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET","EnvType":"string","EnvValue":"ci-caching","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_LOGS_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_NAMESPACE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_TIMEOUT","EnvType":"int64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CI_IMAGE","EnvType":"string","EnvValue":"686244538589.dkr.ecr.us-east-2.amazonaws.com/cirunner:47","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtron-ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TARGET_PLATFORM","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DOCKER_BUILD_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/docker","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_BUILD_CONTEXT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_WORKFLOW_EXECUTION_STAGE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_CM_NAME","EnvType":"string","EnvValue":"blob-storage-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_SECRET_NAME","EnvType":"string","EnvValue":"blob-storage-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_API_SECRET","EnvType":"string","EnvValue":"devtroncd-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_PAYLOAD","EnvType":"string","EnvValue":"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/vikram1601/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2022-10-30T20:00:00\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"User Name \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\"}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_WEB_HOOK_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_CM_CS_IN_CI_JOB","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_COUNT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_INTERVAL","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCANNER_ENDPOINT","EnvType":"string","EnvValue":"http://image-scanner-new-demo-devtroncd-service.devtroncd:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_MAX_RETRIES","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_RETRY_DELAY","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IN_APP_LOGGING_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CD_WORKFLOW_RUNNER_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CI_WORKFLOW_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODE","EnvType":"string","EnvValue":"DEV","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_SERVER_HOST","EnvType":"string","EnvValue":"localhost:4222","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_HOST","EnvType":"string","EnvValue":"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PRE_CI_CACHE_PATH","EnvType":"string","EnvValue":"/devtroncd-cache","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOW_DOCKER_BUILD_ARGS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CI_JOB_BUILD_CACHE_PUSH_PULL","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CREATING_ECR_REPO","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINATION_GRACE_PERIOD_SECS","EnvType":"int","EnvValue":"180","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_QUERY_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CD_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CI_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BUILDX","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DOCKER_API_TO_GET_DIGEST","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_EXTERNAL_NODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WF_CONTROLLER_INSTANCE_ID","EnvType":"string","EnvValue":"devtron-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_CACHE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"ci-runner","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"DEVTRON","Fields":[{"Env":"-","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_IMAGE","EnvType":"string","EnvValue":"quay.io/devtron/chart-sync:1227622d-132-3775","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_JOB_RESOURCES_OBJ","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"chart-sync","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_AUTO_SYNC_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_COUNT_ON_CONFLICT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_DELAY_ON_CONFLICT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_COUNT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_DELAY","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ASYNC_BUILDX_CACHE_EXPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_MODE_MIN","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PORT","EnvType":"string","EnvValue":"8000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CExpirationTime","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_TRIGGER_CRON_TIME","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_STATUS_UPDATE_CRON","EnvType":"string","EnvValue":"*/5 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLI_CMD_TIMEOUT_GLOBAL_SECONDS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLUSTER_STATUS_CRON_TIME","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CONSUMER_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_LOG_TIME_LIMIT","EnvType":"int64","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TIMEOUT","EnvType":"float64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_BOM_URL","EnvType":"string","EnvValue":"https://raw.githubusercontent.com/devtron-labs/devtron/%s/charts/devtron/devtron-bom.yaml","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEX_SECRET_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_CHART_NAME","EnvType":"string","EnvValue":"devtron-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_URL","EnvType":"string","EnvValue":"https://helm.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_INSTALLATION_TYPE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_MODULES_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.modules","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_SECRET_NAME","EnvType":"string","EnvValue":"devtron-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_VERSION_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.release","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CID","EnvType":"string","EnvValue":"example-app","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CLIENT_ID","EnvType":"string","EnvValue":"argo-cd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CSTOREKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_JWTKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_RURL","EnvType":"string","EnvValue":"http://127.0.0.1:8080/callback","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_SECRET","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ECR_REPO_NAME_PREFIX","EnvType":"string","EnvValue":"test/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_ARGO_CD_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EPHEMERAL_SERVER_VERSION_REGEX","EnvType":"string","EnvValue":"v[1-9]\\.\\b(2[3-9]\\|[3-9][0-9])\\b.*","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EVENT_URL","EnvType":"string","EnvValue":"http://localhost:3000/notify","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXECUTE_WIRE_NIL_CHECKER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CI_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_WORKER_POOL_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FORCE_SECURITY_SCANNING","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_REPO_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GO_RUNTIME_ENV","EnvType":"string","EnvValue":"production","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_ORG_ID","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PASSWORD","EnvType":"string","EnvValue":"prom-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PORT","EnvType":"string","EnvValue":"8090","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HIDE_IMAGE_TAGGING_HARD_DELETE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_AUTOCOMPLETE_AUTH_CHECK","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_GROUP_NAME","EnvType":"string","EnvValue":"installer.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_RESOURCE","EnvType":"string","EnvValue":"installers","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_VERSION","EnvType":"string","EnvValue":"v1alpha1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"JwtExpirationTime","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_CLIENT_MAX_IDLE_CONNS_PER_HOST","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_IDLE_CONN_TIMEOUT","EnvType":"int","EnvValue":"300","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_KEEPALIVE","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_TIMEOUT","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TLS_HANDSHAKE_TIMEOUT","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_RECEIVE_MSG_SIZE","EnvType":"int","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_SEND_MSG_SIZE","EnvType":"int","EnvValue":"4","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_URL","EnvType":"string","EnvValue":"http://lens-milandevtron-service:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOGGER_DEV_MODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOG_LEVEL","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_SESSION_PER_USER","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_METADATA_API_URL","EnvType":"string","EnvValue":"https://api.devtron.ai/module?name=%s","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_STATUS_HANDLING_CRON_DURATION_MIN","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_ACK_WAIT_IN_SECS","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_BUFFER_SIZE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_MAX_AGE","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_PROCESSING_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_REPLICAS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NOTIFICATION_MEDIUM","EnvType":"NotificationMedium","EnvValue":"rest","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"OTEL_COLLECTOR_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PARALLELISM_LIMIT_FOR_TAG_PROCESSING","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_EXPORT_PROM_METRICS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_FAILURE_QUERIES","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_QUERY","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_SLOW_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_QUERY_DUR_THRESHOLD","EnvType":"int64","EnvValue":"5000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PLUGIN_NAME","EnvType":"string","EnvValue":"Pull images from container repository","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROPAGATE_EXTRA_LABELS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROXY_SERVICE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESTRICT_TERMINAL_ACCESS_FOR_NON_SUPER_USER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUNTIME_CONFIG_LOCAL_DEV","EnvType":"LocalDevMode","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_FORMAT","EnvType":"string","EnvValue":"@{{%s}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_HANDLE_PRIMITIVES","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_NAME_REGEX","EnvType":"string","EnvValue":"^[a-zA-Z][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9]$","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOULD_CHECK_NAMESPACE_ON_CLONE","EnvType":"bool","EnvValue":"false","EnvDescription":"should we check if namespace exists or not while cloning app","Example":"","Deprecated":"false"},{"Env":"SOCKET_DISCONNECT_DELAY_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SOCKET_HEARTBEAT_SECONDS","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"STREAM_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SYSTEM_VAR_PREFIX","EnvType":"string","EnvValue":"DEVTRON_","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"default","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_INACTIVE_DURATION_IN_MINS","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_STATUS_SYNC_In_SECS","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_LOG_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PASSWORD","EnvType":"string","EnvValue":"postgrespw","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PORT","EnvType":"string","EnvValue":"55000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_FOR_FAILED_CI_BUILD","EnvType":"string","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_IN_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USER_SESSION_DURATION_SECONDS","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_API_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CUSTOM_HTTP_TRANSPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_GIT_CLI","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_RBAC_CREATION_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_CACHE_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_EXPRESSION_REGEX","EnvType":"string","EnvValue":"@{{([^}]+)}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WEBHOOK_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"GITOPS","Fields":[{"Env":"ACD_CM","EnvType":"string","EnvValue":"argocd-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_PASSWORD","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_SECRET_NAME","EnvType":"string","EnvValue":"devtron-gitops-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS","EnvType":"string","EnvValue":"Deployment,Rollout,StatefulSet,ReplicaSet","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS_BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"INFRA_SETUP","Fields":[{"Env":"DASHBOARD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_PORT","EnvType":"string","EnvValue":"3000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_HOST","EnvType":"string","EnvValue":"http://localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_PORT","EnvType":"string","EnvValue":"5556","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_PROTOCOL","EnvType":"string","EnvValue":"REST","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_URL","EnvType":"string","EnvValue":"127.0.0.1:7070","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_CLIENT_URL","EnvType":"string","EnvValue":"127.0.0.1:50051","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"POSTGRES","Fields":[{"Env":"APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"Application name","Example":"","Deprecated":"false"},{"Env":"CASBIN_DATABASE","EnvType":"string","EnvValue":"casbin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"address of postgres service","Example":"postgresql-postgresql.devtroncd","Deprecated":"false"},{"Env":"PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"postgres database to be made connection with","Example":"orchestrator, casbin, git_sensor, lens","Deprecated":"false"},{"Env":"PG_PASSWORD","EnvType":"string","EnvValue":"{password}","EnvDescription":"password for postgres, associated with PG_USER","Example":"confidential ;)","Deprecated":"false"},{"Env":"PG_PORT","EnvType":"string","EnvValue":"5432","EnvDescription":"port of postgresql service","Example":"5432","Deprecated":"false"},{"Env":"PG_READ_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"user for postgres","Example":"postgres","Deprecated":"false"},{"Env":"PG_WRITE_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"RBAC","Fields":[{"Env":"ENFORCER_CACHE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_CACHE_EXPIRATION_IN_SEC","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_MAX_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CASBIN_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"}]}] \ No newline at end of file +[{"Category":"CD","Fields":[{"Env":"ARGO_APP_MANUAL_SYNC_TIME","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HELM_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_TIMEOUT_DURATION","EnvType":"string","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS","EnvType":"int","EnvValue":"12","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"6","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CD_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PIPELINE_DEGRADED_TIME","EnvType":"string","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_DEVTRON_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_EXTERNAL_HELM_APP","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_HELM_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"CI_RUNNER","Fields":[{"Env":"AZURE_ACCOUNT_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_ACCOUNT_NAME","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_CACHE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_LOG","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_CONNECTION_INSECURE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_URL","EnvType":"string","EnvValue":"http://devtron-minio.devtroncd:9000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BASE_LOG_LOCATION_PATH","EnvType":"string","EnvValue":"/home/devtron/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_GCP_CREDENTIALS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_PROVIDER","EnvType":"","EnvValue":"S3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ACCESS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_BUCKET_VERSIONED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT_INSECURE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_SECRET_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/devtron/buildx","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_K8S_DRIVER_OPTIONS","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_PROVENANCE_MODE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILD_LOG_TTL_VALUE_IN_SECS","EnvType":"int","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CACHE_LIMIT","EnvType":"int64","EnvValue":"5000000000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"cd-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_IGNORE_DOCKER_CACHE","EnvType":"bool","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_RUNNER_DOCKER_MTU_VALUE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_SUCCESS_AUTO_TRIGGER_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_VOLUME_MOUNTS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"arsenal-v1/ci-artifacts","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_BUCKET","EnvType":"string","EnvValue":"devtron-pro-ci-logs","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"arsenal-v1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET","EnvType":"string","EnvValue":"ci-caching","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_LOGS_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_NAMESPACE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_TIMEOUT","EnvType":"int64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CI_IMAGE","EnvType":"string","EnvValue":"686244538589.dkr.ecr.us-east-2.amazonaws.com/cirunner:47","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtron-ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TARGET_PLATFORM","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DOCKER_BUILD_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/docker","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_BUILD_CONTEXT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_WORKFLOW_EXECUTION_STAGE","EnvType":"bool","EnvValue":"false","EnvDescription":"if enabled then we will display build stages separately for CI/Job/Pre-Post CD","Example":"false","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_CM_NAME","EnvType":"string","EnvValue":"blob-storage-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_SECRET_NAME","EnvType":"string","EnvValue":"blob-storage-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_API_SECRET","EnvType":"string","EnvValue":"devtroncd-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_PAYLOAD","EnvType":"string","EnvValue":"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/vikram1601/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2022-10-30T20:00:00\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"User Name \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\"}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_WEB_HOOK_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_CM_CS_IN_CI_JOB","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_COUNT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_INTERVAL","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCANNER_ENDPOINT","EnvType":"string","EnvValue":"http://image-scanner-new-demo-devtroncd-service.devtroncd:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_MAX_RETRIES","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_RETRY_DELAY","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IN_APP_LOGGING_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CD_WORKFLOW_RUNNER_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CI_WORKFLOW_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODE","EnvType":"string","EnvValue":"DEV","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_SERVER_HOST","EnvType":"string","EnvValue":"localhost:4222","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_HOST","EnvType":"string","EnvValue":"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PRE_CI_CACHE_PATH","EnvType":"string","EnvValue":"/devtroncd-cache","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOW_DOCKER_BUILD_ARGS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CI_JOB_BUILD_CACHE_PUSH_PULL","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CREATING_ECR_REPO","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINATION_GRACE_PERIOD_SECS","EnvType":"int","EnvValue":"180","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_QUERY_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CD_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CI_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BUILDX","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DOCKER_API_TO_GET_DIGEST","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_EXTERNAL_NODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WF_CONTROLLER_INSTANCE_ID","EnvType":"string","EnvValue":"devtron-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_CACHE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"ci-runner","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"DEVTRON","Fields":[{"Env":"-","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_IMAGE","EnvType":"string","EnvValue":"quay.io/devtron/chart-sync:1227622d-132-3775","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_JOB_RESOURCES_OBJ","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"chart-sync","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_AUTO_SYNC_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_COUNT_ON_CONFLICT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_DELAY_ON_CONFLICT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_COUNT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_DELAY","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ASYNC_BUILDX_CACHE_EXPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_MODE_MIN","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PORT","EnvType":"string","EnvValue":"8000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CExpirationTime","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_TRIGGER_CRON_TIME","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_STATUS_UPDATE_CRON","EnvType":"string","EnvValue":"*/5 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLI_CMD_TIMEOUT_GLOBAL_SECONDS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLUSTER_STATUS_CRON_TIME","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CONSUMER_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_LOG_TIME_LIMIT","EnvType":"int64","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TIMEOUT","EnvType":"float64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_BOM_URL","EnvType":"string","EnvValue":"https://raw.githubusercontent.com/devtron-labs/devtron/%s/charts/devtron/devtron-bom.yaml","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEX_SECRET_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_CHART_NAME","EnvType":"string","EnvValue":"devtron-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_URL","EnvType":"string","EnvValue":"https://helm.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_INSTALLATION_TYPE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_MODULES_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.modules","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_SECRET_NAME","EnvType":"string","EnvValue":"devtron-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_VERSION_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.release","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CID","EnvType":"string","EnvValue":"example-app","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CLIENT_ID","EnvType":"string","EnvValue":"argo-cd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CSTOREKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_JWTKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_RURL","EnvType":"string","EnvValue":"http://127.0.0.1:8080/callback","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_SECRET","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ECR_REPO_NAME_PREFIX","EnvType":"string","EnvValue":"test/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_ARGO_CD_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EPHEMERAL_SERVER_VERSION_REGEX","EnvType":"string","EnvValue":"v[1-9]\\.\\b(2[3-9]\\|[3-9][0-9])\\b.*","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EVENT_URL","EnvType":"string","EnvValue":"http://localhost:3000/notify","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXECUTE_WIRE_NIL_CHECKER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CI_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_WORKER_POOL_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FORCE_SECURITY_SCANNING","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_REPO_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GO_RUNTIME_ENV","EnvType":"string","EnvValue":"production","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_ORG_ID","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PASSWORD","EnvType":"string","EnvValue":"prom-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PORT","EnvType":"string","EnvValue":"8090","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HIDE_IMAGE_TAGGING_HARD_DELETE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_AUTOCOMPLETE_AUTH_CHECK","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_GROUP_NAME","EnvType":"string","EnvValue":"installer.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_RESOURCE","EnvType":"string","EnvValue":"installers","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_VERSION","EnvType":"string","EnvValue":"v1alpha1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"JwtExpirationTime","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_CLIENT_MAX_IDLE_CONNS_PER_HOST","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_IDLE_CONN_TIMEOUT","EnvType":"int","EnvValue":"300","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_KEEPALIVE","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_TIMEOUT","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TLS_HANDSHAKE_TIMEOUT","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_RECEIVE_MSG_SIZE","EnvType":"int","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_SEND_MSG_SIZE","EnvType":"int","EnvValue":"4","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_URL","EnvType":"string","EnvValue":"http://lens-milandevtron-service:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOGGER_DEV_MODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOG_LEVEL","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_SESSION_PER_USER","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_METADATA_API_URL","EnvType":"string","EnvValue":"https://api.devtron.ai/module?name=%s","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_STATUS_HANDLING_CRON_DURATION_MIN","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_ACK_WAIT_IN_SECS","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_BUFFER_SIZE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_MAX_AGE","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_PROCESSING_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_REPLICAS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NOTIFICATION_MEDIUM","EnvType":"NotificationMedium","EnvValue":"rest","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"OTEL_COLLECTOR_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PARALLELISM_LIMIT_FOR_TAG_PROCESSING","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_EXPORT_PROM_METRICS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_FAILURE_QUERIES","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_QUERY","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_SLOW_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_QUERY_DUR_THRESHOLD","EnvType":"int64","EnvValue":"5000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PLUGIN_NAME","EnvType":"string","EnvValue":"Pull images from container repository","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROPAGATE_EXTRA_LABELS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROXY_SERVICE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESTRICT_TERMINAL_ACCESS_FOR_NON_SUPER_USER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUNTIME_CONFIG_LOCAL_DEV","EnvType":"LocalDevMode","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_FORMAT","EnvType":"string","EnvValue":"@{{%s}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_HANDLE_PRIMITIVES","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_NAME_REGEX","EnvType":"string","EnvValue":"^[a-zA-Z][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9]$","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOULD_CHECK_NAMESPACE_ON_CLONE","EnvType":"bool","EnvValue":"false","EnvDescription":"should we check if namespace exists or not while cloning app","Example":"","Deprecated":"false"},{"Env":"SOCKET_DISCONNECT_DELAY_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SOCKET_HEARTBEAT_SECONDS","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"STREAM_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SYSTEM_VAR_PREFIX","EnvType":"string","EnvValue":"DEVTRON_","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"default","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_INACTIVE_DURATION_IN_MINS","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_STATUS_SYNC_In_SECS","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_LOG_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PASSWORD","EnvType":"string","EnvValue":"postgrespw","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PORT","EnvType":"string","EnvValue":"55000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_FOR_FAILED_CI_BUILD","EnvType":"string","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_IN_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USER_SESSION_DURATION_SECONDS","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_API_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CUSTOM_HTTP_TRANSPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_GIT_CLI","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_RBAC_CREATION_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_CACHE_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_EXPRESSION_REGEX","EnvType":"string","EnvValue":"@{{([^}]+)}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WEBHOOK_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"GITOPS","Fields":[{"Env":"ACD_CM","EnvType":"string","EnvValue":"argocd-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_PASSWORD","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_SECRET_NAME","EnvType":"string","EnvValue":"devtron-gitops-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS","EnvType":"string","EnvValue":"Deployment,Rollout,StatefulSet,ReplicaSet","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS_BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"INFRA_SETUP","Fields":[{"Env":"DASHBOARD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_PORT","EnvType":"string","EnvValue":"3000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_HOST","EnvType":"string","EnvValue":"http://localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_PORT","EnvType":"string","EnvValue":"5556","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_PROTOCOL","EnvType":"string","EnvValue":"REST","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_URL","EnvType":"string","EnvValue":"127.0.0.1:7070","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_CLIENT_URL","EnvType":"string","EnvValue":"127.0.0.1:50051","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"POSTGRES","Fields":[{"Env":"APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"Application name","Example":"","Deprecated":"false"},{"Env":"CASBIN_DATABASE","EnvType":"string","EnvValue":"casbin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"address of postgres service","Example":"postgresql-postgresql.devtroncd","Deprecated":"false"},{"Env":"PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"postgres database to be made connection with","Example":"orchestrator, casbin, git_sensor, lens","Deprecated":"false"},{"Env":"PG_PASSWORD","EnvType":"string","EnvValue":"{password}","EnvDescription":"password for postgres, associated with PG_USER","Example":"confidential ;)","Deprecated":"false"},{"Env":"PG_PORT","EnvType":"string","EnvValue":"5432","EnvDescription":"port of postgresql service","Example":"5432","Deprecated":"false"},{"Env":"PG_READ_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"user for postgres","Example":"postgres","Deprecated":"false"},{"Env":"PG_WRITE_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"RBAC","Fields":[{"Env":"ENFORCER_CACHE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_CACHE_EXPIRATION_IN_SEC","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_MAX_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CASBIN_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"}]}] \ No newline at end of file diff --git a/env_gen.md b/env_gen.md index c456264bfe..abac26ced3 100644 --- a/env_gen.md +++ b/env_gen.md @@ -76,7 +76,7 @@ | DEFAULT_TARGET_PLATFORM | string | | | | false | | DOCKER_BUILD_CACHE_PATH | string |/var/lib/docker | | | false | | ENABLE_BUILD_CONTEXT | bool |false | | | false | - | ENABLE_WORKFLOW_EXECUTION_STAGE | bool |false | | | false | + | ENABLE_WORKFLOW_EXECUTION_STAGE | bool |false | if enabled then we will display build stages separately for CI/Job/Pre-Post CD | false | false | | EXTERNAL_BLOB_STORAGE_CM_NAME | string |blob-storage-cm | | | false | | EXTERNAL_BLOB_STORAGE_SECRET_NAME | string |blob-storage-secret | | | false | | EXTERNAL_CD_NODE_LABEL_SELECTOR | | | | | false | diff --git a/pkg/pipeline/types/CiCdConfig.go b/pkg/pipeline/types/CiCdConfig.go index f96cbd145c..b3729f9b02 100644 --- a/pkg/pipeline/types/CiCdConfig.go +++ b/pkg/pipeline/types/CiCdConfig.go @@ -160,7 +160,7 @@ type CiCdConfig struct { UseArtifactListingQueryV2 bool `env:"USE_ARTIFACT_LISTING_QUERY_V2" envDefault:"true"` UseImageTagFromGitProviderForTagBasedBuild bool `env:"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD" envDefault:"false"` // this is being done for https://github.com/devtron-labs/devtron/issues/4263 UseDockerApiToGetDigest bool `env:"USE_DOCKER_API_TO_GET_DIGEST" envDefault:"false"` - EnableWorkflowExecutionStage bool `env:"ENABLE_WORKFLOW_EXECUTION_STAGE" envDefault:"false"` + EnableWorkflowExecutionStage bool `env:"ENABLE_WORKFLOW_EXECUTION_STAGE" envDefault:"false" description:"if enabled then we will display build stages separately for CI/Job/Pre-Post CD" example:"false"` } type CiConfig struct { diff --git a/pkg/pipeline/workflowStatus/bean/bean.go b/pkg/pipeline/workflowStatus/bean/bean.go index acc6d236aa..db9dc5c079 100644 --- a/pkg/pipeline/workflowStatus/bean/bean.go +++ b/pkg/pipeline/workflowStatus/bean/bean.go @@ -34,6 +34,7 @@ const ( WORKFLOW_STAGE_STATUS_ABORTED WorkflowStageStatus = "ABORTED" WORKFLOW_STAGE_STATUS_CANCELLED WorkflowStageStatus = "CANCELLED" WORKFLOW_STAGE_STATUS_TIMEOUT WorkflowStageStatus = "TIMEOUT" + //don't forget to add new status in IsTerminal() method if it is terminal status ) func (n WorkflowStageStatus) ToString() string { From 3d22e4b6f1f249f8783704d0d9bca1a337bc00c5 Mon Sep 17 00:00:00 2001 From: prakhar katiyar Date: Tue, 28 Jan 2025 17:32:01 +0530 Subject: [PATCH 12/43] default check SMTP --- pkg/notifier/SMTPNotificationService.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/notifier/SMTPNotificationService.go b/pkg/notifier/SMTPNotificationService.go index 65e9eed08c..b5611c91c0 100644 --- a/pkg/notifier/SMTPNotificationService.go +++ b/pkg/notifier/SMTPNotificationService.go @@ -175,6 +175,10 @@ func (impl *SMTPNotificationServiceImpl) DeleteNotificationConfig(deleteReq *bea impl.logger.Errorw("found notifications using this config, cannot delete", "config", deleteReq) return fmt.Errorf(" Please delete all notifications using this config before deleting") } + // check if default then dont delete + if existingConfig.Default { + return fmt.Errorf("default configuration cannot be deleted") + } existingConfig.UpdatedOn = time.Now() existingConfig.UpdatedBy = userId //deleting smtp config From a71d16f9c51ed0729d3202af3f5b1cb3b5e4503f Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 18:45:37 +0530 Subject: [PATCH 13/43] fix for aborted and cancelled --- .../workflowStatus/WorkflowStageStatusService.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 0a7206d47e..908bbb1b93 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -351,8 +351,9 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { updatedWfStatus = cdWorkflow.WorkflowTimedOut } - if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { - updatedWfStatus = cdWorkflow.WorkflowAborted + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED || + extractedStatus == bean2.WORKFLOW_STAGE_STATUS_CANCELLED { + updatedWfStatus = bean2.WORKFLOW_STAGE_STATUS_CANCELLED.ToString() } } } @@ -364,8 +365,9 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { updatedWfStatus = cdWorkflow.WorkflowTimedOut } - if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { - updatedWfStatus = cdWorkflow.WorkflowAborted + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED || + extractedStatus == bean2.WORKFLOW_STAGE_STATUS_CANCELLED { + updatedWfStatus = bean2.WORKFLOW_STAGE_STATUS_CANCELLED.ToString() } } } From 2bdc693cdca5cfa0b975f4da275a7e50c8c087d9 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 19:12:22 +0530 Subject: [PATCH 14/43] add cancel in terminal status --- .../pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go b/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go index b5850f6e1b..56cee95adf 100644 --- a/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go +++ b/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go @@ -4,9 +4,10 @@ import ( "errors" "github.com/devtron-labs/common-lib/utils/k8s/health" "github.com/devtron-labs/devtron/client/argocdServer/bean" + "github.com/devtron-labs/devtron/pkg/pipeline/executors" ) -var WfrTerminalStatusList = []string{WorkflowAborted, WorkflowFailed, WorkflowSucceeded, bean.HIBERNATING, string(health.HealthStatusHealthy), string(health.HealthStatusDegraded), WorkflowTimedOut} +var WfrTerminalStatusList = []string{WorkflowAborted, WorkflowFailed, WorkflowSucceeded, bean.HIBERNATING, string(health.HealthStatusHealthy), string(health.HealthStatusDegraded), WorkflowTimedOut, executors.WorkflowCancel} type WorkflowStatus int From 0e8c54e7b157bfbbf41244ad6228ac8b2e4944f4 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 19:24:02 +0530 Subject: [PATCH 15/43] import cycle fix --- .../bean/workflow/cdWorkflow/CdWorkflowBean.go | 6 ++++-- pkg/pipeline/CdHandler.go | 10 +++++----- pkg/pipeline/CiHandler.go | 12 ++++++------ pkg/pipeline/executors/WorkflowUtils.go | 5 +---- pkg/workflow/dag/WorkflowDagExecutor.go | 3 +-- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go b/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go index 56cee95adf..911c4c048e 100644 --- a/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go +++ b/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow/CdWorkflowBean.go @@ -4,10 +4,9 @@ import ( "errors" "github.com/devtron-labs/common-lib/utils/k8s/health" "github.com/devtron-labs/devtron/client/argocdServer/bean" - "github.com/devtron-labs/devtron/pkg/pipeline/executors" ) -var WfrTerminalStatusList = []string{WorkflowAborted, WorkflowFailed, WorkflowSucceeded, bean.HIBERNATING, string(health.HealthStatusHealthy), string(health.HealthStatusDegraded), WorkflowTimedOut, executors.WorkflowCancel} +var WfrTerminalStatusList = []string{WorkflowAborted, WorkflowFailed, WorkflowSucceeded, bean.HIBERNATING, string(health.HealthStatusHealthy), string(health.HealthStatusDegraded), WorkflowTimedOut, WorkflowCancel} type WorkflowStatus int @@ -62,3 +61,6 @@ type CdWorkflowRunnerArtifactMetadata struct { ParentCiArtifact int `pg:"parent_ci_artifact"` Scanned bool `pg:"scanned"` } + +const WorkflowCancel = "CANCELLED" +const POD_DELETED_MESSAGE = "pod deleted" diff --git a/pkg/pipeline/CdHandler.go b/pkg/pipeline/CdHandler.go index f232464773..a3cba7c83e 100644 --- a/pkg/pipeline/CdHandler.go +++ b/pkg/pipeline/CdHandler.go @@ -23,6 +23,7 @@ import ( "github.com/devtron-labs/common-lib/utils" bean4 "github.com/devtron-labs/common-lib/utils/bean" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/adapter/cdWorkflow" + cdWorkflow2 "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" bean2 "github.com/devtron-labs/devtron/pkg/bean" "github.com/devtron-labs/devtron/pkg/build/artifacts/imageTagging" "github.com/devtron-labs/devtron/pkg/cluster/adapter" @@ -49,7 +50,6 @@ import ( "github.com/devtron-labs/devtron/pkg/auth/user" "github.com/devtron-labs/devtron/pkg/cluster" pipelineBean "github.com/devtron-labs/devtron/pkg/pipeline/bean" - "github.com/devtron-labs/devtron/pkg/pipeline/executors" "github.com/devtron-labs/devtron/pkg/pipeline/types" resourceGroup2 "github.com/devtron-labs/devtron/pkg/resourceGroup" util3 "github.com/devtron-labs/devtron/util" @@ -219,7 +219,7 @@ func (impl *CdHandlerImpl) CancelStage(workflowRunnerId int, forceAbort bool, us return 0, err } } - workflowRunner.Status = executors.WorkflowCancel + workflowRunner.Status = cdWorkflow2.WorkflowCancel workflowRunner.UpdatedOn = time.Now() workflowRunner.UpdatedBy = userId err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(workflowRunner) @@ -231,7 +231,7 @@ func (impl *CdHandlerImpl) CancelStage(workflowRunnerId int, forceAbort bool, us } func (impl *CdHandlerImpl) updateWorkflowRunnerForForceAbort(workflowRunner *pipelineConfig.CdWorkflowRunner) error { - workflowRunner.Status = executors.WorkflowCancel + workflowRunner.Status = cdWorkflow2.WorkflowCancel workflowRunner.PodStatus = string(bean2.Failed) workflowRunner.Message = constants.FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE err := impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(workflowRunner) @@ -280,7 +280,7 @@ func (impl *CdHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus cdArtifactLocationFormat := impl.config.GetArtifactLocationFormat() cdArtifactLocation := fmt.Sprintf(cdArtifactLocationFormat, savedWorkflow.CdWorkflowId, savedWorkflow.Id) if impl.stateChanged(status, podStatus, message, workflowStatus.FinishedAt.Time, savedWorkflow) { - if savedWorkflow.Status != executors.WorkflowCancel { + if savedWorkflow.Status != cdWorkflow2.WorkflowCancel { savedWorkflow.Status = status } savedWorkflow.CdArtifactLocation = cdArtifactLocation @@ -549,7 +549,7 @@ func (impl *CdHandlerImpl) getWorkflowLogs(pipelineId int, cdWorkflow *pipelineC if logStream == nil || err != nil { if !cdWorkflow.BlobStorageEnabled { return nil, nil, errors.New("logs-not-stored-in-repository") - } else if string(v1alpha1.NodeSucceeded) == cdWorkflow.Status || string(v1alpha1.NodeError) == cdWorkflow.Status || string(v1alpha1.NodeFailed) == cdWorkflow.Status || cdWorkflow.Status == executors.WorkflowCancel { + } else if string(v1alpha1.NodeSucceeded) == cdWorkflow.Status || string(v1alpha1.NodeError) == cdWorkflow.Status || string(v1alpha1.NodeFailed) == cdWorkflow.Status || cdWorkflow.Status == cdWorkflow2.WorkflowCancel { impl.Logger.Debugw("pod is not live", "podName", cdWorkflow.PodName, "err", err) return impl.getLogsFromRepository(pipelineId, cdWorkflow, clusterConfig, runStageInEnv) } diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index 4558e5db74..9058c999e1 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -663,7 +663,7 @@ func (impl *CiHandlerImpl) CancelBuild(workflowId int, forceAbort bool) (int, er return workflow.Id, nil } - workflow.Status = executors.WorkflowCancel + workflow.Status = cdWorkflow.WorkflowCancel if workflow.ExecutorType == cdWorkflow.WORKFLOW_EXECUTOR_TYPE_SYSTEM { workflow.PodStatus = "Failed" workflow.Message = constants2.TERMINATE_MESSAGE @@ -707,7 +707,7 @@ func (impl *CiHandlerImpl) handleForceAbortCaseForCi(workflow *pipelineConfig.Ci } func (impl *CiHandlerImpl) updateWorkflowForForceAbort(workflow *pipelineConfig.CiWorkflow) error { - workflow.Status = executors.WorkflowCancel + workflow.Status = cdWorkflow.WorkflowCancel workflow.PodStatus = string(bean.Failed) workflow.Message = constants2.FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE err := impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(workflow) @@ -875,7 +875,7 @@ func (impl *CiHandlerImpl) getWorkflowLogs(ciWorkflow *pipelineConfig.CiWorkflow if logStream == nil || err != nil { if !ciWorkflow.BlobStorageEnabled { return nil, nil, &util.ApiError{Code: "200", HttpStatusCode: 400, UserMessage: "logs-not-stored-in-repository"} - } else if string(v1alpha1.NodeSucceeded) == ciWorkflow.Status || string(v1alpha1.NodeError) == ciWorkflow.Status || string(v1alpha1.NodeFailed) == ciWorkflow.Status || ciWorkflow.Status == executors.WorkflowCancel { + } else if string(v1alpha1.NodeSucceeded) == ciWorkflow.Status || string(v1alpha1.NodeError) == ciWorkflow.Status || string(v1alpha1.NodeFailed) == ciWorkflow.Status || ciWorkflow.Status == cdWorkflow.WorkflowCancel { impl.Logger.Debugw("pod is not live", "podName", ciWorkflow.PodName, "err", err) return impl.getLogsFromRepository(ciWorkflow, clusterConfig, isExt) } @@ -1198,7 +1198,7 @@ func (impl *CiHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus ciArtifactLocation := fmt.Sprintf(ciArtifactLocationFormat, savedWorkflow.Id, savedWorkflow.Id) if impl.stateChanged(status, podStatus, message, workflowStatus.FinishedAt.Time, savedWorkflow) { - if savedWorkflow.Status != executors.WorkflowCancel { + if savedWorkflow.Status != cdWorkflow.WorkflowCancel { savedWorkflow.Status = status } savedWorkflow.PodStatus = podStatus @@ -1207,7 +1207,7 @@ func (impl *CiHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus if len(message) > 250 { savedWorkflow.Message = message[:250] } - if savedWorkflow.ExecutorType == cdWorkflow.WORKFLOW_EXECUTOR_TYPE_SYSTEM && savedWorkflow.Status == executors.WorkflowCancel { + if savedWorkflow.ExecutorType == cdWorkflow.WORKFLOW_EXECUTOR_TYPE_SYSTEM && savedWorkflow.Status == cdWorkflow.WorkflowCancel { savedWorkflow.PodStatus = "Failed" savedWorkflow.Message = constants2.TERMINATE_MESSAGE } @@ -1708,7 +1708,7 @@ func (impl *CiHandlerImpl) UpdateCiWorkflowStatusFailure(timeoutForFailureCiBuil ciWorkflow.Status = "Failed" ciWorkflow.PodStatus = "Failed" if isPodDeleted { - ciWorkflow.Message = executors.POD_DELETED_MESSAGE + ciWorkflow.Message = cdWorkflow.POD_DELETED_MESSAGE //error logging handled inside handlePodDeleted impl.handlePodDeleted(ciWorkflow) } else { diff --git a/pkg/pipeline/executors/WorkflowUtils.go b/pkg/pipeline/executors/WorkflowUtils.go index c06b0703fc..d44eec20d9 100644 --- a/pkg/pipeline/executors/WorkflowUtils.go +++ b/pkg/pipeline/executors/WorkflowUtils.go @@ -251,13 +251,10 @@ func GetClientInstance(config *rest.Config, namespace string) (v1alpha12.Workflo func CheckIfReTriggerRequired(status, message, workflowRunnerStatus string) bool { return ((status == string(v1alpha1.NodeError) || status == string(v1alpha1.NodeFailed)) && - message == POD_DELETED_MESSAGE) && (workflowRunnerStatus != WorkflowCancel && workflowRunnerStatus != cdWorkflow.WorkflowAborted) + message == cdWorkflow.POD_DELETED_MESSAGE) && (workflowRunnerStatus != cdWorkflow.WorkflowCancel && workflowRunnerStatus != cdWorkflow.WorkflowAborted) } -const WorkflowCancel = "CANCELLED" -const POD_DELETED_MESSAGE = "pod deleted" - func GetWorkflowLabelsForSystemExecutor(workflowTemplate bean.WorkflowTemplate) map[string]string { return map[string]string{ DEVTRON_WORKFLOW_LABEL_KEY: DEVTRON_WORKFLOW_LABEL_VALUE, diff --git a/pkg/workflow/dag/WorkflowDagExecutor.go b/pkg/workflow/dag/WorkflowDagExecutor.go index bb1b08100d..9c8bbdf2aa 100644 --- a/pkg/workflow/dag/WorkflowDagExecutor.go +++ b/pkg/workflow/dag/WorkflowDagExecutor.go @@ -46,7 +46,6 @@ import ( eventProcessorBean "github.com/devtron-labs/devtron/pkg/eventProcessor/bean" "github.com/devtron-labs/devtron/pkg/pipeline" constants2 "github.com/devtron-labs/devtron/pkg/pipeline/constants" - "github.com/devtron-labs/devtron/pkg/pipeline/executors" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" repository2 "github.com/devtron-labs/devtron/pkg/plugin/repository" "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning" @@ -746,7 +745,7 @@ func (impl *WorkflowDagExecutorImpl) UpdateCiWorkflowForCiSuccess(request *bean2 return err } // if workflow already cancelled then return, this state arises when user force aborts a ci - if savedWorkflow.Status == executors.WorkflowCancel { + if savedWorkflow.Status == cdWorkflow2.WorkflowCancel { return err } savedWorkflow.Status = string(v1alpha1.NodeSucceeded) From d9995c3020e6fd434795e37e8b7ddfa6a39fb1bc Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 20:01:41 +0530 Subject: [PATCH 16/43] bug fix for cancel and abort --- .../WorkflowStageStatusService.go | 20 +++++++++---------- .../workflowStatus/adapter/adapter.go | 8 ++------ pkg/pipeline/workflowStatus/bean/bean.go | 3 +-- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 908bbb1b93..1a8c2d84ee 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -261,7 +261,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( // update workflow preparation stage and pod status if terminal for _, stage := range currentWorkflowStages { if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { - extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) if extractedStatus != bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { stage.Status = extractedStatus } @@ -269,7 +269,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( //also mark pod status as terminal if wfstatus is terminal if stage.StageName == bean2.POD_EXECUTION && slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - stage.Status = adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, false) + stage.Status = adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) } } @@ -299,7 +299,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( stage.Status = bean2.WORKFLOW_STAGE_STATUS_RUNNING stage.StartTime = time.Now().Format(bean3.LayoutRFC3339) } else if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { - extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) if extractedStatus.IsTerminal() { stage.Status = extractedStatus stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) @@ -344,30 +344,28 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( //mark execution stage as completed if stage.StageName == bean2.WORKFLOW_EXECUTION { if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { - extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) if extractedStatus.IsTerminal() { stage.Status = extractedStatus stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { updatedWfStatus = cdWorkflow.WorkflowTimedOut } - if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED || - extractedStatus == bean2.WORKFLOW_STAGE_STATUS_CANCELLED { - updatedWfStatus = bean2.WORKFLOW_STAGE_STATUS_CANCELLED.ToString() + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { + updatedWfStatus = cdWorkflow.WorkflowCancel } } } } else if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { - extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage, true) + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) if extractedStatus.IsTerminal() { stage.Status = extractedStatus stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { updatedWfStatus = cdWorkflow.WorkflowTimedOut } - if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED || - extractedStatus == bean2.WORKFLOW_STAGE_STATUS_CANCELLED { - updatedWfStatus = bean2.WORKFLOW_STAGE_STATUS_CANCELLED.ToString() + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { + updatedWfStatus = cdWorkflow.WorkflowCancel } } } diff --git a/pkg/pipeline/workflowStatus/adapter/adapter.go b/pkg/pipeline/workflowStatus/adapter/adapter.go index fad5b54bf4..583212201b 100644 --- a/pkg/pipeline/workflowStatus/adapter/adapter.go +++ b/pkg/pipeline/workflowStatus/adapter/adapter.go @@ -41,7 +41,7 @@ func getMetadataJson(metadata string) map[string]interface{} { } // for workflow there can be other status map than for pod status like in aborted case -func ConvertStatusToDevtronStatus(wfStatus string, wfMessage string, isWorkflow bool) bean.WorkflowStageStatus { +func ConvertStatusToDevtronStatus(wfStatus string, wfMessage string) bean.WorkflowStageStatus { // implementation switch strings.ToLower(wfStatus) { case "pending", strings.ToLower(cdWorkflow.WorkflowWaitingToStart): @@ -57,11 +57,7 @@ func ConvertStatusToDevtronStatus(wfStatus string, wfMessage string, isWorkflow return bean.WORKFLOW_STAGE_STATUS_FAILED } case "aborted", "cancelled": - if isWorkflow { - return bean.WORKFLOW_STAGE_STATUS_CANCELLED - } else { - return bean.WORKFLOW_STAGE_STATUS_ABORTED - } + return bean.WORKFLOW_STAGE_STATUS_ABORTED default: log.Println("unknown wf status", "wf", wfStatus) return bean.WORKFLOW_STAGE_STATUS_UNKNOWN diff --git a/pkg/pipeline/workflowStatus/bean/bean.go b/pkg/pipeline/workflowStatus/bean/bean.go index db9dc5c079..310488a026 100644 --- a/pkg/pipeline/workflowStatus/bean/bean.go +++ b/pkg/pipeline/workflowStatus/bean/bean.go @@ -32,7 +32,6 @@ const ( WORKFLOW_STAGE_STATUS_SUCCEEDED WorkflowStageStatus = "SUCCEEDED" WORKFLOW_STAGE_STATUS_FAILED WorkflowStageStatus = "FAILED" WORKFLOW_STAGE_STATUS_ABORTED WorkflowStageStatus = "ABORTED" - WORKFLOW_STAGE_STATUS_CANCELLED WorkflowStageStatus = "CANCELLED" WORKFLOW_STAGE_STATUS_TIMEOUT WorkflowStageStatus = "TIMEOUT" //don't forget to add new status in IsTerminal() method if it is terminal status ) @@ -43,7 +42,7 @@ func (n WorkflowStageStatus) ToString() string { func (n WorkflowStageStatus) IsTerminal() bool { switch n { - case WORKFLOW_STAGE_STATUS_SUCCEEDED, WORKFLOW_STAGE_STATUS_FAILED, WORKFLOW_STAGE_STATUS_ABORTED, WORKFLOW_STAGE_STATUS_TIMEOUT, WORKFLOW_STAGE_STATUS_CANCELLED: + case WORKFLOW_STAGE_STATUS_SUCCEEDED, WORKFLOW_STAGE_STATUS_FAILED, WORKFLOW_STAGE_STATUS_ABORTED, WORKFLOW_STAGE_STATUS_TIMEOUT: return true default: return false From 279a3dec94098c4bcef6a0e31ef321539e81bf3e Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 28 Jan 2025 23:38:03 +0530 Subject: [PATCH 17/43] bug fix updating workflow --- pkg/pipeline/CiHandler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index 9058c999e1..70a44d402f 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -1218,7 +1218,7 @@ func (impl *CiHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus savedWorkflow.CiArtifactLocation = ciArtifactLocation savedWorkflow.PodName = podName impl.Logger.Debugw("updating workflow ", "workflow", savedWorkflow) - err = impl.workFlowStageStatusService.SaveCiWorkflowWithStage(savedWorkflow) + err = impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(savedWorkflow) if err != nil { impl.Logger.Error("update wf failed for id " + strconv.Itoa(savedWorkflow.Id)) return 0, err From 4617e215203775ba22f0c02f15a82af6cdc5b967 Mon Sep 17 00:00:00 2001 From: kartik-579 Date: Wed, 29 Jan 2025 23:09:09 +0530 Subject: [PATCH 18/43] develop sync change --- internal/sql/repository/CiArtifactRepository.go | 4 ++-- internal/sql/repository/CiArtifactsListingQueryBuilder.go | 6 +++--- .../user/repository/helper/UserRepositoryQueryBuilder.go | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/sql/repository/CiArtifactRepository.go b/internal/sql/repository/CiArtifactRepository.go index 2f3c41ae37..4f765c8eee 100644 --- a/internal/sql/repository/CiArtifactRepository.go +++ b/internal/sql/repository/CiArtifactRepository.go @@ -362,8 +362,8 @@ func (impl CiArtifactRepositoryImpl) GetArtifactsByCDPipelineV3(listingFilterOpt artifactsResp := make([]*CiArtifactWithExtraData, 0, listingFilterOpts.Limit) var artifacts []*CiArtifact totalCount := 0 - finalQuery := BuildQueryForParentTypeCIOrWebhook(*listingFilterOpts) - _, err := impl.dbConnection.Query(&artifactsResp, finalQuery) + finalQuery, finalQueryParams := BuildQueryForParentTypeCIOrWebhook(*listingFilterOpts) + _, err := impl.dbConnection.Query(&artifactsResp, finalQuery, finalQueryParams...) if err != nil { return nil, totalCount, err } diff --git a/internal/sql/repository/CiArtifactsListingQueryBuilder.go b/internal/sql/repository/CiArtifactsListingQueryBuilder.go index 1227ade98a..e13ea4632d 100644 --- a/internal/sql/repository/CiArtifactsListingQueryBuilder.go +++ b/internal/sql/repository/CiArtifactsListingQueryBuilder.go @@ -25,8 +25,8 @@ import ( const EmptyLikeRegex = "%%" -func BuildQueryForParentTypeCIOrWebhook(listingFilterOpts bean.ArtifactsListFilterOptions) string { - commonPaginatedQueryPart, commonPaginatedQueryParams := " cia.image LIKE '?'", []interface{}{listingFilterOpts.SearchString} +func BuildQueryForParentTypeCIOrWebhook(listingFilterOpts bean.ArtifactsListFilterOptions) (string, []interface{}) { + commonPaginatedQueryPart, commonPaginatedQueryParams := " cia.image LIKE ?", []interface{}{listingFilterOpts.SearchString} orderByClause := " ORDER BY cia.id DESC" limitOffsetQueryPart, limitOffsetQueryParams := fmt.Sprintf(" LIMIT ? OFFSET ?"), []interface{}{listingFilterOpts.Limit, listingFilterOpts.Offset} finalQuery := "" @@ -68,7 +68,7 @@ func BuildQueryForParentTypeCIOrWebhook(listingFilterOpts bean.ArtifactsListFilt finalQueryParams = append(finalQueryParams, remainingQueryParams...) finalQueryParams = append(finalQueryParams, commonPaginatedQueryParams...) finalQueryParams = append(finalQueryParams, limitOffsetQueryParams...) - return finalQuery + return finalQuery, finalQueryParams } func BuildQueryForArtifactsForCdStage(listingFilterOptions bean.ArtifactsListFilterOptions) string { diff --git a/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go b/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go index 27a868770b..6f344a87bf 100644 --- a/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go +++ b/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go @@ -108,7 +108,7 @@ func GetQueryForGroupListingWithFilters(req *bean.ListingRequest) (string, []int func GetEmailSearchQuery(usersTableAlias string, emailId string) (string, []interface{}) { queryParams := []interface{}{emailId, emailId} expression := fmt.Sprintf( - "( (%s.user_type is NULL and %s.email_id ILIKE '?' ) or (%s.user_type='apiToken' and %s.email_id='?') )", + "( (%s.user_type is NULL and %s.email_id ILIKE ? ) or (%s.user_type='apiToken' and %s.email_id=?) )", usersTableAlias, usersTableAlias, usersTableAlias, usersTableAlias) return expression, queryParams } From 27e8cc5d3c0c4253d0f64dc071cc2b48ac878626 Mon Sep 17 00:00:00 2001 From: Shivam Nagar <124123645+Shivam-nagar23@users.noreply.github.com> Date: Fri, 31 Jan 2025 11:03:40 +0530 Subject: [PATCH 19/43] role grouplisting fix (#6343) --- .../user/repository/helper/UserRepositoryQueryBuilder.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go b/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go index 6f344a87bf..976bbfcd6b 100644 --- a/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go +++ b/pkg/auth/user/repository/helper/UserRepositoryQueryBuilder.go @@ -84,11 +84,11 @@ func GetQueryForGroupListingWithFilters(req *bean.ListingRequest) (string, []int orderCondition := "" if len(req.SortBy) > 0 && !req.CountCheck { - orderCondition += " order by ? " - queryParams = append(queryParams, req.SortBy) + orderCondition += " order by " if req.SortOrder == bean2.Desc { - orderCondition += " ? " - queryParams = append(queryParams, bean2.Desc) + orderCondition += fmt.Sprintf(" %s %s ", req.SortBy, bean2.Desc) + } else { + orderCondition += fmt.Sprintf(" %s ", req.SortBy) } } if req.Size > 0 && !req.CountCheck && !req.ShowAll { From 2d4a33c7a0e9c37dee9432ff032a0d54bd52183e Mon Sep 17 00:00:00 2001 From: prakhar katiyar Date: Fri, 31 Jan 2025 14:06:46 +0530 Subject: [PATCH 20/43] common-lib change --- go.mod | 4 +- go.sum | 8 ++-- .../common-lib/utils/k8s/K8sUtil.go | 39 +++++++++++++++++++ vendor/modules.txt | 8 ++-- 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index a5b1939cba..e0b428c748 100644 --- a/go.mod +++ b/go.mod @@ -288,8 +288,8 @@ require gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect replace ( github.com/argoproj/argo-workflows/v3 v3.5.10 => github.com/devtron-labs/argo-workflows/v3 v3.5.13 - github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250127104410-85d6bfe0b45f - github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250127104410-85d6bfe0b45f + github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd + github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 k8s.io/api => k8s.io/api v0.29.7 diff --git a/go.sum b/go.sum index 150815b113..4ce5063093 100644 --- a/go.sum +++ b/go.sum @@ -792,10 +792,10 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzq github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/devtron-labs/argo-workflows/v3 v3.5.13 h1:3pINq0gXOSeTw2z/vYe+j80lRpSN5Rp/8mfQORh8SmU= github.com/devtron-labs/argo-workflows/v3 v3.5.13/go.mod h1:/vqxcovDPT4zqr4DjR5v7CF8ggpY1l3TSa2CIG3jmjA= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250127104410-85d6bfe0b45f h1:8nYP02cYX/9e3H8YfBV4b8hP4WwbGY/dUMNu+N9cH1Q= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250127104410-85d6bfe0b45f/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250127104410-85d6bfe0b45f h1:4wUbt+83DmpZFqYS69CJxNtBpSuCb58UwqOrWsZG82s= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250127104410-85d6bfe0b45f/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd h1:7XBSRgT5HDlesM3sr08EcmtfXy5BML5Y5pWmGd+YZvM= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd h1:rgG/B2BwFZuvs9dXuq2ytxbl86dyyShQ6HawjTmbymA= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= github.com/devtron-labs/go-bitbucket v0.9.60-beta h1:VEx1jvDgdtDPS6A1uUFoaEi0l1/oLhbr+90xOwr6sDU= github.com/devtron-labs/go-bitbucket v0.9.60-beta/go.mod h1:GnuiCesvh8xyHeMCb+twm8lBR/kQzJYSKL28ZfObp1Y= github.com/devtron-labs/protos v0.0.3-0.20240802105333-92ee9bb85d80 h1:xwbTeijNTf4/j1v+tSfwVqwLVnReas/NqEKeQHvSTys= diff --git a/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go b/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go index f3adf4a535..d2943feb5d 100644 --- a/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go +++ b/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go @@ -115,6 +115,7 @@ type K8sService interface { GetConfigMapWithCtx(ctx context.Context, namespace string, name string, client *v12.CoreV1Client) (*v1.ConfigMap, error) GetNsIfExists(namespace string, client *v12.CoreV1Client) (ns *v1.Namespace, exists bool, err error) CreateNsIfNotExists(namespace string, clusterConfig *ClusterConfig) (ns *v1.Namespace, nsCreated bool, err error) + CreateNsWithLabelsIfNotExists(namespace string, labels map[string]string, clusterConfig *ClusterConfig) (ns *v1.Namespace, nsCreated bool, err error) UpdateNSLabels(namespace *v1.Namespace, labels map[string]string, clusterConfig *ClusterConfig) (ns *v1.Namespace, err error) GetK8sDiscoveryClientInCluster() (*discovery.DiscoveryClient, error) GetK8sDiscoveryClient(clusterConfig *ClusterConfig) (*discovery.DiscoveryClient, error) @@ -144,6 +145,7 @@ type K8sService interface { //below functions are exposed for K8sUtilExtended GetRestConfigByClusterWithoutCustomTransport(clusterConfig *ClusterConfig) (*rest.Config, error) OverrideRestConfigWithCustomTransport(restConfig *rest.Config) (*rest.Config, error) + CreateNsWithLabels(namespace string, labels map[string]string, client *v12.CoreV1Client) (ns *v1.Namespace, err error) CreateNs(namespace string, client *v12.CoreV1Client) (ns *v1.Namespace, err error) } @@ -317,6 +319,32 @@ func (impl *K8sServiceImpl) CreateNsIfNotExists(namespace string, clusterConfig return ns, nsCreated, err } +func (impl *K8sServiceImpl) CreateNsWithLabelsIfNotExists(namespace string, labels map[string]string, clusterConfig *ClusterConfig) (ns *v1.Namespace, nsCreated bool, err error) { + v12Client, err := impl.GetCoreV1Client(clusterConfig) + if err != nil { + impl.logger.Errorw("error", "error", err, "clusterConfig", clusterConfig) + return nil, false, err + } + ns, exists, err := impl.GetNsIfExists(namespace, v12Client) + if err != nil { + impl.logger.Errorw("error", "error", err, "clusterConfig", clusterConfig) + return ns, false, err + } + if exists { + nsCreated = false + impl.logger.Infow("namesapce already exist") + return ns, nsCreated, nil + } + impl.logger.Infow("ns not exists creating", "ns", namespace) + ns, err = impl.CreateNsWithLabels(namespace, labels, v12Client) + if err != nil { + impl.logger.Errorw("error in creating ns", "namespace", namespace, "err", err) + return nil, false, err + } + nsCreated = true + return ns, nsCreated, err +} + func (impl *K8sServiceImpl) UpdateNSLabels(namespace *v1.Namespace, labels map[string]string, clusterConfig *ClusterConfig) (ns *v1.Namespace, err error) { v12Client, err := impl.GetCoreV1Client(clusterConfig) if err != nil { @@ -359,6 +387,17 @@ func (impl *K8sServiceImpl) CreateNs(namespace string, client *v12.CoreV1Client) } } +func (impl *K8sServiceImpl) CreateNsWithLabels(namespace string, labels map[string]string, client *v12.CoreV1Client) (ns *v1.Namespace, err error) { + nsSpec := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespace, Labels: labels}} + ns, err = client.Namespaces().Create(context.Background(), nsSpec, metav1.CreateOptions{}) + if err != nil { + impl.logger.Errorw("error in creating ns", "err", err) + return nil, err + } else { + return ns, nil + } +} + func (impl *K8sServiceImpl) deleteNs(namespace string, client *v12.CoreV1Client) error { err := client.Namespaces().Delete(context.Background(), namespace, metav1.DeleteOptions{}) return err diff --git a/vendor/modules.txt b/vendor/modules.txt index f07ff09ba8..8bd57f44e5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -336,7 +336,7 @@ github.com/davecgh/go-spew/spew # github.com/deckarep/golang-set v1.8.0 ## explicit; go 1.17 github.com/deckarep/golang-set -# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250127104410-85d6bfe0b45f +# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd ## explicit; go 1.21 github.com/devtron-labs/authenticator/apiToken github.com/devtron-labs/authenticator/client @@ -344,7 +344,7 @@ github.com/devtron-labs/authenticator/jwt github.com/devtron-labs/authenticator/middleware github.com/devtron-labs/authenticator/oidc github.com/devtron-labs/authenticator/password -# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250127104410-85d6bfe0b45f +# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd ## explicit; go 1.21 github.com/devtron-labs/common-lib/async github.com/devtron-labs/common-lib/blob-storage @@ -2215,8 +2215,8 @@ xorm.io/xorm/log xorm.io/xorm/names xorm.io/xorm/schemas xorm.io/xorm/tags -# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250127104410-85d6bfe0b45f -# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250127104410-85d6bfe0b45f +# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd +# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd # github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 # github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 # k8s.io/api => k8s.io/api v0.29.7 From 302f92bd0beaa8311e4830bf6a7452eb230c0b43 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 31 Jan 2025 15:08:16 +0530 Subject: [PATCH 21/43] review comments -1 --- .../trigger/devtronApps/TriggerService.go | 3 ++ pkg/pipeline/WebhookService.go | 5 +- .../WorkflowStageStatusService.go | 50 ++++++------------- pkg/pipeline/workflowStatus/util/util.go | 18 +++++++ pkg/workflow/dag/WorkflowDagExecutor.go | 3 ++ wire_gen.go | 6 +-- 6 files changed, 45 insertions(+), 40 deletions(-) create mode 100644 pkg/pipeline/workflowStatus/util/util.go diff --git a/pkg/deployment/trigger/devtronApps/TriggerService.go b/pkg/deployment/trigger/devtronApps/TriggerService.go index 12a84c2e4a..150a445d83 100644 --- a/pkg/deployment/trigger/devtronApps/TriggerService.go +++ b/pkg/deployment/trigger/devtronApps/TriggerService.go @@ -174,6 +174,7 @@ type TriggerServiceImpl struct { attributeService attributes.AttributesService clusterRepository repository5.ClusterRepository workflowStageService workflowStatus.WorkFlowStageStatusService + cdHandler pipeline.CdHandler } func NewTriggerServiceImpl(logger *zap.SugaredLogger, @@ -233,6 +234,7 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, attributeService attributes.AttributesService, clusterRepository repository5.ClusterRepository, workflowStageService workflowStatus.WorkFlowStageStatusService, + cdHandler pipeline.CdHandler, ) (*TriggerServiceImpl, error) { impl := &TriggerServiceImpl{ logger: logger, @@ -298,6 +300,7 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, workflowStageService: workflowStageService, clusterRepository: clusterRepository, + cdHandler: cdHandler, } config, err := types.GetCdConfig() if err != nil { diff --git a/pkg/pipeline/WebhookService.go b/pkg/pipeline/WebhookService.go index d7a66a7bfb..ac7f17ed8e 100644 --- a/pkg/pipeline/WebhookService.go +++ b/pkg/pipeline/WebhookService.go @@ -84,13 +84,15 @@ type WebhookServiceImpl struct { ciWorkflowRepository pipelineConfig.CiWorkflowRepository cdWorkflowCommonService cd.CdWorkflowCommonService workFlowStageStatusService workflowStatus.WorkFlowStageStatusService + ciService CiService } func NewWebhookServiceImpl(ciArtifactRepository repository.CiArtifactRepository, logger *zap.SugaredLogger, ciPipelineRepository pipelineConfig.CiPipelineRepository, ciWorkflowRepository pipelineConfig.CiWorkflowRepository, cdWorkflowCommonService cd.CdWorkflowCommonService, - workFlowStageStatusService workflowStatus.WorkFlowStageStatusService) *WebhookServiceImpl { + workFlowStageStatusService workflowStatus.WorkFlowStageStatusService, + ciService CiService) *WebhookServiceImpl { webhookHandler := &WebhookServiceImpl{ ciArtifactRepository: ciArtifactRepository, logger: logger, @@ -98,6 +100,7 @@ func NewWebhookServiceImpl(ciArtifactRepository repository.CiArtifactRepository, ciWorkflowRepository: ciWorkflowRepository, cdWorkflowCommonService: cdWorkflowCommonService, workFlowStageStatusService: workFlowStageStatusService, + ciService: ciService, } config, err := types2.GetCiConfig() if err != nil { diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 1a8c2d84ee..4fa13c26da 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -2,6 +2,7 @@ package workflowStatus import ( "encoding/json" + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" @@ -12,6 +13,7 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" bean2 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/repository" + "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/util" "github.com/devtron-labs/devtron/pkg/sql" "go.uber.org/zap" "slices" @@ -200,26 +202,26 @@ func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStage stage.Metadata = string(marshalledMetadata) } switch podStatus { - case "Pending": + case string(v1alpha1.NodePending): if !stage.Status.IsTerminal() { stage.Message = message stage.Status = bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED } - case "Running": + case string(v1alpha1.NodeRunning): if stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED || stage.Status == bean2.WORKFLOW_STAGE_STATUS_UNKNOWN { stage.Message = message stage.Status = bean2.WORKFLOW_STAGE_STATUS_RUNNING stage.StartTime = time.Now().Format(bean3.LayoutRFC3339) } - case "Succeeded": + case string(v1alpha1.NodeSucceeded): if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING || stage.Status == bean2.WORKFLOW_STAGE_STATUS_UNKNOWN { stage.Message = message stage.Status = bean2.WORKFLOW_STAGE_STATUS_SUCCEEDED stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) } - case "Failed", "Error": + case string(v1alpha1.NodeFailed), string(v1alpha1.NodeError): if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING || stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED || stage.Status == bean2.WORKFLOW_STAGE_STATUS_UNKNOWN { @@ -249,14 +251,8 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( updatedWfStatus := currentWfDBstatus //todo for switch case use enums switch strings.ToLower(podStatus) { - case "pending": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = cdWorkflow.WorkflowWaitingToStart - } else { - updatedWfStatus = wfStatus - } - } + case strings.ToLower(string(v1alpha1.NodePending)): + updatedWfStatus = util.ComputeWorkflowStatus(currentWfDBstatus, wfStatus, cdWorkflow.WorkflowWaitingToStart) // update workflow preparation stage and pod status if terminal for _, stage := range currentWorkflowStages { @@ -273,14 +269,8 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) } } - case "running": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = constants.Running - } else { - updatedWfStatus = wfStatus - } - } + case strings.ToLower(string(v1alpha1.NodeRunning)): + updatedWfStatus = util.ComputeWorkflowStatus(currentWfDBstatus, wfStatus, constants.Running) //if pod is running, update preparation and execution stages for _, stage := range currentWorkflowStages { @@ -308,14 +298,8 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( } } } - case "succeeded": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = cdWorkflow.WorkflowSucceeded - } else { - updatedWfStatus = wfStatus - } - } + case strings.ToLower(string(v1alpha1.NodeSucceeded)): + updatedWfStatus = util.ComputeWorkflowStatus(currentWfDBstatus, wfStatus, cdWorkflow.WorkflowSucceeded) //if pod is succeeded, update execution stage for _, stage := range currentWorkflowStages { @@ -329,14 +313,8 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( } } } - case "failed", "error": - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { - updatedWfStatus = cdWorkflow.WorkflowFailed - } else { - updatedWfStatus = wfStatus - } - } + case strings.ToLower(string(v1alpha1.NodeFailed)), strings.ToLower(string(v1alpha1.NodeError)): + updatedWfStatus = util.ComputeWorkflowStatus(currentWfDBstatus, wfStatus, cdWorkflow.WorkflowFailed) //if pod is failed, update execution stage for _, stage := range currentWorkflowStages { diff --git a/pkg/pipeline/workflowStatus/util/util.go b/pkg/pipeline/workflowStatus/util/util.go new file mode 100644 index 0000000000..95933c5c14 --- /dev/null +++ b/pkg/pipeline/workflowStatus/util/util.go @@ -0,0 +1,18 @@ +package util + +import ( + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" + "slices" +) + +func ComputeWorkflowStatus(currentWfDBstatus, wfStatus, stageStatus string) string { + updatedWfStatus := currentWfDBstatus + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { + if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + updatedWfStatus = stageStatus + } else { + updatedWfStatus = wfStatus + } + } + return updatedWfStatus +} diff --git a/pkg/workflow/dag/WorkflowDagExecutor.go b/pkg/workflow/dag/WorkflowDagExecutor.go index 9c8bbdf2aa..4cda6b8a0f 100644 --- a/pkg/workflow/dag/WorkflowDagExecutor.go +++ b/pkg/workflow/dag/WorkflowDagExecutor.go @@ -120,6 +120,7 @@ type WorkflowDagExecutorImpl struct { customTagService pipeline.CustomTagService pipelineStatusTimelineService status.PipelineStatusTimelineService workFlowStageStatusService workflowStatus.WorkFlowStageStatusService + ciService pipeline.CiService helmAppService client2.HelmAppService @@ -150,6 +151,7 @@ func NewWorkflowDagExecutorImpl(Logger *zap.SugaredLogger, pipelineRepository pi customTagService pipeline.CustomTagService, pipelineStatusTimelineService status.PipelineStatusTimelineService, workFlowStageStatusService workflowStatus.WorkFlowStageStatusService, + ciService pipeline.CiService, helmAppService client2.HelmAppService, cdWorkflowCommonService cd.CdWorkflowCommonService, cdTriggerService devtronApps.TriggerService, @@ -187,6 +189,7 @@ func NewWorkflowDagExecutorImpl(Logger *zap.SugaredLogger, pipelineRepository pi scanHistoryRepository: scanHistoryRepository, imageScanService: imageScanService, workFlowStageStatusService: workFlowStageStatusService, + ciService: ciService, } config, err := types.GetCdConfig() if err != nil { diff --git a/wire_gen.go b/wire_gen.go index 1e08f76ff2..18894329ae 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -738,12 +738,12 @@ func InitializeApp() (*App, error) { scanToolExecutionHistoryMappingRepositoryImpl := repository11.NewScanToolExecutionHistoryMappingRepositoryImpl(db, sugaredLogger) cdWorkflowReadServiceImpl := read15.NewCdWorkflowReadServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) imageScanServiceImpl := imageScanning.NewImageScanServiceImpl(sugaredLogger, imageScanHistoryRepositoryImpl, imageScanResultRepositoryImpl, imageScanObjectMetaRepositoryImpl, cveStoreRepositoryImpl, imageScanDeployInfoRepositoryImpl, userServiceImpl, appRepositoryImpl, environmentServiceImpl, ciArtifactRepositoryImpl, policyServiceImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, scanToolMetadataRepositoryImpl, scanToolExecutionHistoryMappingRepositoryImpl, cvePolicyRepositoryImpl, cdWorkflowReadServiceImpl) - triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl, workFlowStageStatusServiceImpl) + triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl, workFlowStageStatusServiceImpl, cdHandlerImpl) if err != nil { return nil, err } commonArtifactServiceImpl := artifacts.NewCommonArtifactServiceImpl(sugaredLogger, ciArtifactRepositoryImpl) - workflowDagExecutorImpl := dag.NewWorkflowDagExecutorImpl(sugaredLogger, pipelineRepositoryImpl, cdWorkflowRepositoryImpl, ciArtifactRepositoryImpl, enforcerUtilImpl, appWorkflowRepositoryImpl, pipelineStageServiceImpl, ciWorkflowRepositoryImpl, ciPipelineRepositoryImpl, pipelineStageRepositoryImpl, globalPluginRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, customTagServiceImpl, pipelineStatusTimelineServiceImpl, workFlowStageStatusServiceImpl, helmAppServiceImpl, cdWorkflowCommonServiceImpl, triggerServiceImpl, userDeploymentRequestServiceImpl, manifestCreationServiceImpl, commonArtifactServiceImpl, deploymentConfigServiceImpl, runnable, imageScanHistoryRepositoryImpl, imageScanServiceImpl) + workflowDagExecutorImpl := dag.NewWorkflowDagExecutorImpl(sugaredLogger, pipelineRepositoryImpl, cdWorkflowRepositoryImpl, ciArtifactRepositoryImpl, enforcerUtilImpl, appWorkflowRepositoryImpl, pipelineStageServiceImpl, ciWorkflowRepositoryImpl, ciPipelineRepositoryImpl, pipelineStageRepositoryImpl, globalPluginRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, customTagServiceImpl, pipelineStatusTimelineServiceImpl, workFlowStageStatusServiceImpl, ciServiceImpl, helmAppServiceImpl, cdWorkflowCommonServiceImpl, triggerServiceImpl, userDeploymentRequestServiceImpl, manifestCreationServiceImpl, commonArtifactServiceImpl, deploymentConfigServiceImpl, runnable, imageScanHistoryRepositoryImpl, imageScanServiceImpl) externalCiRestHandlerImpl := restHandler.NewExternalCiRestHandlerImpl(sugaredLogger, validate, userServiceImpl, enforcerImpl, workflowDagExecutorImpl) pubSubClientRestHandlerImpl := restHandler.NewPubSubClientRestHandlerImpl(pubSubClientServiceImpl, sugaredLogger, ciCdConfig) webhookRouterImpl := router.NewWebhookRouterImpl(gitWebhookRestHandlerImpl, pipelineConfigRestHandlerImpl, externalCiRestHandlerImpl, pubSubClientRestHandlerImpl) @@ -1052,7 +1052,7 @@ func InitializeApp() (*App, error) { cdWorkflowServiceImpl := cd.NewCdWorkflowServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) cdWorkflowRunnerServiceImpl := cd.NewCdWorkflowRunnerServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, workFlowStageStatusServiceImpl) cdWorkflowRunnerReadServiceImpl := read15.NewCdWorkflowRunnerReadServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) - webhookServiceImpl := pipeline.NewWebhookServiceImpl(ciArtifactRepositoryImpl, sugaredLogger, ciPipelineRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowCommonServiceImpl, workFlowStageStatusServiceImpl) + webhookServiceImpl := pipeline.NewWebhookServiceImpl(ciArtifactRepositoryImpl, sugaredLogger, ciPipelineRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowCommonServiceImpl, workFlowStageStatusServiceImpl, ciServiceImpl) workflowEventProcessorImpl, err := in.NewWorkflowEventProcessorImpl(sugaredLogger, pubSubClientServiceImpl, cdWorkflowServiceImpl, cdWorkflowReadServiceImpl, cdWorkflowRunnerServiceImpl, cdWorkflowRunnerReadServiceImpl, workflowDagExecutorImpl, ciHandlerImpl, cdHandlerImpl, eventSimpleFactoryImpl, eventRESTClientImpl, triggerServiceImpl, deployedAppServiceImpl, webhookServiceImpl, validate, environmentVariables, cdWorkflowCommonServiceImpl, cdPipelineConfigServiceImpl, userDeploymentRequestServiceImpl, pipelineRepositoryImpl, ciArtifactRepositoryImpl, cdWorkflowRepositoryImpl, deploymentConfigServiceImpl) if err != nil { return nil, err From 71b3cff5178ddb412097e27c2f9bf1db03a058ab Mon Sep 17 00:00:00 2001 From: prakhar katiyar Date: Fri, 31 Jan 2025 17:57:40 +0530 Subject: [PATCH 22/43] common-lib change --- go.mod | 4 ++-- go.sum | 8 ++++---- .../devtron-labs/common-lib/utils/k8s/K8sUtil.go | 8 ++++---- vendor/modules.txt | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index e0b428c748..ea812d373c 100644 --- a/go.mod +++ b/go.mod @@ -288,8 +288,8 @@ require gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect replace ( github.com/argoproj/argo-workflows/v3 v3.5.10 => github.com/devtron-labs/argo-workflows/v3 v3.5.13 - github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd - github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd + github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250131122608-37b43d9c326c + github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250131122608-37b43d9c326c github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 k8s.io/api => k8s.io/api v0.29.7 diff --git a/go.sum b/go.sum index 4ce5063093..aea1b354cc 100644 --- a/go.sum +++ b/go.sum @@ -792,10 +792,10 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzq github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/devtron-labs/argo-workflows/v3 v3.5.13 h1:3pINq0gXOSeTw2z/vYe+j80lRpSN5Rp/8mfQORh8SmU= github.com/devtron-labs/argo-workflows/v3 v3.5.13/go.mod h1:/vqxcovDPT4zqr4DjR5v7CF8ggpY1l3TSa2CIG3jmjA= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd h1:7XBSRgT5HDlesM3sr08EcmtfXy5BML5Y5pWmGd+YZvM= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd h1:rgG/B2BwFZuvs9dXuq2ytxbl86dyyShQ6HawjTmbymA= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250131122608-37b43d9c326c h1:Tx3PbTIlmEMxIuLtuKemw/wf/EioxMhntAy5Gq+6cEY= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250131122608-37b43d9c326c/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250131122608-37b43d9c326c h1:PlI5lNkYUHfZz0rq8x++kh1EAPv+aMl8J6p3+LOkEE0= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250131122608-37b43d9c326c/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= github.com/devtron-labs/go-bitbucket v0.9.60-beta h1:VEx1jvDgdtDPS6A1uUFoaEi0l1/oLhbr+90xOwr6sDU= github.com/devtron-labs/go-bitbucket v0.9.60-beta/go.mod h1:GnuiCesvh8xyHeMCb+twm8lBR/kQzJYSKL28ZfObp1Y= github.com/devtron-labs/protos v0.0.3-0.20240802105333-92ee9bb85d80 h1:xwbTeijNTf4/j1v+tSfwVqwLVnReas/NqEKeQHvSTys= diff --git a/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go b/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go index d2943feb5d..792bfa9d12 100644 --- a/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go +++ b/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go @@ -301,12 +301,12 @@ func (impl *K8sServiceImpl) CreateNsIfNotExists(namespace string, clusterConfig } ns, exists, err := impl.GetNsIfExists(namespace, v12Client) if err != nil { - impl.logger.Errorw("error", "error", err, "clusterConfig", clusterConfig) + impl.logger.Errorw("error", "error", err) return ns, false, err } if exists { nsCreated = false - impl.logger.Infow("namesapce already exist") + impl.logger.Infow("namespace already exist", "namespace", namespace) return ns, nsCreated, nil } impl.logger.Infow("ns not exists creating", "ns", namespace) @@ -327,12 +327,12 @@ func (impl *K8sServiceImpl) CreateNsWithLabelsIfNotExists(namespace string, labe } ns, exists, err := impl.GetNsIfExists(namespace, v12Client) if err != nil { - impl.logger.Errorw("error", "error", err, "clusterConfig", clusterConfig) + impl.logger.Errorw("error", "error", err) return ns, false, err } if exists { nsCreated = false - impl.logger.Infow("namesapce already exist") + impl.logger.Infow("namespace already exist", "namespace", namespace) return ns, nsCreated, nil } impl.logger.Infow("ns not exists creating", "ns", namespace) diff --git a/vendor/modules.txt b/vendor/modules.txt index 8bd57f44e5..1537973c5d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -336,7 +336,7 @@ github.com/davecgh/go-spew/spew # github.com/deckarep/golang-set v1.8.0 ## explicit; go 1.17 github.com/deckarep/golang-set -# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd +# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250131122608-37b43d9c326c ## explicit; go 1.21 github.com/devtron-labs/authenticator/apiToken github.com/devtron-labs/authenticator/client @@ -344,7 +344,7 @@ github.com/devtron-labs/authenticator/jwt github.com/devtron-labs/authenticator/middleware github.com/devtron-labs/authenticator/oidc github.com/devtron-labs/authenticator/password -# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd +# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250131122608-37b43d9c326c ## explicit; go 1.21 github.com/devtron-labs/common-lib/async github.com/devtron-labs/common-lib/blob-storage @@ -2215,8 +2215,8 @@ xorm.io/xorm/log xorm.io/xorm/names xorm.io/xorm/schemas xorm.io/xorm/tags -# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250130073004-380f988fb5cd -# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250130073004-380f988fb5cd +# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250131122608-37b43d9c326c +# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250131122608-37b43d9c326c # github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 # github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 # k8s.io/api => k8s.io/api v0.29.7 From 1e7491a3672da4dda85a33fb1e5a8940346a617c Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Sun, 2 Feb 2025 18:59:25 +0530 Subject: [PATCH 23/43] ci refactor flow to ci service --- .../trigger/devtronApps/TriggerService.go | 3 - pkg/pipeline/CiHandler.go | 8 +- pkg/pipeline/CiService.go | 94 +++++++++++++- pkg/pipeline/WebhookService.go | 2 +- .../WorkflowStageStatusService.go | 119 +++++------------- pkg/workflow/dag/WorkflowDagExecutor.go | 2 +- wire_gen.go | 4 +- 7 files changed, 130 insertions(+), 102 deletions(-) diff --git a/pkg/deployment/trigger/devtronApps/TriggerService.go b/pkg/deployment/trigger/devtronApps/TriggerService.go index 150a445d83..12a84c2e4a 100644 --- a/pkg/deployment/trigger/devtronApps/TriggerService.go +++ b/pkg/deployment/trigger/devtronApps/TriggerService.go @@ -174,7 +174,6 @@ type TriggerServiceImpl struct { attributeService attributes.AttributesService clusterRepository repository5.ClusterRepository workflowStageService workflowStatus.WorkFlowStageStatusService - cdHandler pipeline.CdHandler } func NewTriggerServiceImpl(logger *zap.SugaredLogger, @@ -234,7 +233,6 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, attributeService attributes.AttributesService, clusterRepository repository5.ClusterRepository, workflowStageService workflowStatus.WorkFlowStageStatusService, - cdHandler pipeline.CdHandler, ) (*TriggerServiceImpl, error) { impl := &TriggerServiceImpl{ logger: logger, @@ -300,7 +298,6 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, workflowStageService: workflowStageService, clusterRepository: clusterRepository, - cdHandler: cdHandler, } config, err := types.GetCdConfig() if err != nil { diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index 70a44d402f..c5198b3319 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -668,7 +668,7 @@ func (impl *CiHandlerImpl) CancelBuild(workflowId int, forceAbort bool) (int, er workflow.PodStatus = "Failed" workflow.Message = constants2.TERMINATE_MESSAGE } - err = impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(workflow) + err = impl.ciService.UpdateCiWorkflowWithStage(workflow) if err != nil { impl.Logger.Errorw("cannot update deleted workflow status, but wf deleted", "err", err) return 0, err @@ -710,7 +710,7 @@ func (impl *CiHandlerImpl) updateWorkflowForForceAbort(workflow *pipelineConfig. workflow.Status = cdWorkflow.WorkflowCancel workflow.PodStatus = string(bean.Failed) workflow.Message = constants2.FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE - err := impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(workflow) + err := impl.ciService.UpdateCiWorkflowWithStage(workflow) if err != nil { impl.Logger.Errorw("error in updating workflow status", "err", err) return err @@ -1218,7 +1218,7 @@ func (impl *CiHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus savedWorkflow.CiArtifactLocation = ciArtifactLocation savedWorkflow.PodName = podName impl.Logger.Debugw("updating workflow ", "workflow", savedWorkflow) - err = impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(savedWorkflow) + err = impl.ciService.UpdateCiWorkflowWithStage(savedWorkflow) if err != nil { impl.Logger.Error("update wf failed for id " + strconv.Itoa(savedWorkflow.Id)) return 0, err @@ -1714,7 +1714,7 @@ func (impl *CiHandlerImpl) UpdateCiWorkflowStatusFailure(timeoutForFailureCiBuil } else { ciWorkflow.Message = "marked failed by job" } - err := impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(ciWorkflow) + err := impl.ciService.UpdateCiWorkflowWithStage(ciWorkflow) if err != nil { impl.Logger.Errorw("unable to update ci workflow, its eligible to mark failed", "err", err) // skip this and process for next ci workflow diff --git a/pkg/pipeline/CiService.go b/pkg/pipeline/CiService.go index d663985019..4bb29aa4dc 100644 --- a/pkg/pipeline/CiService.go +++ b/pkg/pipeline/CiService.go @@ -24,6 +24,7 @@ import ( "github.com/devtron-labs/common-lib/utils" bean3 "github.com/devtron-labs/common-lib/utils/bean" commonBean "github.com/devtron-labs/common-lib/workflow" + bean5 "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/internal/sql/constants" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" "github.com/devtron-labs/devtron/pkg/attributes" @@ -37,6 +38,7 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/infraProviders" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" bean2 "github.com/devtron-labs/devtron/pkg/plugin/bean" + "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/util/sliceUtil" "path" "path/filepath" @@ -75,6 +77,8 @@ import ( type CiService interface { TriggerCiPipeline(trigger types.Trigger) (int, error) GetCiMaterials(pipelineId int, ciMaterials []*pipelineConfig.CiPipelineMaterial) ([]*pipelineConfig.CiPipelineMaterial, error) + SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error + UpdateCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error } type BuildxCacheFlags struct { BuildxCacheModeMin bool `env:"BUILDX_CACHE_MODE_MIN" envDefault:"false"` @@ -105,6 +109,8 @@ type CiServiceImpl struct { ciCdPipelineOrchestrator CiCdPipelineOrchestrator buildxCacheFlags *BuildxCacheFlags attributeService attributes.AttributesService + ciWorkflowRepository pipelineConfig.CiWorkflowRepository + transactionManager sql.TransactionWrapper } func NewCiServiceImpl(Logger *zap.SugaredLogger, workflowService WorkflowService, @@ -122,6 +128,8 @@ func NewCiServiceImpl(Logger *zap.SugaredLogger, workflowService WorkflowService globalPluginService plugin.GlobalPluginService, infraProvider infraProviders.InfraProvider, ciCdPipelineOrchestrator CiCdPipelineOrchestrator, attributeService attributes.AttributesService, + ciWorkflowRepository pipelineConfig.CiWorkflowRepository, + transactionManager sql.TransactionWrapper, ) *CiServiceImpl { buildxCacheFlags := &BuildxCacheFlags{} err := env.Parse(buildxCacheFlags) @@ -151,6 +159,8 @@ func NewCiServiceImpl(Logger *zap.SugaredLogger, workflowService WorkflowService ciCdPipelineOrchestrator: ciCdPipelineOrchestrator, buildxCacheFlags: buildxCacheFlags, attributeService: attributeService, + ciWorkflowRepository: ciWorkflowRepository, + transactionManager: transactionManager, } config, err := types.GetCiConfig() if err != nil { @@ -258,9 +268,9 @@ func (impl *CiServiceImpl) markCurrentCiWorkflowFailed(savedCiWf *pipelineConfig var dbErr error if savedCiWf.Id == 0 { - dbErr = impl.workflowStageStatusService.SaveCiWorkflowWithStage(savedCiWf) + dbErr = impl.SaveCiWorkflowWithStage(savedCiWf) } else { - dbErr = impl.workflowStageStatusService.UpdateCiWorkflowWithStage(savedCiWf) + dbErr = impl.UpdateCiWorkflowWithStage(savedCiWf) } if dbErr != nil { @@ -365,7 +375,7 @@ func (impl *CiServiceImpl) TriggerCiPipeline(trigger types.Trigger) (int, error) if err != nil { savedCiWf.Status = cdWorkflow.WorkflowAborted savedCiWf.Message = err.Error() - err1 := impl.workflowStageStatusService.UpdateCiWorkflowWithStage(savedCiWf) + err1 := impl.UpdateCiWorkflowWithStage(savedCiWf) if err1 != nil { impl.Logger.Errorw("could not save workflow, after failing due to conflicting image tag") } @@ -520,7 +530,7 @@ func (impl *CiServiceImpl) saveNewWorkflow(pipeline *pipelineConfig.CiPipeline, ciWorkflow.Namespace = ciWorkflowConfigNamespace ciWorkflow.EnvironmentId = EnvironmentId } - err := impl.workflowStageStatusService.SaveCiWorkflowWithStage(ciWorkflow) + err := impl.SaveCiWorkflowWithStage(ciWorkflow) if err != nil { impl.Logger.Errorw("saving workflow error", "err", err) return &pipelineConfig.CiWorkflow{}, err @@ -1087,7 +1097,7 @@ func (impl *CiServiceImpl) updateCiWorkflow(request *types.WorkflowRequest, save ciBuildConfig := request.CiBuildConfig ciBuildType := string(ciBuildConfig.CiBuildType) savedWf.CiBuildType = ciBuildType - return impl.workflowStageStatusService.UpdateCiWorkflowWithStage(savedWf) + return impl.UpdateCiWorkflowWithStage(savedWf) } func _getTruncatedImageTag(imageTag string) string { @@ -1104,3 +1114,77 @@ func _getTruncatedImageTag(imageTag string) string { return imageTag[:_truncatedLength] } } + +func (impl *CiServiceImpl) SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.Logger.Errorw("error in starting transaction to save default configurations", "workflowName", wf.Name, "error", err) + return err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.Logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) + } + }() + if impl.config.EnableWorkflowExecutionStage { + wf.Status = cdWorkflow.WorkflowWaitingToStart + } + err = impl.ciWorkflowRepository.SaveWorkFlowWithTx(wf, tx) + if err != nil { + impl.Logger.Errorw("error in saving workflow", "payload", wf, "error", err) + return err + } + + err = impl.workflowStageStatusService.SaveWorkflowStages(wf.Id, bean5.CI_WORKFLOW_TYPE.String(), wf.Name, tx) + if err != nil { + impl.Logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) + return err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.Logger.Errorw("error in committing transaction", "workflowName", wf.Name, "error", err) + return err + } + return nil + +} + +func (impl *CiServiceImpl) UpdateCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.Logger.Errorw("error in starting transaction to save default configurations", "workflowName", wf.Name, "error", err) + return err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.Logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) + } + }() + + wf.Status, wf.PodStatus, err = impl.workflowStageStatusService.UpdateWorkflowStages(wf.Id, bean5.CI_WORKFLOW_TYPE.String(), wf.Name, wf.Status, wf.PodStatus, wf.Message, wf.PodName, tx) + if err != nil { + impl.Logger.Errorw("error in updating workflow stages", "workflowName", wf.Name, "error", err) + return err + } + + err = impl.ciWorkflowRepository.UpdateWorkFlowWithTx(wf, tx) + if err != nil { + impl.Logger.Errorw("error in saving workflow", "payload", wf, "error", err) + return err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.Logger.Errorw("error in committing transaction", "workflowName", wf.Name, "error", err) + return err + } + return nil + +} diff --git a/pkg/pipeline/WebhookService.go b/pkg/pipeline/WebhookService.go index ac7f17ed8e..2fcdb828de 100644 --- a/pkg/pipeline/WebhookService.go +++ b/pkg/pipeline/WebhookService.go @@ -168,7 +168,7 @@ func (impl *WebhookServiceImpl) HandleMultipleImagesFromEvent(imageDetails []*re GitTriggers: ciWorkflow.GitTriggers, Message: ciWorkflow.Message, } - err = impl.workFlowStageStatusService.SaveCiWorkflowWithStage(workflow) + err = impl.ciService.SaveCiWorkflowWithStage(workflow) if err != nil { impl.logger.Errorw("error in saving workflow for child workflow", "err", err, "parentCiWorkflowId", ciWorkflowId) return nil, err diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 4fa13c26da..98b54cdcc1 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -15,6 +15,7 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/repository" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/util" "github.com/devtron-labs/devtron/pkg/sql" + "github.com/go-pg/pg" "go.uber.org/zap" "slices" "strings" @@ -22,13 +23,13 @@ import ( ) type WorkFlowStageStatusService interface { - SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error - UpdateCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*repository.WorkflowExecutionStage, error) GetPrePostWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean2.WorkflowStageDto, error) + SaveWorkflowStages(wfId int, wfType, wfName string, tx *pg.Tx) error + UpdateWorkflowStages(wfId int, wfType, wfName, wfStatus, podStatus, message, podName string, tx *pg.Tx) (string, string, error) ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean2.WorkflowStageDto } @@ -63,90 +64,6 @@ func NewWorkflowStageFlowStatusServiceImpl(logger *zap.SugaredLogger, return wfStageServiceImpl } -func (impl *WorkFlowStageStatusServiceImpl) SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error { - // implementation - tx, err := impl.transactionManager.StartTx() - if err != nil { - impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wf.Name, "error", err) - return err - } - - defer func() { - dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { - impl.logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) - } - }() - if impl.config.EnableWorkflowExecutionStage { - wf.Status = cdWorkflow.WorkflowWaitingToStart - } - err = impl.ciWorkflowRepository.SaveWorkFlowWithTx(wf, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) - return err - } - - if impl.config.EnableWorkflowExecutionStage { - pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String()) - pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) - return err - } - } - - err = impl.transactionManager.CommitTx(tx) - if err != nil { - impl.logger.Errorw("error in committing transaction", "workflowName", wf.Name, "error", err) - return err - } - return nil - -} - -func (impl *WorkFlowStageStatusServiceImpl) UpdateCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow) error { - // implementation - tx, err := impl.transactionManager.StartTx() - if err != nil { - impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wf.Name, "error", err) - return err - } - - defer func() { - dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { - impl.logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) - } - }() - - if impl.config.EnableWorkflowExecutionStage { - pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wf.Id, bean.CI_WORKFLOW_TYPE.String(), wf.Status, wf.PodStatus, wf.Message, wf.PodName) - pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wf.Name, "error", err) - return err - } - - // update workflow with updated wf status - wf.Status = updatedWfStatus - wf.PodStatus = updatedPodStatus - } - - err = impl.ciWorkflowRepository.UpdateWorkFlowWithTx(wf, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow", "payload", wf, "error", err) - return err - } - - err = impl.transactionManager.CommitTx(tx) - if err != nil { - impl.logger.Errorw("error in committing transaction", "workflowName", wf.Name, "error", err) - return err - } - return nil - -} - func (impl *WorkFlowStageStatusServiceImpl) getUpdatedPipelineStagesForWorkflow(wfId int, wfType string, wfStatus string, podStatus string, message string, podName string) ([]*repository.WorkflowExecutionStage, string, string) { // implementation currentWorkflowStages, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdAndType(wfId, wfType) @@ -544,3 +461,33 @@ func (impl *WorkFlowStageStatusServiceImpl) ConvertDBWorkflowStageToMap(workflow return wfMap } + +func (impl *WorkFlowStageStatusServiceImpl) SaveWorkflowStages(wfId int, wfType, wfName string, tx *pg.Tx) error { + if impl.config.EnableWorkflowExecutionStage { + pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wfId, wfType) + pipelineStageStatus, err := impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wfName, "error", err) + return err + } + } else { + impl.logger.Debugw("workflow execution stage is disabled", "workflowName", wfName) + } + return nil +} + +func (impl *WorkFlowStageStatusServiceImpl) UpdateWorkflowStages(wfId int, wfType, wfName, wfStatus, podStatus, message, podName string, tx *pg.Tx) (string, string, error) { + if impl.config.EnableWorkflowExecutionStage { + pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wfId, wfType, wfStatus, podStatus, message, podName) + pipelineStageStatus, err := impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wfName, "error", err) + return wfStatus, podStatus, err + } + + return updatedWfStatus, updatedPodStatus, nil + } else { + impl.logger.Debugw("workflow execution stage is disabled", "workflowName", wfName) + } + return wfStatus, podStatus, nil +} diff --git a/pkg/workflow/dag/WorkflowDagExecutor.go b/pkg/workflow/dag/WorkflowDagExecutor.go index 4cda6b8a0f..0cc0cf5bbe 100644 --- a/pkg/workflow/dag/WorkflowDagExecutor.go +++ b/pkg/workflow/dag/WorkflowDagExecutor.go @@ -754,7 +754,7 @@ func (impl *WorkflowDagExecutorImpl) UpdateCiWorkflowForCiSuccess(request *bean2 savedWorkflow.Status = string(v1alpha1.NodeSucceeded) savedWorkflow.IsArtifactUploaded = workflow.GetArtifactUploadedType(request.IsArtifactUploaded) impl.logger.Debugw("updating workflow ", "savedWorkflow", savedWorkflow) - err = impl.workFlowStageStatusService.UpdateCiWorkflowWithStage(savedWorkflow) + err = impl.ciService.UpdateCiWorkflowWithStage(savedWorkflow) if err != nil { impl.logger.Errorw("update wf failed for id ", "err", err) return err diff --git a/wire_gen.go b/wire_gen.go index 18894329ae..46753e6f7b 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -646,7 +646,7 @@ func InitializeApp() (*App, error) { deploymentTemplateHistoryServiceImpl := deploymentTemplate.NewDeploymentTemplateHistoryServiceImpl(sugaredLogger, deploymentTemplateHistoryRepositoryImpl, pipelineRepositoryImpl, chartRepositoryImpl, userServiceImpl, cdWorkflowRepositoryImpl, scopedVariableManagerImpl, deployedAppMetricsServiceImpl, chartRefServiceImpl) chartServiceImpl := chart.NewChartServiceImpl(chartRepositoryImpl, sugaredLogger, chartTemplateServiceImpl, chartRepoRepositoryImpl, appRepositoryImpl, utilMergeUtil, envConfigOverrideRepositoryImpl, pipelineConfigRepositoryImpl, environmentRepositoryImpl, deploymentTemplateHistoryServiceImpl, scopedVariableManagerImpl, deployedAppMetricsServiceImpl, chartRefServiceImpl, gitOpsConfigReadServiceImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl) ciCdPipelineOrchestratorImpl := pipeline.NewCiCdPipelineOrchestrator(appRepositoryImpl, sugaredLogger, materialRepositoryImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, ciPipelineMaterialRepositoryImpl, cdWorkflowRepositoryImpl, clientImpl, ciCdConfig, appWorkflowRepositoryImpl, environmentRepositoryImpl, attributesServiceImpl, appCrudOperationServiceImpl, userAuthServiceImpl, prePostCdScriptHistoryServiceImpl, pipelineStageServiceImpl, gitMaterialHistoryServiceImpl, ciPipelineHistoryServiceImpl, ciTemplateReadServiceImpl, ciTemplateServiceImpl, dockerArtifactStoreRepositoryImpl, ciArtifactRepositoryImpl, configMapServiceImpl, customTagServiceImpl, genericNoteServiceImpl, chartServiceImpl, transactionUtilImpl, gitOpsConfigReadServiceImpl, deploymentConfigServiceImpl) - ciServiceImpl := pipeline.NewCiServiceImpl(sugaredLogger, workflowServiceImpl, ciPipelineMaterialRepositoryImpl, workFlowStageStatusServiceImpl, eventRESTClientImpl, eventSimpleFactoryImpl, ciPipelineRepositoryImpl, ciArtifactRepositoryImpl, pipelineStageServiceImpl, userServiceImpl, ciTemplateReadServiceImpl, appCrudOperationServiceImpl, environmentRepositoryImpl, appRepositoryImpl, scopedVariableManagerImpl, customTagServiceImpl, pluginInputVariableParserImpl, globalPluginServiceImpl, infraProviderImpl, ciCdPipelineOrchestratorImpl, attributesServiceImpl) + ciServiceImpl := pipeline.NewCiServiceImpl(sugaredLogger, workflowServiceImpl, ciPipelineMaterialRepositoryImpl, workFlowStageStatusServiceImpl, eventRESTClientImpl, eventSimpleFactoryImpl, ciPipelineRepositoryImpl, ciArtifactRepositoryImpl, pipelineStageServiceImpl, userServiceImpl, ciTemplateReadServiceImpl, appCrudOperationServiceImpl, environmentRepositoryImpl, appRepositoryImpl, scopedVariableManagerImpl, customTagServiceImpl, pluginInputVariableParserImpl, globalPluginServiceImpl, infraProviderImpl, ciCdPipelineOrchestratorImpl, attributesServiceImpl, ciWorkflowRepositoryImpl, transactionUtilImpl) ciLogServiceImpl, err := pipeline.NewCiLogServiceImpl(sugaredLogger, ciServiceImpl, k8sServiceImpl) if err != nil { return nil, err @@ -738,7 +738,7 @@ func InitializeApp() (*App, error) { scanToolExecutionHistoryMappingRepositoryImpl := repository11.NewScanToolExecutionHistoryMappingRepositoryImpl(db, sugaredLogger) cdWorkflowReadServiceImpl := read15.NewCdWorkflowReadServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) imageScanServiceImpl := imageScanning.NewImageScanServiceImpl(sugaredLogger, imageScanHistoryRepositoryImpl, imageScanResultRepositoryImpl, imageScanObjectMetaRepositoryImpl, cveStoreRepositoryImpl, imageScanDeployInfoRepositoryImpl, userServiceImpl, appRepositoryImpl, environmentServiceImpl, ciArtifactRepositoryImpl, policyServiceImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, scanToolMetadataRepositoryImpl, scanToolExecutionHistoryMappingRepositoryImpl, cvePolicyRepositoryImpl, cdWorkflowReadServiceImpl) - triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl, workFlowStageStatusServiceImpl, cdHandlerImpl) + triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl, workFlowStageStatusServiceImpl) if err != nil { return nil, err } From 6cfcda51041a1286a81b464e1ce4f3755a27d829 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Sun, 2 Feb 2025 19:17:09 +0530 Subject: [PATCH 24/43] move cd functions to cdworkflow runner service --- pkg/app/AppService.go | 10 +- .../devtronApps/PostStageTriggerService.go | 6 +- .../devtronApps/PreStageTriggerService.go | 10 +- .../trigger/devtronApps/TriggerService.go | 11 +-- pkg/pipeline/CdHandler.go | 10 +- .../WorkflowStageStatusService.go | 91 +---------------- pkg/workflow/cd/CdWorkflowCommonService.go | 11 +-- pkg/workflow/cd/CdWorkflowRunnerService.go | 97 ++++++++++++++++++- pkg/workflow/dag/WorkflowDagExecutor.go | 9 +- pkg/workflow/status/WorkflowStatusService.go | 12 +-- wire_gen.go | 16 +-- 11 files changed, 144 insertions(+), 139 deletions(-) diff --git a/pkg/app/AppService.go b/pkg/app/AppService.go index adf62c8d9c..077688bb16 100644 --- a/pkg/app/AppService.go +++ b/pkg/app/AppService.go @@ -38,7 +38,7 @@ import ( bean6 "github.com/devtron-labs/devtron/pkg/deployment/manifest/deploymentTemplate/bean" "github.com/devtron-labs/devtron/pkg/deployment/manifest/deploymentTemplate/read" bean4 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/bean" - "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" + "github.com/devtron-labs/devtron/pkg/workflow/cd" "io/ioutil" "net/url" "path" @@ -126,7 +126,7 @@ type AppServiceImpl struct { appListingService AppListingService deploymentConfigService common2.DeploymentConfigService envConfigOverrideReadService read.EnvConfigOverrideService - workflowStageService workflowStatus.WorkFlowStageStatusService + cdWorkflowRunnerService cd.CdWorkflowRunnerService } type AppService interface { @@ -167,7 +167,7 @@ func NewAppService( appListingService AppListingService, deploymentConfigService common2.DeploymentConfigService, envConfigOverrideReadService read.EnvConfigOverrideService, - workflowStageService workflowStatus.WorkFlowStageStatusService) *AppServiceImpl { + cdWorkflowRunnerService cd.CdWorkflowRunnerService) *AppServiceImpl { appServiceImpl := &AppServiceImpl{ mergeUtil: mergeUtil, pipelineOverrideRepository: pipelineOverrideRepository, @@ -197,7 +197,7 @@ func NewAppService( appListingService: appListingService, deploymentConfigService: deploymentConfigService, envConfigOverrideReadService: envConfigOverrideReadService, - workflowStageService: workflowStageService, + cdWorkflowRunnerService: cdWorkflowRunnerService, } return appServiceImpl } @@ -1009,7 +1009,7 @@ func (impl *AppServiceImpl) UpdateCdWorkflowRunnerByACDObject(app *v1alpha1.Appl } wfr.UpdatedBy = 1 wfr.UpdatedOn = time.Now() - err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(wfr) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(wfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "wfr", wfr, "app", app, "err", err) return err diff --git a/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go b/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go index 3f67c5b844..8a11b06a6b 100644 --- a/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go +++ b/pkg/deployment/trigger/devtronApps/PostStageTriggerService.go @@ -119,7 +119,7 @@ func (impl *TriggerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (* runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) + _ = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } @@ -129,7 +129,7 @@ func (impl *TriggerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (* runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) + _ = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } manifestPushTempate, err := impl.getManifestPushTemplateForPostStage(request, envDevploymentConfig, jobHelmPackagePath, cdStageWorkflowRequest, cdWf, runner, pipeline, triggeredBy, triggeredAt) @@ -143,7 +143,7 @@ func (impl *TriggerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (* return nil, err } wfr.ImagePathReservationIds = pluginImagePathReservationIds - err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(&wfr) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(&wfr) if err != nil { impl.logger.Error("error in updating image path reservation ids in cd workflow runner", "err", "err") } diff --git a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go index a1e68b1e93..ee87dd748e 100644 --- a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go +++ b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go @@ -135,11 +135,11 @@ func (impl *TriggerServiceImpl) TriggerPreStage(request bean.TriggerRequest) (*b runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) + _ = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } else { runner.ImagePathReservationIds = imagePathReservationIds - _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) + _ = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner) } _, span = otel.Tracer("orchestrator").Start(ctx, "cdWorkflowService.SubmitWorkflow") @@ -152,7 +152,7 @@ func (impl *TriggerServiceImpl) TriggerPreStage(request bean.TriggerRequest) (*b runner.Status = cdWorkflow.WorkflowFailed runner.Message = err.Error() runner.FinishedOn = time.Now() - _ = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) + _ = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner) return nil, err } manifestPushTemplate, err := impl.getManifestPushTemplateForPreStage(ctx, envDeploymentConfig, pipeline, artifact, jobHelmPackagePath, cdWf, runner, triggeredBy, triggeredAt, request) @@ -262,7 +262,7 @@ func (impl *TriggerServiceImpl) createStartingWfAndRunner(request bean.TriggerRe ReferenceId: request.TriggerContext.ReferenceId, } _, span := otel.Tracer("orchestrator").Start(ctx, "cdWorkflowRepository.SaveWorkFlowRunner") - _, err = impl.workflowStageService.SaveCDWorkflowRunnerWithStage(runner) + _, err = impl.cdWorkflowRunnerService.SaveCDWorkflowRunnerWithStage(runner) span.End() if err != nil { return nil, nil, err @@ -311,7 +311,7 @@ func (impl *TriggerServiceImpl) checkVulnerabilityStatusAndFailWfIfNeeded(ctx co runner.FinishedOn = time.Now() runner.UpdatedOn = time.Now() runner.UpdatedBy = triggeredBy - err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner) if err != nil { impl.logger.Errorw("error in updating wfr status due to vulnerable image", "err", err) return err diff --git a/pkg/deployment/trigger/devtronApps/TriggerService.go b/pkg/deployment/trigger/devtronApps/TriggerService.go index 12a84c2e4a..ca847d06e8 100644 --- a/pkg/deployment/trigger/devtronApps/TriggerService.go +++ b/pkg/deployment/trigger/devtronApps/TriggerService.go @@ -74,7 +74,6 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/history" "github.com/devtron-labs/devtron/pkg/pipeline/repository" "github.com/devtron-labs/devtron/pkg/pipeline/types" - "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" "github.com/devtron-labs/devtron/pkg/plugin" security2 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning" read2 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/read" @@ -173,7 +172,7 @@ type TriggerServiceImpl struct { gitOperationService git.GitOperationService attributeService attributes.AttributesService clusterRepository repository5.ClusterRepository - workflowStageService workflowStatus.WorkFlowStageStatusService + cdWorkflowRunnerService cd.CdWorkflowRunnerService } func NewTriggerServiceImpl(logger *zap.SugaredLogger, @@ -232,7 +231,7 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, gitOperationService git.GitOperationService, attributeService attributes.AttributesService, clusterRepository repository5.ClusterRepository, - workflowStageService workflowStatus.WorkFlowStageStatusService, + cdWorkflowRunnerService cd.CdWorkflowRunnerService, ) (*TriggerServiceImpl, error) { impl := &TriggerServiceImpl{ logger: logger, @@ -295,7 +294,7 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, ciCdPipelineOrchestrator: ciCdPipelineOrchestrator, gitOperationService: gitOperationService, attributeService: attributeService, - workflowStageService: workflowStageService, + cdWorkflowRunnerService: cdWorkflowRunnerService, clusterRepository: clusterRepository, } @@ -522,7 +521,7 @@ func (impl *TriggerServiceImpl) ManualCdTrigger(triggerContext bean.TriggerConte AuditLog: sql.AuditLog{CreatedOn: triggeredAt, CreatedBy: overrideRequest.UserId, UpdatedOn: triggeredAt, UpdatedBy: overrideRequest.UserId}, ReferenceId: triggerContext.ReferenceId, } - savedWfr, err := impl.workflowStageService.SaveCDWorkflowRunnerWithStage(runner) + savedWfr, err := impl.cdWorkflowRunnerService.SaveCDWorkflowRunnerWithStage(runner) if err != nil { impl.logger.Errorw("err in creating cdWorkflowRunner, ManualCdTrigger", "cdWorkflowId", cdWorkflowId, "err", err) return 0, "", nil, err @@ -653,7 +652,7 @@ func (impl *TriggerServiceImpl) TriggerAutomaticDeployment(request bean.TriggerR AuditLog: sql.AuditLog{CreatedOn: triggeredAt, CreatedBy: triggeredBy, UpdatedOn: triggeredAt, UpdatedBy: triggeredBy}, ReferenceId: request.TriggerContext.ReferenceId, } - savedWfr, err := impl.workflowStageService.SaveCDWorkflowRunnerWithStage(runner) + savedWfr, err := impl.cdWorkflowRunnerService.SaveCDWorkflowRunnerWithStage(runner) if err != nil { return err } diff --git a/pkg/pipeline/CdHandler.go b/pkg/pipeline/CdHandler.go index a3cba7c83e..c1365c6b3f 100644 --- a/pkg/pipeline/CdHandler.go +++ b/pkg/pipeline/CdHandler.go @@ -34,6 +34,7 @@ import ( util2 "github.com/devtron-labs/devtron/pkg/pipeline/util" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" bean5 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" + "github.com/devtron-labs/devtron/pkg/workflow/cd" "os" "path/filepath" "strconv" @@ -101,6 +102,7 @@ type CdHandlerImpl struct { customTagService CustomTagService deploymentConfigService common2.DeploymentConfigService workflowStageStatusService workflowStatus.WorkFlowStageStatusService + cdWorkflowRunnerService cd.CdWorkflowRunnerService } func NewCdHandlerImpl(Logger *zap.SugaredLogger, userService user.UserService, @@ -115,6 +117,7 @@ func NewCdHandlerImpl(Logger *zap.SugaredLogger, userService user.UserService, blobConfigStorageService BlobStorageConfigService, customTagService CustomTagService, deploymentConfigService common2.DeploymentConfigService, workflowStageStatusService workflowStatus.WorkFlowStageStatusService, + cdWorkflowRunnerService cd.CdWorkflowRunnerService, ) *CdHandlerImpl { cdh := &CdHandlerImpl{ Logger: Logger, @@ -136,6 +139,7 @@ func NewCdHandlerImpl(Logger *zap.SugaredLogger, userService user.UserService, customTagService: customTagService, deploymentConfigService: deploymentConfigService, workflowStageStatusService: workflowStageStatusService, + cdWorkflowRunnerService: cdWorkflowRunnerService, } config, err := types.GetCdConfig() if err != nil { @@ -222,7 +226,7 @@ func (impl *CdHandlerImpl) CancelStage(workflowRunnerId int, forceAbort bool, us workflowRunner.Status = cdWorkflow2.WorkflowCancel workflowRunner.UpdatedOn = time.Now() workflowRunner.UpdatedBy = userId - err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(workflowRunner) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(workflowRunner) if err != nil { impl.Logger.Error("cannot update deleted workflow runner status, but wf deleted", "err", err) return 0, err @@ -234,7 +238,7 @@ func (impl *CdHandlerImpl) updateWorkflowRunnerForForceAbort(workflowRunner *pip workflowRunner.Status = cdWorkflow2.WorkflowCancel workflowRunner.PodStatus = string(bean2.Failed) workflowRunner.Message = constants.FORCE_ABORT_MESSAGE_AFTER_STARTING_STAGE - err := impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(workflowRunner) + err := impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(workflowRunner) if err != nil { impl.Logger.Errorw("error in updating workflow status in cd workflow runner in force abort case", "err", err) return err @@ -292,7 +296,7 @@ func (impl *CdHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus savedWorkflow.PodName = podName savedWorkflow.UpdateAuditLog(1) impl.Logger.Debugw("updating workflow ", "workflow", savedWorkflow) - err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(savedWorkflow) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(savedWorkflow) if err != nil { impl.Logger.Error("update wf failed for id " + strconv.Itoa(savedWorkflow.Id)) return 0, "", err diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 98b54cdcc1..64e8990979 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -23,11 +23,11 @@ import ( ) type WorkFlowStageStatusService interface { - SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) - UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error + //todo move read functions for ci and cd from here to their respective services. CiService and CdWorkflowRunnerService GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*repository.WorkflowExecutionStage, error) GetPrePostWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean2.WorkflowStageDto, error) + SaveWorkflowStages(wfId int, wfType, wfName string, tx *pg.Tx) error UpdateWorkflowStages(wfId int, wfType, wfName, wfStatus, podStatus, message, podName string, tx *pg.Tx) (string, string, error) ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean2.WorkflowStageDto @@ -47,7 +47,6 @@ func NewWorkflowStageFlowStatusServiceImpl(logger *zap.SugaredLogger, ciWorkflowRepository pipelineConfig.CiWorkflowRepository, cdWorkflowRepository pipelineConfig.CdWorkflowRepository, transactionManager sql.TransactionWrapper, - config *types.CiCdConfig, ) *WorkFlowStageStatusServiceImpl { wfStageServiceImpl := &WorkFlowStageStatusServiceImpl{ logger: logger, @@ -353,92 +352,6 @@ func (impl *WorkFlowStageStatusServiceImpl) GetPrePostWorkflowStagesByWorkflowRu return resp, nil } -func (impl *WorkFlowStageStatusServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) { - // implementation - tx, err := impl.transactionManager.StartTx() - if err != nil { - impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wfr.Name, "error", err) - return wfr, err - } - - defer func() { - dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { - impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) - } - }() - if impl.config.EnableWorkflowExecutionStage { - wfr.Status = cdWorkflow.WorkflowWaitingToStart - } - wfr, err = impl.cdWorkflowRepository.SaveWorkFlowRunnerWithTx(wfr, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) - return wfr, err - } - - if impl.config.EnableWorkflowExecutionStage { - pipelineStageStatus := adapter.GetDefaultPipelineStatusForWorkflow(wfr.Id, wfr.WorkflowType.String()) - pipelineStageStatus, err = impl.workflowStatusRepository.SaveWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) - return wfr, err - } - } - - err = impl.transactionManager.CommitTx(tx) - if err != nil { - impl.logger.Errorw("error in committing transaction", "workflowName", wfr.Name, "error", err) - return wfr, err - } - return wfr, nil -} - -func (impl *WorkFlowStageStatusServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error { - // implementation - tx, err := impl.transactionManager.StartTx() - if err != nil { - impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wfr.Name, "error", err) - return err - } - - defer func() { - dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { - impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) - } - }() - - if impl.config.EnableWorkflowExecutionStage { - if wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean.CD_WORKFLOW_TYPE_POST { - pipelineStageStatus, updatedWfStatus, updatedPodStatus := impl.getUpdatedPipelineStagesForWorkflow(wfr.Id, wfr.WorkflowType.String(), wfr.Status, wfr.PodStatus, wfr.Message, wfr.PodName) - pipelineStageStatus, err = impl.workflowStatusRepository.UpdateWorkflowStages(pipelineStageStatus, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) - return err - } - wfr.Status = updatedWfStatus - wfr.PodStatus = updatedPodStatus - } else { - impl.logger.Infow("workflow type not supported to update stage data", "workflowName", wfr.Name, "workflowType", wfr.WorkflowType) - } - } - - //update workflow runner now with updatedWfStatus if applicable - err = impl.cdWorkflowRepository.UpdateWorkFlowRunnerWithTx(wfr, tx) - if err != nil { - impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) - return err - } - - err = impl.transactionManager.CommitTx(tx) - if err != nil { - impl.logger.Errorw("error in committing transaction", "workflowName", wfr.Name, "error", err) - return err - } - return nil - -} - func (impl *WorkFlowStageStatusServiceImpl) ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean2.WorkflowStageDto { wfMap := make(map[string][]*bean2.WorkflowStageDto) foundInDb := false diff --git a/pkg/workflow/cd/CdWorkflowCommonService.go b/pkg/workflow/cd/CdWorkflowCommonService.go index 682b3608a0..d1c5314244 100644 --- a/pkg/workflow/cd/CdWorkflowCommonService.go +++ b/pkg/workflow/cd/CdWorkflowCommonService.go @@ -31,7 +31,6 @@ import ( "github.com/devtron-labs/devtron/pkg/app/status" common2 "github.com/devtron-labs/devtron/pkg/deployment/common" "github.com/devtron-labs/devtron/pkg/pipeline/types" - "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" globalUtil "github.com/devtron-labs/devtron/util" "go.opentelemetry.io/otel" "go.uber.org/zap" @@ -59,7 +58,7 @@ type CdWorkflowCommonServiceImpl struct { pipelineRepository pipelineConfig.PipelineRepository pipelineStatusTimelineRepository pipelineConfig.PipelineStatusTimelineRepository deploymentConfigService common2.DeploymentConfigService - workflowStageService workflowStatus.WorkFlowStageStatusService + cdWorkflowRunnerService CdWorkflowRunnerService } func NewCdWorkflowCommonServiceImpl(logger *zap.SugaredLogger, @@ -68,7 +67,7 @@ func NewCdWorkflowCommonServiceImpl(logger *zap.SugaredLogger, pipelineRepository pipelineConfig.PipelineRepository, pipelineStatusTimelineRepository pipelineConfig.PipelineStatusTimelineRepository, deploymentConfigService common2.DeploymentConfigService, - workflowStageService workflowStatus.WorkFlowStageStatusService) (*CdWorkflowCommonServiceImpl, error) { + cdWorkflowRunnerService CdWorkflowRunnerService) (*CdWorkflowCommonServiceImpl, error) { config, err := types.GetCdConfig() if err != nil { return nil, err @@ -81,7 +80,7 @@ func NewCdWorkflowCommonServiceImpl(logger *zap.SugaredLogger, pipelineRepository: pipelineRepository, pipelineStatusTimelineRepository: pipelineStatusTimelineRepository, deploymentConfigService: deploymentConfigService, - workflowStageService: workflowStageService, + cdWorkflowRunnerService: cdWorkflowRunnerService, }, nil } @@ -175,7 +174,7 @@ func (impl *CdWorkflowCommonServiceImpl) MarkCurrentDeploymentFailed(runner *pip runner.Message = util.GetClientErrorDetailedMessage(releaseErr) runner.FinishedOn = time.Now() runner.UpdateAuditLog(triggeredBy) - err1 := impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runner) + err1 := impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner) if err1 != nil { impl.logger.Errorw("error updating cd wf runner status", "err", releaseErr, "currentRunner", runner) return err1 @@ -227,7 +226,7 @@ func (impl *CdWorkflowCommonServiceImpl) UpdateNonTerminalStatusInRunner(ctx con } cdWfr.Status = status cdWfr.UpdateAuditLog(userId) - err = impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(cdWfr) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(cdWfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner, UpdateNonTerminalStatusInRunner", "cdWfr", cdWfr, "err", err) return err diff --git a/pkg/workflow/cd/CdWorkflowRunnerService.go b/pkg/workflow/cd/CdWorkflowRunnerService.go index ac67daa398..67326e3038 100644 --- a/pkg/workflow/cd/CdWorkflowRunnerService.go +++ b/pkg/workflow/cd/CdWorkflowRunnerService.go @@ -17,9 +17,13 @@ package cd import ( + bean2 "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" + "github.com/devtron-labs/devtron/pkg/pipeline/types" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" + "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/workflow/cd/adapter" "github.com/devtron-labs/devtron/pkg/workflow/cd/bean" "go.uber.org/zap" @@ -28,28 +32,40 @@ import ( type CdWorkflowRunnerService interface { UpdateWfr(dto *bean.CdWorkflowRunnerDto, updatedBy int) error UpdateIsArtifactUploaded(wfrId int, isArtifactUploaded bool) error + SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) + UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error } type CdWorkflowRunnerServiceImpl struct { logger *zap.SugaredLogger cdWorkflowRepository pipelineConfig.CdWorkflowRepository workflowStageService workflowStatus.WorkFlowStageStatusService + transactionManager sql.TransactionWrapper + config *types.CiCdConfig } func NewCdWorkflowRunnerServiceImpl(logger *zap.SugaredLogger, cdWorkflowRepository pipelineConfig.CdWorkflowRepository, - workflowStageService workflowStatus.WorkFlowStageStatusService) *CdWorkflowRunnerServiceImpl { - return &CdWorkflowRunnerServiceImpl{ + workflowStageService workflowStatus.WorkFlowStageStatusService, + transactionManager sql.TransactionWrapper) *CdWorkflowRunnerServiceImpl { + impl := &CdWorkflowRunnerServiceImpl{ logger: logger, cdWorkflowRepository: cdWorkflowRepository, workflowStageService: workflowStageService, + transactionManager: transactionManager, } + ciCdConfig, err := types.GetCiCdConfig() + if err != nil { + return nil + } + impl.config = ciCdConfig + return impl } func (impl *CdWorkflowRunnerServiceImpl) UpdateWfr(dto *bean.CdWorkflowRunnerDto, updatedBy int) error { runnerDbObj := adapter.ConvertCdWorkflowRunnerDtoToDbObj(dto) runnerDbObj.UpdateAuditLog(int32(updatedBy)) - err := impl.workflowStageService.UpdateCdWorkflowRunnerWithStage(runnerDbObj) + err := impl.UpdateCdWorkflowRunnerWithStage(runnerDbObj) if err != nil { impl.logger.Errorw("error in updating runner status in db", "runnerId", runnerDbObj.Id, "err", err) return err @@ -65,3 +81,78 @@ func (impl *CdWorkflowRunnerServiceImpl) UpdateIsArtifactUploaded(wfrId int, isA } return nil } + +func (impl *CdWorkflowRunnerServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wfr.Name, "error", err) + return wfr, err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) + } + }() + if impl.config.EnableWorkflowExecutionStage { + wfr.Status = cdWorkflow.WorkflowWaitingToStart + } + wfr, err = impl.cdWorkflowRepository.SaveWorkFlowRunnerWithTx(wfr, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) + return wfr, err + } + + err = impl.workflowStageService.SaveWorkflowStages(wfr.Id, wfr.WorkflowType.String(), wfr.Name, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow stages", "workflowName", wfr.Name, "error", err) + return wfr, err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.logger.Errorw("error in committing transaction", "workflowName", wfr.Name, "error", err) + return wfr, err + } + return wfr, nil +} + +func (impl *CdWorkflowRunnerServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error { + // implementation + tx, err := impl.transactionManager.StartTx() + if err != nil { + impl.logger.Errorw("error in starting transaction to save default configurations", "workflowName", wfr.Name, "error", err) + return err + } + + defer func() { + dbErr := impl.transactionManager.RollbackTx(tx) + if dbErr != nil { + impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) + } + }() + if wfr.WorkflowType == bean2.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == bean2.CD_WORKFLOW_TYPE_POST { + wfr.Status, wfr.PodStatus, err = impl.workflowStageService.UpdateWorkflowStages(wfr.Id, wfr.WorkflowType.String(), wfr.Name, wfr.Status, wfr.PodStatus, wfr.Message, wfr.PodName, tx) + if err != nil { + impl.logger.Errorw("error in updating workflow stages", "workflowName", wfr.Name, "error", err) + return err + } + } + + //update workflow runner now with updatedWfStatus if applicable + err = impl.cdWorkflowRepository.UpdateWorkFlowRunnerWithTx(wfr, tx) + if err != nil { + impl.logger.Errorw("error in saving workflow", "payload", wfr, "error", err) + return err + } + + err = impl.transactionManager.CommitTx(tx) + if err != nil { + impl.logger.Errorw("error in committing transaction", "workflowName", wfr.Name, "error", err) + return err + } + return nil + +} diff --git a/pkg/workflow/dag/WorkflowDagExecutor.go b/pkg/workflow/dag/WorkflowDagExecutor.go index 0cc0cf5bbe..2cddf7a65c 100644 --- a/pkg/workflow/dag/WorkflowDagExecutor.go +++ b/pkg/workflow/dag/WorkflowDagExecutor.go @@ -46,7 +46,6 @@ import ( eventProcessorBean "github.com/devtron-labs/devtron/pkg/eventProcessor/bean" "github.com/devtron-labs/devtron/pkg/pipeline" constants2 "github.com/devtron-labs/devtron/pkg/pipeline/constants" - "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" repository2 "github.com/devtron-labs/devtron/pkg/plugin/repository" "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning" repository3 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/repository" @@ -119,7 +118,7 @@ type WorkflowDagExecutorImpl struct { eventFactory client.EventFactory customTagService pipeline.CustomTagService pipelineStatusTimelineService status.PipelineStatusTimelineService - workFlowStageStatusService workflowStatus.WorkFlowStageStatusService + cdWorkflowRunnerService cd.CdWorkflowRunnerService ciService pipeline.CiService helmAppService client2.HelmAppService @@ -150,7 +149,7 @@ func NewWorkflowDagExecutorImpl(Logger *zap.SugaredLogger, pipelineRepository pi eventFactory client.EventFactory, customTagService pipeline.CustomTagService, pipelineStatusTimelineService status.PipelineStatusTimelineService, - workFlowStageStatusService workflowStatus.WorkFlowStageStatusService, + cdWorkflowRunnerService cd.CdWorkflowRunnerService, ciService pipeline.CiService, helmAppService client2.HelmAppService, cdWorkflowCommonService cd.CdWorkflowCommonService, @@ -188,7 +187,7 @@ func NewWorkflowDagExecutorImpl(Logger *zap.SugaredLogger, pipelineRepository pi asyncRunnable: asyncRunnable, scanHistoryRepository: scanHistoryRepository, imageScanService: imageScanService, - workFlowStageStatusService: workFlowStageStatusService, + cdWorkflowRunnerService: cdWorkflowRunnerService, ciService: ciService, } config, err := types.GetCdConfig() @@ -338,7 +337,7 @@ func (impl *WorkflowDagExecutorImpl) handleAsyncTriggerReleaseError(ctx context. } cdWfr.UpdatedBy = 1 cdWfr.UpdatedOn = time.Now() - err := impl.workFlowStageStatusService.UpdateCdWorkflowRunnerWithStage(cdWfr) + err := impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(cdWfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "wfr", cdWfr, "err", err) return diff --git a/pkg/workflow/status/WorkflowStatusService.go b/pkg/workflow/status/WorkflowStatusService.go index 792c21e165..7ca800d796 100644 --- a/pkg/workflow/status/WorkflowStatusService.go +++ b/pkg/workflow/status/WorkflowStatusService.go @@ -39,8 +39,8 @@ import ( bean3 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/bean" "github.com/devtron-labs/devtron/pkg/eventProcessor/out" "github.com/devtron-labs/devtron/pkg/pipeline/types" - "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" "github.com/devtron-labs/devtron/pkg/sql" + "github.com/devtron-labs/devtron/pkg/workflow/cd" "github.com/devtron-labs/devtron/pkg/workflow/dag" util3 "github.com/devtron-labs/devtron/util" "github.com/go-pg/pg" @@ -87,7 +87,7 @@ type WorkflowStatusServiceImpl struct { pipelineRepository pipelineConfig.PipelineRepository appListingService app.AppListingService deploymentConfigService common2.DeploymentConfigService - workflowStageStatusService workflowStatus.WorkFlowStageStatusService + cdWorkflowRunnerService cd.CdWorkflowRunnerService } func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, @@ -109,7 +109,7 @@ func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, pipelineRepository pipelineConfig.PipelineRepository, appListingService app.AppListingService, deploymentConfigService common2.DeploymentConfigService, - workflowStageStatusService workflowStatus.WorkFlowStageStatusService, + cdWorkflowRunnerService cd.CdWorkflowRunnerService, ) (*WorkflowStatusServiceImpl, error) { impl := &WorkflowStatusServiceImpl{ logger: logger, @@ -133,7 +133,7 @@ func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, pipelineRepository: pipelineRepository, appListingService: appListingService, deploymentConfigService: deploymentConfigService, - workflowStageStatusService: workflowStageStatusService, + cdWorkflowRunnerService: cdWorkflowRunnerService, } config, err := types.GetCdConfig() if err != nil { @@ -173,7 +173,7 @@ func (impl *WorkflowStatusServiceImpl) CheckHelmAppStatusPeriodicallyAndUpdateIn return err } } - err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(wfr) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(wfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "wfr", wfr, "err", err) return err @@ -241,7 +241,7 @@ func (impl *WorkflowStatusServiceImpl) UpdatePipelineTimelineAndStatusByLiveAppl cdWfr.Status = cdWorkflow2.WorkflowUnableToFetchState cdWfr.UpdatedOn = time.Now() cdWfr.UpdatedBy = 1 - err = impl.workflowStageStatusService.UpdateCdWorkflowRunnerWithStage(&cdWfr) + err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(&cdWfr) if err != nil { impl.logger.Errorw("error on update cd workflow runner", "cdWfr", cdWfr, "err", err) return err, isTimelineUpdated diff --git a/wire_gen.go b/wire_gen.go index 46753e6f7b..a02aef9527 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -574,8 +574,9 @@ func InitializeApp() (*App, error) { deployedAppMetricsServiceImpl := deployedAppMetrics.NewDeployedAppMetricsServiceImpl(sugaredLogger, appLevelMetricsRepositoryImpl, envLevelAppMetricsRepositoryImpl, chartRefServiceImpl) appListingServiceImpl := app2.NewAppListingServiceImpl(sugaredLogger, appListingRepositoryImpl, appRepositoryImpl, appListingViewBuilderImpl, pipelineRepositoryImpl, linkoutsRepositoryImpl, cdWorkflowRepositoryImpl, pipelineOverrideRepositoryImpl, environmentRepositoryImpl, chartRepositoryImpl, ciPipelineRepositoryImpl, dockerRegistryIpsConfigServiceImpl, userRepositoryImpl, deployedAppMetricsServiceImpl, ciArtifactRepositoryImpl, envConfigOverrideReadServiceImpl, ciPipelineConfigReadServiceImpl) workflowStageRepositoryImpl := repository16.NewWorkflowStageRepositoryImpl(sugaredLogger, db) - workFlowStageStatusServiceImpl := workflowStatus.NewWorkflowStageFlowStatusServiceImpl(sugaredLogger, workflowStageRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowRepositoryImpl, transactionUtilImpl, ciCdConfig) - appServiceImpl := app2.NewAppService(pipelineOverrideRepositoryImpl, mergeUtil, sugaredLogger, pipelineRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, appRepositoryImpl, configMapRepositoryImpl, chartRepositoryImpl, cdWorkflowRepositoryImpl, commonServiceImpl, chartTemplateServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineStatusTimelineResourcesServiceImpl, pipelineStatusSyncDetailServiceImpl, pipelineStatusTimelineServiceImpl, appServiceConfig, appStatusServiceImpl, installedAppReadServiceImpl, installedAppVersionHistoryRepositoryImpl, scopedVariableCMCSManagerImpl, acdConfig, gitOpsConfigReadServiceImpl, gitOperationServiceImpl, deploymentTemplateServiceImpl, appListingServiceImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl, workFlowStageStatusServiceImpl) + workFlowStageStatusServiceImpl := workflowStatus.NewWorkflowStageFlowStatusServiceImpl(sugaredLogger, workflowStageRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowRepositoryImpl, transactionUtilImpl) + cdWorkflowRunnerServiceImpl := cd.NewCdWorkflowRunnerServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, workFlowStageStatusServiceImpl, transactionUtilImpl) + appServiceImpl := app2.NewAppService(pipelineOverrideRepositoryImpl, mergeUtil, sugaredLogger, pipelineRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, appRepositoryImpl, configMapRepositoryImpl, chartRepositoryImpl, cdWorkflowRepositoryImpl, commonServiceImpl, chartTemplateServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineStatusTimelineResourcesServiceImpl, pipelineStatusSyncDetailServiceImpl, pipelineStatusTimelineServiceImpl, appServiceConfig, appStatusServiceImpl, installedAppReadServiceImpl, installedAppVersionHistoryRepositoryImpl, scopedVariableCMCSManagerImpl, acdConfig, gitOpsConfigReadServiceImpl, gitOperationServiceImpl, deploymentTemplateServiceImpl, appListingServiceImpl, deploymentConfigServiceImpl, envConfigOverrideReadServiceImpl, cdWorkflowRunnerServiceImpl) globalCMCSRepositoryImpl := repository2.NewGlobalCMCSRepositoryImpl(sugaredLogger, db) globalCMCSServiceImpl := pipeline.NewGlobalCMCSServiceImpl(sugaredLogger, globalCMCSRepositoryImpl) argoWorkflowExecutorImpl := executors.NewArgoWorkflowExecutorImpl(sugaredLogger) @@ -686,7 +687,7 @@ func InitializeApp() (*App, error) { devtronAppCMCSServiceImpl := pipeline.NewDevtronAppCMCSServiceImpl(sugaredLogger, appServiceImpl, attributesRepositoryImpl) globalStrategyMetadataChartRefMappingRepositoryImpl := chartRepoRepository.NewGlobalStrategyMetadataChartRefMappingRepositoryImpl(db, sugaredLogger) devtronAppStrategyServiceImpl := pipeline.NewDevtronAppStrategyServiceImpl(sugaredLogger, chartRepositoryImpl, globalStrategyMetadataChartRefMappingRepositoryImpl, ciCdPipelineOrchestratorImpl, cdPipelineConfigServiceImpl) - cdWorkflowCommonServiceImpl, err := cd.NewCdWorkflowCommonServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, pipelineStatusTimelineServiceImpl, pipelineRepositoryImpl, pipelineStatusTimelineRepositoryImpl, deploymentConfigServiceImpl, workFlowStageStatusServiceImpl) + cdWorkflowCommonServiceImpl, err := cd.NewCdWorkflowCommonServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, pipelineStatusTimelineServiceImpl, pipelineRepositoryImpl, pipelineStatusTimelineRepositoryImpl, deploymentConfigServiceImpl, cdWorkflowRunnerServiceImpl) if err != nil { return nil, err } @@ -706,7 +707,7 @@ func InitializeApp() (*App, error) { installedAppDBExtendedServiceImpl := FullMode.NewInstalledAppDBExtendedServiceImpl(installedAppDBServiceImpl, appStatusServiceImpl, gitOpsConfigReadServiceImpl) gitOpsValidationServiceImpl := validation.NewGitOpsValidationServiceImpl(sugaredLogger, gitFactory, gitOperationServiceImpl, gitOpsConfigReadServiceImpl, chartTemplateServiceImpl, chartServiceImpl, installedAppDBExtendedServiceImpl) devtronAppGitOpConfigServiceImpl := gitOpsConfig.NewDevtronAppGitOpConfigServiceImpl(sugaredLogger, chartRepositoryImpl, chartServiceImpl, gitOpsConfigReadServiceImpl, gitOpsValidationServiceImpl, argoClientWrapperServiceImpl, deploymentConfigServiceImpl) - cdHandlerImpl := pipeline.NewCdHandlerImpl(sugaredLogger, userServiceImpl, cdWorkflowRepositoryImpl, ciLogServiceImpl, ciArtifactRepositoryImpl, ciPipelineMaterialRepositoryImpl, pipelineRepositoryImpl, environmentRepositoryImpl, ciWorkflowRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, imageTaggingServiceImpl, k8sServiceImpl, workflowServiceImpl, clusterServiceImplExtended, blobStorageConfigServiceImpl, customTagServiceImpl, deploymentConfigServiceImpl, workFlowStageStatusServiceImpl) + cdHandlerImpl := pipeline.NewCdHandlerImpl(sugaredLogger, userServiceImpl, cdWorkflowRepositoryImpl, ciLogServiceImpl, ciArtifactRepositoryImpl, ciPipelineMaterialRepositoryImpl, pipelineRepositoryImpl, environmentRepositoryImpl, ciWorkflowRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, imageTaggingServiceImpl, k8sServiceImpl, workflowServiceImpl, clusterServiceImplExtended, blobStorageConfigServiceImpl, customTagServiceImpl, deploymentConfigServiceImpl, workFlowStageStatusServiceImpl, cdWorkflowRunnerServiceImpl) appWorkflowServiceImpl := appWorkflow2.NewAppWorkflowServiceImpl(sugaredLogger, appWorkflowRepositoryImpl, ciCdPipelineOrchestratorImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, enforcerUtilImpl, resourceGroupServiceImpl, appRepositoryImpl, userAuthServiceImpl, chartServiceImpl, deploymentConfigServiceImpl) appCloneServiceImpl := appClone.NewAppCloneServiceImpl(sugaredLogger, pipelineBuilderImpl, attributesServiceImpl, chartServiceImpl, configMapServiceImpl, appWorkflowServiceImpl, appListingServiceImpl, propertiesConfigServiceImpl, pipelineStageServiceImpl, ciTemplateReadServiceImpl, appRepositoryImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, ciPipelineConfigServiceImpl, gitOpsConfigReadServiceImpl) deploymentTemplateRepositoryImpl := repository2.NewDeploymentTemplateRepositoryImpl(db, sugaredLogger) @@ -738,12 +739,12 @@ func InitializeApp() (*App, error) { scanToolExecutionHistoryMappingRepositoryImpl := repository11.NewScanToolExecutionHistoryMappingRepositoryImpl(db, sugaredLogger) cdWorkflowReadServiceImpl := read15.NewCdWorkflowReadServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) imageScanServiceImpl := imageScanning.NewImageScanServiceImpl(sugaredLogger, imageScanHistoryRepositoryImpl, imageScanResultRepositoryImpl, imageScanObjectMetaRepositoryImpl, cveStoreRepositoryImpl, imageScanDeployInfoRepositoryImpl, userServiceImpl, appRepositoryImpl, environmentServiceImpl, ciArtifactRepositoryImpl, policyServiceImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, scanToolMetadataRepositoryImpl, scanToolExecutionHistoryMappingRepositoryImpl, cvePolicyRepositoryImpl, cdWorkflowReadServiceImpl) - triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl, workFlowStageStatusServiceImpl) + triggerServiceImpl, err := devtronApps.NewTriggerServiceImpl(sugaredLogger, cdWorkflowCommonServiceImpl, gitOpsManifestPushServiceImpl, gitOpsConfigReadServiceImpl, argoK8sClientImpl, acdConfig, argoClientWrapperServiceImpl, pipelineStatusTimelineServiceImpl, chartTemplateServiceImpl, workflowEventPublishServiceImpl, manifestCreationServiceImpl, deployedConfigurationHistoryServiceImpl, pipelineStageServiceImpl, globalPluginServiceImpl, customTagServiceImpl, pluginInputVariableParserImpl, prePostCdScriptHistoryServiceImpl, scopedVariableCMCSManagerImpl, workflowServiceImpl, imageDigestPolicyServiceImpl, userServiceImpl, clientImpl, helmAppServiceImpl, enforcerUtilImpl, userDeploymentRequestServiceImpl, helmAppClientImpl, eventSimpleFactoryImpl, eventRESTClientImpl, environmentVariables, appRepositoryImpl, ciPipelineMaterialRepositoryImpl, imageScanHistoryReadServiceImpl, imageScanDeployInfoReadServiceImpl, imageScanDeployInfoServiceImpl, pipelineRepositoryImpl, pipelineOverrideRepositoryImpl, manifestPushConfigRepositoryImpl, chartRepositoryImpl, environmentRepositoryImpl, cdWorkflowRepositoryImpl, ciWorkflowRepositoryImpl, ciArtifactRepositoryImpl, ciTemplateReadServiceImpl, gitMaterialReadServiceImpl, appLabelRepositoryImpl, ciPipelineRepositoryImpl, appWorkflowRepositoryImpl, dockerArtifactStoreRepositoryImpl, imageScanServiceImpl, k8sServiceImpl, transactionUtilImpl, deploymentConfigServiceImpl, ciCdPipelineOrchestratorImpl, gitOperationServiceImpl, attributesServiceImpl, clusterRepositoryImpl, cdWorkflowRunnerServiceImpl) if err != nil { return nil, err } commonArtifactServiceImpl := artifacts.NewCommonArtifactServiceImpl(sugaredLogger, ciArtifactRepositoryImpl) - workflowDagExecutorImpl := dag.NewWorkflowDagExecutorImpl(sugaredLogger, pipelineRepositoryImpl, cdWorkflowRepositoryImpl, ciArtifactRepositoryImpl, enforcerUtilImpl, appWorkflowRepositoryImpl, pipelineStageServiceImpl, ciWorkflowRepositoryImpl, ciPipelineRepositoryImpl, pipelineStageRepositoryImpl, globalPluginRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, customTagServiceImpl, pipelineStatusTimelineServiceImpl, workFlowStageStatusServiceImpl, ciServiceImpl, helmAppServiceImpl, cdWorkflowCommonServiceImpl, triggerServiceImpl, userDeploymentRequestServiceImpl, manifestCreationServiceImpl, commonArtifactServiceImpl, deploymentConfigServiceImpl, runnable, imageScanHistoryRepositoryImpl, imageScanServiceImpl) + workflowDagExecutorImpl := dag.NewWorkflowDagExecutorImpl(sugaredLogger, pipelineRepositoryImpl, cdWorkflowRepositoryImpl, ciArtifactRepositoryImpl, enforcerUtilImpl, appWorkflowRepositoryImpl, pipelineStageServiceImpl, ciWorkflowRepositoryImpl, ciPipelineRepositoryImpl, pipelineStageRepositoryImpl, globalPluginRepositoryImpl, eventRESTClientImpl, eventSimpleFactoryImpl, customTagServiceImpl, pipelineStatusTimelineServiceImpl, cdWorkflowRunnerServiceImpl, ciServiceImpl, helmAppServiceImpl, cdWorkflowCommonServiceImpl, triggerServiceImpl, userDeploymentRequestServiceImpl, manifestCreationServiceImpl, commonArtifactServiceImpl, deploymentConfigServiceImpl, runnable, imageScanHistoryRepositoryImpl, imageScanServiceImpl) externalCiRestHandlerImpl := restHandler.NewExternalCiRestHandlerImpl(sugaredLogger, validate, userServiceImpl, enforcerImpl, workflowDagExecutorImpl) pubSubClientRestHandlerImpl := restHandler.NewPubSubClientRestHandlerImpl(pubSubClientServiceImpl, sugaredLogger, ciCdConfig) webhookRouterImpl := router.NewWebhookRouterImpl(gitWebhookRestHandlerImpl, pipelineConfigRestHandlerImpl, externalCiRestHandlerImpl, pubSubClientRestHandlerImpl) @@ -821,7 +822,7 @@ func InitializeApp() (*App, error) { return nil, err } cdPipelineEventPublishServiceImpl := out.NewCDPipelineEventPublishServiceImpl(sugaredLogger, pubSubClientServiceImpl) - workflowStatusServiceImpl, err := status2.NewWorkflowStatusServiceImpl(sugaredLogger, workflowDagExecutorImpl, pipelineStatusTimelineServiceImpl, appServiceImpl, appStatusServiceImpl, acdConfig, appServiceConfig, pipelineStatusSyncDetailServiceImpl, argoClientWrapperServiceImpl, cdPipelineEventPublishServiceImpl, cdWorkflowRepositoryImpl, pipelineOverrideRepositoryImpl, installedAppVersionHistoryRepositoryImpl, appRepositoryImpl, environmentRepositoryImpl, installedAppRepositoryImpl, installedAppReadServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineRepositoryImpl, appListingServiceImpl, deploymentConfigServiceImpl, workFlowStageStatusServiceImpl) + workflowStatusServiceImpl, err := status2.NewWorkflowStatusServiceImpl(sugaredLogger, workflowDagExecutorImpl, pipelineStatusTimelineServiceImpl, appServiceImpl, appStatusServiceImpl, acdConfig, appServiceConfig, pipelineStatusSyncDetailServiceImpl, argoClientWrapperServiceImpl, cdPipelineEventPublishServiceImpl, cdWorkflowRepositoryImpl, pipelineOverrideRepositoryImpl, installedAppVersionHistoryRepositoryImpl, appRepositoryImpl, environmentRepositoryImpl, installedAppRepositoryImpl, installedAppReadServiceImpl, pipelineStatusTimelineRepositoryImpl, pipelineRepositoryImpl, appListingServiceImpl, deploymentConfigServiceImpl, cdWorkflowRunnerServiceImpl) if err != nil { return nil, err } @@ -1050,7 +1051,6 @@ func InitializeApp() (*App, error) { muxRouter := router.NewMuxRouter(sugaredLogger, environmentRouterImpl, clusterRouterImpl, webhookRouterImpl, userAuthRouterImpl, gitProviderRouterImpl, gitHostRouterImpl, dockerRegRouterImpl, notificationRouterImpl, teamRouterImpl, userRouterImpl, chartRefRouterImpl, configMapRouterImpl, appStoreRouterImpl, chartRepositoryRouterImpl, releaseMetricsRouterImpl, deploymentGroupRouterImpl, batchOperationRouterImpl, chartGroupRouterImpl, imageScanRouterImpl, policyRouterImpl, gitOpsConfigRouterImpl, dashboardRouterImpl, attributesRouterImpl, userAttributesRouterImpl, commonRouterImpl, grafanaRouterImpl, ssoLoginRouterImpl, telemetryRouterImpl, telemetryEventClientImplExtended, bulkUpdateRouterImpl, webhookListenerRouterImpl, appRouterImpl, coreAppRouterImpl, helmAppRouterImpl, k8sApplicationRouterImpl, pProfRouterImpl, deploymentConfigRouterImpl, dashboardTelemetryRouterImpl, commonDeploymentRouterImpl, externalLinkRouterImpl, globalPluginRouterImpl, moduleRouterImpl, serverRouterImpl, apiTokenRouterImpl, cdApplicationStatusUpdateHandlerImpl, k8sCapacityRouterImpl, webhookHelmRouterImpl, globalCMCSRouterImpl, userTerminalAccessRouterImpl, jobRouterImpl, ciStatusUpdateCronImpl, resourceGroupingRouterImpl, rbacRoleRouterImpl, scopedVariableRouterImpl, ciTriggerCronImpl, proxyRouterImpl, deploymentConfigurationRouterImpl, infraConfigRouterImpl, argoApplicationRouterImpl, devtronResourceRouterImpl, fluxApplicationRouterImpl, scanningResultRouterImpl) loggingMiddlewareImpl := util4.NewLoggingMiddlewareImpl(userServiceImpl) cdWorkflowServiceImpl := cd.NewCdWorkflowServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) - cdWorkflowRunnerServiceImpl := cd.NewCdWorkflowRunnerServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl, workFlowStageStatusServiceImpl) cdWorkflowRunnerReadServiceImpl := read15.NewCdWorkflowRunnerReadServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) webhookServiceImpl := pipeline.NewWebhookServiceImpl(ciArtifactRepositoryImpl, sugaredLogger, ciPipelineRepositoryImpl, ciWorkflowRepositoryImpl, cdWorkflowCommonServiceImpl, workFlowStageStatusServiceImpl, ciServiceImpl) workflowEventProcessorImpl, err := in.NewWorkflowEventProcessorImpl(sugaredLogger, pubSubClientServiceImpl, cdWorkflowServiceImpl, cdWorkflowReadServiceImpl, cdWorkflowRunnerServiceImpl, cdWorkflowRunnerReadServiceImpl, workflowDagExecutorImpl, ciHandlerImpl, cdHandlerImpl, eventSimpleFactoryImpl, eventRESTClientImpl, triggerServiceImpl, deployedAppServiceImpl, webhookServiceImpl, validate, environmentVariables, cdWorkflowCommonServiceImpl, cdPipelineConfigServiceImpl, userDeploymentRequestServiceImpl, pipelineRepositoryImpl, ciArtifactRepositoryImpl, cdWorkflowRepositoryImpl, deploymentConfigServiceImpl) From 5c07fc72faebe05503429d8a1fd949ffd3b6297b Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 3 Feb 2025 09:02:51 +0530 Subject: [PATCH 25/43] status_type to status_for --- .../WorkflowStageStatusService.go | 12 +++++----- .../workflowStatus/adapter/adapter.go | 6 ++--- pkg/pipeline/workflowStatus/bean/bean.go | 8 +++---- .../repository/WorkflowStageRepository.go | 22 +++++++++---------- .../sql/31902800_build_worker_status.up.sql | 3 ++- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 64e8990979..8ee3d9ba48 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -111,7 +111,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStage } //update pod stage status by using convertPodStatusToDevtronStatus for _, stage := range currentWorkflowStages { - if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_POD { + if stage.StatusFor == bean2.WORKFLOW_STAGE_STATUS_TYPE_POD { // add pod name in stage metadata if not empty if len(podName) > 0 { marshalledMetadata, _ := json.Marshal(map[string]string{"podName": podName}) @@ -190,7 +190,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( //if pod is running, update preparation and execution stages for _, stage := range currentWorkflowStages { - if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + if stage.StatusFor == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { //mark preparation stage as completed if stage.StageName == bean2.WORKFLOW_PREPARATION { if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { @@ -219,7 +219,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( //if pod is succeeded, update execution stage for _, stage := range currentWorkflowStages { - if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + if stage.StatusFor == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { //mark execution stage as completed if stage.StageName == bean2.WORKFLOW_EXECUTION { if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { @@ -234,7 +234,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( //if pod is failed, update execution stage for _, stage := range currentWorkflowStages { - if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + if stage.StatusFor == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { //mark execution stage as completed if stage.StageName == bean2.WORKFLOW_EXECUTION { if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { @@ -269,7 +269,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( impl.logger.Errorw("unknown pod status", "podStatus", podStatus) //mark workflow stage status as unknown for _, stage := range currentWorkflowStages { - if stage.StatusType == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { + if stage.StatusFor == bean2.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW { //mark execution stage as completed if stage.StageName == bean2.WORKFLOW_EXECUTION { if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING { @@ -361,7 +361,7 @@ func (impl *WorkFlowStageStatusServiceImpl) ConvertDBWorkflowStageToMap(workflow } for _, wfStage := range workflowStages { if wfStage.WorkflowId == wfId { - wfMap[wfStage.StatusType.ToString()] = append(wfMap[wfStage.StatusType.ToString()], adapter.ConvertDBWorkflowStageToDto(wfStage)) + wfMap[wfStage.StatusFor.ToString()] = append(wfMap[wfStage.StatusFor.ToString()], adapter.ConvertDBWorkflowStageToDto(wfStage)) foundInDb = true } } diff --git a/pkg/pipeline/workflowStatus/adapter/adapter.go b/pkg/pipeline/workflowStatus/adapter/adapter.go index 583212201b..65380932a9 100644 --- a/pkg/pipeline/workflowStatus/adapter/adapter.go +++ b/pkg/pipeline/workflowStatus/adapter/adapter.go @@ -78,7 +78,7 @@ func GetDefaultWorkflowPreparationStage(workflowId int, workflowType string) *re return &repository.WorkflowExecutionStage{ StageName: bean.WORKFLOW_PREPARATION, Status: bean.WORKFLOW_STAGE_STATUS_RUNNING, - StatusType: bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW, + StatusFor: bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW, StartTime: time.Now().Format(bean3.LayoutRFC3339), WorkflowId: workflowId, WorkflowType: workflowType, @@ -95,7 +95,7 @@ func GetDefaultWorkflowExecutionStage(workflowId int, workflowType string) *repo return &repository.WorkflowExecutionStage{ StageName: bean.WORKFLOW_EXECUTION, Status: bean.WORKFLOW_STAGE_STATUS_NOT_STARTED, - StatusType: bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW, + StatusFor: bean.WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW, StartTime: "", WorkflowId: workflowId, WorkflowType: workflowType, @@ -112,7 +112,7 @@ func GetDefaultPodExecutionStage(workflowId int, workflowType string) *repositor return &repository.WorkflowExecutionStage{ StageName: bean.POD_EXECUTION, Status: bean.WORKFLOW_STAGE_STATUS_NOT_STARTED, - StatusType: bean.WORKFLOW_STAGE_STATUS_TYPE_POD, + StatusFor: bean.WORKFLOW_STAGE_STATUS_TYPE_POD, StartTime: "", WorkflowId: workflowId, WorkflowType: workflowType, diff --git a/pkg/pipeline/workflowStatus/bean/bean.go b/pkg/pipeline/workflowStatus/bean/bean.go index 310488a026..f1bd26a22c 100644 --- a/pkg/pipeline/workflowStatus/bean/bean.go +++ b/pkg/pipeline/workflowStatus/bean/bean.go @@ -12,14 +12,14 @@ func (n WorkflowStageName) ToString() string { return string(n) } -type WorkflowStageStatusType string +type WorkflowStageStatusFor string const ( - WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW WorkflowStageStatusType = "workflow" - WORKFLOW_STAGE_STATUS_TYPE_POD WorkflowStageStatusType = "pod" + WORKFLOW_STAGE_STATUS_TYPE_WORKFLOW WorkflowStageStatusFor = "workflow" + WORKFLOW_STAGE_STATUS_TYPE_POD WorkflowStageStatusFor = "pod" ) -func (n WorkflowStageStatusType) ToString() string { +func (n WorkflowStageStatusFor) ToString() string { return string(n) } diff --git a/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go index 4706d4b5f7..a30686159f 100644 --- a/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go +++ b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go @@ -23,17 +23,17 @@ type WorkflowStageRepositoryImpl struct { } type WorkflowExecutionStage struct { - tableName struct{} `sql:"workflow_execution_stage" pg:",discard_unknown_columns"` - Id int `sql:"id,pk"` - StageName bean.WorkflowStageName `sql:"stage_name,notnull"` // same as app name - Status bean.WorkflowStageStatus `sql:"status"` - StatusType bean.WorkflowStageStatusType `sql:"status_type"` - Message string `sql:"message"` - Metadata string `sql:"metadata"` - WorkflowId int `sql:"workflow_id,notnull"` - WorkflowType string `sql:"workflow_type,notnull"` - StartTime string `sql:"start_time"` - EndTime string `sql:"end_time"` + tableName struct{} `sql:"workflow_execution_stage" pg:",discard_unknown_columns"` + Id int `sql:"id,pk"` + StageName bean.WorkflowStageName `sql:"stage_name,notnull"` // same as app name + Status bean.WorkflowStageStatus `sql:"status"` + StatusFor bean.WorkflowStageStatusFor `sql:"status_type"` + Message string `sql:"message"` + Metadata string `sql:"metadata"` + WorkflowId int `sql:"workflow_id,notnull"` + WorkflowType string `sql:"workflow_type,notnull"` + StartTime string `sql:"start_time"` + EndTime string `sql:"end_time"` sql.AuditLog } diff --git a/scripts/sql/31902800_build_worker_status.up.sql b/scripts/sql/31902800_build_worker_status.up.sql index 0b7e5b1942..2a43914bb7 100644 --- a/scripts/sql/31902800_build_worker_status.up.sql +++ b/scripts/sql/31902800_build_worker_status.up.sql @@ -3,8 +3,9 @@ CREATE SEQUENCE IF NOT EXISTS id_seq_workflow_execution_stage; CREATE TABLE IF NOT EXISTS public.workflow_execution_stage ( id int4 NOT NULL DEFAULT nextval('id_seq_workflow_execution_stage'::regclass), stage_name varchar(50) NULL, + step_name varchar(50) NULL, status varchar(50) NULL, - status_type varchar(50) NULL, + status_for varchar(50) NULL, message text NULL, metadata text NULL, workflow_id int4 NOT NULL, From 67ed0dec46a61145513af8afc6d29f0869cd5dd2 Mon Sep 17 00:00:00 2001 From: Shivam Nagar <124123645+Shivam-nagar23@users.noreply.github.com> Date: Tue, 4 Feb 2025 11:36:38 +0530 Subject: [PATCH 26/43] feat: sql script changes for operation audit (#6342) * permissions audit * adpater and repo changes * save audit * audits for user and role group * permissions audit * permissions schema for * generic operation audit repo adn service * renaming * operations audit service * schema added * opeartions audit * audit generic changes * audit struct change * permissions chanages * sql script * sql script * sql fetch * role grouplisting fix * role group validation * removed opeartion audit pkg from oss * column change --- api/bean/UserRequest.go | 38 +++++++++++++++++++ internal/util/adapter.go | 10 +++++ pkg/auth/user/RoleGroupService.go | 6 ++- scripts/sql/31902800_operation_audit.down.sql | 5 +++ scripts/sql/31902800_operation_audit.up.sql | 21 ++++++++++ wire_gen.go | 2 +- 6 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 internal/util/adapter.go create mode 100644 scripts/sql/31902800_operation_audit.down.sql create mode 100644 scripts/sql/31902800_operation_audit.up.sql diff --git a/api/bean/UserRequest.go b/api/bean/UserRequest.go index 3b56044aaf..bc670469c7 100644 --- a/api/bean/UserRequest.go +++ b/api/bean/UserRequest.go @@ -19,6 +19,7 @@ package bean import ( "encoding/json" "github.com/devtron-labs/devtron/pkg/auth/user/bean" + "github.com/devtron-labs/devtron/pkg/sql" "time" ) @@ -168,3 +169,40 @@ type BulkDeleteRequest struct { type UserRoleGroup struct { RoleGroup *RoleGroup `json:"roleGroup"` } + +type GroupPermissionsAuditDto struct { + RoleGroupInfo *RoleGroup `json:"roleGroupInfo,omitempty"` + EntityAudit sql.AuditLog `json:"entityAudit,omitempty"` +} + +func NewGroupPermissionsAuditDto() *GroupPermissionsAuditDto { + return &GroupPermissionsAuditDto{} +} + +func (pa *GroupPermissionsAuditDto) WithRoleGroupInfo(roleGroupInfo *RoleGroup) *GroupPermissionsAuditDto { + pa.RoleGroupInfo = roleGroupInfo + return pa +} +func (pa *GroupPermissionsAuditDto) WithEntityAudit(entityAudit sql.AuditLog) *GroupPermissionsAuditDto { + pa.EntityAudit = entityAudit + return pa +} + +type UserPermissionsAuditDto struct { + UserInfo *UserInfo `json:"userInfo,omitempty"` + EntityAudit sql.AuditLog `json:"entityAudit,omitempty"` +} + +func NewUserPermissionsAuditDto() *UserPermissionsAuditDto { + return &UserPermissionsAuditDto{} +} + +func (pa *UserPermissionsAuditDto) WithUserInfo(userInfo *UserInfo) *UserPermissionsAuditDto { + pa.UserInfo = userInfo + return pa +} + +func (pa *UserPermissionsAuditDto) WithEntityAudit(entityAudit sql.AuditLog) *UserPermissionsAuditDto { + pa.EntityAudit = entityAudit + return pa +} diff --git a/internal/util/adapter.go b/internal/util/adapter.go new file mode 100644 index 0000000000..2a2a3a0f62 --- /dev/null +++ b/internal/util/adapter.go @@ -0,0 +1,10 @@ +package util + +func GetApiErrorAdapter(httpStatusCode int, code, userMessage, internalMessage string) *ApiError { + return &ApiError{ + HttpStatusCode: httpStatusCode, + Code: code, + UserMessage: userMessage, + InternalMessage: internalMessage, + } +} diff --git a/pkg/auth/user/RoleGroupService.go b/pkg/auth/user/RoleGroupService.go index 664521276d..d0d4c71f73 100644 --- a/pkg/auth/user/RoleGroupService.go +++ b/pkg/auth/user/RoleGroupService.go @@ -89,11 +89,15 @@ func (impl RoleGroupServiceImpl) CreateRoleGroup(request *bean.RoleGroup) (*bean defer tx.Rollback() if request.Id > 0 { - _, err := impl.roleGroupRepository.GetRoleGroupById(request.Id) + roleGroup, err := impl.roleGroupRepository.GetRoleGroupById(request.Id) if err != nil { impl.logger.Errorw("error while fetching user from db", "error", err) return nil, err } + if roleGroup != nil && len(roleGroup.Name) > 0 { + return nil, util.GetApiErrorAdapter(400, "400", "role group already exist with the given id", "role group already exist with the given id") + } + return nil, util.GetApiErrorAdapter(400, "400", "id not supported in create request", "id not supported in create request") } else { //loading policy for safety casbin2.LoadPolicy() diff --git a/scripts/sql/31902800_operation_audit.down.sql b/scripts/sql/31902800_operation_audit.down.sql new file mode 100644 index 0000000000..9088fbe9d8 --- /dev/null +++ b/scripts/sql/31902800_operation_audit.down.sql @@ -0,0 +1,5 @@ +-- Drop Table: operation_audit +DROP TABLE IF EXISTS "public"."operation_audit"; + +-- Drop Sequence: id_seq_operation_audit +DROP SEQUENCE IF EXISTS id_seq_operation_audit; \ No newline at end of file diff --git a/scripts/sql/31902800_operation_audit.up.sql b/scripts/sql/31902800_operation_audit.up.sql new file mode 100644 index 0000000000..05d1744d8f --- /dev/null +++ b/scripts/sql/31902800_operation_audit.up.sql @@ -0,0 +1,21 @@ +BEGIN; + +-- Create Sequence for operation_audit +CREATE SEQUENCE IF NOT EXISTS id_seq_operation_audit; + +-- Table Definition: operation_audit +CREATE TABLE IF NOT EXISTS "public"."operation_audit" ( + "id" int NOT NULL DEFAULT nextval('id_seq_operation_audit'::regclass), + "entity_id" int NOT NULL, + "entity_type" VARCHAR(50) NOT NULL , + "operation_type" VARCHAR(20) NOT NULL, + "entity_value_json" jsonb NOT NULL, + "entity_value_schema_type" VARCHAR(20) NOT NULL, + "created_on" timestamptz NOT NULL, + "created_by" int4 NOT NULL, + "updated_on" timestamptz NOT NULL, + "updated_by" int4 NOT NULL, + PRIMARY KEY ("id") + ); + +COMMIT; \ No newline at end of file diff --git a/wire_gen.go b/wire_gen.go index b59e017b53..07018678d2 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -1,6 +1,6 @@ // Code generated by Wire. DO NOT EDIT. -//go:generate go run -mod=mod github.com/google/wire/cmd/wire +//go:generate go run github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject From 06d4e950561231760ecd4bb05352c772fb704b6e Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 4 Feb 2025 21:20:30 +0530 Subject: [PATCH 27/43] merge conflicts + code refactor --- pkg/pipeline/CdHandler.go | 4 +- pkg/pipeline/CiHandler.go | 4 +- .../WorkflowStageStatusService.go | 51 ++----------------- .../workflowStatus/adapter/adapter.go | 11 ++-- .../repository/WorkflowStageRepository.go | 12 ----- pkg/workflow/cd/CdWorkflowRunnerService.go | 41 +++++++++++++++ 6 files changed, 56 insertions(+), 67 deletions(-) diff --git a/pkg/pipeline/CdHandler.go b/pkg/pipeline/CdHandler.go index c1365c6b3f..22f1efc15a 100644 --- a/pkg/pipeline/CdHandler.go +++ b/pkg/pipeline/CdHandler.go @@ -494,7 +494,7 @@ func (impl *CdHandlerImpl) GetCdBuildHistory(appId int, environmentId int, pipel wfIdToWfTypeMap[item.Id] = item } } - wfRunnerIdToStageDetailMap, err := impl.workflowStageStatusService.GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdToWfTypeMap) + wfRunnerIdToStageDetailMap, err := impl.cdWorkflowRunnerService.GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdToWfTypeMap) if err != nil { impl.Logger.Errorw("error in fetching pre/post stage data", "err", err) return cdWorkflowArtifact, err @@ -640,7 +640,7 @@ func (impl *CdHandlerImpl) FetchCdWorkflowDetails(appId int, environmentId int, if workflowR.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE || workflowR.WorkflowType == bean.CD_WORKFLOW_TYPE_POST { //get execution stage data impl.Logger.Infow("fetching pre/post workflow stages", "workflowId", workflowR.Id, "workflowType", workflowR.WorkflowType) - workflowStageData, err := impl.workflowStageStatusService.GetPrePostWorkflowStagesByWorkflowIdAndType(workflowR.Id, workflowR.WorkflowType.String()) + workflowStageData, err := impl.workflowStageStatusService.GetWorkflowStagesByWorkflowIdAndType(workflowR.Id, workflowR.WorkflowType.String()) if err != nil { impl.Logger.Errorw("error in fetching pre/post workflow stages", "err", err) return types.WorkflowResponse{}, err diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index c5198b3319..4e9df000e8 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -537,7 +537,7 @@ func (impl *CiHandlerImpl) GetBuildHistory(pipelineId int, appId int, offset int workflowIds = append(workflowIds, w.Id) } - allWfStagesDetail, err := impl.workFlowStageStatusService.GetCiWorkflowStagesByWorkflowIds(workflowIds) + allWfStagesDetail, err := impl.workFlowStageStatusService.GetWorkflowStagesByWorkflowIdsAndWfType(workflowIds, bean2.CI_WORKFLOW_TYPE.String()) if err != nil { impl.Logger.Errorw("error in fetching allWfStagesDetail", "err", err, "workflowIds", workflowIds) return nil, err @@ -793,7 +793,7 @@ func (impl *CiHandlerImpl) FetchWorkflowDetails(appId int, pipelineId int, build impl.ciWorkflowRepository.MigrateIsArtifactUploaded(workflow.Id, ciArtifact.IsArtifactUploaded) isArtifactUploaded = ciArtifact.IsArtifactUploaded } - wfStagesDetail, err := impl.workFlowStageStatusService.GetCiWorkflowStagesByWorkflowIds([]int{workflow.Id}) + wfStagesDetail, err := impl.workFlowStageStatusService.GetWorkflowStagesByWorkflowIdsAndWfType([]int{workflow.Id}, bean2.CI_WORKFLOW_TYPE.String()) if err != nil { impl.Logger.Errorw("error in fetching allWfStagesDetail", "err", err, "workflowId", workflow.Id) return types.WorkflowResponse{}, err diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 8ee3d9ba48..5bd6cf6474 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -7,7 +7,6 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" bean3 "github.com/devtron-labs/devtron/pkg/bean" - bean4 "github.com/devtron-labs/devtron/pkg/pipeline/bean" "github.com/devtron-labs/devtron/pkg/pipeline/constants" "github.com/devtron-labs/devtron/pkg/pipeline/types" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/adapter" @@ -23,10 +22,8 @@ import ( ) type WorkFlowStageStatusService interface { - //todo move read functions for ci and cd from here to their respective services. CiService and CdWorkflowRunnerService - GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*repository.WorkflowExecutionStage, error) - GetPrePostWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) - GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean2.WorkflowStageDto, error) + GetWorkflowStagesByWorkflowIdsAndWfType(wfIds []int, wfType string) ([]*repository.WorkflowExecutionStage, error) + GetWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) SaveWorkflowStages(wfId int, wfType, wfName string, tx *pg.Tx) error UpdateWorkflowStages(wfId int, wfType, wfName, wfStatus, podStatus, message, podName string, tx *pg.Tx) (string, string, error) @@ -284,10 +281,10 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( return currentWorkflowStages, updatedWfStatus } -func (impl *WorkFlowStageStatusServiceImpl) GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*repository.WorkflowExecutionStage, error) { +func (impl *WorkFlowStageStatusServiceImpl) GetWorkflowStagesByWorkflowIdsAndWfType(wfIds []int, wfType string) ([]*repository.WorkflowExecutionStage, error) { // implementation - dbData, err := impl.workflowStatusRepository.GetCiWorkflowStagesByWorkflowIds(wfIds) + dbData, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdsAndWtype(wfIds, wfType) if err != nil { impl.logger.Errorw("error in getting ci workflow stages", "error", err) return nil, err @@ -299,7 +296,7 @@ func (impl *WorkFlowStageStatusServiceImpl) GetCiWorkflowStagesByWorkflowIds(wfI } } -func (impl *WorkFlowStageStatusServiceImpl) GetPrePostWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) { +func (impl *WorkFlowStageStatusServiceImpl) GetWorkflowStagesByWorkflowIdAndType(wfId int, wfType string) ([]*repository.WorkflowExecutionStage, error) { // implementation dbData, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdAndWtype(wfId, wfType) @@ -314,44 +311,6 @@ func (impl *WorkFlowStageStatusServiceImpl) GetPrePostWorkflowStagesByWorkflowId } } -func (impl *WorkFlowStageStatusServiceImpl) GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean2.WorkflowStageDto, error) { - // implementation - resp := map[int]map[string][]*bean2.WorkflowStageDto{} - if len(wfIdWfTypeMap) == 0 { - return resp, nil - } - //first create a map of pre-runner ids and post-runner ids - prePostRunnerIds := map[string][]int{} - for wfId, wf := range wfIdWfTypeMap { - if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE.String() { - prePostRunnerIds[bean.CD_WORKFLOW_TYPE_PRE.String()] = append(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_PRE.String()], wfId) - } else if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_POST.String() { - prePostRunnerIds[bean.CD_WORKFLOW_TYPE_POST.String()] = append(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_POST.String()], wfId) - } - } - - preCdDbData, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdsAndWtype(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_PRE.String()], bean.CD_WORKFLOW_TYPE_PRE.String()) - if err != nil { - impl.logger.Errorw("error in getting pre-ci workflow stages", "error", err) - return resp, err - } - //do the above for post cd - postCdDbData, err := impl.workflowStatusRepository.GetWorkflowStagesByWorkflowIdsAndWtype(prePostRunnerIds[bean.CD_WORKFLOW_TYPE_POST.String()], bean.CD_WORKFLOW_TYPE_POST.String()) - if err != nil { - impl.logger.Errorw("error in getting post-ci workflow stages", "error", err) - return resp, err - } - //iterate over prePostRunnerIds and create response structure using ConvertDBWorkflowStageToMap function - for wfId, wf := range wfIdWfTypeMap { - if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_PRE.String() { - resp[wfId] = impl.ConvertDBWorkflowStageToMap(preCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) - } else if wf.WorkflowType == bean.CD_WORKFLOW_TYPE_POST.String() { - resp[wfId] = impl.ConvertDBWorkflowStageToMap(postCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) - } - } - return resp, nil -} - func (impl *WorkFlowStageStatusServiceImpl) ConvertDBWorkflowStageToMap(workflowStages []*repository.WorkflowExecutionStage, wfId int, status, podStatus, message, wfType string, startTime, endTime time.Time) map[string][]*bean2.WorkflowStageDto { wfMap := make(map[string][]*bean2.WorkflowStageDto) foundInDb := false diff --git a/pkg/pipeline/workflowStatus/adapter/adapter.go b/pkg/pipeline/workflowStatus/adapter/adapter.go index 65380932a9..7d81975033 100644 --- a/pkg/pipeline/workflowStatus/adapter/adapter.go +++ b/pkg/pipeline/workflowStatus/adapter/adapter.go @@ -2,6 +2,7 @@ package adapter import ( "encoding/json" + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" bean3 "github.com/devtron-labs/devtron/pkg/bean" "github.com/devtron-labs/devtron/pkg/pipeline/constants" @@ -44,19 +45,19 @@ func getMetadataJson(metadata string) map[string]interface{} { func ConvertStatusToDevtronStatus(wfStatus string, wfMessage string) bean.WorkflowStageStatus { // implementation switch strings.ToLower(wfStatus) { - case "pending", strings.ToLower(cdWorkflow.WorkflowWaitingToStart): + case strings.ToLower(string(v1alpha1.NodePending)), strings.ToLower(cdWorkflow.WorkflowWaitingToStart): return bean.WORKFLOW_STAGE_STATUS_NOT_STARTED - case "starting", "running": + case strings.ToLower(cdWorkflow.WorkflowStarting), strings.ToLower(string(v1alpha1.NodeRunning)): return bean.WORKFLOW_STAGE_STATUS_RUNNING - case "succeeded": + case strings.ToLower(cdWorkflow.WorkflowSucceeded): return bean.WORKFLOW_STAGE_STATUS_SUCCEEDED - case "failed", "error", "errored": + case strings.ToLower(cdWorkflow.WorkflowFailed), strings.ToLower(string(v1alpha1.NodeError)), "errored": if strings.ToLower(wfMessage) == strings.ToLower(constants.POD_TIMEOUT_MESSAGE) { return bean.WORKFLOW_STAGE_STATUS_TIMEOUT } else { return bean.WORKFLOW_STAGE_STATUS_FAILED } - case "aborted", "cancelled": + case strings.ToLower(cdWorkflow.WorkflowAborted), strings.ToLower(cdWorkflow.WorkflowCancel): return bean.WORKFLOW_STAGE_STATUS_ABORTED default: log.Println("unknown wf status", "wf", wfStatus) diff --git a/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go index a30686159f..720d397794 100644 --- a/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go +++ b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go @@ -1,7 +1,6 @@ package repository import ( - bean2 "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" "github.com/devtron-labs/devtron/pkg/sql" "github.com/go-pg/pg" @@ -12,7 +11,6 @@ type WorkflowStageRepository interface { SaveWorkflowStages(workflowStage []*WorkflowExecutionStage, tx *pg.Tx) ([]*WorkflowExecutionStage, error) UpdateWorkflowStages(workflowStage []*WorkflowExecutionStage, tx *pg.Tx) ([]*WorkflowExecutionStage, error) GetWorkflowStagesByWorkflowIdAndType(workflowId int, workflowType string) ([]*WorkflowExecutionStage, error) - GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*WorkflowExecutionStage, error) GetWorkflowStagesByWorkflowIdAndWtype(wfId int, wfType string) ([]*WorkflowExecutionStage, error) GetWorkflowStagesByWorkflowIdsAndWtype(wfIds []int, wfType string) ([]*WorkflowExecutionStage, error) } @@ -72,16 +70,6 @@ func (impl *WorkflowStageRepositoryImpl) GetWorkflowStagesByWorkflowIdAndType(wo return workflowStages, err } -func (impl *WorkflowStageRepositoryImpl) GetCiWorkflowStagesByWorkflowIds(wfIds []int) ([]*WorkflowExecutionStage, error) { - var workflowStages []*WorkflowExecutionStage - err := impl.dbConnection.Model(&workflowStages).Where("workflow_id in (?)", pg.In(wfIds)).Where("workflow_type = ?", bean2.CI_WORKFLOW_TYPE).Order("id ASC").Select() - if err != nil { - impl.logger.Errorw("error in fetching ci workflow stages", "err", err) - return workflowStages, err - } - return workflowStages, err -} - func (impl *WorkflowStageRepositoryImpl) GetWorkflowStagesByWorkflowIdAndWtype(wfId int, wfType string) ([]*WorkflowExecutionStage, error) { var workflowStages []*WorkflowExecutionStage err := impl.dbConnection.Model(&workflowStages).Where("workflow_id = ?", wfId).Where("workflow_type = ?", wfType).Order("id ASC").Select() diff --git a/pkg/workflow/cd/CdWorkflowRunnerService.go b/pkg/workflow/cd/CdWorkflowRunnerService.go index 67326e3038..9feb66a059 100644 --- a/pkg/workflow/cd/CdWorkflowRunnerService.go +++ b/pkg/workflow/cd/CdWorkflowRunnerService.go @@ -21,8 +21,10 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" + bean4 "github.com/devtron-labs/devtron/pkg/pipeline/bean" "github.com/devtron-labs/devtron/pkg/pipeline/types" "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" + bean3 "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus/bean" "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/workflow/cd/adapter" "github.com/devtron-labs/devtron/pkg/workflow/cd/bean" @@ -34,6 +36,7 @@ type CdWorkflowRunnerService interface { UpdateIsArtifactUploaded(wfrId int, isArtifactUploaded bool) error SaveCDWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) (*pipelineConfig.CdWorkflowRunner, error) UpdateCdWorkflowRunnerWithStage(wfr *pipelineConfig.CdWorkflowRunner) error + GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean3.WorkflowStageDto, error) } type CdWorkflowRunnerServiceImpl struct { @@ -156,3 +159,41 @@ func (impl *CdWorkflowRunnerServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr *pi return nil } + +func (impl *CdWorkflowRunnerServiceImpl) GetPrePostWorkflowStagesByWorkflowRunnerIdsList(wfIdWfTypeMap map[int]bean4.CdWorkflowWithArtifact) (map[int]map[string][]*bean3.WorkflowStageDto, error) { + // implementation + resp := map[int]map[string][]*bean3.WorkflowStageDto{} + if len(wfIdWfTypeMap) == 0 { + return resp, nil + } + //first create a map of pre-runner ids and post-runner ids + prePostRunnerIds := map[string][]int{} + for wfId, wf := range wfIdWfTypeMap { + if wf.WorkflowType == bean2.CD_WORKFLOW_TYPE_PRE.String() { + prePostRunnerIds[bean2.CD_WORKFLOW_TYPE_PRE.String()] = append(prePostRunnerIds[bean2.CD_WORKFLOW_TYPE_PRE.String()], wfId) + } else if wf.WorkflowType == bean2.CD_WORKFLOW_TYPE_POST.String() { + prePostRunnerIds[bean2.CD_WORKFLOW_TYPE_POST.String()] = append(prePostRunnerIds[bean2.CD_WORKFLOW_TYPE_POST.String()], wfId) + } + } + + preCdDbData, err := impl.workflowStageService.GetWorkflowStagesByWorkflowIdsAndWfType(prePostRunnerIds[bean2.CD_WORKFLOW_TYPE_PRE.String()], bean2.CD_WORKFLOW_TYPE_PRE.String()) + if err != nil { + impl.logger.Errorw("error in getting pre-ci workflow stages", "error", err) + return resp, err + } + //do the above for post cd + postCdDbData, err := impl.workflowStageService.GetWorkflowStagesByWorkflowIdsAndWfType(prePostRunnerIds[bean2.CD_WORKFLOW_TYPE_POST.String()], bean2.CD_WORKFLOW_TYPE_POST.String()) + if err != nil { + impl.logger.Errorw("error in getting post-ci workflow stages", "error", err) + return resp, err + } + //iterate over prePostRunnerIds and create response structure using ConvertDBWorkflowStageToMap function + for wfId, wf := range wfIdWfTypeMap { + if wf.WorkflowType == bean2.CD_WORKFLOW_TYPE_PRE.String() { + resp[wfId] = impl.workflowStageService.ConvertDBWorkflowStageToMap(preCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) + } else if wf.WorkflowType == bean2.CD_WORKFLOW_TYPE_POST.String() { + resp[wfId] = impl.workflowStageService.ConvertDBWorkflowStageToMap(postCdDbData, wfId, wf.Status, wf.PodStatus, wf.Message, wf.WorkflowType, wf.StartedOn, wf.FinishedOn) + } + } + return resp, nil +} From d414d6fdd7646a3cd8c75b07081ba651f463f5da Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 7 Feb 2025 10:17:03 +0530 Subject: [PATCH 28/43] handle failure cases before scheduling --- .../devtronApps/PreStageTriggerService.go | 2 + pkg/pipeline/CiService.go | 2 + .../WorkflowStageStatusService.go | 43 +++++++++++++++---- pkg/pipeline/workflowStatus/util/util.go | 2 +- pkg/workflow/cd/CdWorkflowRunnerService.go | 6 +-- 5 files changed, 43 insertions(+), 12 deletions(-) diff --git a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go index ee87dd748e..6e0b81c207 100644 --- a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go +++ b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" blob_storage "github.com/devtron-labs/common-lib/blob-storage" commonBean "github.com/devtron-labs/common-lib/workflow" bean2 "github.com/devtron-labs/devtron/api/bean" @@ -251,6 +252,7 @@ func (impl *TriggerServiceImpl) createStartingWfAndRunner(request bean.TriggerRe WorkflowType: request.WorkflowType, ExecutorType: impl.config.GetWorkflowExecutorType(), Status: cdWorkflow.WorkflowStarting, // starting PreStage + PodStatus: string(v1alpha1.NodePending), TriggeredBy: triggeredBy, StartedOn: triggeredAt, Namespace: request.RunStageInEnvNamespace, diff --git a/pkg/pipeline/CiService.go b/pkg/pipeline/CiService.go index bd1aad681f..e9e2e40579 100644 --- a/pkg/pipeline/CiService.go +++ b/pkg/pipeline/CiService.go @@ -20,6 +20,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" "github.com/caarlos0/env" "github.com/devtron-labs/common-lib/utils" bean3 "github.com/devtron-labs/common-lib/utils/bean" @@ -1149,6 +1150,7 @@ func (impl *CiServiceImpl) SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow }() if impl.config.EnableWorkflowExecutionStage { wf.Status = cdWorkflow.WorkflowWaitingToStart + wf.PodStatus = string(v1alpha1.NodePending) } err = impl.ciWorkflowRepository.SaveWorkFlowWithTx(wf, tx) if err != nil { diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 5bd6cf6474..d376a68c67 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -36,7 +36,7 @@ type WorkFlowStageStatusServiceImpl struct { ciWorkflowRepository pipelineConfig.CiWorkflowRepository cdWorkflowRepository pipelineConfig.CdWorkflowRepository transactionManager sql.TransactionWrapper - config *types.CiCdConfig + config *types.CiConfig } func NewWorkflowStageFlowStatusServiceImpl(logger *zap.SugaredLogger, @@ -52,11 +52,11 @@ func NewWorkflowStageFlowStatusServiceImpl(logger *zap.SugaredLogger, cdWorkflowRepository: cdWorkflowRepository, transactionManager: transactionManager, } - ciCdConfig, err := types.GetCiCdConfig() + ciConfig, err := types.GetCiConfig() if err != nil { return nil } - wfStageServiceImpl.config = ciCdConfig + wfStageServiceImpl.config = ciConfig return wfStageServiceImpl } @@ -93,7 +93,7 @@ func (impl *WorkFlowStageStatusServiceImpl) getUpdatedPipelineStagesForWorkflow( } impl.logger.Infow("step-1", "wfId", wfId, "wfType", wfType, "wfStatus", wfStatus, "currentWfDBstatus", currentWfDBstatus, "podStatus", podStatus, "currentPodStatus", currentPodStatus, "message", message) - currentWorkflowStages, updatedPodStatus := impl.updatePodStages(currentWorkflowStages, podStatus, currentPodStatus, message, podName) + currentWorkflowStages, updatedPodStatus := impl.updatePodStages(currentWorkflowStages, podStatus, currentPodStatus, message, podName, wfStatus) impl.logger.Infow("step-2", "updatedPodStatus", updatedPodStatus, "updated pod stages", currentWorkflowStages) currentWorkflowStages, updatedWfStatus := impl.updateWorkflowStagesToDevtronStatus(currentWorkflowStages, wfStatus, currentWfDBstatus, message, podStatus) impl.logger.Infow("step-3", "updatedWfStatus", updatedWfStatus, "updatedPodStatus", updatedPodStatus, "updated workflow stages", currentWorkflowStages) @@ -101,7 +101,7 @@ func (impl *WorkFlowStageStatusServiceImpl) getUpdatedPipelineStagesForWorkflow( return currentWorkflowStages, updatedWfStatus, updatedPodStatus } -func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStages []*repository.WorkflowExecutionStage, podStatus string, currentPodStatus string, message string, podName string) ([]*repository.WorkflowExecutionStage, string) { +func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStages []*repository.WorkflowExecutionStage, podStatus string, currentPodStatus string, message string, podName string, wfStatus string) ([]*repository.WorkflowExecutionStage, string) { updatedPodStatus := currentPodStatus if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentPodStatus) { updatedPodStatus = podStatus @@ -147,9 +147,18 @@ func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStage } default: impl.logger.Errorw("unknown pod status", "podStatus", podStatus, "message", message) - stage.Message = message - stage.Status = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN - stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + if stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED { + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, "") + if extractedStatus.IsTerminal() { + stage.Status = extractedStatus + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + updatedPodStatus = wfStatus + } + } else { + stage.Message = message + stage.Status = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + } } } } @@ -275,6 +284,24 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( } } } + if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { + //assumption: once pod is running we don't internally do any extra operation which would call this function and simply update status accrording to kubewatch events + //that's why we are getting pod status as unknown because we don't explicity set pod status + //this is the case when our internal code has called to update status before actually scheduling pod + //update wf status as given in request, don't change that + updatedWfStatus = util.ComputeWorkflowStatus(currentWfDBstatus, wfStatus, "") + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) + if extractedStatus.IsTerminal() { + stage.Status = extractedStatus + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { + updatedWfStatus = cdWorkflow.WorkflowTimedOut + } + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { + updatedWfStatus = cdWorkflow.WorkflowCancel + } + } + } } } diff --git a/pkg/pipeline/workflowStatus/util/util.go b/pkg/pipeline/workflowStatus/util/util.go index 95933c5c14..ab347ad277 100644 --- a/pkg/pipeline/workflowStatus/util/util.go +++ b/pkg/pipeline/workflowStatus/util/util.go @@ -8,7 +8,7 @@ import ( func ComputeWorkflowStatus(currentWfDBstatus, wfStatus, stageStatus string) string { updatedWfStatus := currentWfDBstatus if !slices.Contains(cdWorkflow.WfrTerminalStatusList, currentWfDBstatus) { - if !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { + if len(stageStatus) > 0 && !slices.Contains(cdWorkflow.WfrTerminalStatusList, wfStatus) { updatedWfStatus = stageStatus } else { updatedWfStatus = wfStatus diff --git a/pkg/workflow/cd/CdWorkflowRunnerService.go b/pkg/workflow/cd/CdWorkflowRunnerService.go index 9feb66a059..7d5f00a425 100644 --- a/pkg/workflow/cd/CdWorkflowRunnerService.go +++ b/pkg/workflow/cd/CdWorkflowRunnerService.go @@ -44,7 +44,7 @@ type CdWorkflowRunnerServiceImpl struct { cdWorkflowRepository pipelineConfig.CdWorkflowRepository workflowStageService workflowStatus.WorkFlowStageStatusService transactionManager sql.TransactionWrapper - config *types.CiCdConfig + config *types.CiConfig } func NewCdWorkflowRunnerServiceImpl(logger *zap.SugaredLogger, @@ -57,11 +57,11 @@ func NewCdWorkflowRunnerServiceImpl(logger *zap.SugaredLogger, workflowStageService: workflowStageService, transactionManager: transactionManager, } - ciCdConfig, err := types.GetCiCdConfig() + ciConfig, err := types.GetCiConfig() if err != nil { return nil } - impl.config = ciCdConfig + impl.config = ciConfig return impl } From 1d684164aa1a5dffd9791da56b26dc44e4cb6605 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 7 Feb 2025 10:21:07 +0530 Subject: [PATCH 29/43] updated sql scripts number --- ...operation_audit.down.sql => 31902900_operation_audit.down.sql} | 0 ...800_operation_audit.up.sql => 31902900_operation_audit.up.sql} | 0 ...rker_status.down.sql => 32002900_build_worker_status.down.sql} | 0 ...d_worker_status.up.sql => 32002900_build_worker_status.up.sql} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename scripts/sql/{31902800_operation_audit.down.sql => 31902900_operation_audit.down.sql} (100%) rename scripts/sql/{31902800_operation_audit.up.sql => 31902900_operation_audit.up.sql} (100%) rename scripts/sql/{31902800_build_worker_status.down.sql => 32002900_build_worker_status.down.sql} (100%) rename scripts/sql/{31902800_build_worker_status.up.sql => 32002900_build_worker_status.up.sql} (100%) diff --git a/scripts/sql/31902800_operation_audit.down.sql b/scripts/sql/31902900_operation_audit.down.sql similarity index 100% rename from scripts/sql/31902800_operation_audit.down.sql rename to scripts/sql/31902900_operation_audit.down.sql diff --git a/scripts/sql/31902800_operation_audit.up.sql b/scripts/sql/31902900_operation_audit.up.sql similarity index 100% rename from scripts/sql/31902800_operation_audit.up.sql rename to scripts/sql/31902900_operation_audit.up.sql diff --git a/scripts/sql/31902800_build_worker_status.down.sql b/scripts/sql/32002900_build_worker_status.down.sql similarity index 100% rename from scripts/sql/31902800_build_worker_status.down.sql rename to scripts/sql/32002900_build_worker_status.down.sql diff --git a/scripts/sql/31902800_build_worker_status.up.sql b/scripts/sql/32002900_build_worker_status.up.sql similarity index 100% rename from scripts/sql/31902800_build_worker_status.up.sql rename to scripts/sql/32002900_build_worker_status.up.sql From 2a3a98704c2bf6f0d71a66b26f694735b8d5937d Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 7 Feb 2025 13:32:37 +0530 Subject: [PATCH 30/43] merge fix --- .../WorkflowStageStatusService.go | 33 ++++++++++--------- wire_gen.go | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index d376a68c67..2022e3fdd0 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -283,25 +283,26 @@ func (impl *WorkFlowStageStatusServiceImpl) updateWorkflowStagesToDevtronStatus( updatedWfStatus = bean2.WORKFLOW_STAGE_STATUS_UNKNOWN.ToString() } } - } - if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { - //assumption: once pod is running we don't internally do any extra operation which would call this function and simply update status accrording to kubewatch events - //that's why we are getting pod status as unknown because we don't explicity set pod status - //this is the case when our internal code has called to update status before actually scheduling pod - //update wf status as given in request, don't change that - updatedWfStatus = util.ComputeWorkflowStatus(currentWfDBstatus, wfStatus, "") - extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) - if extractedStatus.IsTerminal() { - stage.Status = extractedStatus - stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) - if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { - updatedWfStatus = cdWorkflow.WorkflowTimedOut - } - if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { - updatedWfStatus = cdWorkflow.WorkflowCancel + if stage.StageName == bean2.WORKFLOW_PREPARATION && !stage.Status.IsTerminal() { + //assumption: once pod is running we don't internally do any extra operation which would call this function and simply update status accrording to kubewatch events + //that's why we are getting pod status as unknown because we don't explicity set pod status + //this is the case when our internal code has called to update status before actually scheduling pod + //update wf status as given in request, don't change that + updatedWfStatus = util.ComputeWorkflowStatus(currentWfDBstatus, wfStatus, "") + extractedStatus := adapter.ConvertStatusToDevtronStatus(wfStatus, wfMessage) + if extractedStatus.IsTerminal() { + stage.Status = extractedStatus + stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_TIMEOUT { + updatedWfStatus = cdWorkflow.WorkflowTimedOut + } + if extractedStatus == bean2.WORKFLOW_STAGE_STATUS_ABORTED { + updatedWfStatus = cdWorkflow.WorkflowCancel + } } } } + } } diff --git a/wire_gen.go b/wire_gen.go index 4cad84b6a7..8141c31139 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -1,6 +1,6 @@ // Code generated by Wire. DO NOT EDIT. -//go:generate go run github.com/google/wire/cmd/wire +//go:generate go run -mod=mod github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject From 24b1ac3ee29e96ce061ff12319ae2cc8fb8c168f Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Fri, 7 Feb 2025 13:38:29 +0530 Subject: [PATCH 31/43] eso secret data clone fix --- pkg/appClone/AppCloneService.go | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/pkg/appClone/AppCloneService.go b/pkg/appClone/AppCloneService.go index 4daee21c85..44a1d7a409 100644 --- a/pkg/appClone/AppCloneService.go +++ b/pkg/appClone/AppCloneService.go @@ -548,19 +548,24 @@ func (impl *AppCloneServiceImpl) configDataClone(cfData []*bean3.ConfigData) []* var copiedData []*bean3.ConfigData for _, refdata := range cfData { data := &bean3.ConfigData{ - Name: refdata.Name, - Type: refdata.Type, - External: refdata.External, - MountPath: refdata.MountPath, - Data: refdata.Data, - DefaultData: refdata.DefaultData, - DefaultMountPath: refdata.DefaultMountPath, - Global: refdata.Global, - ExternalSecretType: refdata.ExternalSecretType, - FilePermission: refdata.FilePermission, - SubPath: refdata.SubPath, - ESOSubPath: refdata.ESOSubPath, - MergeStrategy: refdata.MergeStrategy, + Name: refdata.Name, + Type: refdata.Type, + External: refdata.External, + MountPath: refdata.MountPath, + Data: refdata.Data, + DefaultData: refdata.DefaultData, + DefaultMountPath: refdata.DefaultMountPath, + Global: refdata.Global, + ExternalSecretType: refdata.ExternalSecretType, + FilePermission: refdata.FilePermission, + SubPath: refdata.SubPath, + ESOSubPath: refdata.ESOSubPath, + MergeStrategy: refdata.MergeStrategy, + ESOSecretData: refdata.ESOSecretData, + DefaultESOSecretData: refdata.DefaultESOSecretData, + ExternalSecret: refdata.ExternalSecret, + DefaultExternalSecret: refdata.DefaultExternalSecret, + RoleARN: refdata.RoleARN, } copiedData = append(copiedData, data) } From cb3ca49aabc3f5f0bf127e49d1b4fb6324738d27 Mon Sep 17 00:00:00 2001 From: prakhar katiyar Date: Fri, 7 Feb 2025 14:34:26 +0530 Subject: [PATCH 32/43] notification fixes --- pkg/notifier/NotificationConfigService.go | 40 +++-------------------- pkg/notifier/SESNotificationService.go | 15 ++++++--- pkg/notifier/SMTPNotificationService.go | 15 ++++++--- 3 files changed, 25 insertions(+), 45 deletions(-) diff --git a/pkg/notifier/NotificationConfigService.go b/pkg/notifier/NotificationConfigService.go index 02b97660f4..00681337eb 100644 --- a/pkg/notifier/NotificationConfigService.go +++ b/pkg/notifier/NotificationConfigService.go @@ -294,23 +294,14 @@ func (impl *NotificationConfigServiceImpl) BuildNotificationSettingsResponse(not if config.Providers != nil && len(config.Providers) > 0 { var slackIds []*int var webhookIds []*int - var sesUserIds []int32 - var smtpUserIds []int32 var providerConfigs []*beans.ProvidersConfig for _, item := range config.Providers { - // if item.ConfigId > 0 that means, user is of user repository, else user email is custom - if item.ConfigId > 0 { - if item.Destination == util.Slack { - slackIds = append(slackIds, &item.ConfigId) - } else if item.Destination == util.SES { - sesUserIds = append(sesUserIds, int32(item.ConfigId)) - } else if item.Destination == util.SMTP { - smtpUserIds = append(smtpUserIds, int32(item.ConfigId)) - } else if item.Destination == util.Webhook { - webhookIds = append(webhookIds, &item.ConfigId) - } + if item.Destination == util.Slack { + slackIds = append(slackIds, &item.ConfigId) + } else if item.Destination == util.Webhook { + webhookIds = append(webhookIds, &item.ConfigId) } else { - providerConfigs = append(providerConfigs, &beans.ProvidersConfig{Dest: string(item.Destination), Recipient: item.Recipient}) + providerConfigs = append(providerConfigs, &beans.ProvidersConfig{Dest: string(item.Destination), Recipient: item.Recipient, Id: item.ConfigId}) } } if len(slackIds) > 0 { @@ -333,27 +324,6 @@ func (impl *NotificationConfigServiceImpl) BuildNotificationSettingsResponse(not providerConfigs = append(providerConfigs, &beans.ProvidersConfig{Id: item.Id, ConfigName: item.ConfigName, Dest: string(util.Webhook)}) } } - - if len(sesUserIds) > 0 { - sesConfigs, err := impl.userRepository.GetByIds(sesUserIds) - if err != nil && err != pg.ErrNoRows { - impl.logger.Errorw("error in fetching user", "sesUserIds", sesUserIds, "error", err) - return notificationSettingsResponses, deletedItemCount, err - } - for _, item := range sesConfigs { - providerConfigs = append(providerConfigs, &beans.ProvidersConfig{Id: int(item.Id), ConfigName: item.EmailId, Dest: string(util.SES)}) - } - } - if len(smtpUserIds) > 0 { - smtpConfigs, err := impl.userRepository.GetByIds(smtpUserIds) - if err != nil && err != pg.ErrNoRows { - impl.logger.Errorw("error in fetching user", "smtpUserIds", smtpUserIds, "error", err) - return notificationSettingsResponses, deletedItemCount, err - } - for _, item := range smtpConfigs { - providerConfigs = append(providerConfigs, &beans.ProvidersConfig{Id: int(item.Id), ConfigName: item.EmailId, Dest: string(util.SMTP)}) - } - } notificationSettingsResponse.ProvidersConfig = providerConfigs } diff --git a/pkg/notifier/SESNotificationService.go b/pkg/notifier/SESNotificationService.go index 60f7244fb7..324ffac9d0 100644 --- a/pkg/notifier/SESNotificationService.go +++ b/pkg/notifier/SESNotificationService.go @@ -60,6 +60,12 @@ func (impl *SESNotificationServiceImpl) SaveOrEditNotificationConfig(channelReq for _, config := range sesConfigs { if config.Id != 0 { + model, err := impl.sesRepository.FindOne(config.Id) + if err != nil && !util.IsErrNoRows(err) { + impl.logger.Errorw("err while fetching ses config", "err", err) + return []int{}, err + } + if config.Default { _, err := impl.sesRepository.UpdateSESConfigDefault() if err != nil && !util.IsErrNoRows(err) { @@ -67,6 +73,10 @@ func (impl *SESNotificationServiceImpl) SaveOrEditNotificationConfig(channelReq return []int{}, err } } else { + // check if this config is already default, we don't want to reverse it + if model.Default { + return []int{}, fmt.Errorf("cannot update default config to non default") + } _, err := impl.sesRepository.FindDefault() if err != nil && !util.IsErrNoRows(err) { impl.logger.Errorw("err while updating ses config", "err", err) @@ -76,11 +86,6 @@ func (impl *SESNotificationServiceImpl) SaveOrEditNotificationConfig(channelReq } } - model, err := impl.sesRepository.FindOne(config.Id) - if err != nil && !util.IsErrNoRows(err) { - impl.logger.Errorw("err while fetching ses config", "err", err) - return []int{}, err - } adapter.BuildConfigUpdateModelForSES(config, model, userId) model, uErr := impl.sesRepository.UpdateSESConfig(model) if uErr != nil { diff --git a/pkg/notifier/SMTPNotificationService.go b/pkg/notifier/SMTPNotificationService.go index b5611c91c0..bcfa060739 100644 --- a/pkg/notifier/SMTPNotificationService.go +++ b/pkg/notifier/SMTPNotificationService.go @@ -60,6 +60,12 @@ func (impl *SMTPNotificationServiceImpl) SaveOrEditNotificationConfig(channelReq for _, config := range smtpConfigs { if config.Id != 0 { + model, err := impl.smtpRepository.FindOne(config.Id) + if err != nil && !util.IsErrNoRows(err) { + impl.logger.Errorw("err while fetching smtp config", "err", err) + return []int{}, err + } + if config.Default { _, err := impl.smtpRepository.UpdateSMTPConfigDefault() if err != nil && !util.IsErrNoRows(err) { @@ -67,6 +73,10 @@ func (impl *SMTPNotificationServiceImpl) SaveOrEditNotificationConfig(channelReq return []int{}, err } } else { + // check if this config is already default, we don't want to reverse it + if model.Default { + return []int{}, fmt.Errorf("cannot update default config to non default") + } _, err := impl.smtpRepository.FindDefault() if err != nil && !util.IsErrNoRows(err) { impl.logger.Errorw("err while updating smtp config", "err", err) @@ -76,11 +86,6 @@ func (impl *SMTPNotificationServiceImpl) SaveOrEditNotificationConfig(channelReq } } - model, err := impl.smtpRepository.FindOne(config.Id) - if err != nil && !util.IsErrNoRows(err) { - impl.logger.Errorw("err while fetching smtp config", "err", err) - return []int{}, err - } adapter.BuildConfigUpdateModelForSMTP(config, model, userId) model, uErr := impl.smtpRepository.UpdateSMTPConfig(model) if uErr != nil { From a1f79f1e1437823f1e6537e31839329dfe91ea07 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 7 Feb 2025 16:47:26 +0530 Subject: [PATCH 33/43] default flag true & avoid already commited log --- env_gen.json | 2 +- env_gen.md | 2 +- pkg/pipeline/CiService.go | 3 ++- pkg/pipeline/types/CiCdConfig.go | 2 +- pkg/workflow/cd/CdWorkflowRunnerService.go | 3 ++- util/CommonConstant.go | 1 + 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/env_gen.json b/env_gen.json index e59bfb7d58..adec9c458c 100644 --- a/env_gen.json +++ b/env_gen.json @@ -1 +1 @@ -[{"Category":"CD","Fields":[{"Env":"ARGO_APP_MANUAL_SYNC_TIME","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HELM_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_TIMEOUT_DURATION","EnvType":"string","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS","EnvType":"int","EnvValue":"12","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"6","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CD_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PIPELINE_DEGRADED_TIME","EnvType":"string","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_DEVTRON_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_EXTERNAL_HELM_APP","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_HELM_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"CI_RUNNER","Fields":[{"Env":"AZURE_ACCOUNT_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_ACCOUNT_NAME","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_CACHE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_LOG","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_CONNECTION_INSECURE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_URL","EnvType":"string","EnvValue":"http://devtron-minio.devtroncd:9000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BASE_LOG_LOCATION_PATH","EnvType":"string","EnvValue":"/home/devtron/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_GCP_CREDENTIALS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_PROVIDER","EnvType":"","EnvValue":"S3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ACCESS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_BUCKET_VERSIONED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT_INSECURE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_SECRET_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/devtron/buildx","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_K8S_DRIVER_OPTIONS","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_PROVENANCE_MODE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILD_LOG_TTL_VALUE_IN_SECS","EnvType":"int","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CACHE_LIMIT","EnvType":"int64","EnvValue":"5000000000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"cd-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_IGNORE_DOCKER_CACHE","EnvType":"bool","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_RUNNER_DOCKER_MTU_VALUE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_SUCCESS_AUTO_TRIGGER_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_VOLUME_MOUNTS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"arsenal-v1/ci-artifacts","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_BUCKET","EnvType":"string","EnvValue":"devtron-pro-ci-logs","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"arsenal-v1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET","EnvType":"string","EnvValue":"ci-caching","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_LOGS_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_NAMESPACE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_TIMEOUT","EnvType":"int64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CI_IMAGE","EnvType":"string","EnvValue":"686244538589.dkr.ecr.us-east-2.amazonaws.com/cirunner:47","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtron-ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TARGET_PLATFORM","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DOCKER_BUILD_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/docker","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_BUILD_CONTEXT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_WORKFLOW_EXECUTION_STAGE","EnvType":"bool","EnvValue":"false","EnvDescription":"if enabled then we will display build stages separately for CI/Job/Pre-Post CD","Example":"false","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_CM_NAME","EnvType":"string","EnvValue":"blob-storage-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_SECRET_NAME","EnvType":"string","EnvValue":"blob-storage-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_API_SECRET","EnvType":"string","EnvValue":"devtroncd-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_PAYLOAD","EnvType":"string","EnvValue":"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/vikram1601/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2022-10-30T20:00:00\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"User Name \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\"}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_WEB_HOOK_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_CM_CS_IN_CI_JOB","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_COUNT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_INTERVAL","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCANNER_ENDPOINT","EnvType":"string","EnvValue":"http://image-scanner-new-demo-devtroncd-service.devtroncd:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_MAX_RETRIES","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_RETRY_DELAY","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IN_APP_LOGGING_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CD_WORKFLOW_RUNNER_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CI_WORKFLOW_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODE","EnvType":"string","EnvValue":"DEV","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_SERVER_HOST","EnvType":"string","EnvValue":"localhost:4222","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_HOST","EnvType":"string","EnvValue":"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PRE_CI_CACHE_PATH","EnvType":"string","EnvValue":"/devtroncd-cache","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOW_DOCKER_BUILD_ARGS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CI_JOB_BUILD_CACHE_PUSH_PULL","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CREATING_ECR_REPO","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINATION_GRACE_PERIOD_SECS","EnvType":"int","EnvValue":"180","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_QUERY_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CD_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CI_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BUILDX","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DOCKER_API_TO_GET_DIGEST","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_EXTERNAL_NODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WF_CONTROLLER_INSTANCE_ID","EnvType":"string","EnvValue":"devtron-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_CACHE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"ci-runner","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"DEVTRON","Fields":[{"Env":"-","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_IMAGE","EnvType":"string","EnvValue":"quay.io/devtron/chart-sync:1227622d-132-3775","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_JOB_RESOURCES_OBJ","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"chart-sync","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_AUTO_SYNC_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_COUNT_ON_CONFLICT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_DELAY_ON_CONFLICT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_COUNT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_DELAY","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ASYNC_BUILDX_CACHE_EXPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_MODE_MIN","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PORT","EnvType":"string","EnvValue":"8000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CExpirationTime","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_TRIGGER_CRON_TIME","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_STATUS_UPDATE_CRON","EnvType":"string","EnvValue":"*/5 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLI_CMD_TIMEOUT_GLOBAL_SECONDS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLUSTER_STATUS_CRON_TIME","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CONSUMER_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_LOG_TIME_LIMIT","EnvType":"int64","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TIMEOUT","EnvType":"float64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_BOM_URL","EnvType":"string","EnvValue":"https://raw.githubusercontent.com/devtron-labs/devtron/%s/charts/devtron/devtron-bom.yaml","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEX_SECRET_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_CHART_NAME","EnvType":"string","EnvValue":"devtron-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_URL","EnvType":"string","EnvValue":"https://helm.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_INSTALLATION_TYPE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_MODULES_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.modules","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_SECRET_NAME","EnvType":"string","EnvValue":"devtron-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_VERSION_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.release","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CID","EnvType":"string","EnvValue":"example-app","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CLIENT_ID","EnvType":"string","EnvValue":"argo-cd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CSTOREKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_JWTKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_RURL","EnvType":"string","EnvValue":"http://127.0.0.1:8080/callback","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_SECRET","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ECR_REPO_NAME_PREFIX","EnvType":"string","EnvValue":"test/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_ARGO_CD_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EPHEMERAL_SERVER_VERSION_REGEX","EnvType":"string","EnvValue":"v[1-9]\\.\\b(2[3-9]\\|[3-9][0-9])\\b.*","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EVENT_URL","EnvType":"string","EnvValue":"http://localhost:3000/notify","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXECUTE_WIRE_NIL_CHECKER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CI_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_WORKER_POOL_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FORCE_SECURITY_SCANNING","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_REPO_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GO_RUNTIME_ENV","EnvType":"string","EnvValue":"production","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_ORG_ID","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PASSWORD","EnvType":"string","EnvValue":"prom-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PORT","EnvType":"string","EnvValue":"8090","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HIDE_IMAGE_TAGGING_HARD_DELETE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_AUTOCOMPLETE_AUTH_CHECK","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_GROUP_NAME","EnvType":"string","EnvValue":"installer.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_RESOURCE","EnvType":"string","EnvValue":"installers","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_VERSION","EnvType":"string","EnvValue":"v1alpha1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"JwtExpirationTime","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_CLIENT_MAX_IDLE_CONNS_PER_HOST","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_IDLE_CONN_TIMEOUT","EnvType":"int","EnvValue":"300","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_KEEPALIVE","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_TIMEOUT","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TLS_HANDSHAKE_TIMEOUT","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_RECEIVE_MSG_SIZE","EnvType":"int","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_SEND_MSG_SIZE","EnvType":"int","EnvValue":"4","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_URL","EnvType":"string","EnvValue":"http://lens-milandevtron-service:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOGGER_DEV_MODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOG_LEVEL","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_SESSION_PER_USER","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_METADATA_API_URL","EnvType":"string","EnvValue":"https://api.devtron.ai/module?name=%s","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_STATUS_HANDLING_CRON_DURATION_MIN","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_ACK_WAIT_IN_SECS","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_BUFFER_SIZE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_MAX_AGE","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_PROCESSING_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_REPLICAS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NOTIFICATION_MEDIUM","EnvType":"NotificationMedium","EnvValue":"rest","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"OTEL_COLLECTOR_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PARALLELISM_LIMIT_FOR_TAG_PROCESSING","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_EXPORT_PROM_METRICS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_FAILURE_QUERIES","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_QUERY","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_SLOW_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_QUERY_DUR_THRESHOLD","EnvType":"int64","EnvValue":"5000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PLUGIN_NAME","EnvType":"string","EnvValue":"Pull images from container repository","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROPAGATE_EXTRA_LABELS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROXY_SERVICE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESTRICT_TERMINAL_ACCESS_FOR_NON_SUPER_USER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUNTIME_CONFIG_LOCAL_DEV","EnvType":"LocalDevMode","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_FORMAT","EnvType":"string","EnvValue":"@{{%s}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_HANDLE_PRIMITIVES","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_NAME_REGEX","EnvType":"string","EnvValue":"^[a-zA-Z][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9]$","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOULD_CHECK_NAMESPACE_ON_CLONE","EnvType":"bool","EnvValue":"false","EnvDescription":"should we check if namespace exists or not while cloning app","Example":"","Deprecated":"false"},{"Env":"SOCKET_DISCONNECT_DELAY_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SOCKET_HEARTBEAT_SECONDS","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"STREAM_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SYSTEM_VAR_PREFIX","EnvType":"string","EnvValue":"DEVTRON_","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"default","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_INACTIVE_DURATION_IN_MINS","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_STATUS_SYNC_In_SECS","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_LOG_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PASSWORD","EnvType":"string","EnvValue":"postgrespw","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PORT","EnvType":"string","EnvValue":"55000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_FOR_FAILED_CI_BUILD","EnvType":"string","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_IN_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USER_SESSION_DURATION_SECONDS","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_API_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CUSTOM_HTTP_TRANSPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_GIT_CLI","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_RBAC_CREATION_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_CACHE_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_EXPRESSION_REGEX","EnvType":"string","EnvValue":"@{{([^}]+)}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WEBHOOK_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"GITOPS","Fields":[{"Env":"ACD_CM","EnvType":"string","EnvValue":"argocd-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_PASSWORD","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_SECRET_NAME","EnvType":"string","EnvValue":"devtron-gitops-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS","EnvType":"string","EnvValue":"Deployment,Rollout,StatefulSet,ReplicaSet","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS_BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"INFRA_SETUP","Fields":[{"Env":"DASHBOARD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_PORT","EnvType":"string","EnvValue":"3000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_HOST","EnvType":"string","EnvValue":"http://localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_PORT","EnvType":"string","EnvValue":"5556","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_PROTOCOL","EnvType":"string","EnvValue":"REST","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_URL","EnvType":"string","EnvValue":"127.0.0.1:7070","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_CLIENT_URL","EnvType":"string","EnvValue":"127.0.0.1:50051","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"POSTGRES","Fields":[{"Env":"APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"Application name","Example":"","Deprecated":"false"},{"Env":"CASBIN_DATABASE","EnvType":"string","EnvValue":"casbin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"address of postgres service","Example":"postgresql-postgresql.devtroncd","Deprecated":"false"},{"Env":"PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"postgres database to be made connection with","Example":"orchestrator, casbin, git_sensor, lens","Deprecated":"false"},{"Env":"PG_PASSWORD","EnvType":"string","EnvValue":"{password}","EnvDescription":"password for postgres, associated with PG_USER","Example":"confidential ;)","Deprecated":"false"},{"Env":"PG_PORT","EnvType":"string","EnvValue":"5432","EnvDescription":"port of postgresql service","Example":"5432","Deprecated":"false"},{"Env":"PG_READ_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"user for postgres","Example":"postgres","Deprecated":"false"},{"Env":"PG_WRITE_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"RBAC","Fields":[{"Env":"ENFORCER_CACHE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_CACHE_EXPIRATION_IN_SEC","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_MAX_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CASBIN_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"}]}] \ No newline at end of file +[{"Category":"CD","Fields":[{"Env":"ARGO_APP_MANUAL_SYNC_TIME","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HELM_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_CRON_TIME","EnvType":"string","EnvValue":"*/2 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PIPELINE_STATUS_TIMEOUT_DURATION","EnvType":"string","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS","EnvType":"int","EnvValue":"12","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT","EnvType":"int","EnvValue":"6","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CD_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PIPELINE_DEGRADED_TIME","EnvType":"string","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_DEVTRON_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_EXTERNAL_HELM_APP","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REVISION_HISTORY_LIMIT_HELM_APP","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"CI_RUNNER","Fields":[{"Env":"AZURE_ACCOUNT_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_ACCOUNT_NAME","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_CACHE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_BLOB_CONTAINER_CI_LOG","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_CONNECTION_INSECURE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"AZURE_GATEWAY_URL","EnvType":"string","EnvValue":"http://devtron-minio.devtroncd:9000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BASE_LOG_LOCATION_PATH","EnvType":"string","EnvValue":"/home/devtron/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_GCP_CREDENTIALS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_PROVIDER","EnvType":"","EnvValue":"S3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ACCESS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_BUCKET_VERSIONED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_ENDPOINT_INSECURE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_S3_SECRET_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/devtron/buildx","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_K8S_DRIVER_OPTIONS","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_PROVENANCE_MODE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILD_LOG_TTL_VALUE_IN_SECS","EnvType":"int","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CACHE_LIMIT","EnvType":"int64","EnvValue":"5000000000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"cd-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_BASE_CIDR","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_DEFAULT_ADDRESS_POOL_SIZE","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_IGNORE_DOCKER_CACHE","EnvType":"bool","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_RUNNER_DOCKER_MTU_VALUE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_SUCCESS_AUTO_TRIGGER_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_VOLUME_MOUNTS_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_EXECUTOR_TYPE","EnvType":"","EnvValue":"AWF","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"arsenal-v1/ci-artifacts","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_BUCKET","EnvType":"string","EnvValue":"devtron-pro-ci-logs","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_BUILD_LOGS_KEY_PREFIX","EnvType":"string","EnvValue":"arsenal-v1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET","EnvType":"string","EnvValue":"ci-caching","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CACHE_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_ARTIFACT_KEY_LOCATION","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_LOGS_BUCKET_REGION","EnvType":"string","EnvValue":"us-east-2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_NAMESPACE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CD_TIMEOUT","EnvType":"int64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_CI_IMAGE","EnvType":"string","EnvValue":"686244538589.dkr.ecr.us-east-2.amazonaws.com/cirunner:47","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtron-ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TARGET_PLATFORM","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DOCKER_BUILD_CACHE_PATH","EnvType":"string","EnvValue":"/var/lib/docker","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_BUILD_CONTEXT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_WORKFLOW_EXECUTION_STAGE","EnvType":"bool","EnvValue":"true","EnvDescription":"if enabled then we will display build stages separately for CI/Job/Pre-Post CD","Example":"true","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_CM_NAME","EnvType":"string","EnvValue":"blob-storage-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_BLOB_STORAGE_SECRET_NAME","EnvType":"string","EnvValue":"blob-storage-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_LABEL_SELECTOR","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_KEY","EnvType":"string","EnvValue":"dedicated","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CD_NODE_TAINTS_VALUE","EnvType":"string","EnvValue":"ci","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_API_SECRET","EnvType":"string","EnvValue":"devtroncd-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_PAYLOAD","EnvType":"string","EnvValue":"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/vikram1601/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2022-10-30T20:00:00\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"User Name \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\"}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXTERNAL_CI_WEB_HOOK_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_CM_CS_IN_CI_JOB","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_COUNT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_RETRY_INTERVAL","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCANNER_ENDPOINT","EnvType":"string","EnvValue":"http://image-scanner-new-demo-devtroncd-service.devtroncd:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_MAX_RETRIES","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IMAGE_SCAN_RETRY_DELAY","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IN_APP_LOGGING_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CD_WORKFLOW_RUNNER_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_CI_WORKFLOW_RETRIES","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODE","EnvType":"string","EnvValue":"DEV","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_SERVER_HOST","EnvType":"string","EnvValue":"localhost:4222","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_HOST","EnvType":"string","EnvValue":"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ORCH_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PRE_CI_CACHE_PATH","EnvType":"string","EnvValue":"/devtroncd-cache","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOW_DOCKER_BUILD_ARGS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CI_JOB_BUILD_CACHE_PUSH_PULL","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SKIP_CREATING_ECR_REPO","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINATION_GRACE_PERIOD_SECS","EnvType":"int","EnvValue":"180","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_QUERY_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CD_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BLOB_STORAGE_CONFIG_IN_CI_WORKFLOW","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_BUILDX","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DOCKER_API_TO_GET_DIGEST","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_EXTERNAL_NODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WF_CONTROLLER_INSTANCE_ID","EnvType":"string","EnvValue":"devtron-runner","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_CACHE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WORKFLOW_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"ci-runner","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"DEVTRON","Fields":[{"Env":"-","EnvType":"","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_IMAGE","EnvType":"string","EnvValue":"quay.io/devtron/chart-sync:1227622d-132-3775","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_JOB_RESOURCES_OBJ","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"APP_SYNC_SERVICE_ACCOUNT","EnvType":"string","EnvValue":"chart-sync","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_AUTO_SYNC_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_COUNT_ON_CONFLICT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_GIT_COMMIT_RETRY_DELAY_ON_CONFLICT","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_COUNT","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ARGO_REPO_REGISTER_RETRY_DELAY","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ASYNC_BUILDX_CACHE_EXPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BLOB_STORAGE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"BUILDX_CACHE_MODE_MIN","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CD_PORT","EnvType":"string","EnvValue":"8000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CExpirationTime","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_TRIGGER_CRON_TIME","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CI_WORKFLOW_STATUS_UPDATE_CRON","EnvType":"string","EnvValue":"*/5 * * * *","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLI_CMD_TIMEOUT_GLOBAL_SECONDS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CLUSTER_STATUS_CRON_TIME","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"CONSUMER_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_LOG_TIME_LIMIT","EnvType":"int64","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEFAULT_TIMEOUT","EnvType":"float64","EnvValue":"3600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_BOM_URL","EnvType":"string","EnvValue":"https://raw.githubusercontent.com/devtron-labs/devtron/%s/charts/devtron/devtron-bom.yaml","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_DEX_SECRET_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_CHART_NAME","EnvType":"string","EnvValue":"devtron-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_RELEASE_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_NAME","EnvType":"string","EnvValue":"devtron","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_HELM_REPO_URL","EnvType":"string","EnvValue":"https://helm.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_INSTALLATION_TYPE","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_MODULES_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.modules","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_SECRET_NAME","EnvType":"string","EnvValue":"devtron-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEVTRON_VERSION_IDENTIFIER_IN_HELM_VALUES","EnvType":"string","EnvValue":"installer.release","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CID","EnvType":"string","EnvValue":"example-app","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CLIENT_ID","EnvType":"string","EnvValue":"argo-cd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_CSTOREKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_JWTKEY","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_RURL","EnvType":"string","EnvValue":"http://127.0.0.1:8080/callback","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_SECRET","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ECR_REPO_NAME_PREFIX","EnvType":"string","EnvValue":"test/","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_ARGO_CD_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENABLE_ASYNC_INSTALL_DEVTRON_CHART","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EPHEMERAL_SERVER_VERSION_REGEX","EnvType":"string","EnvValue":"v[1-9]\\.\\b(2[3-9]\\|[3-9][0-9])\\b.*","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EVENT_URL","EnvType":"string","EnvValue":"http://localhost:3000/notify","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXECUTE_WIRE_NIL_CHECKER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"EXPOSE_CI_METRICS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FEATURE_RESTART_WORKLOAD_WORKER_POOL_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"FORCE_SECURITY_SCANNING","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_REPO_PREFIX","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GO_RUNTIME_ENV","EnvType":"string","EnvValue":"production","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_ORG_ID","EnvType":"int","EnvValue":"2","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PASSWORD","EnvType":"string","EnvValue":"prom-operator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_PORT","EnvType":"string","EnvValue":"8090","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GRAFANA_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HIDE_IMAGE_TAGGING_HARD_DELETE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IGNORE_AUTOCOMPLETE_AUTH_CHECK","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_GROUP_NAME","EnvType":"string","EnvValue":"installer.devtron.ai","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_RESOURCE","EnvType":"string","EnvValue":"installers","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"INSTALLER_CRD_OBJECT_VERSION","EnvType":"string","EnvValue":"v1alpha1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"JwtExpirationTime","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_CLIENT_MAX_IDLE_CONNS_PER_HOST","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_IDLE_CONN_TIMEOUT","EnvType":"int","EnvValue":"300","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_KEEPALIVE","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TCP_TIMEOUT","EnvType":"int","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"K8s_TLS_HANDSHAKE_TIMEOUT","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_RECEIVE_MSG_SIZE","EnvType":"int","EnvValue":"20","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"KUBELINK_GRPC_MAX_SEND_MSG_SIZE","EnvType":"int","EnvValue":"4","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LENS_URL","EnvType":"string","EnvValue":"http://lens-milandevtron-service:80","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LIMIT_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOGGER_DEV_MODE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"LOG_LEVEL","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MAX_SESSION_PER_USER","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_METADATA_API_URL","EnvType":"string","EnvValue":"https://api.devtron.ai/module?name=%s","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MODULE_STATUS_HANDLING_CRON_DURATION_MIN","EnvType":"int","EnvValue":"3","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_ACK_WAIT_IN_SECS","EnvType":"int","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_BUFFER_SIZE","EnvType":"int","EnvValue":"-1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_MAX_AGE","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_PROCESSING_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NATS_MSG_REPLICAS","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"NOTIFICATION_MEDIUM","EnvType":"NotificationMedium","EnvValue":"rest","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"OTEL_COLLECTOR_URL","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PARALLELISM_LIMIT_FOR_TAG_PROCESSING","EnvType":"int","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_EXPORT_PROM_METRICS","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_FAILURE_QUERIES","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_ALL_QUERY","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_LOG_SLOW_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_QUERY_DUR_THRESHOLD","EnvType":"int64","EnvValue":"5000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PLUGIN_NAME","EnvType":"string","EnvValue":"Pull images from container repository","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROPAGATE_EXTRA_LABELS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PROXY_SERVICE_CONFIG","EnvType":"string","EnvValue":"{}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_CPU","EnvType":"string","EnvValue":"0.5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"REQ_CI_MEM","EnvType":"string","EnvValue":"3G","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESTRICT_TERMINAL_ACCESS_FOR_NON_SUPER_USER","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUNTIME_CONFIG_LOCAL_DEV","EnvType":"LocalDevMode","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_ENABLED","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_FORMAT","EnvType":"string","EnvValue":"@{{%s}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_HANDLE_PRIMITIVES","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SCOPED_VARIABLE_NAME_REGEX","EnvType":"string","EnvValue":"^[a-zA-Z][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9]$","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SHOULD_CHECK_NAMESPACE_ON_CLONE","EnvType":"bool","EnvValue":"false","EnvDescription":"should we check if namespace exists or not while cloning app","Example":"","Deprecated":"false"},{"Env":"SOCKET_DISCONNECT_DELAY_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SOCKET_HEARTBEAT_SECONDS","EnvType":"int","EnvValue":"25","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"STREAM_CONFIG_JSON","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"SYSTEM_VAR_PREFIX","EnvType":"string","EnvValue":"DEVTRON_","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_DEFAULT_NAMESPACE","EnvType":"string","EnvValue":"default","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_INACTIVE_DURATION_IN_MINS","EnvType":"int","EnvValue":"10","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TERMINAL_POD_STATUS_SYNC_In_SECS","EnvType":"int","EnvValue":"600","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_LOG_QUERY","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PASSWORD","EnvType":"string","EnvValue":"postgrespw","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_PORT","EnvType":"string","EnvValue":"55000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TEST_PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_FOR_FAILED_CI_BUILD","EnvType":"string","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"TIMEOUT_IN_SECONDS","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USER_SESSION_DURATION_SECONDS","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_ARTIFACT_LISTING_API_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CUSTOM_HTTP_TRANSPORT","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_GIT_CLI","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_RBAC_CREATION_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_CACHE_ENABLED","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"VARIABLE_EXPRESSION_REGEX","EnvType":"string","EnvValue":"@{{([^}]+)}}","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"WEBHOOK_TOKEN","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"GITOPS","Fields":[{"Env":"ACD_CM","EnvType":"string","EnvValue":"argocd-cm","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_PASSWORD","EnvType":"string","EnvValue":"","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ACD_USERNAME","EnvType":"string","EnvValue":"admin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GITOPS_SECRET_NAME","EnvType":"string","EnvValue":"devtron-gitops-secret","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS","EnvType":"string","EnvValue":"Deployment,Rollout,StatefulSet,ReplicaSet","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RESOURCE_LIST_FOR_REPLICAS_BATCH_SIZE","EnvType":"int","EnvValue":"5","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"INFRA_SETUP","Fields":[{"Env":"DASHBOARD_HOST","EnvType":"string","EnvValue":"localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_NAMESPACE","EnvType":"string","EnvValue":"devtroncd","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DASHBOARD_PORT","EnvType":"string","EnvValue":"3000","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_HOST","EnvType":"string","EnvValue":"http://localhost","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"DEX_PORT","EnvType":"string","EnvValue":"5556","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_PROTOCOL","EnvType":"string","EnvValue":"REST","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_TIMEOUT","EnvType":"int","EnvValue":"0","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"GIT_SENSOR_URL","EnvType":"string","EnvValue":"127.0.0.1:7070","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"HELM_CLIENT_URL","EnvType":"string","EnvValue":"127.0.0.1:50051","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"POSTGRES","Fields":[{"Env":"APP","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"Application name","Example":"","Deprecated":"false"},{"Env":"CASBIN_DATABASE","EnvType":"string","EnvValue":"casbin","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_ADDR","EnvType":"string","EnvValue":"127.0.0.1","EnvDescription":"address of postgres service","Example":"postgresql-postgresql.devtroncd","Deprecated":"false"},{"Env":"PG_DATABASE","EnvType":"string","EnvValue":"orchestrator","EnvDescription":"postgres database to be made connection with","Example":"orchestrator, casbin, git_sensor, lens","Deprecated":"false"},{"Env":"PG_PASSWORD","EnvType":"string","EnvValue":"{password}","EnvDescription":"password for postgres, associated with PG_USER","Example":"confidential ;)","Deprecated":"false"},{"Env":"PG_PORT","EnvType":"string","EnvValue":"5432","EnvDescription":"port of postgresql service","Example":"5432","Deprecated":"false"},{"Env":"PG_READ_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"PG_USER","EnvType":"string","EnvValue":"postgres","EnvDescription":"user for postgres","Example":"postgres","Deprecated":"false"},{"Env":"PG_WRITE_TIMEOUT","EnvType":"int64","EnvValue":"30","EnvDescription":"","Example":"","Deprecated":"false"}]},{"Category":"RBAC","Fields":[{"Env":"ENFORCER_CACHE","EnvType":"bool","EnvValue":"false","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_CACHE_EXPIRATION_IN_SEC","EnvType":"int","EnvValue":"86400","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"ENFORCER_MAX_BATCH_SIZE","EnvType":"int","EnvValue":"1","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"USE_CASBIN_V2","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"}]}] \ No newline at end of file diff --git a/env_gen.md b/env_gen.md index abac26ced3..8e7461ef9b 100644 --- a/env_gen.md +++ b/env_gen.md @@ -76,7 +76,7 @@ | DEFAULT_TARGET_PLATFORM | string | | | | false | | DOCKER_BUILD_CACHE_PATH | string |/var/lib/docker | | | false | | ENABLE_BUILD_CONTEXT | bool |false | | | false | - | ENABLE_WORKFLOW_EXECUTION_STAGE | bool |false | if enabled then we will display build stages separately for CI/Job/Pre-Post CD | false | false | + | ENABLE_WORKFLOW_EXECUTION_STAGE | bool |true | if enabled then we will display build stages separately for CI/Job/Pre-Post CD | true | false | | EXTERNAL_BLOB_STORAGE_CM_NAME | string |blob-storage-cm | | | false | | EXTERNAL_BLOB_STORAGE_SECRET_NAME | string |blob-storage-secret | | | false | | EXTERNAL_CD_NODE_LABEL_SELECTOR | | | | | false | diff --git a/pkg/pipeline/CiService.go b/pkg/pipeline/CiService.go index e9e2e40579..f796ca30c7 100644 --- a/pkg/pipeline/CiService.go +++ b/pkg/pipeline/CiService.go @@ -40,6 +40,7 @@ import ( "github.com/devtron-labs/devtron/pkg/pipeline/workflowStatus" bean2 "github.com/devtron-labs/devtron/pkg/plugin/bean" "github.com/devtron-labs/devtron/pkg/sql" + util3 "github.com/devtron-labs/devtron/util" "github.com/devtron-labs/devtron/util/sliceUtil" "path" "path/filepath" @@ -1183,7 +1184,7 @@ func (impl *CiServiceImpl) UpdateCiWorkflowWithStage(wf *pipelineConfig.CiWorkfl defer func() { dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { + if dbErr != nil && dbErr.Error() != util3.SqlAlreadyCommitedErrMsg { impl.Logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) } }() diff --git a/pkg/pipeline/types/CiCdConfig.go b/pkg/pipeline/types/CiCdConfig.go index b3729f9b02..961bd9f26f 100644 --- a/pkg/pipeline/types/CiCdConfig.go +++ b/pkg/pipeline/types/CiCdConfig.go @@ -160,7 +160,7 @@ type CiCdConfig struct { UseArtifactListingQueryV2 bool `env:"USE_ARTIFACT_LISTING_QUERY_V2" envDefault:"true"` UseImageTagFromGitProviderForTagBasedBuild bool `env:"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD" envDefault:"false"` // this is being done for https://github.com/devtron-labs/devtron/issues/4263 UseDockerApiToGetDigest bool `env:"USE_DOCKER_API_TO_GET_DIGEST" envDefault:"false"` - EnableWorkflowExecutionStage bool `env:"ENABLE_WORKFLOW_EXECUTION_STAGE" envDefault:"false" description:"if enabled then we will display build stages separately for CI/Job/Pre-Post CD" example:"false"` + EnableWorkflowExecutionStage bool `env:"ENABLE_WORKFLOW_EXECUTION_STAGE" envDefault:"true" description:"if enabled then we will display build stages separately for CI/Job/Pre-Post CD" example:"true"` } type CiConfig struct { diff --git a/pkg/workflow/cd/CdWorkflowRunnerService.go b/pkg/workflow/cd/CdWorkflowRunnerService.go index 7d5f00a425..7b8f77ae3d 100644 --- a/pkg/workflow/cd/CdWorkflowRunnerService.go +++ b/pkg/workflow/cd/CdWorkflowRunnerService.go @@ -28,6 +28,7 @@ import ( "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/workflow/cd/adapter" "github.com/devtron-labs/devtron/pkg/workflow/cd/bean" + "github.com/devtron-labs/devtron/util" "go.uber.org/zap" ) @@ -95,7 +96,7 @@ func (impl *CdWorkflowRunnerServiceImpl) SaveCDWorkflowRunnerWithStage(wfr *pipe defer func() { dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { + if dbErr != nil && dbErr.Error() != util.SqlAlreadyCommitedErrMsg { impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) } }() diff --git a/util/CommonConstant.go b/util/CommonConstant.go index f643d1d725..fcf2c6fd6a 100644 --- a/util/CommonConstant.go +++ b/util/CommonConstant.go @@ -30,4 +30,5 @@ const ( ConfigMapSecretUsageTypeVolume string = "volume" YamlSeparator string = "---\n" NotSupportedErr = "This feature is not supported" + SqlAlreadyCommitedErrMsg = "sql: transaction has already been committed or rolled back" ) From 0ed86d5b4dacd3c8220554683b58d2560db4e506 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 7 Feb 2025 16:51:36 +0530 Subject: [PATCH 34/43] update error message --- pkg/pipeline/CiService.go | 2 +- pkg/workflow/cd/CdWorkflowRunnerService.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/pipeline/CiService.go b/pkg/pipeline/CiService.go index f796ca30c7..d5282add0b 100644 --- a/pkg/pipeline/CiService.go +++ b/pkg/pipeline/CiService.go @@ -1145,7 +1145,7 @@ func (impl *CiServiceImpl) SaveCiWorkflowWithStage(wf *pipelineConfig.CiWorkflow defer func() { dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { + if dbErr != nil && dbErr.Error() != util3.SqlAlreadyCommitedErrMsg { impl.Logger.Errorw("error in rolling back transaction", "workflowName", wf.Name, "error", dbErr) } }() diff --git a/pkg/workflow/cd/CdWorkflowRunnerService.go b/pkg/workflow/cd/CdWorkflowRunnerService.go index 7b8f77ae3d..8883817251 100644 --- a/pkg/workflow/cd/CdWorkflowRunnerService.go +++ b/pkg/workflow/cd/CdWorkflowRunnerService.go @@ -133,7 +133,7 @@ func (impl *CdWorkflowRunnerServiceImpl) UpdateCdWorkflowRunnerWithStage(wfr *pi defer func() { dbErr := impl.transactionManager.RollbackTx(tx) - if dbErr != nil { + if dbErr != nil && dbErr.Error() != util.SqlAlreadyCommitedErrMsg { impl.logger.Errorw("error in rolling back transaction", "workflowName", wfr.Name, "error", dbErr) } }() From ecd0d33d43ea2aa794f82f92dbaeb212134a9127 Mon Sep 17 00:00:00 2001 From: Gireesh Naidu Date: Fri, 7 Feb 2025 17:51:47 +0530 Subject: [PATCH 35/43] fix: ignore handling of the cd workflow status update event no state change is detected since last update status for the wfr --- .../in/WorkflowEventProcessorService.go | 76 ++++++++++--------- pkg/pipeline/CdHandler.go | 16 ++-- pkg/pipeline/CiHandler.go | 24 ++++-- 3 files changed, 66 insertions(+), 50 deletions(-) diff --git a/pkg/eventProcessor/in/WorkflowEventProcessorService.go b/pkg/eventProcessor/in/WorkflowEventProcessorService.go index 7328c13825..8b703f6a62 100644 --- a/pkg/eventProcessor/in/WorkflowEventProcessorService.go +++ b/pkg/eventProcessor/in/WorkflowEventProcessorService.go @@ -436,51 +436,47 @@ func (impl *WorkflowEventProcessorImpl) SubscribeCDWorkflowStatusUpdate() error return } - wfrId, wfrStatus, err := impl.cdHandler.UpdateWorkflow(wfStatus) + wfrId, wfrStatus, stateChanged, err := impl.cdHandler.UpdateWorkflow(wfStatus) impl.logger.Debugw("UpdateWorkflow", "wfrId", wfrId, "wfrStatus", wfrStatus) if err != nil { impl.logger.Error("err", err) return } - - wfr, err := impl.cdWorkflowRepository.FindWorkflowRunnerById(wfrId) - if err != nil { - impl.logger.Errorw("could not get wf runner", "err", err) - return - } - if wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { - if len(wfr.ImagePathReservationIds) > 0 { - err := impl.cdHandler.DeactivateImageReservationPathsOnFailure(wfr.ImagePathReservationIds) - if err != nil { - impl.logger.Errorw("error in removing image path reservation ") - } - } - } - if wfrStatus == string(v1alpha1.NodeSucceeded) || wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { - eventType := eventUtil.EventType(0) - if wfrStatus == string(v1alpha1.NodeSucceeded) { - eventType = eventUtil.Success - } else if wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { - eventType = eventUtil.Fail + if stateChanged { + wfr, err := impl.cdWorkflowRepository.FindWorkflowRunnerById(wfrId) + if err != nil { + impl.logger.Errorw("could not get wf runner", "wfrId", wfrId, "err", err) + return } - - if wfr != nil && executors.CheckIfReTriggerRequired(wfrStatus, wfStatus.Message, wfr.Status) { - err = impl.workflowDagExecutor.HandleCdStageReTrigger(wfr) - if err != nil { - //check if this log required or not - impl.logger.Errorw("error in HandleCdStageReTrigger", "error", err) + if wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { + if len(wfr.ImagePathReservationIds) > 0 { + err := impl.cdHandler.DeactivateImageReservationPathsOnFailure(wfr.ImagePathReservationIds) + if err != nil { + impl.logger.Errorw("error in removing image path reservation ", "imagePathReservationIds", wfr.ImagePathReservationIds, "err", err) + } } } + if wfrStatus == string(v1alpha1.NodeSucceeded) || wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { + eventType := eventUtil.EventType(0) + if wfrStatus == string(v1alpha1.NodeSucceeded) { + eventType = eventUtil.Success + } else if wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { + eventType = eventUtil.Fail + } - if wfr.WorkflowType == apiBean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == apiBean.CD_WORKFLOW_TYPE_POST { - event, _ := impl.eventFactory.Build(eventType, &wfr.CdWorkflow.PipelineId, wfr.CdWorkflow.Pipeline.AppId, &wfr.CdWorkflow.Pipeline.EnvironmentId, eventUtil.CD) - impl.logger.Debugw("event pre stage", "event", event) - event = impl.eventFactory.BuildExtraCDData(event, wfr, 0, wfr.WorkflowType) - _, evtErr := impl.eventClient.WriteNotificationEvent(event) - if evtErr != nil { - impl.logger.Errorw("CD stage post fail or success event unable to sent", "error", evtErr) + if wfr != nil && executors.CheckIfReTriggerRequired(wfrStatus, wfStatus.Message, wfr.Status) { + err = impl.workflowDagExecutor.HandleCdStageReTrigger(wfr) + if err != nil { + //check if this log required or not + impl.logger.Errorw("error in HandleCdStageReTrigger", "workflowRunnerId", wfr.Id, "workflowStatus", wfrStatus, "workflowStatusMessage", wfStatus.Message, "error", err) + } + impl.logger.Debugw("re-triggered cd stage", "workflowRunnerId", wfr.Id, "workflowStatus", wfrStatus, "workflowStatusMessage", wfStatus.Message) + } else { + impl.sendPrePostCdNotificationEvent(eventType, wfr) } } + } else { + impl.logger.Debugw("no state change detected for the cd workflow status update, ignoring this event", "workflowRunnerId", wfrId, "wfrStatus", wfrStatus) } } @@ -503,6 +499,18 @@ func (impl *WorkflowEventProcessorImpl) SubscribeCDWorkflowStatusUpdate() error return nil } +func (impl *WorkflowEventProcessorImpl) sendPrePostCdNotificationEvent(eventType eventUtil.EventType, wfr *pipelineConfig.CdWorkflowRunner) { + if wfr.WorkflowType == apiBean.CD_WORKFLOW_TYPE_PRE || wfr.WorkflowType == apiBean.CD_WORKFLOW_TYPE_POST { + event, _ := impl.eventFactory.Build(eventType, &wfr.CdWorkflow.PipelineId, wfr.CdWorkflow.Pipeline.AppId, &wfr.CdWorkflow.Pipeline.EnvironmentId, eventUtil.CD) + impl.logger.Debugw("event pre stage", "event", event) + event = impl.eventFactory.BuildExtraCDData(event, wfr, 0, wfr.WorkflowType) + _, evtErr := impl.eventClient.WriteNotificationEvent(event) + if evtErr != nil { + impl.logger.Errorw("CD stage post fail or success event unable to sent", "error", evtErr) + } + } +} + func (impl *WorkflowEventProcessorImpl) extractCiCompleteEventFrom(msg *model.PubSubMsg) (bean.CiCompleteEvent, error) { ciCompleteEvent := bean.CiCompleteEvent{} err := json.Unmarshal([]byte(msg.Data), &ciCompleteEvent) diff --git a/pkg/pipeline/CdHandler.go b/pkg/pipeline/CdHandler.go index 89d24826e1..81b3e12905 100644 --- a/pkg/pipeline/CdHandler.go +++ b/pkg/pipeline/CdHandler.go @@ -64,7 +64,7 @@ const ( ) type CdHandler interface { - UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus) (int, string, error) + UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus) (int, string, bool, error) GetCdBuildHistory(appId int, environmentId int, pipelineId int, offset int, size int) ([]pipelineBean.CdWorkflowWithArtifact, error) GetRunningWorkflowLogs(environmentId int, pipelineId int, workflowId int) (*bufio.Reader, func() error, error) FetchCdWorkflowDetails(appId int, environmentId int, pipelineId int, buildId int) (types.WorkflowResponse, error) @@ -252,23 +252,23 @@ func (impl *CdHandlerImpl) handleForceAbortCaseForCdStage(workflowRunner *pipeli return nil } -func (impl *CdHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus) (int, string, error) { +func (impl *CdHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus) (int, string, bool, error) { wfStatusRs := impl.extractWorkfowStatus(workflowStatus) workflowName, status, podStatus, message, podName := wfStatusRs.WorkflowName, wfStatusRs.Status, wfStatusRs.PodStatus, wfStatusRs.Message, wfStatusRs.PodName impl.Logger.Debugw("cd update for ", "wf ", workflowName, "status", status) if workflowName == "" { - return 0, "", errors.New("invalid wf name") + return 0, "", false, errors.New("invalid wf name") } workflowId, err := strconv.Atoi(workflowName[:strings.Index(workflowName, "-")]) if err != nil { impl.Logger.Error("invalid wf status update req", "err", err) - return 0, "", err + return 0, "", false, err } savedWorkflow, err := impl.cdWorkflowRepository.FindWorkflowRunnerById(workflowId) if err != nil { impl.Logger.Error("cannot get saved wf", "err", err) - return 0, "", err + return 0, "", false, err } cdArtifactLocationFormat := impl.config.GetArtifactLocationFormat() @@ -289,21 +289,21 @@ func (impl *CdHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus err = impl.cdWorkflowRepository.UpdateWorkFlowRunner(savedWorkflow) if err != nil { impl.Logger.Error("update wf failed for id " + strconv.Itoa(savedWorkflow.Id)) - return 0, "", err + return 0, "", true, err } appId := savedWorkflow.CdWorkflow.Pipeline.AppId envId := savedWorkflow.CdWorkflow.Pipeline.EnvironmentId envDeploymentConfig, err := impl.deploymentConfigService.GetConfigForDevtronApps(appId, envId) if err != nil { impl.Logger.Errorw("error in fetching environment deployment config by appId and envId", "appId", appId, "envId", envId, "err", err) - return 0, "", err + return 0, "", true, err } util3.TriggerCDMetrics(cdWorkflow.GetTriggerMetricsFromRunnerObj(savedWorkflow, envDeploymentConfig), impl.config.ExposeCDMetrics) if string(v1alpha1.NodeError) == savedWorkflow.Status || string(v1alpha1.NodeFailed) == savedWorkflow.Status { impl.Logger.Warnw("cd stage failed for workflow: ", "wfId", savedWorkflow.Id) } } - return savedWorkflow.Id, savedWorkflow.Status, nil + return savedWorkflow.Id, savedWorkflow.Status, false, nil } func (impl *CdHandlerImpl) extractWorkfowStatus(workflowStatus v1alpha1.WorkflowStatus) *types.WorkflowStatus { diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index b6b461f42a..5c1dac4811 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -1206,17 +1206,25 @@ func (impl *CiHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus impl.Logger.Error("update wf failed for id " + strconv.Itoa(savedWorkflow.Id)) return 0, err } - if string(v1alpha1.NodeError) == savedWorkflow.Status || string(v1alpha1.NodeFailed) == savedWorkflow.Status { - impl.Logger.Warnw("ci failed for workflow: ", "wfId", savedWorkflow.Id) + impl.sendCIFailEvent(savedWorkflow, status, message) + } + return savedWorkflow.Id, nil +} - if extractErrorCode(savedWorkflow.Message) != workFlow.CiStageFailErrorCode { - go impl.WriteCIFailEvent(savedWorkflow) - } else { - impl.Logger.Infof("Step failed notification received for wfID %d with message %s", savedWorkflow.Id, savedWorkflow.Message) - } +func (impl *CiHandlerImpl) sendCIFailEvent(savedWorkflow *pipelineConfig.CiWorkflow, status, message string) { + if string(v1alpha1.NodeError) == savedWorkflow.Status || string(v1alpha1.NodeFailed) == savedWorkflow.Status { + if executors.CheckIfReTriggerRequired(status, message, savedWorkflow.Status) { + impl.Logger.Infow("not sending failure notification for re-trigger workflow", "workflowId", savedWorkflow.Id) + return + } + impl.Logger.Warnw("ci failed for workflow: ", "wfId", savedWorkflow.Id) + + if extractErrorCode(savedWorkflow.Message) != workFlow.CiStageFailErrorCode { + go impl.WriteCIFailEvent(savedWorkflow) + } else { + impl.Logger.Infof("Step failed notification received for wfID %d with message %s", savedWorkflow.Id, savedWorkflow.Message) } } - return savedWorkflow.Id, nil } func extractErrorCode(msg string) int { From c7f511a124b48c0f237df3a1015b5de9bc5003d4 Mon Sep 17 00:00:00 2001 From: Vikram Singh Date: Mon, 10 Feb 2025 12:07:57 +0530 Subject: [PATCH 36/43] main sync develop and vendor update --- go.mod | 4 ++-- go.sum | 8 ++++---- vendor/modules.txt | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 5090e43b14..df88b945a9 100644 --- a/go.mod +++ b/go.mod @@ -288,8 +288,8 @@ require gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect replace ( github.com/argoproj/argo-workflows/v3 v3.5.10 => github.com/devtron-labs/argo-workflows/v3 v3.5.13 - github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250205062151-43fa5137f565 - github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250205062151-43fa5137f565 + github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 + github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 k8s.io/api => k8s.io/api v0.29.7 diff --git a/go.sum b/go.sum index b7972b8060..d0b8f82530 100644 --- a/go.sum +++ b/go.sum @@ -792,10 +792,10 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzq github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/devtron-labs/argo-workflows/v3 v3.5.13 h1:3pINq0gXOSeTw2z/vYe+j80lRpSN5Rp/8mfQORh8SmU= github.com/devtron-labs/argo-workflows/v3 v3.5.13/go.mod h1:/vqxcovDPT4zqr4DjR5v7CF8ggpY1l3TSa2CIG3jmjA= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250205062151-43fa5137f565 h1:9hEDO9lEgHW73WvsCEUZHM1IbssX1X7LR/n2it71JU0= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250205062151-43fa5137f565/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250205062151-43fa5137f565 h1:OZlu0xClOijctMwFa5APd9XDrQamTUqNhiRXXcN2XFM= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250205062151-43fa5137f565/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 h1:wI12BFM1NmAkfCfl0pMQHREuI5Xs0XvuQ8K7Rz39z/8= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 h1:bEc/5jYG7PlNwRopPks+waUyRQYrY5tiRwOXpzsyhGc= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= github.com/devtron-labs/go-bitbucket v0.9.60-beta h1:VEx1jvDgdtDPS6A1uUFoaEi0l1/oLhbr+90xOwr6sDU= github.com/devtron-labs/go-bitbucket v0.9.60-beta/go.mod h1:GnuiCesvh8xyHeMCb+twm8lBR/kQzJYSKL28ZfObp1Y= github.com/devtron-labs/protos v0.0.3-0.20240802105333-92ee9bb85d80 h1:xwbTeijNTf4/j1v+tSfwVqwLVnReas/NqEKeQHvSTys= diff --git a/vendor/modules.txt b/vendor/modules.txt index f0d590e37a..6c6184d29a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -336,7 +336,7 @@ github.com/davecgh/go-spew/spew # github.com/deckarep/golang-set v1.8.0 ## explicit; go 1.17 github.com/deckarep/golang-set -# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250205062151-43fa5137f565 +# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 ## explicit; go 1.21 github.com/devtron-labs/authenticator/apiToken github.com/devtron-labs/authenticator/client @@ -344,7 +344,7 @@ github.com/devtron-labs/authenticator/jwt github.com/devtron-labs/authenticator/middleware github.com/devtron-labs/authenticator/oidc github.com/devtron-labs/authenticator/password -# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250205062151-43fa5137f565 +# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 ## explicit; go 1.21 github.com/devtron-labs/common-lib/async github.com/devtron-labs/common-lib/blob-storage @@ -2215,8 +2215,8 @@ xorm.io/xorm/log xorm.io/xorm/names xorm.io/xorm/schemas xorm.io/xorm/tags -# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250205062151-43fa5137f565 -# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250205062151-43fa5137f565 +# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 +# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 # github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 # github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 # k8s.io/api => k8s.io/api v0.29.7 From f988b39fee222251f1857445160e6543d2592555 Mon Sep 17 00:00:00 2001 From: Vikram Singh Date: Mon, 10 Feb 2025 15:08:23 +0530 Subject: [PATCH 37/43] column name fixed --- .../workflowStatus/repository/WorkflowStageRepository.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go index 720d397794..d384f30c3b 100644 --- a/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go +++ b/pkg/pipeline/workflowStatus/repository/WorkflowStageRepository.go @@ -25,7 +25,7 @@ type WorkflowExecutionStage struct { Id int `sql:"id,pk"` StageName bean.WorkflowStageName `sql:"stage_name,notnull"` // same as app name Status bean.WorkflowStageStatus `sql:"status"` - StatusFor bean.WorkflowStageStatusFor `sql:"status_type"` + StatusFor bean.WorkflowStageStatusFor `sql:"status_for"` Message string `sql:"message"` Metadata string `sql:"metadata"` WorkflowId int `sql:"workflow_id,notnull"` From 0e1da1a3cdea33e964146657a9b9f3e2cdbe9db9 Mon Sep 17 00:00:00 2001 From: Gireesh Naidu Date: Wed, 12 Feb 2025 11:53:00 +0530 Subject: [PATCH 38/43] fix: workflow status fix --- .../in/WorkflowEventProcessorService.go | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/pkg/eventProcessor/in/WorkflowEventProcessorService.go b/pkg/eventProcessor/in/WorkflowEventProcessorService.go index 3f4e47b89c..d91bd56caf 100644 --- a/pkg/eventProcessor/in/WorkflowEventProcessorService.go +++ b/pkg/eventProcessor/in/WorkflowEventProcessorService.go @@ -444,12 +444,14 @@ func (impl *WorkflowEventProcessorImpl) SubscribeCDWorkflowStatusUpdate() error impl.logger.Error("err", err) return } + if stateChanged { wfr, err := impl.cdWorkflowRepository.FindWorkflowRunnerById(wfrId) if err != nil { impl.logger.Errorw("could not get wf runner", "wfrId", wfrId, "err", err) return } + if wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { if len(wfr.ImagePathReservationIds) > 0 { err := impl.cdHandler.DeactivateImageReservationPathsOnFailure(wfr.ImagePathReservationIds) @@ -458,22 +460,28 @@ func (impl *WorkflowEventProcessorImpl) SubscribeCDWorkflowStatusUpdate() error } } } - if wfrStatus == string(v1alpha1.NodeSucceeded) || wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { - eventType := eventUtil.EventType(0) - if wfrStatus == string(v1alpha1.NodeSucceeded) { - eventType = eventUtil.Success - } else if wfrStatus == string(v1alpha1.NodeFailed) || wfrStatus == string(v1alpha1.NodeError) { - eventType = eventUtil.Fail - } + wfStatusInEvent := string(wfStatus.Phase) + if wfStatusInEvent == string(v1alpha1.NodeSucceeded) || wfStatusInEvent == string(v1alpha1.NodeFailed) || wfStatusInEvent == string(v1alpha1.NodeError) { + // the re-trigger should only happen when we get a pod deleted event. if wfr != nil && executors.CheckIfReTriggerRequired(wfrStatus, wfStatus.Message, wfr.Status) { err = impl.workflowDagExecutor.HandleCdStageReTrigger(wfr) if err != nil { - //check if this log required or not + // check if this log required or not impl.logger.Errorw("error in HandleCdStageReTrigger", "workflowRunnerId", wfr.Id, "workflowStatus", wfrStatus, "workflowStatusMessage", wfStatus.Message, "error", err) } impl.logger.Debugw("re-triggered cd stage", "workflowRunnerId", wfr.Id, "workflowStatus", wfrStatus, "workflowStatusMessage", wfStatus.Message) } else { + // we send this notification on *workflow_runner* status, both success and failure + // during workflow runner failure, particularly when failure occurred due to pod deletion , we get two events from kubewatch. + // event1: with failure status + exit-code [need to send notification] + // event2: with failure status + pod deletion message [skip notification] + eventType := eventUtil.EventType(0) + if wfStatusInEvent == string(v1alpha1.NodeSucceeded) { + eventType = eventUtil.Success + } else if wfStatusInEvent == string(v1alpha1.NodeFailed) || wfStatusInEvent == string(v1alpha1.NodeError) { + eventType = eventUtil.Fail + } impl.sendPrePostCdNotificationEvent(eventType, wfr) } } From 1e0393c3db8a9defd2679ae2c5809a0b21f615f5 Mon Sep 17 00:00:00 2001 From: Gireesh Naidu Date: Wed, 12 Feb 2025 12:32:36 +0530 Subject: [PATCH 39/43] fix: oss no notify fix --- pkg/pipeline/CdHandler.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/pipeline/CdHandler.go b/pkg/pipeline/CdHandler.go index 8866e28ad0..1eddf62877 100644 --- a/pkg/pipeline/CdHandler.go +++ b/pkg/pipeline/CdHandler.go @@ -312,6 +312,7 @@ func (impl *CdHandlerImpl) UpdateWorkflow(workflowStatus v1alpha1.WorkflowStatus if string(v1alpha1.NodeError) == savedWorkflow.Status || string(v1alpha1.NodeFailed) == savedWorkflow.Status { impl.Logger.Warnw("cd stage failed for workflow: ", "wfId", savedWorkflow.Id) } + return savedWorkflow.Id, savedWorkflow.Status, true, nil } return savedWorkflow.Id, savedWorkflow.Status, false, nil } From 3838e387266ff863893af0728240b7565bdddbcf Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Wed, 12 Feb 2025 15:11:53 +0530 Subject: [PATCH 40/43] handling of skipped event --- pkg/pipeline/workflowStatus/WorkflowStageStatusService.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go index 2022e3fdd0..d583ef9261 100644 --- a/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go +++ b/pkg/pipeline/workflowStatus/WorkflowStageStatusService.go @@ -134,7 +134,7 @@ func (impl *WorkFlowStageStatusServiceImpl) updatePodStages(currentWorkflowStage stage.Status = bean2.WORKFLOW_STAGE_STATUS_SUCCEEDED stage.EndTime = time.Now().Format(bean3.LayoutRFC3339) } - case string(v1alpha1.NodeFailed), string(v1alpha1.NodeError): + case string(v1alpha1.NodeFailed), string(v1alpha1.NodeError), string(v1alpha1.NodeSkipped): if stage.Status == bean2.WORKFLOW_STAGE_STATUS_RUNNING || stage.Status == bean2.WORKFLOW_STAGE_STATUS_NOT_STARTED || stage.Status == bean2.WORKFLOW_STAGE_STATUS_UNKNOWN { From 91a905b42c045bfefa58efe5f63e764f635b0d11 Mon Sep 17 00:00:00 2001 From: Shivam-nagar23 Date: Thu, 13 Feb 2025 10:33:58 +0530 Subject: [PATCH 41/43] sequence change --- scripts/sql/32002900_build_worker_status.down.sql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/sql/32002900_build_worker_status.down.sql b/scripts/sql/32002900_build_worker_status.down.sql index 43da0263a8..6dc8e268d5 100644 --- a/scripts/sql/32002900_build_worker_status.down.sql +++ b/scripts/sql/32002900_build_worker_status.down.sql @@ -1,3 +1,2 @@ -DROP SEQUENCE IF EXISTS id_seq_workflow_execution_stage; - -DROP TABLE IF EXISTS public.workflow_execution_stage CASCADE; \ No newline at end of file +DROP TABLE IF EXISTS public.workflow_execution_stage CASCADE; +DROP SEQUENCE IF EXISTS id_seq_workflow_execution_stage; \ No newline at end of file From 761978b74e451f4b77b374a51e79ab3ae9c6dfdb Mon Sep 17 00:00:00 2001 From: Vikram Singh Date: Thu, 13 Feb 2025 12:43:38 +0530 Subject: [PATCH 42/43] vendor update on rc29 --- go.mod | 4 ++-- go.sum | 8 ++++---- vendor/modules.txt | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index df88b945a9..be973a0085 100644 --- a/go.mod +++ b/go.mod @@ -288,8 +288,8 @@ require gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect replace ( github.com/argoproj/argo-workflows/v3 v3.5.10 => github.com/devtron-labs/argo-workflows/v3 v3.5.13 - github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 - github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 + github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 + github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 k8s.io/api => k8s.io/api v0.29.7 diff --git a/go.sum b/go.sum index d0b8f82530..0819245a3a 100644 --- a/go.sum +++ b/go.sum @@ -792,10 +792,10 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzq github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/devtron-labs/argo-workflows/v3 v3.5.13 h1:3pINq0gXOSeTw2z/vYe+j80lRpSN5Rp/8mfQORh8SmU= github.com/devtron-labs/argo-workflows/v3 v3.5.13/go.mod h1:/vqxcovDPT4zqr4DjR5v7CF8ggpY1l3TSa2CIG3jmjA= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 h1:wI12BFM1NmAkfCfl0pMQHREuI5Xs0XvuQ8K7Rz39z/8= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 h1:bEc/5jYG7PlNwRopPks+waUyRQYrY5tiRwOXpzsyhGc= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 h1:5miSn4CPVILxT/XO7VoQT5Ej4VNf28Brp3BF7NPrPvQ= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 h1:MlMcOWz2Gy8sGo5PJQ+mpIB+0WA4XQkK13SBKXIhRvs= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= github.com/devtron-labs/go-bitbucket v0.9.60-beta h1:VEx1jvDgdtDPS6A1uUFoaEi0l1/oLhbr+90xOwr6sDU= github.com/devtron-labs/go-bitbucket v0.9.60-beta/go.mod h1:GnuiCesvh8xyHeMCb+twm8lBR/kQzJYSKL28ZfObp1Y= github.com/devtron-labs/protos v0.0.3-0.20240802105333-92ee9bb85d80 h1:xwbTeijNTf4/j1v+tSfwVqwLVnReas/NqEKeQHvSTys= diff --git a/vendor/modules.txt b/vendor/modules.txt index 6c6184d29a..adb7100fa5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -336,7 +336,7 @@ github.com/davecgh/go-spew/spew # github.com/deckarep/golang-set v1.8.0 ## explicit; go 1.17 github.com/deckarep/golang-set -# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 +# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 ## explicit; go 1.21 github.com/devtron-labs/authenticator/apiToken github.com/devtron-labs/authenticator/client @@ -344,7 +344,7 @@ github.com/devtron-labs/authenticator/jwt github.com/devtron-labs/authenticator/middleware github.com/devtron-labs/authenticator/oidc github.com/devtron-labs/authenticator/password -# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 +# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 ## explicit; go 1.21 github.com/devtron-labs/common-lib/async github.com/devtron-labs/common-lib/blob-storage @@ -2215,8 +2215,8 @@ xorm.io/xorm/log xorm.io/xorm/names xorm.io/xorm/schemas xorm.io/xorm/tags -# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250210055647-3ce7e36ba884 -# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250210055647-3ce7e36ba884 +# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 +# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 # github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 # github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 # k8s.io/api => k8s.io/api v0.29.7 From 6c244a0cdd0c9f4d8b7415719b62b79b0403ff71 Mon Sep 17 00:00:00 2001 From: Vikram Singh Date: Thu, 13 Feb 2025 13:31:21 +0530 Subject: [PATCH 43/43] vendor update on rc --- go.mod | 4 ++-- go.sum | 8 ++++---- vendor/modules.txt | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index be973a0085..4088841309 100644 --- a/go.mod +++ b/go.mod @@ -288,8 +288,8 @@ require gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect replace ( github.com/argoproj/argo-workflows/v3 v3.5.10 => github.com/devtron-labs/argo-workflows/v3 v3.5.13 - github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 - github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 + github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213074742-042aeadc9d72 + github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213074742-042aeadc9d72 github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 k8s.io/api => k8s.io/api v0.29.7 diff --git a/go.sum b/go.sum index 0819245a3a..98b244a9af 100644 --- a/go.sum +++ b/go.sum @@ -792,10 +792,10 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzq github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/devtron-labs/argo-workflows/v3 v3.5.13 h1:3pINq0gXOSeTw2z/vYe+j80lRpSN5Rp/8mfQORh8SmU= github.com/devtron-labs/argo-workflows/v3 v3.5.13/go.mod h1:/vqxcovDPT4zqr4DjR5v7CF8ggpY1l3TSa2CIG3jmjA= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 h1:5miSn4CPVILxT/XO7VoQT5Ej4VNf28Brp3BF7NPrPvQ= -github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 h1:MlMcOWz2Gy8sGo5PJQ+mpIB+0WA4XQkK13SBKXIhRvs= -github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213074742-042aeadc9d72 h1:BEFuaGkJgvu+8H+To2sMJQusaD3PZwQbxn0ikIpkWbE= +github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213074742-042aeadc9d72/go.mod h1:5lv4Wfj5ERhhvDGXe2IeES6qxjvUVCcohaRwKnWBMNo= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213074742-042aeadc9d72 h1:hPVJuggt+zZjcf3PFaXy7ZrBV7VPB8+ztMVUErmHX3Y= +github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213074742-042aeadc9d72/go.mod h1:1QJJLpgJSkb5Jm9xPeKAk+kXb0QgBOOOgJj0cgYhAVA= github.com/devtron-labs/go-bitbucket v0.9.60-beta h1:VEx1jvDgdtDPS6A1uUFoaEi0l1/oLhbr+90xOwr6sDU= github.com/devtron-labs/go-bitbucket v0.9.60-beta/go.mod h1:GnuiCesvh8xyHeMCb+twm8lBR/kQzJYSKL28ZfObp1Y= github.com/devtron-labs/protos v0.0.3-0.20240802105333-92ee9bb85d80 h1:xwbTeijNTf4/j1v+tSfwVqwLVnReas/NqEKeQHvSTys= diff --git a/vendor/modules.txt b/vendor/modules.txt index adb7100fa5..7ce8e9e49e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -336,7 +336,7 @@ github.com/davecgh/go-spew/spew # github.com/deckarep/golang-set v1.8.0 ## explicit; go 1.17 github.com/deckarep/golang-set -# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 +# github.com/devtron-labs/authenticator v0.4.35-0.20240809073103-6e11da8083f8 => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213074742-042aeadc9d72 ## explicit; go 1.21 github.com/devtron-labs/authenticator/apiToken github.com/devtron-labs/authenticator/client @@ -344,7 +344,7 @@ github.com/devtron-labs/authenticator/jwt github.com/devtron-labs/authenticator/middleware github.com/devtron-labs/authenticator/oidc github.com/devtron-labs/authenticator/password -# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 +# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213074742-042aeadc9d72 ## explicit; go 1.21 github.com/devtron-labs/common-lib/async github.com/devtron-labs/common-lib/blob-storage @@ -2215,8 +2215,8 @@ xorm.io/xorm/log xorm.io/xorm/names xorm.io/xorm/schemas xorm.io/xorm/tags -# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213064930-8b81671f1d87 -# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213064930-8b81671f1d87 +# github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250213074742-042aeadc9d72 +# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250213074742-042aeadc9d72 # github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 # github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5 # k8s.io/api => k8s.io/api v0.29.7