From a9502af0556fd2589c2b616a71983b8f05f1be94 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Fri, 4 Apr 2025 18:35:38 +0530 Subject: [PATCH 01/20] approval deployment flow --- api/restHandler/BulkUpdateRestHandler.go | 62 +++++++++++++++++-- .../DeploymentPipelineRestHandler.go | 41 ++++++++++-- .../trigger/PipelineTriggerRestHandler.go | 53 ++++++++++++++-- pkg/auth/user/bean/bean.go | 6 ++ pkg/bulkAction/service/BulkUpdateService.go | 46 +++++++------- .../service/BulkUpdateService_ent.go | 5 +- .../deployedApp/DeployedAppService.go | 23 +++---- .../deployedApp/DeployedAppService_ent.go | 7 ++- .../trigger/devtronApps/TriggerService.go | 5 +- .../bean/cdPipelineEventBean.go | 6 +- .../in/CDPipelineEventProcessorService.go | 2 +- .../in/WorkflowEventProcessorService.go | 2 +- .../out/CDPipelineEventPublishService.go | 10 +-- .../out/WorkflowEventPublishService.go | 6 +- pkg/eventProcessor/out/bean/bean.go | 14 +++-- .../AppDeploymentTypeChangeManager.go | 13 ++-- ...32703400_alter_cd_workflow_runner.down.sql | 1 + .../32703400_alter_cd_workflow_runner.up.sql | 1 + 18 files changed, 229 insertions(+), 74 deletions(-) create mode 100644 scripts/sql/32703400_alter_cd_workflow_runner.down.sql create mode 100644 scripts/sql/32703400_alter_cd_workflow_runner.up.sql diff --git a/api/restHandler/BulkUpdateRestHandler.go b/api/restHandler/BulkUpdateRestHandler.go index 61b65644b7..a98281324e 100644 --- a/api/restHandler/BulkUpdateRestHandler.go +++ b/api/restHandler/BulkUpdateRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" "fmt" + bean4 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository" "github.com/devtron-labs/devtron/pkg/build/git/gitProvider" "github.com/devtron-labs/devtron/pkg/bulkAction/bean" @@ -212,9 +213,14 @@ func (handler BulkUpdateRestHandlerImpl) CheckAuthForBulkUpdate(AppId int, EnvId } func (handler BulkUpdateRestHandlerImpl) BulkUpdate(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } decoder := json.NewDecoder(r.Body) var script bean.BulkUpdateScript - err := decoder.Decode(&script) + err = decoder.Decode(&script) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return @@ -250,8 +256,18 @@ func (handler BulkUpdateRestHandlerImpl) BulkUpdate(w http.ResponseWriter, r *ht common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } } - - response := handler.bulkUpdateService.BulkUpdate(script.Spec) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean4.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + response := handler.bulkUpdateService.BulkUpdate(script.Spec, userMetadata) common.WriteJsonResp(w, nil, response, http.StatusOK) } @@ -261,7 +277,19 @@ func (handler BulkUpdateRestHandlerImpl) BulkHibernate(w http.ResponseWriter, r return // response already written by the helper on error. } token := r.Header.Get("token") - response, err := handler.bulkUpdateService.BulkHibernate(request, r.Context(), w, token, handler.checkAuthForBulkHibernateAndUnhibernate) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(request.UserId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean4.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: request.UserId, + } + + response, err := handler.bulkUpdateService.BulkHibernate(r.Context(), request, token, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return @@ -298,7 +326,18 @@ func (handler BulkUpdateRestHandlerImpl) BulkUnHibernate(w http.ResponseWriter, return // response already written by the helper on error. } token := r.Header.Get("token") - response, err := handler.bulkUpdateService.BulkUnHibernate(request, r.Context(), w, token, handler.checkAuthForBulkHibernateAndUnhibernate) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(request.UserId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean4.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: request.UserId, + } + response, err := handler.bulkUpdateService.BulkUnHibernate(r.Context(), request, token, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return @@ -326,7 +365,18 @@ func (handler BulkUpdateRestHandlerImpl) BulkDeploy(w http.ResponseWriter, r *ht common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - response, err := handler.bulkUpdateService.BulkDeploy(&request, token, handler.checkAuthBatch) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean4.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + response, err := handler.bulkUpdateService.BulkDeploy(&request, token, handler.checkAuthBatch, userMetadata) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return diff --git a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go index 8437aa7ec4..1d5cfae789 100644 --- a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go +++ b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" models2 "github.com/devtron-labs/devtron/internal/sql/models" + bean4 "github.com/devtron-labs/devtron/pkg/auth/user/bean" bean3 "github.com/devtron-labs/devtron/pkg/chart/bean" devtronAppGitOpConfigBean "github.com/devtron-labs/devtron/pkg/chart/gitOpsConfig/bean" @@ -412,8 +413,18 @@ func (handler *PipelineConfigRestHandlerImpl) HandleChangeDeploymentRequest(w ht // Retrieve argocd token ctx := r.Context() - - resp, err := handler.pipelineBuilder.ChangeDeploymentType(ctx, deploymentAppTypeChangeRequest) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean4.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + resp, err := handler.pipelineBuilder.ChangeDeploymentType(ctx, deploymentAppTypeChangeRequest, userMetadata) if err != nil { nErr := errors.New("failed to change deployment type with error msg: " + err.Error()) @@ -464,7 +475,18 @@ func (handler *PipelineConfigRestHandlerImpl) HandleChangeDeploymentTypeRequest( } ctx := r.Context() - resp, err := handler.pipelineBuilder.ChangePipelineDeploymentType(ctx, deploymentTypeChangeRequest) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean4.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + resp, err := handler.pipelineBuilder.ChangePipelineDeploymentType(ctx, deploymentTypeChangeRequest, userMetadata) if err != nil { handler.Logger.Errorw(err.Error(), "payload", deploymentTypeChangeRequest, "err", err) @@ -513,7 +535,18 @@ func (handler *PipelineConfigRestHandlerImpl) HandleTriggerDeploymentAfterTypeCh } ctx := r.Context() - resp, err := handler.pipelineBuilder.TriggerDeploymentAfterTypeChange(ctx, deploymentAppTriggerRequest) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean4.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + resp, err := handler.pipelineBuilder.TriggerDeploymentAfterTypeChange(ctx, deploymentAppTriggerRequest, userMetadata) if err != nil { handler.Logger.Errorw(err.Error(), diff --git a/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go b/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go index 08b43625b1..8d4858fb15 100644 --- a/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go +++ b/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" util2 "github.com/devtron-labs/devtron/internal/util" + bean5 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/deployment/deployedApp" bean2 "github.com/devtron-labs/devtron/pkg/deployment/deployedApp/bean" "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps" @@ -140,7 +141,18 @@ func (handler PipelineTriggerRestHandlerImpl) OverrideConfig(w http.ResponseWrit triggerContext := bean3.TriggerContext{ Context: ctx, } - mergeResp, helmPackageName, _, err := handler.cdTriggerService.ManualCdTrigger(triggerContext, &overrideRequest) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean5.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + mergeResp, helmPackageName, _, err := handler.cdTriggerService.ManualCdTrigger(triggerContext, &overrideRequest, userMetadata) span.End() if err != nil { handler.logger.Errorw("request err, OverrideConfig", "err", err, "payload", overrideRequest) @@ -184,7 +196,18 @@ func (handler PipelineTriggerRestHandlerImpl) RotatePods(w http.ResponseWriter, common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } - rotatePodResponse, err := handler.deployedAppService.RotatePods(r.Context(), &podRotateRequest) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean5.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + rotatePodResponse, err := handler.deployedAppService.RotatePods(r.Context(), &podRotateRequest, userMetadata) if err != nil { handler.logger.Errorw("service err, RotatePods", "err", err, "payload", podRotateRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -229,7 +252,18 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopApp(w http.ResponseWriter } //rback block ends here ctx := r.Context() - mergeResp, err := handler.deployedAppService.StopStartApp(ctx, &overrideRequest) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean5.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + mergeResp, err := handler.deployedAppService.StopStartApp(ctx, &overrideRequest, userMetadata) if err != nil { handler.logger.Errorw("service err, StartStopApp", "err", err, "payload", overrideRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -283,7 +317,18 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopDeploymentGroup(w http.Re return } //rback block ends here - res, err := handler.workflowEventPublishService.TriggerBulkHibernateAsync(stopDeploymentGroupRequest) + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail, err := handler.userAuthService.GetActiveEmailById(userId) + if err != nil { + common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) + return + } + userMetadata := &bean5.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } + res, err := handler.workflowEventPublishService.TriggerBulkHibernateAsync(stopDeploymentGroupRequest, userMetadata) if err != nil { handler.logger.Errorw("service err, StartStopDeploymentGroup", "err", err, "payload", stopDeploymentGroupRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) diff --git a/pkg/auth/user/bean/bean.go b/pkg/auth/user/bean/bean.go index 01235fce1a..2b03b0ad49 100644 --- a/pkg/auth/user/bean/bean.go +++ b/pkg/auth/user/bean/bean.go @@ -142,3 +142,9 @@ const ( ApplicationBasedKey MergingBaseKey = "application" EnvironmentBasedKey MergingBaseKey = "environment" ) + +type UserMetadata struct { + UserEmailId string + IsUserSuperAdmin bool + UserId int32 +} diff --git a/pkg/bulkAction/service/BulkUpdateService.go b/pkg/bulkAction/service/BulkUpdateService.go index 3b94648b69..4ff629a5ba 100644 --- a/pkg/bulkAction/service/BulkUpdateService.go +++ b/pkg/bulkAction/service/BulkUpdateService.go @@ -34,6 +34,7 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/util" appWorkflow2 "github.com/devtron-labs/devtron/pkg/appWorkflow" + bean6 "github.com/devtron-labs/devtron/pkg/auth/user/bean" bean2 "github.com/devtron-labs/devtron/pkg/bean" bean4 "github.com/devtron-labs/devtron/pkg/bulkAction/bean" "github.com/devtron-labs/devtron/pkg/bulkAction/utils" @@ -68,15 +69,15 @@ type BulkUpdateService interface { FindBulkUpdateReadme(operation string) (response *bean4.BulkUpdateSeeExampleResponse, err error) GetBulkAppName(bulkUpdateRequest *bean4.BulkUpdatePayload) (*bean4.ImpactedObjectsResponse, error) ApplyJsonPatch(patch jsonpatch.Patch, target string) (string, error) - BulkUpdateDeploymentTemplate(bulkUpdatePayload *bean4.BulkUpdatePayload) *bean4.DeploymentTemplateBulkUpdateResponse - BulkUpdateConfigMap(bulkUpdatePayload *bean4.BulkUpdatePayload) *bean4.CmAndSecretBulkUpdateResponse - BulkUpdateSecret(bulkUpdatePayload *bean4.BulkUpdatePayload) *bean4.CmAndSecretBulkUpdateResponse - BulkUpdate(bulkUpdateRequest *bean4.BulkUpdatePayload) (bulkUpdateResponse *bean4.BulkUpdateResponse) + BulkUpdateDeploymentTemplate(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.DeploymentTemplateBulkUpdateResponse + BulkUpdateConfigMap(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.CmAndSecretBulkUpdateResponse + BulkUpdateSecret(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.CmAndSecretBulkUpdateResponse + BulkUpdate(bulkUpdateRequest *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) (bulkUpdateResponse *bean4.BulkUpdateResponse) // BulkHibernate deprecated - BulkHibernate(request *bean4.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) - BulkHibernateV1(request *bean4.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) - BulkUnHibernate(request *bean4.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) - BulkDeploy(request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthBatch func(token string, appObject []string, envObject []string) (map[string]bool, map[string]bool)) (*bean4.BulkApplicationForEnvironmentResponse, error) + BulkHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) + BulkHibernateV1(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) + BulkUnHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) + BulkDeploy(request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthBatch func(token string, appObject []string, envObject []string) (map[string]bool, map[string]bool), userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationForEnvironmentResponse, error) BulkBuildTrigger(request *bean4.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean4.BulkApplicationForEnvironmentResponse, error) GetBulkActionImpactedPipelinesAndWfs(dto *bean4.CdBulkActionRequestDto) ([]*pipelineConfig.Pipeline, []int, []int, error) @@ -379,7 +380,7 @@ func (impl BulkUpdateServiceImpl) ApplyJsonPatch(patch jsonpatch.Patch, target s } return string(modified), err } -func (impl BulkUpdateServiceImpl) BulkUpdateDeploymentTemplate(bulkUpdatePayload *bean4.BulkUpdatePayload) *bean4.DeploymentTemplateBulkUpdateResponse { +func (impl BulkUpdateServiceImpl) BulkUpdateDeploymentTemplate(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.DeploymentTemplateBulkUpdateResponse { deploymentTemplateBulkUpdateResponse := &bean4.DeploymentTemplateBulkUpdateResponse{} var appNameIncludes []string var appNameExcludes []string @@ -544,7 +545,7 @@ func (impl BulkUpdateServiceImpl) BulkUpdateDeploymentTemplate(bulkUpdatePayload return deploymentTemplateBulkUpdateResponse } -func (impl BulkUpdateServiceImpl) BulkUpdateConfigMap(bulkUpdatePayload *bean4.BulkUpdatePayload) *bean4.CmAndSecretBulkUpdateResponse { +func (impl BulkUpdateServiceImpl) BulkUpdateConfigMap(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.CmAndSecretBulkUpdateResponse { configMapBulkUpdateResponse := &bean4.CmAndSecretBulkUpdateResponse{} var appNameIncludes []string var appNameExcludes []string @@ -749,7 +750,7 @@ func (impl BulkUpdateServiceImpl) BulkUpdateConfigMap(bulkUpdatePayload *bean4.B } return configMapBulkUpdateResponse } -func (impl BulkUpdateServiceImpl) BulkUpdateSecret(bulkUpdatePayload *bean4.BulkUpdatePayload) *bean4.CmAndSecretBulkUpdateResponse { +func (impl BulkUpdateServiceImpl) BulkUpdateSecret(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.CmAndSecretBulkUpdateResponse { secretBulkUpdateResponse := &bean4.CmAndSecretBulkUpdateResponse{} var appNameIncludes []string var appNameExcludes []string @@ -966,19 +967,19 @@ func (impl BulkUpdateServiceImpl) BulkUpdateSecret(bulkUpdatePayload *bean4.Bulk } return secretBulkUpdateResponse } -func (impl BulkUpdateServiceImpl) BulkUpdate(bulkUpdatePayload *bean4.BulkUpdatePayload) *bean4.BulkUpdateResponse { +func (impl BulkUpdateServiceImpl) BulkUpdate(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.BulkUpdateResponse { bulkUpdateResponse := &bean4.BulkUpdateResponse{} var deploymentTemplateBulkUpdateResponse *bean4.DeploymentTemplateBulkUpdateResponse var configMapBulkUpdateResponse *bean4.CmAndSecretBulkUpdateResponse var secretBulkUpdateResponse *bean4.CmAndSecretBulkUpdateResponse if bulkUpdatePayload.DeploymentTemplate != nil && bulkUpdatePayload.DeploymentTemplate.Spec != nil && bulkUpdatePayload.DeploymentTemplate.Spec.PatchJson != "" { - deploymentTemplateBulkUpdateResponse = impl.BulkUpdateDeploymentTemplate(bulkUpdatePayload) + deploymentTemplateBulkUpdateResponse = impl.BulkUpdateDeploymentTemplate(bulkUpdatePayload, userMetadata) } if bulkUpdatePayload.ConfigMap != nil && bulkUpdatePayload.ConfigMap.Spec != nil && len(bulkUpdatePayload.ConfigMap.Spec.Names) != 0 && bulkUpdatePayload.ConfigMap.Spec.PatchJson != "" { - configMapBulkUpdateResponse = impl.BulkUpdateConfigMap(bulkUpdatePayload) + configMapBulkUpdateResponse = impl.BulkUpdateConfigMap(bulkUpdatePayload, userMetadata) } if bulkUpdatePayload.Secret != nil && bulkUpdatePayload.Secret.Spec != nil && len(bulkUpdatePayload.Secret.Spec.Names) != 0 && bulkUpdatePayload.Secret.Spec.PatchJson != "" { - secretBulkUpdateResponse = impl.BulkUpdateSecret(bulkUpdatePayload) + secretBulkUpdateResponse = impl.BulkUpdateSecret(bulkUpdatePayload, userMetadata) } bulkUpdateResponse.DeploymentTemplate = deploymentTemplateBulkUpdateResponse @@ -987,7 +988,8 @@ func (impl BulkUpdateServiceImpl) BulkUpdate(bulkUpdatePayload *bean4.BulkUpdate return bulkUpdateResponse } -func (impl BulkUpdateServiceImpl) BulkHibernate(request *bean4.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { +func (impl BulkUpdateServiceImpl) BulkHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, + userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { var pipelines []*pipelineConfig.Pipeline var err error if len(request.AppIdIncludes) > 0 { @@ -1052,7 +1054,7 @@ func (impl BulkUpdateServiceImpl) BulkHibernate(request *bean4.BulkApplicationFo UserId: request.UserId, RequestType: bean5.STOP, } - _, hibernateReqError = impl.deployedAppService.StopStartApp(ctx, stopRequest) + _, hibernateReqError = impl.deployedAppService.StopStartApp(ctx, stopRequest, userMetadata) if hibernateReqError != nil { impl.logger.Errorw("error in hibernating application", "err", hibernateReqError, "pipeline", pipeline) pipelineResponse := response[appKey] @@ -1143,7 +1145,8 @@ func (impl BulkUpdateServiceImpl) buildHibernateUnHibernateRequestForHelmPipelin } return appIdentifier, hibernateRequest, nil } -func (impl BulkUpdateServiceImpl) BulkUnHibernate(request *bean4.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { +func (impl BulkUpdateServiceImpl) BulkUnHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, + userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { var pipelines []*pipelineConfig.Pipeline var err error if len(request.AppIdIncludes) > 0 { @@ -1208,7 +1211,7 @@ func (impl BulkUpdateServiceImpl) BulkUnHibernate(request *bean4.BulkApplication UserId: request.UserId, RequestType: bean5.START, } - _, hibernateReqError = impl.deployedAppService.StopStartApp(ctx, stopRequest) + _, hibernateReqError = impl.deployedAppService.StopStartApp(ctx, stopRequest, userMetadata) if hibernateReqError != nil { impl.logger.Errorw("error in un-hibernating application", "err", hibernateReqError, "pipeline", pipeline) pipelineResponse := response[appKey] @@ -1248,7 +1251,8 @@ func (impl BulkUpdateServiceImpl) BulkUnHibernate(request *bean4.BulkApplication return bulkOperationResponse, nil } -func (impl BulkUpdateServiceImpl) BulkDeploy(request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthBatch func(token string, appObject []string, envObject []string) (map[string]bool, map[string]bool)) (*bean4.BulkApplicationForEnvironmentResponse, error) { +func (impl BulkUpdateServiceImpl) BulkDeploy(request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthBatch func(token string, appObject []string, envObject []string) (map[string]bool, map[string]bool), + userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationForEnvironmentResponse, error) { var pipelines []*pipelineConfig.Pipeline var err error @@ -1361,7 +1365,7 @@ func (impl BulkUpdateServiceImpl) BulkDeploy(request *bean4.BulkApplicationForEn continue } artifact := artifacts[0] - err = impl.cdPipelineEventPublishService.PublishBulkTriggerTopicEvent(pipeline.Id, pipeline.AppId, artifact.Id, request.UserId) + err = impl.cdPipelineEventPublishService.PublishBulkTriggerTopicEvent(pipeline.Id, pipeline.AppId, artifact.Id, userMetadata) if err != nil { impl.logger.Errorw("error, PublishBulkTriggerTopicEvent", "err", err, "pipeline", pipeline) pipelineResponse := response[appKey] diff --git a/pkg/bulkAction/service/BulkUpdateService_ent.go b/pkg/bulkAction/service/BulkUpdateService_ent.go index a3b9d266db..4c8c8193d9 100644 --- a/pkg/bulkAction/service/BulkUpdateService_ent.go +++ b/pkg/bulkAction/service/BulkUpdateService_ent.go @@ -2,10 +2,11 @@ package service import ( "context" + bean2 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/bulkAction/bean" - "net/http" ) -func (impl BulkUpdateServiceImpl) BulkHibernateV1(request *bean.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { +func (impl BulkUpdateServiceImpl) BulkHibernateV1(ctx context.Context, request *bean.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, + userMetadata *bean2.UserMetadata) (*bean.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { return nil, nil } diff --git a/pkg/deployment/deployedApp/DeployedAppService.go b/pkg/deployment/deployedApp/DeployedAppService.go index f8c65d2373..04cf41a662 100644 --- a/pkg/deployment/deployedApp/DeployedAppService.go +++ b/pkg/deployment/deployedApp/DeployedAppService.go @@ -25,6 +25,7 @@ import ( bean2 "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/internal/sql/models" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + bean6 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" bean5 "github.com/devtron-labs/devtron/pkg/deployment/common/bean" "github.com/devtron-labs/devtron/pkg/deployment/deployedApp/bean" @@ -37,10 +38,10 @@ import ( ) type DeployedAppService interface { - StopStartApp(ctx context.Context, stopRequest *bean.StopAppRequest) (int, error) - RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest) (*bean4.RotatePodResponse, error) - StopStartAppV1(ctx context.Context, stopRequest *bean.StopAppRequest) (int, error) - HibernationPatch(ctx context.Context, appId, envId int) (*bean.HibernationPatchResponse, error) + StopStartApp(ctx context.Context, stopRequest *bean.StopAppRequest, userMetadata *bean6.UserMetadata) (int, error) + RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest, userMetadata *bean6.UserMetadata) (*bean4.RotatePodResponse, error) + StopStartAppV1(ctx context.Context, stopRequest *bean.StopAppRequest, userMetadata *bean6.UserMetadata) (int, error) + HibernationPatch(ctx context.Context, appId, envId int, userMetadata *bean6.UserMetadata) (*bean.HibernationPatchResponse, error) } type DeployedAppServiceImpl struct { @@ -68,11 +69,11 @@ func NewDeployedAppServiceImpl(logger *zap.SugaredLogger, } } -func (impl *DeployedAppServiceImpl) StopStartApp(ctx context.Context, stopRequest *bean.StopAppRequest) (int, error) { - return impl.stopStartApp(ctx, stopRequest) +func (impl *DeployedAppServiceImpl) StopStartApp(ctx context.Context, stopRequest *bean.StopAppRequest, userMetadata *bean6.UserMetadata) (int, error) { + return impl.stopStartApp(ctx, stopRequest, userMetadata) } -func (impl *DeployedAppServiceImpl) stopStartApp(ctx context.Context, stopRequest *bean.StopAppRequest) (int, error) { +func (impl *DeployedAppServiceImpl) stopStartApp(ctx context.Context, stopRequest *bean.StopAppRequest, userMetadata *bean6.UserMetadata) (int, error) { pipelines, err := impl.pipelineRepository.FindActiveByAppIdAndEnvironmentId(stopRequest.AppId, stopRequest.EnvironmentId) if err != nil { impl.logger.Errorw("error in fetching pipeline", "app", stopRequest.AppId, "env", stopRequest.EnvironmentId, "err", err) @@ -98,7 +99,7 @@ func (impl *DeployedAppServiceImpl) stopStartApp(ctx context.Context, stopReques impl.logger.Errorw("error in fetching latest release", "err", err) return 0, err } - err = impl.checkForFeasibilityBeforeStartStop(stopRequest.AppId, stopRequest.EnvironmentId, stopRequest.UserId) + err = impl.checkForFeasibilityBeforeStartStop(stopRequest.AppId, stopRequest.EnvironmentId, userMetadata) if err != nil { impl.logger.Errorw("error in checking for feasibility before hibernating and un hibernating", "stopRequest", stopRequest, "err", err) return 0, err @@ -127,7 +128,7 @@ func (impl *DeployedAppServiceImpl) stopStartApp(ctx context.Context, stopReques Context: ctx, ReferenceId: stopRequest.ReferenceId, } - id, _, _, err := impl.cdTriggerService.ManualCdTrigger(triggerContext, overrideRequest) + id, _, _, err := impl.cdTriggerService.ManualCdTrigger(triggerContext, overrideRequest, userMetadata) if err != nil { impl.logger.Errorw("error in stopping app", "err", err, "appId", stopRequest.AppId, "envId", stopRequest.EnvironmentId) return 0, err @@ -135,7 +136,7 @@ func (impl *DeployedAppServiceImpl) stopStartApp(ctx context.Context, stopReques return id, err } -func (impl *DeployedAppServiceImpl) RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest) (*bean4.RotatePodResponse, error) { +func (impl *DeployedAppServiceImpl) RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest, userMetadata *bean6.UserMetadata) (*bean4.RotatePodResponse, error) { impl.logger.Infow("rotate pod request", "payload", podRotateRequest) //extract cluster id and namespace from env id environmentId := podRotateRequest.EnvironmentId @@ -144,7 +145,7 @@ func (impl *DeployedAppServiceImpl) RotatePods(ctx context.Context, podRotateReq impl.logger.Errorw("error occurred while fetching env details", "envId", environmentId, "err", err) return nil, err } - err = impl.checkForFeasibilityBeforeStartStop(podRotateRequest.AppId, podRotateRequest.EnvironmentId, podRotateRequest.UserId) + err = impl.checkForFeasibilityBeforeStartStop(podRotateRequest.AppId, podRotateRequest.EnvironmentId, userMetadata) if err != nil { impl.logger.Errorw("error in checking for feasibility in Rotating pods", "podRotateRequest", podRotateRequest, "err", err) return nil, err diff --git a/pkg/deployment/deployedApp/DeployedAppService_ent.go b/pkg/deployment/deployedApp/DeployedAppService_ent.go index 8429762833..515b419d47 100644 --- a/pkg/deployment/deployedApp/DeployedAppService_ent.go +++ b/pkg/deployment/deployedApp/DeployedAppService_ent.go @@ -2,20 +2,21 @@ package deployedApp import ( "context" + bean6 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/deployment/deployedApp/bean" ) func (impl *DeployedAppServiceImpl) getTemplate(stopRequest *bean.StopAppRequest) (string, error) { return "", nil } -func (impl *DeployedAppServiceImpl) checkForFeasibilityBeforeStartStop(appId, envId int, userId int32) error { +func (impl *DeployedAppServiceImpl) checkForFeasibilityBeforeStartStop(appId, envId int, userMetadata *bean6.UserMetadata) error { return nil } -func (impl *DeployedAppServiceImpl) StopStartAppV1(ctx context.Context, stopRequest *bean.StopAppRequest) (int, error) { +func (impl *DeployedAppServiceImpl) StopStartAppV1(ctx context.Context, stopRequest *bean.StopAppRequest, userMetadata *bean6.UserMetadata) (int, error) { return 0, nil } -func (impl *DeployedAppServiceImpl) HibernationPatch(ctx context.Context, appId, envId int) (*bean.HibernationPatchResponse, error) { +func (impl *DeployedAppServiceImpl) HibernationPatch(ctx context.Context, appId, envId int, userMetadata *bean6.UserMetadata) (*bean.HibernationPatchResponse, error) { return nil, nil } diff --git a/pkg/deployment/trigger/devtronApps/TriggerService.go b/pkg/deployment/trigger/devtronApps/TriggerService.go index 7a5d135045..5dcf9b50ba 100644 --- a/pkg/deployment/trigger/devtronApps/TriggerService.go +++ b/pkg/deployment/trigger/devtronApps/TriggerService.go @@ -48,6 +48,7 @@ import ( statusBean "github.com/devtron-labs/devtron/pkg/app/status/bean" "github.com/devtron-labs/devtron/pkg/attributes" "github.com/devtron-labs/devtron/pkg/auth/user" + userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean" bean2 "github.com/devtron-labs/devtron/pkg/bean" "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/read" pipeline2 "github.com/devtron-labs/devtron/pkg/build/pipeline" @@ -108,7 +109,7 @@ type TriggerService interface { TriggerStageForBulk(triggerRequest bean.TriggerRequest) error - ManualCdTrigger(triggerContext bean.TriggerContext, overrideRequest *bean3.ValuesOverrideRequest) (int, string, *bean4.ManifestPushTemplate, error) + ManualCdTrigger(triggerContext bean.TriggerContext, overrideRequest *bean3.ValuesOverrideRequest, userMetadata *userBean.UserMetadata) (int, string, *bean4.ManifestPushTemplate, error) TriggerAutomaticDeployment(request bean.TriggerRequest) error TriggerRelease(ctx context.Context, overrideRequest *bean3.ValuesOverrideRequest, envDeploymentConfig *bean9.DeploymentConfig, triggeredAt time.Time, triggeredBy int32) (releaseNo int, manifestPushTemplate *bean4.ManifestPushTemplate, err error) @@ -395,7 +396,7 @@ func (impl *TriggerServiceImpl) validateDeploymentTriggerRequest(ctx context.Con } // TODO: write a wrapper to handle auto and manual trigger -func (impl *TriggerServiceImpl) ManualCdTrigger(triggerContext bean.TriggerContext, overrideRequest *bean3.ValuesOverrideRequest) (int, string, *bean4.ManifestPushTemplate, error) { +func (impl *TriggerServiceImpl) ManualCdTrigger(triggerContext bean.TriggerContext, overrideRequest *bean3.ValuesOverrideRequest, userMetadata *userBean.UserMetadata) (int, string, *bean4.ManifestPushTemplate, error) { triggerContext.TriggerType = bean.Manual // setting triggeredAt variable to have consistent data for various audit log places in db for deployment time diff --git a/pkg/eventProcessor/bean/cdPipelineEventBean.go b/pkg/eventProcessor/bean/cdPipelineEventBean.go index a9e795861e..a6aef049c2 100644 --- a/pkg/eventProcessor/bean/cdPipelineEventBean.go +++ b/pkg/eventProcessor/bean/cdPipelineEventBean.go @@ -16,9 +16,13 @@ package bean -import "github.com/devtron-labs/devtron/api/bean" +import ( + "github.com/devtron-labs/devtron/api/bean" + bean2 "github.com/devtron-labs/devtron/pkg/auth/user/bean" +) type BulkCDDeployEvent struct { ValuesOverrideRequest *bean.ValuesOverrideRequest `json:"valuesOverrideRequest"` //TODO migrate this UserId int32 `json:"userId"` + UserMetadata *bean2.UserMetadata `json:"userMetadata"` } diff --git a/pkg/eventProcessor/in/CDPipelineEventProcessorService.go b/pkg/eventProcessor/in/CDPipelineEventProcessorService.go index 5a54759107..b6582012fd 100644 --- a/pkg/eventProcessor/in/CDPipelineEventProcessorService.go +++ b/pkg/eventProcessor/in/CDPipelineEventProcessorService.go @@ -78,7 +78,7 @@ func (impl *CDPipelineEventProcessorImpl) SubscribeCDBulkTriggerTopic() error { ReferenceId: pointer.String(msg.MsgId), Context: context2.Background(), } - _, _, _, err = impl.cdTriggerService.ManualCdTrigger(triggerContext, event.ValuesOverrideRequest) + _, _, _, err = impl.cdTriggerService.ManualCdTrigger(triggerContext, event.ValuesOverrideRequest, event.UserMetadata) if err != nil { impl.logger.Errorw("Error triggering CD", "topic", pubsub.CD_BULK_DEPLOY_TRIGGER_TOPIC, "msg", msg.Data, "err", err) } diff --git a/pkg/eventProcessor/in/WorkflowEventProcessorService.go b/pkg/eventProcessor/in/WorkflowEventProcessorService.go index 2800e9a3bb..4a5ac909c7 100644 --- a/pkg/eventProcessor/in/WorkflowEventProcessorService.go +++ b/pkg/eventProcessor/in/WorkflowEventProcessorService.go @@ -364,7 +364,7 @@ func (impl *WorkflowEventProcessorImpl) SubscribeHibernateBulkAction() error { ReferenceId: pointer.String(msg.MsgId), } ctx := context.Background() - _, err = impl.deployedAppService.StopStartApp(ctx, stopAppRequest) + _, err = impl.deployedAppService.StopStartApp(ctx, stopAppRequest, deploymentGroupAppWithEnv.UserMetadata) if err != nil { impl.logger.Errorw("error in stop app request", "err", err) return diff --git a/pkg/eventProcessor/out/CDPipelineEventPublishService.go b/pkg/eventProcessor/out/CDPipelineEventPublishService.go index b4c8b9fece..78d26e7feb 100644 --- a/pkg/eventProcessor/out/CDPipelineEventPublishService.go +++ b/pkg/eventProcessor/out/CDPipelineEventPublishService.go @@ -20,13 +20,14 @@ import ( "encoding/json" pubsub "github.com/devtron-labs/common-lib/pubsub-lib" bean2 "github.com/devtron-labs/devtron/api/bean" + bean3 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/eventProcessor/bean" "go.uber.org/zap" ) type CDPipelineEventPublishService interface { PublishBulkTriggerTopicEvent(pipelineId, appId, - artifactId int, userId int32) error + artifactId int, userMetadata *bean3.UserMetadata) error PublishArgoTypePipelineSyncEvent(pipelineId, installedAppVersionId int, userId int32, isAppStoreApplication bool) error @@ -46,16 +47,17 @@ func NewCDPipelineEventPublishServiceImpl(logger *zap.SugaredLogger, } func (impl *CDPipelineEventPublishServiceImpl) PublishBulkTriggerTopicEvent(pipelineId, appId, - artifactId int, userId int32) error { + artifactId int, userMetadata *bean3.UserMetadata) error { event := &bean.BulkCDDeployEvent{ ValuesOverrideRequest: &bean2.ValuesOverrideRequest{ PipelineId: pipelineId, AppId: appId, CiArtifactId: artifactId, - UserId: userId, + UserId: userMetadata.UserId, CdWorkflowType: bean2.CD_WORKFLOW_TYPE_DEPLOY, }, - UserId: userId, + UserId: userMetadata.UserId, + UserMetadata: userMetadata, } payload, err := json.Marshal(event) if err != nil { diff --git a/pkg/eventProcessor/out/WorkflowEventPublishService.go b/pkg/eventProcessor/out/WorkflowEventPublishService.go index 4f7d228616..43c212a8e9 100644 --- a/pkg/eventProcessor/out/WorkflowEventPublishService.go +++ b/pkg/eventProcessor/out/WorkflowEventPublishService.go @@ -28,6 +28,7 @@ import ( "github.com/devtron-labs/devtron/pkg/app" appBean "github.com/devtron-labs/devtron/pkg/app/bean" "github.com/devtron-labs/devtron/pkg/app/status" + bean2 "github.com/devtron-labs/devtron/pkg/auth/user/bean" eventProcessorBean "github.com/devtron-labs/devtron/pkg/eventProcessor/bean" "github.com/devtron-labs/devtron/pkg/eventProcessor/celEvaluator" "github.com/devtron-labs/devtron/pkg/eventProcessor/out/bean" @@ -40,7 +41,7 @@ import ( ) type WorkflowEventPublishService interface { - TriggerBulkHibernateAsync(request bean.StopDeploymentGroupRequest) (interface{}, error) + TriggerBulkHibernateAsync(request bean.StopDeploymentGroupRequest, userMetadata *bean2.UserMetadata) (interface{}, error) TriggerAsyncRelease(userDeploymentRequestId int, overrideRequest *apiBean.ValuesOverrideRequest, valuesOverrideResponse *app.ValuesOverrideResponse, ctx context.Context, triggeredBy int32) (releaseNo int, manifestPushTemplate *appBean.ManifestPushTemplate, err error) TriggerBulkDeploymentAsync(requests []*bean.BulkTriggerRequest, UserId int32) (interface{}, error) } @@ -86,7 +87,7 @@ func NewWorkflowEventPublishServiceImpl(logger *zap.SugaredLogger, return impl, nil } -func (impl *WorkflowEventPublishServiceImpl) TriggerBulkHibernateAsync(request bean.StopDeploymentGroupRequest) (interface{}, error) { +func (impl *WorkflowEventPublishServiceImpl) TriggerBulkHibernateAsync(request bean.StopDeploymentGroupRequest, userMetadata *bean2.UserMetadata) (interface{}, error) { dg, err := impl.groupRepository.FindByIdWithApp(request.DeploymentGroupId) if err != nil { impl.logger.Errorw("error while fetching dg", "err", err) @@ -101,6 +102,7 @@ func (impl *WorkflowEventPublishServiceImpl) TriggerBulkHibernateAsync(request b Active: dg.Active, UserId: request.UserId, RequestType: request.RequestType, + UserMetadata: userMetadata, } data, err := json.Marshal(deploymentGroupAppWithEnv) diff --git a/pkg/eventProcessor/out/bean/bean.go b/pkg/eventProcessor/out/bean/bean.go index 7252b043d9..b2606f6f2e 100644 --- a/pkg/eventProcessor/out/bean/bean.go +++ b/pkg/eventProcessor/out/bean/bean.go @@ -17,6 +17,7 @@ package bean import ( + userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean" bean4 "github.com/devtron-labs/devtron/pkg/deployment/deployedApp/bean" "time" ) @@ -33,12 +34,13 @@ type StopDeploymentGroupRequest struct { } type DeploymentGroupAppWithEnv struct { - EnvironmentId int `json:"environmentId"` - DeploymentGroupId int `json:"deploymentGroupId"` - AppId int `json:"appId"` - Active bool `json:"active"` - UserId int32 `json:"userId"` - RequestType bean4.RequestType `json:"requestType" validate:"oneof=START STOP"` + EnvironmentId int `json:"environmentId"` + DeploymentGroupId int `json:"deploymentGroupId"` + AppId int `json:"appId"` + Active bool `json:"active"` + UserId int32 `json:"userId"` + RequestType bean4.RequestType `json:"requestType" validate:"oneof=START STOP"` + UserMetadata *userBean.UserMetadata `json:"-"` } type CdPipelineDeleteEvent struct { diff --git a/pkg/pipeline/AppDeploymentTypeChangeManager.go b/pkg/pipeline/AppDeploymentTypeChangeManager.go index bcca8290be..ef883e835a 100644 --- a/pkg/pipeline/AppDeploymentTypeChangeManager.go +++ b/pkg/pipeline/AppDeploymentTypeChangeManager.go @@ -30,6 +30,7 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" "github.com/devtron-labs/devtron/internal/util" app2 "github.com/devtron-labs/devtron/pkg/app" + userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/bean" chartService "github.com/devtron-labs/devtron/pkg/chart" "github.com/devtron-labs/devtron/pkg/chart/read" @@ -53,13 +54,13 @@ type AppDeploymentTypeChangeManager interface { // ChangeDeploymentType : takes in DeploymentAppTypeChangeRequest struct and // deletes all the cd pipelines for that deployment type in all apps that belongs to // that environment and updates the db with desired deployment app type - ChangeDeploymentType(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error) + ChangeDeploymentType(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest, userMetadata *userBean.UserMetadata) (*bean.DeploymentAppTypeChangeResponse, error) // ChangePipelineDeploymentType : takes in DeploymentAppTypeChangeRequest struct and // deletes all the cd pipelines for that deployment type in all apps that belongs to // that environment and updates the db with desired deployment app type - ChangePipelineDeploymentType(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error) + ChangePipelineDeploymentType(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest, userMetadata *userBean.UserMetadata) (*bean.DeploymentAppTypeChangeResponse, error) // TriggerDeploymentAfterTypeChange : triggers a new deployment after type change - TriggerDeploymentAfterTypeChange(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error) + TriggerDeploymentAfterTypeChange(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest, userMetadata *userBean.UserMetadata) (*bean.DeploymentAppTypeChangeResponse, error) // DeleteDeploymentApps : takes in a list of pipelines and delete the applications DeleteDeploymentApps(ctx context.Context, pipelines []*pipelineConfig.Pipeline, deploymentConfig []*bean4.DeploymentConfig, userId int32) *bean.DeploymentAppTypeChangeResponse // DeleteDeploymentAppsForEnvironment : takes in environment id and current deployment app type @@ -117,7 +118,7 @@ func NewAppDeploymentTypeChangeManagerImpl( } func (impl *AppDeploymentTypeChangeManagerImpl) ChangeDeploymentType(ctx context.Context, - request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error) { + request *bean.DeploymentAppTypeChangeRequest, userMetadata *userBean.UserMetadata) (*bean.DeploymentAppTypeChangeResponse, error) { var response *bean.DeploymentAppTypeChangeResponse var deleteDeploymentType bean3.DeploymentType @@ -252,7 +253,7 @@ func (impl *AppDeploymentTypeChangeManagerImpl) ChangeDeploymentType(ctx context } func (impl *AppDeploymentTypeChangeManagerImpl) ChangePipelineDeploymentType(ctx context.Context, - request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error) { + request *bean.DeploymentAppTypeChangeRequest, userMetadata *userBean.UserMetadata) (*bean.DeploymentAppTypeChangeResponse, error) { response := &bean.DeploymentAppTypeChangeResponse{ EnvId: request.EnvId, @@ -369,7 +370,7 @@ func (impl *AppDeploymentTypeChangeManagerImpl) ChangePipelineDeploymentType(ctx } func (impl *AppDeploymentTypeChangeManagerImpl) TriggerDeploymentAfterTypeChange(ctx context.Context, - request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error) { + request *bean.DeploymentAppTypeChangeRequest, userMetadata *userBean.UserMetadata) (*bean.DeploymentAppTypeChangeResponse, error) { response := &bean.DeploymentAppTypeChangeResponse{ EnvId: request.EnvId, diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql new file mode 100644 index 0000000000..d12ff9dade --- /dev/null +++ b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql @@ -0,0 +1 @@ +ALTER TABLE cd_workflow_runner DROP COLUMN IF EXISTS image_state; diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql new file mode 100644 index 0000000000..4c2f4a04a6 --- /dev/null +++ b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql @@ -0,0 +1 @@ +ALTER TABLE cd_workflow_runner ADD COLUMN IF NOT EXISTS image_state varchar(50); From bd1a4171441d189e751aaca6302b54f05e690fa2 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Wed, 9 Apr 2025 12:02:24 +0530 Subject: [PATCH 02/20] add image_state in cwr --- internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go index a737a7076a..c368141aa9 100644 --- a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go @@ -126,6 +126,7 @@ type CdWorkflowRunner struct { RefCdWorkflowRunnerId int `sql:"ref_cd_workflow_runner_id,notnull"` ImagePathReservationIds []int `sql:"image_path_reservation_ids" pg:",array,notnull"` ReferenceId *string `sql:"reference_id"` + ImageState string `sql:"image_state"` // image_state currently not utilized in oss CdWorkflow *CdWorkflow sql.AuditLog } From 8e7a80bba3bf6e16a90cf63a93d5ec702066cd7f Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Wed, 9 Apr 2025 16:34:03 +0530 Subject: [PATCH 03/20] make image_state as ImageStateWhileDeployment data type --- .../pipelineConfig/CdWorfkflowRepository.go | 45 ++++++++++--------- .../trigger/devtronApps/constants/constant.go | 3 ++ 2 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 pkg/deployment/trigger/devtronApps/constants/constant.go diff --git a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go index c368141aa9..790eed67e0 100644 --- a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go @@ -25,6 +25,7 @@ import ( "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/internal/util" + "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/constants" "github.com/devtron-labs/devtron/pkg/sql" "github.com/go-pg/pg" "go.opentelemetry.io/otel" @@ -105,28 +106,28 @@ type CdWorkflowRunnerWithExtraFields struct { } type CdWorkflowRunner struct { - tableName struct{} `sql:"cd_workflow_runner" pg:",discard_unknown_columns"` - Id int `sql:"id,pk"` - Name string `sql:"name"` - WorkflowType apiBean.WorkflowType `sql:"workflow_type"` // pre,post,deploy - ExecutorType cdWorkflow.WorkflowExecutorType `sql:"executor_type"` // awf, system - Status string `sql:"status"` - PodStatus string `sql:"pod_status"` - Message string `sql:"message"` - StartedOn time.Time `sql:"started_on"` - FinishedOn time.Time `sql:"finished_on"` - Namespace string `sql:"namespace"` - LogLocation string `sql:"log_file_path"` - CdArtifactLocation string `sql:"cd_artifact_location"` - IsArtifactUploaded workflow.ArtifactUploadedType `sql:"is_artifact_uploaded"` - TriggeredBy int32 `sql:"triggered_by"` - CdWorkflowId int `sql:"cd_workflow_id"` - PodName string `sql:"pod_name"` - BlobStorageEnabled bool `sql:"blob_storage_enabled,notnull"` - RefCdWorkflowRunnerId int `sql:"ref_cd_workflow_runner_id,notnull"` - ImagePathReservationIds []int `sql:"image_path_reservation_ids" pg:",array,notnull"` - ReferenceId *string `sql:"reference_id"` - ImageState string `sql:"image_state"` // image_state currently not utilized in oss + tableName struct{} `sql:"cd_workflow_runner" pg:",discard_unknown_columns"` + Id int `sql:"id,pk"` + Name string `sql:"name"` + WorkflowType apiBean.WorkflowType `sql:"workflow_type"` // pre,post,deploy + ExecutorType cdWorkflow.WorkflowExecutorType `sql:"executor_type"` // awf, system + Status string `sql:"status"` + PodStatus string `sql:"pod_status"` + Message string `sql:"message"` + StartedOn time.Time `sql:"started_on"` + FinishedOn time.Time `sql:"finished_on"` + Namespace string `sql:"namespace"` + LogLocation string `sql:"log_file_path"` + CdArtifactLocation string `sql:"cd_artifact_location"` + IsArtifactUploaded workflow.ArtifactUploadedType `sql:"is_artifact_uploaded"` + TriggeredBy int32 `sql:"triggered_by"` + CdWorkflowId int `sql:"cd_workflow_id"` + PodName string `sql:"pod_name"` + BlobStorageEnabled bool `sql:"blob_storage_enabled,notnull"` + RefCdWorkflowRunnerId int `sql:"ref_cd_workflow_runner_id,notnull"` + ImagePathReservationIds []int `sql:"image_path_reservation_ids" pg:",array,notnull"` + ReferenceId *string `sql:"reference_id"` + ImageState constants.ImageStateWhileDeployment `sql:"image_state"` // image_state currently not utilized in oss CdWorkflow *CdWorkflow sql.AuditLog } diff --git a/pkg/deployment/trigger/devtronApps/constants/constant.go b/pkg/deployment/trigger/devtronApps/constants/constant.go new file mode 100644 index 0000000000..f51c0c7b24 --- /dev/null +++ b/pkg/deployment/trigger/devtronApps/constants/constant.go @@ -0,0 +1,3 @@ +package constants + +type ImageStateWhileDeployment string From 538321eec0c5738d9b7a16c3080540681ae784f1 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Thu, 10 Apr 2025 14:08:49 +0530 Subject: [PATCH 04/20] update notification_templates set template payload for CD trigger ses --- scripts/sql/32703400_alter_cd_workflow_runner.down.sql | 7 +++++++ scripts/sql/32703400_alter_cd_workflow_runner.up.sql | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql index d12ff9dade..12242b1043 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql @@ -1 +1,8 @@ ALTER TABLE cd_workflow_runner DROP COLUMN IF EXISTS image_state; + +---- update notification template for CD trigger ses +UPDATE notification_templates +SET template_payload = '{"from": "{{fromEmail}}", "to": "{{toEmail}}","subject": "▶️ Deployment pipeline triggered | Application: {{appName}} | Environment: {{envName}}","html":"{{#ciMaterials}} {{^webhookType}}{{/webhookType}} {{/ciMaterials}}
cd-triggered
▶️ Deployment pipeline triggered
{{eventTime}}
by{{triggeredBy}}
{{#deploymentHistoryLink}}View Pipeline{{/deploymentHistoryLink}}
{{#appDetailsLink}}App Details{{/appDetailsLink}}

{{deploymentWindowComment}}
Application
Environment
{{appName}}
{{envName}}
Stage
{{stage}}
Source Code
Branch
Commit
{{appName}}/{{branch}}
{{commit}}
Image Details
Image tag
{{dockerImg}}

BlogWebsite
© Devtron Labs 2024
"}' +WHERE node_type = 'CD' + AND event_type_id = 1 + AND channel_type='ses'; \ No newline at end of file diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql index 4c2f4a04a6..dfb4f761c0 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql @@ -1 +1,8 @@ ALTER TABLE cd_workflow_runner ADD COLUMN IF NOT EXISTS image_state varchar(50); + +---- update notification template for CD trigger ses +UPDATE notification_templates +SET template_payload = '{"from": "{{fromEmail}}", "to": "{{toEmail}}","subject": "▶️ Deployment pipeline triggered | Application: {{appName}} | Environment: {{envName}}","html":”​​{{#ciMaterials}} {{^webhookType}}{{/webhookType}} {{/ciMaterials}}
cd-triggered
▶️ Deployment pipeline triggered
{{eventTime}}
by{{triggeredBy}}
{{#deploymentHistoryLink}}View Pipeline{{/deploymentHistoryLink}}
{{#appDetailsLink}}App Details{{/appDetailsLink}}

{{deploymentWindowComment}}
{{triggeredWithoutApproval}}
Application
Environment
{{appName}}
{{envName}}
Stage
{{stage}}
Source Code
Branch
Commit
{{appName}}/{{branch}}
{{commit}}
Image Details
Image tag
{{dockerImg}}

BlogWebsite
© Devtron Labs 2024
"}' +WHERE node_type = 'CD' + AND event_type_id = 1 + AND channel_type='ses'; \ No newline at end of file From 3be33af1209de30430b6213d447f02d91b1be3c2 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Fri, 11 Apr 2025 17:05:52 +0530 Subject: [PATCH 05/20] code review fixes: 1st level kartik --- api/restHandler/BulkUpdateRestHandler.go | 4 ++-- env_gen.json | 2 +- env_gen.md | 1 + pkg/bulkAction/service/BulkUpdateService.go | 14 +++++++------- pkg/bulkAction/service/BulkUpdateService_ent.go | 2 +- util/HttpUtil.go | 8 ++++++++ 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/api/restHandler/BulkUpdateRestHandler.go b/api/restHandler/BulkUpdateRestHandler.go index a98281324e..f9b3a27c60 100644 --- a/api/restHandler/BulkUpdateRestHandler.go +++ b/api/restHandler/BulkUpdateRestHandler.go @@ -289,7 +289,7 @@ func (handler BulkUpdateRestHandlerImpl) BulkHibernate(w http.ResponseWriter, r UserId: request.UserId, } - response, err := handler.bulkUpdateService.BulkHibernate(r.Context(), request, token, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata) + response, err := handler.bulkUpdateService.BulkHibernate(r.Context(), request, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return @@ -337,7 +337,7 @@ func (handler BulkUpdateRestHandlerImpl) BulkUnHibernate(w http.ResponseWriter, IsUserSuperAdmin: isSuperAdmin, UserId: request.UserId, } - response, err := handler.bulkUpdateService.BulkUnHibernate(r.Context(), request, token, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata) + response, err := handler.bulkUpdateService.BulkUnHibernate(r.Context(), request, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return diff --git a/env_gen.json b/env_gen.json index b4b889fc79..ad32c0da18 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":"FEATURE_MIGRATE_ARGOCD_APPLICATION_ENABLE","EnvType":"bool","EnvValue":"false","EnvDescription":"enable migration of external argocd application to devtron pipeline","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MIGRATE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"migrate deployment config data from charts table to deployment_config table","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"},{"Env":"REVISION_HISTORY_LIMIT_LINKED_HELM_APP","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","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":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"use deployment config data from deployment_config table","Example":"","Deprecated":"true"}]},{"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":"ADDITIONAL_NODE_GROUP_LABELS","EnvType":"","EnvValue":"","EnvDescription":"Add comma separated list of additional node group labels to default labels","Example":"karpenter.sh/nodepool,cloud.google.com/gke-nodepool","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":"APP_SYNC_SHUTDOWN_WAIT_DURATION","EnvType":"int","EnvValue":"120","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":"INSTALLED_MODULES","EnvType":"","EnvValue":"","EnvDescription":"List of installed modules given in helm values/yaml are written in cm and used by devtron to know which modules are given","Example":"security.trivy,security.clair","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_AIR_GAP_ENVIRONMENT","EnvType":"bool","EnvValue":"false","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":"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":"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_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":"FEATURE_MIGRATE_ARGOCD_APPLICATION_ENABLE","EnvType":"bool","EnvValue":"false","EnvDescription":"enable migration of external argocd application to devtron pipeline","Example":"","Deprecated":"false"},{"Env":"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME","EnvType":"string","EnvValue":"120","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"IS_INTERNAL_USE","EnvType":"bool","EnvValue":"true","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"MIGRATE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"migrate deployment config data from charts table to deployment_config table","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"},{"Env":"REVISION_HISTORY_LIMIT_LINKED_HELM_APP","EnvType":"int","EnvValue":"15","EnvDescription":"","Example":"","Deprecated":"false"},{"Env":"RUN_HELM_INSTALL_IN_ASYNC_MODE_HELM_APPS","EnvType":"bool","EnvValue":"false","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":"USE_DEPLOYMENT_CONFIG_DATA","EnvType":"bool","EnvValue":"false","EnvDescription":"use deployment config data from deployment_config table","Example":"","Deprecated":"true"}]},{"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":"ADDITIONAL_NODE_GROUP_LABELS","EnvType":"","EnvValue":"","EnvDescription":"Add comma separated list of additional node group labels to default labels","Example":"karpenter.sh/nodepool,cloud.google.com/gke-nodepool","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":"APP_SYNC_SHUTDOWN_WAIT_DURATION","EnvType":"int","EnvValue":"120","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_SCOPES","EnvType":"","EnvValue":"","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":"INSTALLED_MODULES","EnvType":"","EnvValue":"","EnvDescription":"List of installed modules given in helm values/yaml are written in cm and used by devtron to know which modules are given","Example":"security.trivy,security.clair","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_AIR_GAP_ENVIRONMENT","EnvType":"bool","EnvValue":"false","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":"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":"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_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 f247bf8a1f..63d998590a 100644 --- a/env_gen.md +++ b/env_gen.md @@ -168,6 +168,7 @@ | DEX_CSTOREKEY | string | | | | false | | DEX_JWTKEY | string | | | | false | | DEX_RURL | string |http://127.0.0.1:8080/callback | | | false | + | DEX_SCOPES | | | | | false | | DEX_SECRET | string | | | | false | | DEX_URL | string | | | | false | | ECR_REPO_NAME_PREFIX | string |test/ | | | false | diff --git a/pkg/bulkAction/service/BulkUpdateService.go b/pkg/bulkAction/service/BulkUpdateService.go index 4ff629a5ba..10b0213583 100644 --- a/pkg/bulkAction/service/BulkUpdateService.go +++ b/pkg/bulkAction/service/BulkUpdateService.go @@ -74,9 +74,9 @@ type BulkUpdateService interface { BulkUpdateSecret(bulkUpdatePayload *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) *bean4.CmAndSecretBulkUpdateResponse BulkUpdate(bulkUpdateRequest *bean4.BulkUpdatePayload, userMetadata *bean6.UserMetadata) (bulkUpdateResponse *bean4.BulkUpdateResponse) // BulkHibernate deprecated - BulkHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) - BulkHibernateV1(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) - BulkUnHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) + BulkHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) + BulkHibernateV1(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) + BulkUnHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) BulkDeploy(request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthBatch func(token string, appObject []string, envObject []string) (map[string]bool, map[string]bool), userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationForEnvironmentResponse, error) BulkBuildTrigger(request *bean4.BulkApplicationForEnvironmentPayload, ctx context.Context, w http.ResponseWriter, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool) (*bean4.BulkApplicationForEnvironmentResponse, error) @@ -988,7 +988,7 @@ func (impl BulkUpdateServiceImpl) BulkUpdate(bulkUpdatePayload *bean4.BulkUpdate return bulkUpdateResponse } -func (impl BulkUpdateServiceImpl) BulkHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, +func (impl BulkUpdateServiceImpl) BulkHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { var pipelines []*pipelineConfig.Pipeline var err error @@ -1024,7 +1024,7 @@ func (impl BulkUpdateServiceImpl) BulkHibernate(ctx context.Context, request *be } appObject := impl.enforcerUtil.GetAppRBACNameByAppId(pipeline.AppId) envObject := impl.enforcerUtil.GetEnvRBACNameByAppId(pipeline.AppId, pipeline.EnvironmentId) - isValidAuth := checkAuthForBulkActions(token, appObject, envObject) + isValidAuth := checkAuthForBulkActions(util2.GetTokenFromContext(ctx), appObject, envObject) if !isValidAuth { //skip hibernate for the app if user does not have access on that pipelineResponse := response[appKey] @@ -1145,7 +1145,7 @@ func (impl BulkUpdateServiceImpl) buildHibernateUnHibernateRequestForHelmPipelin } return appIdentifier, hibernateRequest, nil } -func (impl BulkUpdateServiceImpl) BulkUnHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, +func (impl BulkUpdateServiceImpl) BulkUnHibernate(ctx context.Context, request *bean4.BulkApplicationForEnvironmentPayload, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean6.UserMetadata) (*bean4.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { var pipelines []*pipelineConfig.Pipeline var err error @@ -1180,7 +1180,7 @@ func (impl BulkUpdateServiceImpl) BulkUnHibernate(ctx context.Context, request * } appObject := impl.enforcerUtil.GetAppRBACNameByAppId(pipeline.AppId) envObject := impl.enforcerUtil.GetEnvRBACNameByAppId(pipeline.AppId, pipeline.EnvironmentId) - isValidAuth := checkAuthForBulkActions(token, appObject, envObject) + isValidAuth := checkAuthForBulkActions(util2.GetTokenFromContext(ctx), appObject, envObject) if !isValidAuth { //skip hibernate for the app if user does not have access on that pipelineResponse := response[appKey] diff --git a/pkg/bulkAction/service/BulkUpdateService_ent.go b/pkg/bulkAction/service/BulkUpdateService_ent.go index 4c8c8193d9..6d7da4c498 100644 --- a/pkg/bulkAction/service/BulkUpdateService_ent.go +++ b/pkg/bulkAction/service/BulkUpdateService_ent.go @@ -6,7 +6,7 @@ import ( "github.com/devtron-labs/devtron/pkg/bulkAction/bean" ) -func (impl BulkUpdateServiceImpl) BulkHibernateV1(ctx context.Context, request *bean.BulkApplicationForEnvironmentPayload, token string, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, +func (impl BulkUpdateServiceImpl) BulkHibernateV1(ctx context.Context, request *bean.BulkApplicationForEnvironmentPayload, checkAuthForBulkActions func(token string, appObject string, envObject string) bool, userMetadata *bean2.UserMetadata) (*bean.BulkApplicationHibernateUnhibernateForEnvironmentResponse, error) { return nil, nil } diff --git a/util/HttpUtil.go b/util/HttpUtil.go index d5d5c91269..2f8a5eb0a7 100644 --- a/util/HttpUtil.go +++ b/util/HttpUtil.go @@ -17,6 +17,7 @@ package util import ( + "context" "crypto/tls" "errors" "fmt" @@ -30,6 +31,8 @@ import ( "time" ) +const TokenKey = "token" + func ReadFromUrlWithRetry(url string) ([]byte, error) { var ( err error @@ -152,3 +155,8 @@ func getCertFileName() string { randomName := fmt.Sprintf("%v.crt", GetRandomName()) return randomName } + +func GetTokenFromContext(ctx context.Context) string { + token, _ := ctx.Value(TokenKey).(string) + return token +} From d0a7cbcd41f33819d6e19f23fddda268a096d158 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Mon, 14 Apr 2025 13:47:15 +0530 Subject: [PATCH 06/20] code review fixes: 1st level kartik --- client/events/EventBuilder.go | 1 + client/events/EventBuilder_ent.go | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 client/events/EventBuilder_ent.go diff --git a/client/events/EventBuilder.go b/client/events/EventBuilder.go index 83f7186811..e0ff101c90 100644 --- a/client/events/EventBuilder.go +++ b/client/events/EventBuilder.go @@ -170,6 +170,7 @@ func (impl *EventSimpleFactoryImpl) BuildExtraCDData(event Event, wfr *pipelineC payload.TriggeredBy = user.EmailId event.Payload = payload } + event = impl.addExtraCdDataForEnterprise(event, wfr) return event } diff --git a/client/events/EventBuilder_ent.go b/client/events/EventBuilder_ent.go new file mode 100644 index 0000000000..c6e2b95e1c --- /dev/null +++ b/client/events/EventBuilder_ent.go @@ -0,0 +1,7 @@ +package client + +import "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + +func (impl *EventSimpleFactoryImpl) addExtraCdDataForEnterprise(event Event, wfr *pipelineConfig.CdWorkflowRunner) Event { + return event +} From d1aff8e17b8a6a15944dc5ca569bbcbd249cc8df Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Mon, 14 Apr 2025 14:56:50 +0530 Subject: [PATCH 07/20] code review fixes: 1st level nishant --- api/restHandler/BulkUpdateRestHandler.go | 25 ++++--------------- .../DeploymentPipelineRestHandler.go | 18 +++---------- .../trigger/PipelineTriggerRestHandler.go | 24 +++--------------- util/HttpUtil.go | 10 +++++++- 4 files changed, 21 insertions(+), 56 deletions(-) diff --git a/api/restHandler/BulkUpdateRestHandler.go b/api/restHandler/BulkUpdateRestHandler.go index f9b3a27c60..3a6d7d2b24 100644 --- a/api/restHandler/BulkUpdateRestHandler.go +++ b/api/restHandler/BulkUpdateRestHandler.go @@ -25,6 +25,7 @@ import ( "github.com/devtron-labs/devtron/pkg/bulkAction/bean" "github.com/devtron-labs/devtron/pkg/bulkAction/service" "github.com/devtron-labs/devtron/pkg/cluster/environment" + "github.com/devtron-labs/devtron/util" "net/http" "strconv" "strings" @@ -257,11 +258,7 @@ func (handler BulkUpdateRestHandlerImpl) BulkUpdate(w http.ResponseWriter, r *ht } } isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(r.Context()) userMetadata := &bean4.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -278,11 +275,7 @@ func (handler BulkUpdateRestHandlerImpl) BulkHibernate(w http.ResponseWriter, r } token := r.Header.Get("token") isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(request.UserId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(r.Context()) userMetadata := &bean4.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -327,11 +320,7 @@ func (handler BulkUpdateRestHandlerImpl) BulkUnHibernate(w http.ResponseWriter, } token := r.Header.Get("token") isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(request.UserId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(r.Context()) userMetadata := &bean4.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -366,11 +355,7 @@ func (handler BulkUpdateRestHandlerImpl) BulkDeploy(w http.ResponseWriter, r *ht return } isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(r.Context()) userMetadata := &bean4.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, diff --git a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go index 1d5cfae789..1a8920492b 100644 --- a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go +++ b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go @@ -414,11 +414,7 @@ func (handler *PipelineConfigRestHandlerImpl) HandleChangeDeploymentRequest(w ht ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util2.GetEmailFromContext(ctx) userMetadata := &bean4.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -476,11 +472,7 @@ func (handler *PipelineConfigRestHandlerImpl) HandleChangeDeploymentTypeRequest( ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util2.GetEmailFromContext(ctx) userMetadata := &bean4.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -536,11 +528,7 @@ func (handler *PipelineConfigRestHandlerImpl) HandleTriggerDeploymentAfterTypeCh ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util2.GetEmailFromContext(ctx) userMetadata := &bean4.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, diff --git a/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go b/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go index 8d4858fb15..3d4df99c68 100644 --- a/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go +++ b/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go @@ -142,11 +142,7 @@ func (handler PipelineTriggerRestHandlerImpl) OverrideConfig(w http.ResponseWrit Context: ctx, } isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(ctx) userMetadata := &bean5.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -197,11 +193,7 @@ func (handler PipelineTriggerRestHandlerImpl) RotatePods(w http.ResponseWriter, return } isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(r.Context()) userMetadata := &bean5.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -253,11 +245,7 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopApp(w http.ResponseWriter //rback block ends here ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(ctx) userMetadata := &bean5.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, @@ -318,11 +306,7 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopDeploymentGroup(w http.Re } //rback block ends here isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userEmail := util.GetEmailFromContext(r.Context()) userMetadata := &bean5.UserMetadata{ UserEmailId: userEmail, IsUserSuperAdmin: isSuperAdmin, diff --git a/util/HttpUtil.go b/util/HttpUtil.go index 2f8a5eb0a7..afe951cfaf 100644 --- a/util/HttpUtil.go +++ b/util/HttpUtil.go @@ -31,7 +31,10 @@ import ( "time" ) -const TokenKey = "token" +const ( + EmailId = "emailId" + TokenKey = "token" +) func ReadFromUrlWithRetry(url string) ([]byte, error) { var ( @@ -160,3 +163,8 @@ func GetTokenFromContext(ctx context.Context) string { token, _ := ctx.Value(TokenKey).(string) return token } + +func GetEmailFromContext(ctx context.Context) string { + email, _ := ctx.Value(EmailId).(string) + return email +} From 353cac888a3fedaf27129cad9998f027aa4c64de Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Mon, 14 Apr 2025 18:08:43 +0530 Subject: [PATCH 08/20] oss sync with ent --- .../app/appList/AppListingRestHandler.go | 16 +++++++++++++++- .../app/appList/AppListingRestHandler_ent.go | 4 +++- pkg/deployment/deployedApp/DeployedAppService.go | 4 ++-- .../deployedApp/DeployedAppService_ent.go | 2 +- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/api/restHandler/app/appList/AppListingRestHandler.go b/api/restHandler/app/appList/AppListingRestHandler.go index 3862d4c4b9..311958b984 100644 --- a/api/restHandler/app/appList/AppListingRestHandler.go +++ b/api/restHandler/app/appList/AppListingRestHandler.go @@ -38,6 +38,7 @@ import ( util4 "github.com/devtron-labs/devtron/pkg/appStore/util" "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" "github.com/devtron-labs/devtron/pkg/auth/user" + "github.com/devtron-labs/devtron/pkg/auth/user/bean" bean5 "github.com/devtron-labs/devtron/pkg/cluster/bean" bean2 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" common2 "github.com/devtron-labs/devtron/pkg/deployment/common" @@ -49,6 +50,7 @@ import ( k8sApplication "github.com/devtron-labs/devtron/pkg/k8s/application" "github.com/devtron-labs/devtron/pkg/pipeline" bean6 "github.com/devtron-labs/devtron/pkg/team/bean" + util2 "github.com/devtron-labs/devtron/util" "github.com/devtron-labs/devtron/util/rbac" "github.com/go-pg/pg" "github.com/gorilla/mux" @@ -469,6 +471,11 @@ func (handler AppListingRestHandlerImpl) FetchOverviewAppsByEnvironment(w http.R } func (handler AppListingRestHandlerImpl) FetchAppDetailsV2(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } vars := mux.Vars(r) token := r.Header.Get("token") appId, err := strconv.Atoi(vars["app-id"]) @@ -486,6 +493,13 @@ func (handler AppListingRestHandlerImpl) FetchAppDetailsV2(w http.ResponseWriter common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } + isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") + userEmail := util2.GetEmailFromContext(r.Context()) + userMetadata := &bean.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } appDetail, err := handler.appListingService.FetchAppDetails(r.Context(), appId, envId) if err != nil { handler.logger.Errorw("service err, FetchAppDetailsV2", "err", err, "appId", appId, "envId", envId) @@ -493,7 +507,7 @@ func (handler AppListingRestHandlerImpl) FetchAppDetailsV2(w http.ResponseWriter return } - appDetail, err = handler.updateApprovalConfigDataInAppDetailResp(appDetail, appId, envId) + appDetail, err = handler.updateApprovalConfigDataInAppDetailResp(r.Context(), appDetail, appId, envId, userMetadata) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return diff --git a/api/restHandler/app/appList/AppListingRestHandler_ent.go b/api/restHandler/app/appList/AppListingRestHandler_ent.go index 48ff9ff1f7..7b80a6489b 100644 --- a/api/restHandler/app/appList/AppListingRestHandler_ent.go +++ b/api/restHandler/app/appList/AppListingRestHandler_ent.go @@ -1,7 +1,9 @@ package appList import ( + "context" "github.com/devtron-labs/devtron/api/bean/AppView" + userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean" "net/http" ) @@ -14,6 +16,6 @@ func (handler AppListingRestHandlerImpl) FetchAutocompleteJobCiPipelines(w http. func (handler AppListingRestHandlerImpl) GetAllAppEnvsFromResourceNames(w http.ResponseWriter, r *http.Request) { } -func (handler AppListingRestHandlerImpl) updateApprovalConfigDataInAppDetailResp(appDetail AppView.AppDetailContainer, appId, envId int) (AppView.AppDetailContainer, error) { +func (handler AppListingRestHandlerImpl) updateApprovalConfigDataInAppDetailResp(ctx context.Context, appDetail AppView.AppDetailContainer, appId, envId int, userMetadata *userBean.UserMetadata) (AppView.AppDetailContainer, error) { return appDetail, nil } diff --git a/pkg/deployment/deployedApp/DeployedAppService.go b/pkg/deployment/deployedApp/DeployedAppService.go index 04cf41a662..d46642835d 100644 --- a/pkg/deployment/deployedApp/DeployedAppService.go +++ b/pkg/deployment/deployedApp/DeployedAppService.go @@ -99,7 +99,7 @@ func (impl *DeployedAppServiceImpl) stopStartApp(ctx context.Context, stopReques impl.logger.Errorw("error in fetching latest release", "err", err) return 0, err } - err = impl.checkForFeasibilityBeforeStartStop(stopRequest.AppId, stopRequest.EnvironmentId, userMetadata) + err = impl.checkForFeasibilityBeforeStartStop(ctx, stopRequest.AppId, stopRequest.EnvironmentId, userMetadata) if err != nil { impl.logger.Errorw("error in checking for feasibility before hibernating and un hibernating", "stopRequest", stopRequest, "err", err) return 0, err @@ -145,7 +145,7 @@ func (impl *DeployedAppServiceImpl) RotatePods(ctx context.Context, podRotateReq impl.logger.Errorw("error occurred while fetching env details", "envId", environmentId, "err", err) return nil, err } - err = impl.checkForFeasibilityBeforeStartStop(podRotateRequest.AppId, podRotateRequest.EnvironmentId, userMetadata) + err = impl.checkForFeasibilityBeforeStartStop(ctx, podRotateRequest.AppId, podRotateRequest.EnvironmentId, userMetadata) if err != nil { impl.logger.Errorw("error in checking for feasibility in Rotating pods", "podRotateRequest", podRotateRequest, "err", err) return nil, err diff --git a/pkg/deployment/deployedApp/DeployedAppService_ent.go b/pkg/deployment/deployedApp/DeployedAppService_ent.go index 515b419d47..514303365d 100644 --- a/pkg/deployment/deployedApp/DeployedAppService_ent.go +++ b/pkg/deployment/deployedApp/DeployedAppService_ent.go @@ -9,7 +9,7 @@ import ( func (impl *DeployedAppServiceImpl) getTemplate(stopRequest *bean.StopAppRequest) (string, error) { return "", nil } -func (impl *DeployedAppServiceImpl) checkForFeasibilityBeforeStartStop(appId, envId int, userMetadata *bean6.UserMetadata) error { +func (impl *DeployedAppServiceImpl) checkForFeasibilityBeforeStartStop(ctx context.Context, appId, envId int, userMetadata *bean6.UserMetadata) error { return nil } From 7a2493a90bd2b38365dcbb3801630ab104c2b104 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Tue, 15 Apr 2025 00:38:00 +0530 Subject: [PATCH 09/20] resource_version in global policy table --- scripts/sql/32703400_alter_cd_workflow_runner.down.sql | 4 +++- scripts/sql/32703400_alter_cd_workflow_runner.up.sql | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql index 12242b1043..aad67020ee 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql @@ -5,4 +5,6 @@ UPDATE notification_templates SET template_payload = '{"from": "{{fromEmail}}", "to": "{{toEmail}}","subject": "▶️ Deployment pipeline triggered | Application: {{appName}} | Environment: {{envName}}","html":"{{#ciMaterials}} {{^webhookType}}{{/webhookType}} {{/ciMaterials}}
cd-triggered
▶️ Deployment pipeline triggered
{{eventTime}}
by{{triggeredBy}}
{{#deploymentHistoryLink}}View Pipeline{{/deploymentHistoryLink}}
{{#appDetailsLink}}App Details{{/appDetailsLink}}

{{deploymentWindowComment}}
Application
Environment
{{appName}}
{{envName}}
Stage
{{stage}}
Source Code
Branch
Commit
{{appName}}/{{branch}}
{{commit}}
Image Details
Image tag
{{dockerImg}}

BlogWebsite
© Devtron Labs 2024
"}' WHERE node_type = 'CD' AND event_type_id = 1 - AND channel_type='ses'; \ No newline at end of file + AND channel_type='ses'; + +ALTER TABLE global_policy DROP COLUMN IF EXISTS resource_version; diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql index dfb4f761c0..82e27c2328 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql @@ -5,4 +5,8 @@ UPDATE notification_templates SET template_payload = '{"from": "{{fromEmail}}", "to": "{{toEmail}}","subject": "▶️ Deployment pipeline triggered | Application: {{appName}} | Environment: {{envName}}","html":”​​{{#ciMaterials}} {{^webhookType}}{{/webhookType}} {{/ciMaterials}}
cd-triggered
▶️ Deployment pipeline triggered
{{eventTime}}
by{{triggeredBy}}
{{#deploymentHistoryLink}}View Pipeline{{/deploymentHistoryLink}}
{{#appDetailsLink}}App Details{{/appDetailsLink}}

{{deploymentWindowComment}}
{{triggeredWithoutApproval}}
Application
Environment
{{appName}}
{{envName}}
Stage
{{stage}}
Source Code
Branch
Commit
{{appName}}/{{branch}}
{{commit}}
Image Details
Image tag
{{dockerImg}}

BlogWebsite
© Devtron Labs 2024
"}' WHERE node_type = 'CD' AND event_type_id = 1 - AND channel_type='ses'; \ No newline at end of file + AND channel_type='ses'; + +--adding resource_version to global_policy table for maintaining optimistic concurrency control +ALTER TABLE global_policy ADD COLUMN IF NOT EXISTS resource_version VARCHAR(50); + From 5dff7b9ac21309ffc0dc0096bae15162be1e0505 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Tue, 15 Apr 2025 12:13:20 +0530 Subject: [PATCH 10/20] varchar 50 to 20 --- scripts/sql/32703400_alter_cd_workflow_runner.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql index 82e27c2328..46ca525f75 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql @@ -8,5 +8,5 @@ WHERE node_type = 'CD' AND channel_type='ses'; --adding resource_version to global_policy table for maintaining optimistic concurrency control -ALTER TABLE global_policy ADD COLUMN IF NOT EXISTS resource_version VARCHAR(50); +ALTER TABLE global_policy ADD COLUMN IF NOT EXISTS resource_version VARCHAR(20); From 26b26c81f195f028d4eb28056de32cb11871c064 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Tue, 15 Apr 2025 12:41:59 +0530 Subject: [PATCH 11/20] update col name to policy_revision --- scripts/sql/32703400_alter_cd_workflow_runner.down.sql | 2 +- scripts/sql/32703400_alter_cd_workflow_runner.up.sql | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql index aad67020ee..31b83aab0c 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.down.sql @@ -7,4 +7,4 @@ WHERE node_type = 'CD' AND event_type_id = 1 AND channel_type='ses'; -ALTER TABLE global_policy DROP COLUMN IF EXISTS resource_version; +ALTER TABLE global_policy DROP COLUMN IF EXISTS policy_revision; diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql index 46ca525f75..976098d909 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql @@ -8,5 +8,6 @@ WHERE node_type = 'CD' AND channel_type='ses'; --adding resource_version to global_policy table for maintaining optimistic concurrency control -ALTER TABLE global_policy ADD COLUMN IF NOT EXISTS resource_version VARCHAR(20); - +ALTER TABLE global_policy ADD COLUMN IF NOT EXISTS policy_revision VARCHAR(20); +-- Create a sequence for global policy revisions +CREATE SEQUENCE global_policy_policy_revision_seq; From 9962cbd46e42404e3f1fcf701b4730770c30c900 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Tue, 15 Apr 2025 15:32:26 +0530 Subject: [PATCH 12/20] varchar to text policy revision --- scripts/sql/32703400_alter_cd_workflow_runner.up.sql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql index 976098d909..c795c1d422 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql @@ -8,6 +8,5 @@ WHERE node_type = 'CD' AND channel_type='ses'; --adding resource_version to global_policy table for maintaining optimistic concurrency control -ALTER TABLE global_policy ADD COLUMN IF NOT EXISTS policy_revision VARCHAR(20); --- Create a sequence for global policy revisions -CREATE SEQUENCE global_policy_policy_revision_seq; +ALTER TABLE global_policy ADD COLUMN IF NOT EXISTS policy_revision text; + From 067e9b8b3eeb428752fb3696c46405aeb7ec8f17 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Wed, 16 Apr 2025 13:38:57 +0530 Subject: [PATCH 13/20] GetCmAndSecretBulkUpdateResponseForOneApp new adaptor func --- pkg/bulkAction/adaptor/adaptor.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 pkg/bulkAction/adaptor/adaptor.go diff --git a/pkg/bulkAction/adaptor/adaptor.go b/pkg/bulkAction/adaptor/adaptor.go new file mode 100644 index 0000000000..167689cd36 --- /dev/null +++ b/pkg/bulkAction/adaptor/adaptor.go @@ -0,0 +1,13 @@ +package adaptor + +import "github.com/devtron-labs/devtron/pkg/bulkAction/bean" + +func GetCmAndSecretBulkUpdateResponseForOneApp(appId int, appName string, envId int, names []string, message string) *bean.CmAndSecretBulkUpdateResponseForOneApp { + return &bean.CmAndSecretBulkUpdateResponseForOneApp{ + AppId: appId, + AppName: appName, + EnvId: envId, + Names: names, + Message: message, + } +} From fa50887c73b8f6d09777e0843c4c6949045a0c55 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Wed, 16 Apr 2025 13:40:18 +0530 Subject: [PATCH 14/20] script fix --- scripts/sql/32703400_alter_cd_workflow_runner.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql index c795c1d422..705cf9d8a7 100644 --- a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql +++ b/scripts/sql/32703400_alter_cd_workflow_runner.up.sql @@ -2,7 +2,7 @@ ALTER TABLE cd_workflow_runner ADD COLUMN IF NOT EXISTS image_state varchar(50); ---- update notification template for CD trigger ses UPDATE notification_templates -SET template_payload = '{"from": "{{fromEmail}}", "to": "{{toEmail}}","subject": "▶️ Deployment pipeline triggered | Application: {{appName}} | Environment: {{envName}}","html":”​​{{#ciMaterials}} {{^webhookType}}{{/webhookType}} {{/ciMaterials}}
cd-triggered
▶️ Deployment pipeline triggered
{{eventTime}}
by{{triggeredBy}}
{{#deploymentHistoryLink}}View Pipeline{{/deploymentHistoryLink}}
{{#appDetailsLink}}App Details{{/appDetailsLink}}

{{deploymentWindowComment}}
{{triggeredWithoutApproval}}
Application
Environment
{{appName}}
{{envName}}
Stage
{{stage}}
Source Code
Branch
Commit
{{appName}}/{{branch}}
{{commit}}
Image Details
Image tag
{{dockerImg}}

BlogWebsite
© Devtron Labs 2024
"}' +SET template_payload = '{"from": "{{fromEmail}}", "to": "{{toEmail}}","subject": "▶️ Deployment pipeline triggered | Application: {{appName}} | Environment: {{envName}}","html":"{{#ciMaterials}} {{^webhookType}}{{/webhookType}} {{/ciMaterials}}
cd-triggered
▶️ Deployment pipeline triggered
{{eventTime}}
by{{triggeredBy}}
{{#deploymentHistoryLink}}View Pipeline{{/deploymentHistoryLink}}
{{#appDetailsLink}}App Details{{/appDetailsLink}}

{{deploymentWindowComment}}
{{triggeredWithoutApproval}}
Application
Environment
{{appName}}
{{envName}}
Stage
{{stage}}
Source Code
Branch
Commit
{{appName}}/{{branch}}
{{commit}}
Image Details
Image tag
{{dockerImg}}

BlogWebsite
© Devtron Labs 2024
"}' WHERE node_type = 'CD' AND event_type_id = 1 AND channel_type='ses'; From 6036c8bf18a73a246f9620f90e3d5cd68d5bb3fb Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Wed, 16 Apr 2025 13:52:18 +0530 Subject: [PATCH 15/20] GetDeploymentTemplateBulkUpdateResponseForOneApp --- pkg/bulkAction/adaptor/adaptor.go | 9 +++++++++ pkg/bulkAction/bean/bean.go | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/pkg/bulkAction/adaptor/adaptor.go b/pkg/bulkAction/adaptor/adaptor.go index 167689cd36..8662ade5bd 100644 --- a/pkg/bulkAction/adaptor/adaptor.go +++ b/pkg/bulkAction/adaptor/adaptor.go @@ -11,3 +11,12 @@ func GetCmAndSecretBulkUpdateResponseForOneApp(appId int, appName string, envId Message: message, } } + +func GetDeploymentTemplateBulkUpdateResponseForOneApp(appId int, appName string, envId int, message string) *bean.DeploymentTemplateBulkUpdateResponseForOneApp { + return &bean.DeploymentTemplateBulkUpdateResponseForOneApp{ + AppId: appId, + AppName: appName, + EnvId: envId, + Message: message, + } +} diff --git a/pkg/bulkAction/bean/bean.go b/pkg/bulkAction/bean/bean.go index 1b4306d8c3..e59c06eab8 100644 --- a/pkg/bulkAction/bean/bean.go +++ b/pkg/bulkAction/bean/bean.go @@ -16,6 +16,8 @@ package bean +import "errors" + type NameIncludesExcludes struct { Names []string `json:"names"` } @@ -159,3 +161,5 @@ type PipelineAndWfBulkActionResponseDto struct { CiPipelineRespDtos []*CiBulkActionResponseDto `json:"ciPipelines"` AppWfRespDtos []*WfBulkActionResponseDto `json:"appWorkflows"` } + +var ErrConfigProtectionEnabled = errors.New("config protection enabled") From 03693a43f5039c1faa36aef82bcecbccfc105381 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Fri, 25 Apr 2025 15:52:35 +0530 Subject: [PATCH 16/20] code review corporation :- level 2 --- api/restHandler/ConfigMapRestHandler.go | 65 +++++-------------- .../DeploymentPipelineRestHandler.go | 41 ++++-------- .../pipelineConfig/CdWorfkflowRepository.go | 44 ++++++------- pkg/auth/user/util/util.go | 19 +++++- .../trigger/devtronApps/constants/constant.go | 2 +- .../DraftAwareConfigService.go | 53 +++++++-------- 6 files changed, 96 insertions(+), 128 deletions(-) diff --git a/api/restHandler/ConfigMapRestHandler.go b/api/restHandler/ConfigMapRestHandler.go index 8a4dcddce5..85d57e2784 100644 --- a/api/restHandler/ConfigMapRestHandler.go +++ b/api/restHandler/ConfigMapRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/pkg/auth/user/util" "github.com/devtron-labs/devtron/pkg/pipeline/draftAwareConfigService" "net/http" "strconv" @@ -125,12 +126,8 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalAddUpdate(w http.ResponseWriter, //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } - res, err := handler.draftAwareResourceService.CMGlobalAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail) + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) + res, err := handler.draftAwareResourceService.CMGlobalAddUpdate(ctx, &configMapRequest, userMetadata) if err != nil { handler.Logger.Errorw("service err, CMGlobalAddUpdate", "err", err, "payload", configMapRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -175,12 +172,8 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentAddUpdate(w http.ResponseWr //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } - res, err := handler.draftAwareResourceService.CMEnvironmentAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail) + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) + res, err := handler.draftAwareResourceService.CMEnvironmentAddUpdate(ctx, &configMapRequest, userMetadata) if err != nil { handler.Logger.Errorw("service err, CMEnvironmentAddUpdate", "err", err, "payload", configMapRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -378,12 +371,8 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalAddUpdate(w http.ResponseWriter, //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } - res, err := handler.draftAwareResourceService.CSGlobalAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail) + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) + res, err := handler.draftAwareResourceService.CSGlobalAddUpdate(ctx, &configMapRequest, userMetadata) if err != nil { handler.Logger.Errorw("service err, CSGlobalAddUpdate", "err", err, "payload", configMapRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -429,12 +418,8 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentAddUpdate(w http.ResponseWr //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } - res, err := handler.draftAwareResourceService.CSEnvironmentAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail) + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) + res, err := handler.draftAwareResourceService.CSEnvironmentAddUpdate(ctx, &configMapRequest, userMetadata) if err != nil { handler.Logger.Errorw("service err, CSEnvironmentAddUpdate", "err", err, "payload", configMapRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -548,17 +533,13 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalDelete(w http.ResponseWriter, r //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) deleteReq := &bean.ConfigDataRequest{ Id: id, AppId: appId, UserId: userId, } - res, err := handler.draftAwareResourceService.CMGlobalDelete(ctx, name, deleteReq, isSuperAdmin, userEmail) + res, err := handler.draftAwareResourceService.CMGlobalDelete(ctx, name, deleteReq, userMetadata) if err != nil { handler.Logger.Errorw("service err, CMGlobalDelete", "err", err, "appId", appId, "id", id, "name", name) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -614,17 +595,13 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentDelete(w http.ResponseWrite //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) deleteReq := &bean.ConfigDataRequest{ Id: id, AppId: appId, UserId: userId, } - res, err := handler.draftAwareResourceService.CMEnvironmentDelete(ctx, name, deleteReq, isSuperAdmin, userEmail) + res, err := handler.draftAwareResourceService.CMEnvironmentDelete(ctx, name, deleteReq, userMetadata) if err != nil { handler.Logger.Errorw("service err, CMEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -666,17 +643,13 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalDelete(w http.ResponseWriter, r //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) deleteReq := &bean.ConfigDataRequest{ Id: id, AppId: appId, UserId: userId, } - res, err := handler.draftAwareResourceService.CSGlobalDelete(ctx, name, deleteReq, isSuperAdmin, userEmail) + res, err := handler.draftAwareResourceService.CSGlobalDelete(ctx, name, deleteReq, userMetadata) if err != nil { handler.Logger.Errorw("service err, CSGlobalDelete", "err", err, "appId", appId, "id", id, "name", name) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -732,17 +705,13 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentDelete(w http.ResponseWrite //RBAC END ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin) deleteReq := &bean.ConfigDataRequest{ Id: id, AppId: appId, UserId: userId, } - res, err := handler.draftAwareResourceService.CSEnvironmentDelete(ctx, name, deleteReq, isSuperAdmin, userEmail) + res, err := handler.draftAwareResourceService.CSEnvironmentDelete(ctx, name, deleteReq, userMetadata) if err != nil { handler.Logger.Errorw("service err, CSEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) diff --git a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go index 1a8920492b..18932e2f97 100644 --- a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go +++ b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go @@ -23,6 +23,7 @@ import ( "fmt" models2 "github.com/devtron-labs/devtron/internal/sql/models" bean4 "github.com/devtron-labs/devtron/pkg/auth/user/bean" + util3 "github.com/devtron-labs/devtron/pkg/auth/user/util" bean3 "github.com/devtron-labs/devtron/pkg/chart/bean" devtronAppGitOpConfigBean "github.com/devtron-labs/devtron/pkg/chart/gitOpsConfig/bean" @@ -178,13 +179,9 @@ func (handler *PipelineConfigRestHandlerImpl) ConfigureDeploymentTemplateForApp( }(ctx.Done(), cn.CloseNotify()) } isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userMetadata := util3.GetUserMetadata(r.Context(), userId, isSuperAdmin) - createResp, err := handler.draftAwareResourceService.Create(ctx, templateRequest, isSuperAdmin, userEmail) + createResp, err := handler.draftAwareResourceService.Create(ctx, templateRequest, userMetadata) if err != nil { handler.Logger.Errorw("service err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -684,12 +681,8 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.Res }(ctx.Done(), cn.CloseNotify()) } isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } - createResp, err := handler.draftAwareResourceService.CreateEnvironmentPropertiesAndBaseIfNeeded(ctx, &envConfigProperties, isSuperAdmin, userEmail) + userMetadata := util3.GetUserMetadata(r.Context(), userId, isSuperAdmin) + createResp, err := handler.draftAwareResourceService.CreateEnvironmentPropertiesAndBaseIfNeeded(ctx, &envConfigProperties, userMetadata) if err != nil { handler.Logger.Errorw("service err, CreateEnvironmentPropertiesAndBaseIfNeeded", "payload", envConfigProperties, "err", err) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -756,12 +749,8 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideUpdate(w http.Res } ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } - createResp, err := handler.draftAwareResourceService.UpdateEnvironmentProperties(ctx, &envConfigProperties, token, isSuperAdmin, userEmail) + userMetadata := util3.GetUserMetadata(r.Context(), userId, isSuperAdmin) + createResp, err := handler.draftAwareResourceService.UpdateEnvironmentProperties(ctx, &envConfigProperties, token, userMetadata) if err != nil { handler.Logger.Errorw("service err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -1358,14 +1347,10 @@ func (handler *PipelineConfigRestHandlerImpl) UpdateAppOverride(w http.ResponseW return } isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userMetadata := util3.GetUserMetadata(r.Context(), userId, isSuperAdmin) _, span = otel.Tracer("orchestrator").Start(ctx, "chartService.UpdateAppOverride") - createResp, err := handler.draftAwareResourceService.UpdateAppOverride(ctx, &templateRequest, token, isSuperAdmin, userEmail) + createResp, err := handler.draftAwareResourceService.UpdateAppOverride(ctx, &templateRequest, token, userMetadata) span.End() if err != nil { handler.Logger.Errorw("service err, UpdateAppOverride", "err", err, "payload", templateRequest) @@ -1507,18 +1492,14 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideReset(w http.Resp } ctx := r.Context() isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*") - userEmail, err := handler.userAuthService.GetActiveEmailById(userId) - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound) - return - } + userMetadata := util3.GetUserMetadata(r.Context(), userId, isSuperAdmin) envProperties := &pipelineBean.EnvironmentProperties{ Id: id, EnvironmentId: environmentId, UserId: userId, AppId: appId, } - isSuccess, err := handler.draftAwareResourceService.ResetEnvironmentProperties(ctx, envProperties, isSuperAdmin, userEmail) + isSuccess, err := handler.draftAwareResourceService.ResetEnvironmentProperties(ctx, envProperties, userMetadata) if err != nil { handler.Logger.Errorw("service err, EnvConfigOverrideReset", "err", err, "appId", appId, "environmentId", environmentId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) diff --git a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go index 790eed67e0..69a42131fe 100644 --- a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go @@ -106,28 +106,28 @@ type CdWorkflowRunnerWithExtraFields struct { } type CdWorkflowRunner struct { - tableName struct{} `sql:"cd_workflow_runner" pg:",discard_unknown_columns"` - Id int `sql:"id,pk"` - Name string `sql:"name"` - WorkflowType apiBean.WorkflowType `sql:"workflow_type"` // pre,post,deploy - ExecutorType cdWorkflow.WorkflowExecutorType `sql:"executor_type"` // awf, system - Status string `sql:"status"` - PodStatus string `sql:"pod_status"` - Message string `sql:"message"` - StartedOn time.Time `sql:"started_on"` - FinishedOn time.Time `sql:"finished_on"` - Namespace string `sql:"namespace"` - LogLocation string `sql:"log_file_path"` - CdArtifactLocation string `sql:"cd_artifact_location"` - IsArtifactUploaded workflow.ArtifactUploadedType `sql:"is_artifact_uploaded"` - TriggeredBy int32 `sql:"triggered_by"` - CdWorkflowId int `sql:"cd_workflow_id"` - PodName string `sql:"pod_name"` - BlobStorageEnabled bool `sql:"blob_storage_enabled,notnull"` - RefCdWorkflowRunnerId int `sql:"ref_cd_workflow_runner_id,notnull"` - ImagePathReservationIds []int `sql:"image_path_reservation_ids" pg:",array,notnull"` - ReferenceId *string `sql:"reference_id"` - ImageState constants.ImageStateWhileDeployment `sql:"image_state"` // image_state currently not utilized in oss + tableName struct{} `sql:"cd_workflow_runner" pg:",discard_unknown_columns"` + Id int `sql:"id,pk"` + Name string `sql:"name"` + WorkflowType apiBean.WorkflowType `sql:"workflow_type"` // pre,post,deploy + ExecutorType cdWorkflow.WorkflowExecutorType `sql:"executor_type"` // awf, system + Status string `sql:"status"` + PodStatus string `sql:"pod_status"` + Message string `sql:"message"` + StartedOn time.Time `sql:"started_on"` + FinishedOn time.Time `sql:"finished_on"` + Namespace string `sql:"namespace"` + LogLocation string `sql:"log_file_path"` + CdArtifactLocation string `sql:"cd_artifact_location"` + IsArtifactUploaded workflow.ArtifactUploadedType `sql:"is_artifact_uploaded"` + TriggeredBy int32 `sql:"triggered_by"` + CdWorkflowId int `sql:"cd_workflow_id"` + PodName string `sql:"pod_name"` + BlobStorageEnabled bool `sql:"blob_storage_enabled,notnull"` + RefCdWorkflowRunnerId int `sql:"ref_cd_workflow_runner_id,notnull"` + ImagePathReservationIds []int `sql:"image_path_reservation_ids" pg:",array,notnull"` + ReferenceId *string `sql:"reference_id"` + ArtifactState constants.ArtifactStateWhileDeployment `sql:"artifact_state"` // artifact_state currently not utilized in oss CdWorkflow *CdWorkflow sql.AuditLog } diff --git a/pkg/auth/user/util/util.go b/pkg/auth/user/util/util.go index cdd7b4d2c9..d958dc5418 100644 --- a/pkg/auth/user/util/util.go +++ b/pkg/auth/user/util/util.go @@ -16,7 +16,12 @@ package util -import "strings" +import ( + "context" + "github.com/devtron-labs/devtron/pkg/auth/user/bean" + util2 "github.com/devtron-labs/devtron/util" + "strings" +) const ( ApiTokenPrefix = "API-TOKEN:" @@ -39,3 +44,15 @@ func CheckIfAdminOrApiToken(email string) bool { func CheckIfApiToken(email string) bool { return strings.HasPrefix(email, ApiTokenPrefix) } + +func GetUserMetadata(ctx context.Context, userId int32, isSuperAdmin bool) *bean.UserMetadata { + // Get user email from context + userEmail := util2.GetEmailFromContext(ctx) + + // Create and return the UserMetadata object + return &bean.UserMetadata{ + UserEmailId: userEmail, + IsUserSuperAdmin: isSuperAdmin, + UserId: userId, + } +} diff --git a/pkg/deployment/trigger/devtronApps/constants/constant.go b/pkg/deployment/trigger/devtronApps/constants/constant.go index f51c0c7b24..66dcec565e 100644 --- a/pkg/deployment/trigger/devtronApps/constants/constant.go +++ b/pkg/deployment/trigger/devtronApps/constants/constant.go @@ -1,3 +1,3 @@ package constants -type ImageStateWhileDeployment string +type ArtifactStateWhileDeployment string diff --git a/pkg/pipeline/draftAwareConfigService/DraftAwareConfigService.go b/pkg/pipeline/draftAwareConfigService/DraftAwareConfigService.go index cf5ff23884..99f646aea7 100644 --- a/pkg/pipeline/draftAwareConfigService/DraftAwareConfigService.go +++ b/pkg/pipeline/draftAwareConfigService/DraftAwareConfigService.go @@ -2,6 +2,7 @@ package draftAwareConfigService import ( "context" + userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean" chartService "github.com/devtron-labs/devtron/pkg/chart" bean3 "github.com/devtron-labs/devtron/pkg/chart/bean" "github.com/devtron-labs/devtron/pkg/pipeline" @@ -12,38 +13,38 @@ import ( type DraftAwareConfigMapService interface { // below methods operate on cm creation and updation - CMGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) - CMEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) + CMGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) + CMEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) // below methods operate on cm deletion - CMGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) - CMEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) + CMGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) + CMEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) } type DraftAwareSecretService interface { // below methods operate on cm creation and updation - CSGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) - CSEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) + CSGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) + CSEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) // below methods operate on cm deletion - CSGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) - CSEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) + CSGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) + CSEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) } type DraftAwareDeploymentTemplateService interface { // below methods operate on deployment template // Create here is used for publishing base deployment template while saving dt for the first time. - Create(ctx context.Context, templateRequest bean3.TemplateRequest, isSuperAdmin bool, userEmail string) (*bean3.TemplateRequest, error) + Create(ctx context.Context, templateRequest bean3.TemplateRequest, userMetadata *userBean.UserMetadata) (*bean3.TemplateRequest, error) // UpdateAppOverride here is used for updating base deployment template. - UpdateAppOverride(ctx context.Context, templateRequest *bean3.TemplateRequest, token string, isSuperAdmin bool, userEmail string) (*bean3.TemplateRequest, error) + UpdateAppOverride(ctx context.Context, templateRequest *bean3.TemplateRequest, token string, userMetadata *userBean.UserMetadata) (*bean3.TemplateRequest, error) // UpdateEnvironmentProperties here is used for updating and saving deployment template at env override level - UpdateEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, token string, isSuperAdmin bool, userEmail string) (*bean.EnvironmentProperties, error) + UpdateEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, token string, userMetadata *userBean.UserMetadata) (*bean.EnvironmentProperties, error) // ResetEnvironmentProperties method handles flow when a user deletes the deployment template env override. - ResetEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, isSuperAdmin bool, userEmail string) (bool, error) + ResetEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, userMetadata *userBean.UserMetadata) (bool, error) // CreateEnvironmentPropertiesAndBaseIfNeeded is utilized when the deployment template chart version is updated and saved - CreateEnvironmentPropertiesAndBaseIfNeeded(ctx context.Context, environmentProperties *bean.EnvironmentProperties, isSuperAdmin bool, userEmail string) (*bean.EnvironmentProperties, error) + CreateEnvironmentPropertiesAndBaseIfNeeded(ctx context.Context, environmentProperties *bean.EnvironmentProperties, userMetadata *userBean.UserMetadata) (*bean.EnvironmentProperties, error) } type DraftAwareConfigService interface { @@ -71,7 +72,7 @@ func NewDraftAwareResourceServiceImpl(logger *zap.SugaredLogger, } } -func (impl *DraftAwareConfigServiceImpl) CMGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) { +func (impl *DraftAwareConfigServiceImpl) CMGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) { resp, err := impl.configMapService.CMGlobalAddUpdate(configMapRequest) if err != nil { impl.logger.Errorw("error in CMGlobalAddUpdate", "configMapRequest", configMapRequest, "err", err) @@ -81,7 +82,7 @@ func (impl *DraftAwareConfigServiceImpl) CMGlobalAddUpdate(ctx context.Context, return resp, nil } -func (impl *DraftAwareConfigServiceImpl) CMEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) { +func (impl *DraftAwareConfigServiceImpl) CMEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) { resp, err := impl.configMapService.CMEnvironmentAddUpdate(configMapRequest) if err != nil { impl.logger.Errorw("error in CMEnvironmentAddUpdate", "configMapRequest", configMapRequest, "err", err) @@ -91,7 +92,7 @@ func (impl *DraftAwareConfigServiceImpl) CMEnvironmentAddUpdate(ctx context.Cont return resp, nil } -func (impl *DraftAwareConfigServiceImpl) CSGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) { +func (impl *DraftAwareConfigServiceImpl) CSGlobalAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) { resp, err := impl.configMapService.CSGlobalAddUpdate(configMapRequest) if err != nil { impl.logger.Errorw("error in CSGlobalAddUpdate", "err", err) @@ -101,7 +102,7 @@ func (impl *DraftAwareConfigServiceImpl) CSGlobalAddUpdate(ctx context.Context, return resp, nil } -func (impl *DraftAwareConfigServiceImpl) CSEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (*bean.ConfigDataRequest, error) { +func (impl *DraftAwareConfigServiceImpl) CSEnvironmentAddUpdate(ctx context.Context, configMapRequest *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (*bean.ConfigDataRequest, error) { resp, err := impl.configMapService.CSEnvironmentAddUpdate(configMapRequest) if err != nil { impl.logger.Errorw("error in CSGlobalAddUpdate", "err", err) @@ -112,7 +113,7 @@ func (impl *DraftAwareConfigServiceImpl) CSEnvironmentAddUpdate(ctx context.Cont } -func (impl *DraftAwareConfigServiceImpl) CMGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) { +func (impl *DraftAwareConfigServiceImpl) CMGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) { resp, err := impl.configMapService.CMGlobalDelete(name, deleteReq.Id, deleteReq.UserId) if err != nil { impl.logger.Errorw("service err, CMGlobalDelete", "appId", deleteReq.AppId, "id", deleteReq.Id, "name", name, "err", err) @@ -122,7 +123,7 @@ func (impl *DraftAwareConfigServiceImpl) CMGlobalDelete(ctx context.Context, nam return resp, nil } -func (impl *DraftAwareConfigServiceImpl) CMEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) { +func (impl *DraftAwareConfigServiceImpl) CMEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) { resp, err := impl.configMapService.CMEnvironmentDelete(name, deleteReq.Id, deleteReq.UserId) if err != nil { impl.logger.Errorw("service err, CMEnvironmentDelete", "appId", deleteReq.AppId, "envId", deleteReq.EnvironmentId, "id", deleteReq.Id, "err", err) @@ -132,7 +133,7 @@ func (impl *DraftAwareConfigServiceImpl) CMEnvironmentDelete(ctx context.Context return resp, nil } -func (impl *DraftAwareConfigServiceImpl) CSGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) { +func (impl *DraftAwareConfigServiceImpl) CSGlobalDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) { resp, err := impl.configMapService.CSGlobalDelete(name, deleteReq.Id, deleteReq.UserId) if err != nil { impl.logger.Errorw("service err, CSGlobalDelete", "appId", deleteReq.AppId, "id", deleteReq.Id, "name", name, "err", err) @@ -142,7 +143,7 @@ func (impl *DraftAwareConfigServiceImpl) CSGlobalDelete(ctx context.Context, nam return resp, nil } -func (impl *DraftAwareConfigServiceImpl) CSEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, isSuperAdmin bool, userEmail string) (bool, error) { +func (impl *DraftAwareConfigServiceImpl) CSEnvironmentDelete(ctx context.Context, name string, deleteReq *bean.ConfigDataRequest, userMetadata *userBean.UserMetadata) (bool, error) { resp, err := impl.configMapService.CSEnvironmentDelete(name, deleteReq.Id, deleteReq.UserId) if err != nil { impl.logger.Errorw("service err, CSEnvironmentDelete", "appId", deleteReq.AppId, "id", deleteReq.Id, "name", name, "err", err) @@ -152,7 +153,7 @@ func (impl *DraftAwareConfigServiceImpl) CSEnvironmentDelete(ctx context.Context return resp, nil } -func (impl *DraftAwareConfigServiceImpl) Create(ctx context.Context, templateRequest bean3.TemplateRequest, isSuperAdmin bool, userEmail string) (*bean3.TemplateRequest, error) { +func (impl *DraftAwareConfigServiceImpl) Create(ctx context.Context, templateRequest bean3.TemplateRequest, userMetadata *userBean.UserMetadata) (*bean3.TemplateRequest, error) { resp, err := impl.chartService.Create(templateRequest, ctx) if err != nil { impl.logger.Errorw("error in creating base deployment template", "appId", templateRequest.AppId, "err", err) @@ -162,7 +163,7 @@ func (impl *DraftAwareConfigServiceImpl) Create(ctx context.Context, templateReq return resp, nil } -func (impl *DraftAwareConfigServiceImpl) UpdateAppOverride(ctx context.Context, templateRequest *bean3.TemplateRequest, token string, isSuperAdmin bool, userEmail string) (*bean3.TemplateRequest, error) { +func (impl *DraftAwareConfigServiceImpl) UpdateAppOverride(ctx context.Context, templateRequest *bean3.TemplateRequest, token string, userMetadata *userBean.UserMetadata) (*bean3.TemplateRequest, error) { resp, err := impl.chartService.UpdateAppOverride(ctx, templateRequest) if err != nil { impl.logger.Errorw("error in updating base deployment template", "chartId", templateRequest.Id, "appId", templateRequest.AppId, "err", err) @@ -172,7 +173,7 @@ func (impl *DraftAwareConfigServiceImpl) UpdateAppOverride(ctx context.Context, return resp, nil } -func (impl *DraftAwareConfigServiceImpl) UpdateEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, token string, isSuperAdmin bool, userEmail string) (*bean.EnvironmentProperties, error) { +func (impl *DraftAwareConfigServiceImpl) UpdateEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, token string, userMetadata *userBean.UserMetadata) (*bean.EnvironmentProperties, error) { resp, err := impl.propertiesConfigService.UpdateEnvironmentProperties(propertiesRequest.AppId, propertiesRequest, propertiesRequest.UserId) if err != nil { impl.logger.Errorw("error in creating/updating env level deployment template", "appId", propertiesRequest.AppId, "envId", propertiesRequest.EnvironmentId, "err", err) @@ -182,7 +183,7 @@ func (impl *DraftAwareConfigServiceImpl) UpdateEnvironmentProperties(ctx context return resp, nil } -func (impl *DraftAwareConfigServiceImpl) ResetEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, isSuperAdmin bool, userEmail string) (bool, error) { +func (impl *DraftAwareConfigServiceImpl) ResetEnvironmentProperties(ctx context.Context, propertiesRequest *bean.EnvironmentProperties, userMetadata *userBean.UserMetadata) (bool, error) { isSuccess, err := impl.propertiesConfigService.ResetEnvironmentProperties(propertiesRequest.Id, propertiesRequest.UserId) if err != nil { impl.logger.Errorw("service err, ResetEnvironmentProperties", "chartEnvConfigOverrideId", propertiesRequest.Id, "userId", propertiesRequest.UserId, "err", err) @@ -192,7 +193,7 @@ func (impl *DraftAwareConfigServiceImpl) ResetEnvironmentProperties(ctx context. return isSuccess, nil } -func (impl *DraftAwareConfigServiceImpl) CreateEnvironmentPropertiesAndBaseIfNeeded(ctx context.Context, environmentProperties *bean.EnvironmentProperties, isSuperAdmin bool, userEmail string) (*bean.EnvironmentProperties, error) { +func (impl *DraftAwareConfigServiceImpl) CreateEnvironmentPropertiesAndBaseIfNeeded(ctx context.Context, environmentProperties *bean.EnvironmentProperties, userMetadata *userBean.UserMetadata) (*bean.EnvironmentProperties, error) { resp, err := impl.propertiesConfigService.CreateEnvironmentPropertiesAndBaseIfNeeded(ctx, environmentProperties.AppId, environmentProperties) if err != nil { impl.logger.Errorw("error, CreateEnvironmentPropertiesAndBaseIfNeeded", "appId", environmentProperties.AppId, "req", environmentProperties, "err", err) From d5ff588dfb75e52e09f56513120fc1cedb420384 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Fri, 25 Apr 2025 17:17:13 +0530 Subject: [PATCH 17/20] revert ArtifactStateWhileDeployment to ImageStateWhileDeployment --- .../pipelineConfig/CdWorfkflowRepository.go | 44 +++++++++---------- .../trigger/devtronApps/constants/constant.go | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go index 69a42131fe..790eed67e0 100644 --- a/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go +++ b/internal/sql/repository/pipelineConfig/CdWorfkflowRepository.go @@ -106,28 +106,28 @@ type CdWorkflowRunnerWithExtraFields struct { } type CdWorkflowRunner struct { - tableName struct{} `sql:"cd_workflow_runner" pg:",discard_unknown_columns"` - Id int `sql:"id,pk"` - Name string `sql:"name"` - WorkflowType apiBean.WorkflowType `sql:"workflow_type"` // pre,post,deploy - ExecutorType cdWorkflow.WorkflowExecutorType `sql:"executor_type"` // awf, system - Status string `sql:"status"` - PodStatus string `sql:"pod_status"` - Message string `sql:"message"` - StartedOn time.Time `sql:"started_on"` - FinishedOn time.Time `sql:"finished_on"` - Namespace string `sql:"namespace"` - LogLocation string `sql:"log_file_path"` - CdArtifactLocation string `sql:"cd_artifact_location"` - IsArtifactUploaded workflow.ArtifactUploadedType `sql:"is_artifact_uploaded"` - TriggeredBy int32 `sql:"triggered_by"` - CdWorkflowId int `sql:"cd_workflow_id"` - PodName string `sql:"pod_name"` - BlobStorageEnabled bool `sql:"blob_storage_enabled,notnull"` - RefCdWorkflowRunnerId int `sql:"ref_cd_workflow_runner_id,notnull"` - ImagePathReservationIds []int `sql:"image_path_reservation_ids" pg:",array,notnull"` - ReferenceId *string `sql:"reference_id"` - ArtifactState constants.ArtifactStateWhileDeployment `sql:"artifact_state"` // artifact_state currently not utilized in oss + tableName struct{} `sql:"cd_workflow_runner" pg:",discard_unknown_columns"` + Id int `sql:"id,pk"` + Name string `sql:"name"` + WorkflowType apiBean.WorkflowType `sql:"workflow_type"` // pre,post,deploy + ExecutorType cdWorkflow.WorkflowExecutorType `sql:"executor_type"` // awf, system + Status string `sql:"status"` + PodStatus string `sql:"pod_status"` + Message string `sql:"message"` + StartedOn time.Time `sql:"started_on"` + FinishedOn time.Time `sql:"finished_on"` + Namespace string `sql:"namespace"` + LogLocation string `sql:"log_file_path"` + CdArtifactLocation string `sql:"cd_artifact_location"` + IsArtifactUploaded workflow.ArtifactUploadedType `sql:"is_artifact_uploaded"` + TriggeredBy int32 `sql:"triggered_by"` + CdWorkflowId int `sql:"cd_workflow_id"` + PodName string `sql:"pod_name"` + BlobStorageEnabled bool `sql:"blob_storage_enabled,notnull"` + RefCdWorkflowRunnerId int `sql:"ref_cd_workflow_runner_id,notnull"` + ImagePathReservationIds []int `sql:"image_path_reservation_ids" pg:",array,notnull"` + ReferenceId *string `sql:"reference_id"` + ImageState constants.ImageStateWhileDeployment `sql:"image_state"` // image_state currently not utilized in oss CdWorkflow *CdWorkflow sql.AuditLog } diff --git a/pkg/deployment/trigger/devtronApps/constants/constant.go b/pkg/deployment/trigger/devtronApps/constants/constant.go index 66dcec565e..f51c0c7b24 100644 --- a/pkg/deployment/trigger/devtronApps/constants/constant.go +++ b/pkg/deployment/trigger/devtronApps/constants/constant.go @@ -1,3 +1,3 @@ package constants -type ArtifactStateWhileDeployment string +type ImageStateWhileDeployment string From 32e5b07c27b697135180e5e230d454b0dfbae344 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Fri, 25 Apr 2025 17:40:06 +0530 Subject: [PATCH 18/20] merge develop --- pkg/deployment/trigger/devtronApps/HandlerService.go | 3 ++- pkg/deployment/trigger/devtronApps/deployStageHandlerCode.go | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/deployment/trigger/devtronApps/HandlerService.go b/pkg/deployment/trigger/devtronApps/HandlerService.go index c92a009134..4382f14ff0 100644 --- a/pkg/deployment/trigger/devtronApps/HandlerService.go +++ b/pkg/deployment/trigger/devtronApps/HandlerService.go @@ -38,6 +38,7 @@ import ( "github.com/devtron-labs/devtron/pkg/app/status" "github.com/devtron-labs/devtron/pkg/attributes" "github.com/devtron-labs/devtron/pkg/auth/user" + userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/read" pipeline2 "github.com/devtron-labs/devtron/pkg/build/pipeline" chartRepoRepository "github.com/devtron-labs/devtron/pkg/chartRepo/repository" @@ -94,7 +95,7 @@ type HandlerService interface { TriggerStageForBulk(triggerRequest bean.TriggerRequest) error - ManualCdTrigger(triggerContext bean.TriggerContext, overrideRequest *bean3.ValuesOverrideRequest) (int, string, *bean4.ManifestPushTemplate, error) + ManualCdTrigger(triggerContext bean.TriggerContext, overrideRequest *bean3.ValuesOverrideRequest, userMetadata *userBean.UserMetadata) (int, string, *bean4.ManifestPushTemplate, error) TriggerAutomaticDeployment(request bean.TriggerRequest) error TriggerRelease(ctx context.Context, overrideRequest *bean3.ValuesOverrideRequest, envDeploymentConfig *bean9.DeploymentConfig, triggeredAt time.Time, triggeredBy int32) (releaseNo int, manifestPushTemplate *bean4.ManifestPushTemplate, err error) diff --git a/pkg/deployment/trigger/devtronApps/deployStageHandlerCode.go b/pkg/deployment/trigger/devtronApps/deployStageHandlerCode.go index 42aabbe940..70f7620216 100644 --- a/pkg/deployment/trigger/devtronApps/deployStageHandlerCode.go +++ b/pkg/deployment/trigger/devtronApps/deployStageHandlerCode.go @@ -36,8 +36,6 @@ import ( "github.com/devtron-labs/devtron/pkg/app" bean4 "github.com/devtron-labs/devtron/pkg/app/bean" statusBean "github.com/devtron-labs/devtron/pkg/app/status/bean" - "github.com/devtron-labs/devtron/pkg/attributes" - "github.com/devtron-labs/devtron/pkg/auth/user" userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean" bean2 "github.com/devtron-labs/devtron/pkg/bean" "github.com/devtron-labs/devtron/pkg/deployment/common" From 88edb03547d2be3cac5708dcd38ff87398188611 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Fri, 25 Apr 2025 17:54:52 +0530 Subject: [PATCH 19/20] correct migration script number --- ...runner.down.sql => 32903500_alter_cd_workflow_runner.down.sql} | 0 ...low_runner.up.sql => 32903500_alter_cd_workflow_runner.up.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename scripts/sql/{32703400_alter_cd_workflow_runner.down.sql => 32903500_alter_cd_workflow_runner.down.sql} (100%) rename scripts/sql/{32703400_alter_cd_workflow_runner.up.sql => 32903500_alter_cd_workflow_runner.up.sql} (100%) diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.down.sql b/scripts/sql/32903500_alter_cd_workflow_runner.down.sql similarity index 100% rename from scripts/sql/32703400_alter_cd_workflow_runner.down.sql rename to scripts/sql/32903500_alter_cd_workflow_runner.down.sql diff --git a/scripts/sql/32703400_alter_cd_workflow_runner.up.sql b/scripts/sql/32903500_alter_cd_workflow_runner.up.sql similarity index 100% rename from scripts/sql/32703400_alter_cd_workflow_runner.up.sql rename to scripts/sql/32903500_alter_cd_workflow_runner.up.sql From 4afc0717077cb844d498551f5565b6e03e885b53 Mon Sep 17 00:00:00 2001 From: Prakash Kumar Date: Mon, 5 May 2025 12:19:31 +0530 Subject: [PATCH 20/20] change script number --- ...runner.down.sql => 33103500_alter_cd_workflow_runner.down.sql} | 0 ...low_runner.up.sql => 33103500_alter_cd_workflow_runner.up.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename scripts/sql/{32903500_alter_cd_workflow_runner.down.sql => 33103500_alter_cd_workflow_runner.down.sql} (100%) rename scripts/sql/{32903500_alter_cd_workflow_runner.up.sql => 33103500_alter_cd_workflow_runner.up.sql} (100%) diff --git a/scripts/sql/32903500_alter_cd_workflow_runner.down.sql b/scripts/sql/33103500_alter_cd_workflow_runner.down.sql similarity index 100% rename from scripts/sql/32903500_alter_cd_workflow_runner.down.sql rename to scripts/sql/33103500_alter_cd_workflow_runner.down.sql diff --git a/scripts/sql/32903500_alter_cd_workflow_runner.up.sql b/scripts/sql/33103500_alter_cd_workflow_runner.up.sql similarity index 100% rename from scripts/sql/32903500_alter_cd_workflow_runner.up.sql rename to scripts/sql/33103500_alter_cd_workflow_runner.up.sql