diff --git a/api/appStore/chartProvider/ChartProviderRestHandler.go b/api/appStore/chartProvider/ChartProviderRestHandler.go index 797a3616481..6fd199dbf0d 100644 --- a/api/appStore/chartProvider/ChartProviderRestHandler.go +++ b/api/appStore/chartProvider/ChartProviderRestHandler.go @@ -39,9 +39,9 @@ type ChartProviderRestHandler interface { type ChartProviderRestHandlerImpl struct { Logger *zap.SugaredLogger chartProviderService chartProvider.ChartProviderService - validator *validator.Validate - userAuthService user.UserService - enforcer casbin.Enforcer + validator *validator.Validate + userAuthService user.UserService + enforcer casbin.Enforcer } func NewChartProviderRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService user.UserService, validator *validator.Validate, chartProviderService chartProvider.ChartProviderService, diff --git a/api/appStore/deployment/AppStoreDeploymentRestHandler.go b/api/appStore/deployment/AppStoreDeploymentRestHandler.go index 3d6d9199bfb..cffb21ff55b 100644 --- a/api/appStore/deployment/AppStoreDeploymentRestHandler.go +++ b/api/appStore/deployment/AppStoreDeploymentRestHandler.go @@ -59,9 +59,9 @@ type AppStoreDeploymentRestHandler interface { } type AppStoreDeploymentRestHandlerImpl struct { - Logger *zap.SugaredLogger - userAuthService user.UserService - enforcer casbin.Enforcer + Logger *zap.SugaredLogger + userAuthService user.UserService + enforcer casbin.Enforcer enforcerUtil rbac.EnforcerUtil enforcerUtilHelm rbac.EnforcerUtilHelm appStoreDeploymentService service.AppStoreDeploymentService diff --git a/api/appStore/deployment/CommonDeploymentRestHandler.go b/api/appStore/deployment/CommonDeploymentRestHandler.go index ffc200419f3..d7bfac9fd88 100644 --- a/api/appStore/deployment/CommonDeploymentRestHandler.go +++ b/api/appStore/deployment/CommonDeploymentRestHandler.go @@ -51,9 +51,9 @@ type CommonDeploymentRestHandler interface { } type CommonDeploymentRestHandlerImpl struct { - Logger *zap.SugaredLogger - userAuthService user.UserService - enforcer casbin.Enforcer + Logger *zap.SugaredLogger + userAuthService user.UserService + enforcer casbin.Enforcer enforcerUtil rbac.EnforcerUtil enforcerUtilHelm rbac.EnforcerUtilHelm appStoreDeploymentService service.AppStoreDeploymentService diff --git a/api/deployment/DeploymentConfigRestHandler.go b/api/deployment/DeploymentConfigRestHandler.go index 53be9a4b6a7..9e17ce9f97d 100644 --- a/api/deployment/DeploymentConfigRestHandler.go +++ b/api/deployment/DeploymentConfigRestHandler.go @@ -31,9 +31,9 @@ type DeploymentConfigRestHandler interface { } type DeploymentConfigRestHandlerImpl struct { - Logger *zap.SugaredLogger - userAuthService user.UserService - enforcer casbin.Enforcer + Logger *zap.SugaredLogger + userAuthService user.UserService + enforcer casbin.Enforcer validator *validator.Validate refChartDir chartRepoRepository.RefChartDir chartService chart.ChartService diff --git a/api/k8s/application/k8sApplicationRestHandler.go b/api/k8s/application/k8sApplicationRestHandler.go index c89444ec5b7..0fa90296ab7 100644 --- a/api/k8s/application/k8sApplicationRestHandler.go +++ b/api/k8s/application/k8sApplicationRestHandler.go @@ -62,9 +62,9 @@ type K8sApplicationRestHandlerImpl struct { validator *validator.Validate enforcerUtil rbac.EnforcerUtil enforcerUtilHelm rbac.EnforcerUtilHelm - helmAppService client.HelmAppService - userService user.UserService - k8sCommonService k8s.K8sCommonService + helmAppService client.HelmAppService + userService user.UserService + k8sCommonService k8s.K8sCommonService } func NewK8sApplicationRestHandlerImpl(logger *zap.SugaredLogger, k8sApplicationService application2.K8sApplicationService, pump connector.Pump, terminalSessionHandler terminal.TerminalSessionHandler, enforcer casbin.Enforcer, enforcerUtilHelm rbac.EnforcerUtilHelm, enforcerUtil rbac.EnforcerUtil, helmAppService client.HelmAppService, userService user.UserService, k8sCommonService k8s.K8sCommonService, validator *validator.Validate) *K8sApplicationRestHandlerImpl { diff --git a/api/restHandler/ChartGroupRestHandler.go b/api/restHandler/ChartGroupRestHandler.go index 46746277f30..9a0b2dc03e7 100644 --- a/api/restHandler/ChartGroupRestHandler.go +++ b/api/restHandler/ChartGroupRestHandler.go @@ -36,9 +36,9 @@ const CHART_GROUP_DELETE_SUCCESS_RESP = "Chart group deleted successfully." type ChartGroupRestHandlerImpl struct { ChartGroupService service.ChartGroupService - Logger *zap.SugaredLogger - userAuthService user.UserService - enforcer casbin.Enforcer + Logger *zap.SugaredLogger + userAuthService user.UserService + enforcer casbin.Enforcer validator *validator.Validate } diff --git a/api/restHandler/CoreAppRestHandler.go b/api/restHandler/CoreAppRestHandler.go index 20566db8c4e..5cd951d7d83 100644 --- a/api/restHandler/CoreAppRestHandler.go +++ b/api/restHandler/CoreAppRestHandler.go @@ -75,9 +75,9 @@ type CoreAppRestHandler interface { } type CoreAppRestHandlerImpl struct { - logger *zap.SugaredLogger - userAuthService user.UserService - validator *validator.Validate + logger *zap.SugaredLogger + userAuthService user.UserService + validator *validator.Validate enforcerUtil rbac.EnforcerUtil enforcer casbin.Enforcer appCrudOperationService app.AppCrudOperationService diff --git a/api/restHandler/DeploymentGroupRestHandler.go b/api/restHandler/DeploymentGroupRestHandler.go index 399ca239728..d8889d6e973 100644 --- a/api/restHandler/DeploymentGroupRestHandler.go +++ b/api/restHandler/DeploymentGroupRestHandler.go @@ -51,9 +51,9 @@ type DeploymentGroupRestHandlerImpl struct { logger *zap.SugaredLogger validator *validator.Validate enforcer casbin.Enforcer - teamService team.TeamService - userAuthService user.UserService - enforcerUtil rbac.EnforcerUtil + teamService team.TeamService + userAuthService user.UserService + enforcerUtil rbac.EnforcerUtil } func NewDeploymentGroupRestHandlerImpl(deploymentGroupService deploymentGroup.DeploymentGroupService, logger *zap.SugaredLogger, diff --git a/api/restHandler/ExternalCiRestHandler.go b/api/restHandler/ExternalCiRestHandler.go index e5856eaacf5..a02d2a34cdf 100644 --- a/api/restHandler/ExternalCiRestHandler.go +++ b/api/restHandler/ExternalCiRestHandler.go @@ -100,6 +100,13 @@ func (impl ExternalCiRestHandlerImpl) HandleExternalCiWebhook(w http.ResponseWri common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } + + err = impl.validator.Struct(ciArtifactReq) + if err != nil { + impl.logger.Errorw("validation err, HandleExternalCiWebhook", "err", err, "payload", ciArtifactReq) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } _, err = impl.webhookService.HandleExternalCiWebhook(externalCiId, ciArtifactReq, impl.checkExternalCiDeploymentAuth, token) if err != nil { impl.logger.Errorw("service err, HandleExternalCiWebhook", "err", err, "payload", req) diff --git a/api/restHandler/GitHostRestHandler.go b/api/restHandler/GitHostRestHandler.go index d96e5f20c12..1048ff4a5fc 100644 --- a/api/restHandler/GitHostRestHandler.go +++ b/api/restHandler/GitHostRestHandler.go @@ -45,9 +45,9 @@ type GitHostRestHandler interface { type GitHostRestHandlerImpl struct { logger *zap.SugaredLogger - gitHostConfig pipeline.GitHostConfig - userAuthService user.UserService - validator *validator.Validate + gitHostConfig pipeline.GitHostConfig + userAuthService user.UserService + validator *validator.Validate enforcer casbin.Enforcer gitSensorClient gitSensor.Client gitProviderConfig pipeline.GitRegistryConfig diff --git a/api/restHandler/GitProviderRestHandler.go b/api/restHandler/GitProviderRestHandler.go index 0a0e94ceaa6..45f9023c5ad 100644 --- a/api/restHandler/GitProviderRestHandler.go +++ b/api/restHandler/GitProviderRestHandler.go @@ -48,9 +48,9 @@ type GitProviderRestHandlerImpl struct { dockerRegistryConfig pipeline.DockerRegistryConfig logger *zap.SugaredLogger gitRegistryConfig pipeline.GitRegistryConfig - dbConfigService pipeline.DbConfigService - userAuthService user.UserService - validator *validator.Validate + dbConfigService pipeline.DbConfigService + userAuthService user.UserService + validator *validator.Validate enforcer casbin.Enforcer teamService team.TeamService deleteServiceFullMode delete2.DeleteServiceFullMode diff --git a/api/restHandler/GlobalCMCSRestHandler.go b/api/restHandler/GlobalCMCSRestHandler.go index b1e294ce7ef..4d6f32f36ae 100644 --- a/api/restHandler/GlobalCMCSRestHandler.go +++ b/api/restHandler/GlobalCMCSRestHandler.go @@ -24,9 +24,9 @@ type GlobalCMCSRestHandler interface { } type GlobalCMCSRestHandlerImpl struct { - logger *zap.SugaredLogger - userAuthService user.UserService - validator *validator.Validate + logger *zap.SugaredLogger + userAuthService user.UserService + validator *validator.Validate enforcer casbin.Enforcer globalCMCSService pipeline.GlobalCMCSService } diff --git a/api/restHandler/ImageScanRestHandler.go b/api/restHandler/ImageScanRestHandler.go index 12222a7bc51..ca33c82b34c 100644 --- a/api/restHandler/ImageScanRestHandler.go +++ b/api/restHandler/ImageScanRestHandler.go @@ -43,9 +43,9 @@ type ImageScanRestHandler interface { type ImageScanRestHandlerImpl struct { logger *zap.SugaredLogger - imageScanService security.ImageScanService - userService user.UserService - enforcer casbin.Enforcer + imageScanService security.ImageScanService + userService user.UserService + enforcer casbin.Enforcer enforcerUtil rbac.EnforcerUtil environmentService cluster.EnvironmentService } diff --git a/api/restHandler/MigrateDbRestHandler.go b/api/restHandler/MigrateDbRestHandler.go index aef4fe4bebd..0342a6bfd25 100644 --- a/api/restHandler/MigrateDbRestHandler.go +++ b/api/restHandler/MigrateDbRestHandler.go @@ -43,9 +43,9 @@ type MigrateDbRestHandlerImpl struct { dockerRegistryConfig pipeline.DockerRegistryConfig logger *zap.SugaredLogger gitRegistryConfig pipeline.GitRegistryConfig - dbConfigService pipeline.DbConfigService - userAuthService user.UserService - validator *validator.Validate + dbConfigService pipeline.DbConfigService + userAuthService user.UserService + validator *validator.Validate dbMigrationService pipeline.DbMigrationService enforcer casbin.Enforcer } diff --git a/api/restHandler/NotificationRestHandler.go b/api/restHandler/NotificationRestHandler.go index 9840f69ec48..7e60cb45696 100644 --- a/api/restHandler/NotificationRestHandler.go +++ b/api/restHandler/NotificationRestHandler.go @@ -73,9 +73,9 @@ type NotificationRestHandlerImpl struct { dockerRegistryConfig pipeline.DockerRegistryConfig logger *zap.SugaredLogger gitRegistryConfig pipeline.GitRegistryConfig - dbConfigService pipeline.DbConfigService - userAuthService user.UserService - validator *validator.Validate + dbConfigService pipeline.DbConfigService + userAuthService user.UserService + validator *validator.Validate notificationService notifier.NotificationConfigService slackService notifier.SlackNotificationService webhookService notifier.WebhookNotificationService diff --git a/api/restHandler/PolicyRestHandler.go b/api/restHandler/PolicyRestHandler.go index c3f99131d94..81e133c79f5 100644 --- a/api/restHandler/PolicyRestHandler.go +++ b/api/restHandler/PolicyRestHandler.go @@ -43,10 +43,10 @@ type PolicyRestHandler interface { } type PolicyRestHandlerImpl struct { logger *zap.SugaredLogger - policyService security.PolicyService - userService user2.UserService - userAuthService user2.UserAuthService - enforcer casbin.Enforcer + policyService security.PolicyService + userService user2.UserService + userAuthService user2.UserAuthService + enforcer casbin.Enforcer enforcerUtil rbac.EnforcerUtil environmentService cluster.EnvironmentService } diff --git a/api/restHandler/TelemetryRestHandler.go b/api/restHandler/TelemetryRestHandler.go index eb1cd76821e..d6406b967b5 100644 --- a/api/restHandler/TelemetryRestHandler.go +++ b/api/restHandler/TelemetryRestHandler.go @@ -38,8 +38,8 @@ type TelemetryRestHandler interface { type TelemetryRestHandlerImpl struct { logger *zap.SugaredLogger telemetryEventClient telemetry.TelemetryEventClient - enforcer casbin.Enforcer - userService user.UserService + enforcer casbin.Enforcer + userService user.UserService } type TelemetryGenericEvent struct { diff --git a/api/restHandler/TestSuitRestHandler.go b/api/restHandler/TestSuitRestHandler.go index 968a3f380d5..75365758167 100644 --- a/api/restHandler/TestSuitRestHandler.go +++ b/api/restHandler/TestSuitRestHandler.go @@ -47,9 +47,9 @@ type TestSuitRestHandler interface { } type TestSuitRestHandlerImpl struct { - logger *zap.SugaredLogger - userService user.UserService - validator *validator.Validate + logger *zap.SugaredLogger + userService user.UserService + validator *validator.Validate enforcer casbin.Enforcer enforcerUtil rbac.EnforcerUtil config *client.EventClientConfig diff --git a/api/router/pubsub/CiEventHandler.go b/api/router/pubsub/CiEventHandler.go index 649e204b2e5..53f95fc9387 100644 --- a/api/router/pubsub/CiEventHandler.go +++ b/api/router/pubsub/CiEventHandler.go @@ -30,6 +30,7 @@ import ( bean2 "github.com/devtron-labs/devtron/pkg/pipeline/bean" "github.com/devtron-labs/devtron/util" "go.uber.org/zap" + "gopkg.in/go-playground/validator.v9" "time" ) @@ -53,6 +54,7 @@ type CiEventHandlerImpl struct { logger *zap.SugaredLogger pubsubClient *pubsub.PubSubClientServiceImpl webhookService pipeline.WebhookService + validator *validator.Validate ciEventConfig *CiEventConfig } @@ -80,11 +82,12 @@ type CiCompleteEvent struct { PluginArtifactStage string `json:"pluginArtifactStage"` } -func NewCiEventHandlerImpl(logger *zap.SugaredLogger, pubsubClient *pubsub.PubSubClientServiceImpl, webhookService pipeline.WebhookService, ciEventConfig *CiEventConfig) *CiEventHandlerImpl { +func NewCiEventHandlerImpl(logger *zap.SugaredLogger, pubsubClient *pubsub.PubSubClientServiceImpl, webhookService pipeline.WebhookService, validator *validator.Validate, ciEventConfig *CiEventConfig) *CiEventHandlerImpl { ciEventHandlerImpl := &CiEventHandlerImpl{ logger: logger, pubsubClient: pubsubClient, webhookService: webhookService, + validator: validator, ciEventConfig: ciEventConfig, } err := ciEventHandlerImpl.Subscribe() @@ -133,10 +136,8 @@ func (impl *CiEventHandlerImpl) Subscribe() error { impl.logger.Error("Error while creating request for pipelineID", "pipelineId", ciCompleteEvent.PipelineId, "err", err) return } - resp, err := impl.webhookService.HandleCiSuccessEvent(ciCompleteEvent.PipelineId, request, detail.ImagePushedAt) + resp, err := impl.ValidateAndHandleCiSuccessEvent(ciCompleteEvent.PipelineId, request, detail.ImagePushedAt) if err != nil { - impl.logger.Error("Error while sending event for CI success for pipelineID", "pipelineId", - ciCompleteEvent.PipelineId, "request", request, "err", err) return } impl.logger.Debug("response of handle ci success event for multiple images from plugin", "resp", resp) @@ -145,10 +146,8 @@ func (impl *CiEventHandlerImpl) Subscribe() error { } else { util.TriggerCIMetrics(ciCompleteEvent.Metrics, impl.ciEventConfig.ExposeCiMetrics, ciCompleteEvent.PipelineName, ciCompleteEvent.AppName) - resp, err := impl.webhookService.HandleCiSuccessEvent(ciCompleteEvent.PipelineId, req, &time.Time{}) + resp, err := impl.ValidateAndHandleCiSuccessEvent(ciCompleteEvent.PipelineId, req, &time.Time{}) if err != nil { - impl.logger.Error("Error while sending event for CI success for pipelineID: ", - ciCompleteEvent.PipelineId, "request: ", req, "error: ", err) return } impl.logger.Debug(resp) @@ -162,6 +161,21 @@ func (impl *CiEventHandlerImpl) Subscribe() error { return nil } +func (impl *CiEventHandlerImpl) ValidateAndHandleCiSuccessEvent(ciPipelineId int, request *pipeline.CiArtifactWebhookRequest, imagePushedAt *time.Time) (int, error) { + validationErr := impl.validator.Struct(request) + if validationErr != nil { + impl.logger.Errorw("validation err, HandleCiSuccessEvent", "err", validationErr, "payload", request) + return 0, validationErr + } + buildArtifactId, err := impl.webhookService.HandleCiSuccessEvent(ciPipelineId, request, imagePushedAt) + if err != nil { + impl.logger.Error("Error while sending event for CI success for pipelineID", + ciPipelineId, "request", request, "error", err) + return 0, err + } + return buildArtifactId, nil +} + func (impl *CiEventHandlerImpl) BuildCiArtifactRequest(event CiCompleteEvent) (*pipeline.CiArtifactWebhookRequest, error) { var ciMaterialInfos []repository.CiMaterialInfo for _, p := range event.CiProjectDetails { @@ -228,6 +242,10 @@ func (impl *CiEventHandlerImpl) BuildCiArtifactRequest(event CiCompleteEvent) (* PluginRegistryArtifactDetails: event.PluginRegistryArtifactDetails, PluginArtifactStage: event.PluginArtifactStage, } + // if DataSource is empty, repository.WEBHOOK is considered as default + if request.DataSource == "" { + request.DataSource = repository.WEBHOOK + } return request, nil } @@ -244,6 +262,9 @@ func (impl *CiEventHandlerImpl) BuildCIArtifactRequestForImageFromCR(imageDetail WorkflowId: &workflowId, IsArtifactUploaded: event.IsArtifactUploaded, } + if request.DataSource == "" { + request.DataSource = repository.WEBHOOK + } return request, nil } @@ -314,5 +335,9 @@ func (impl *CiEventHandlerImpl) BuildCiArtifactRequestForWebhook(event CiComplet WorkflowId: event.WorkflowId, IsArtifactUploaded: event.IsArtifactUploaded, } + // if DataSource is empty, repository.WEBHOOK is considered as default + if request.DataSource == "" { + request.DataSource = repository.WEBHOOK + } return request, nil } diff --git a/api/terminal/UserTerminalAccessRestHandler.go b/api/terminal/UserTerminalAccessRestHandler.go index c2cb455c9e9..4b71273c975 100644 --- a/api/terminal/UserTerminalAccessRestHandler.go +++ b/api/terminal/UserTerminalAccessRestHandler.go @@ -39,9 +39,9 @@ type validShellResponse struct { type UserTerminalAccessRestHandlerImpl struct { Logger *zap.SugaredLogger UserTerminalAccessService clusterTerminalAccess.UserTerminalAccessService - Enforcer casbin.Enforcer - UserService user.UserService - validator *validator.Validate + Enforcer casbin.Enforcer + UserService user.UserService + validator *validator.Validate } func NewUserTerminalAccessRestHandlerImpl(logger *zap.SugaredLogger, userTerminalAccessService clusterTerminalAccess.UserTerminalAccessService, Enforcer casbin.Enforcer, diff --git a/client/events/EventBuilder.go b/client/events/EventBuilder.go index d3c81500171..63060238eae 100644 --- a/client/events/EventBuilder.go +++ b/client/events/EventBuilder.go @@ -49,9 +49,9 @@ type EventSimpleFactoryImpl struct { ciWorkflowRepository pipelineConfig.CiWorkflowRepository ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository ciPipelineRepository pipelineConfig.CiPipelineRepository - pipelineRepository pipelineConfig.PipelineRepository - userRepository repository.UserRepository - ciArtifactRepository repository2.CiArtifactRepository + pipelineRepository pipelineConfig.PipelineRepository + userRepository repository.UserRepository + ciArtifactRepository repository2.CiArtifactRepository } func NewEventSimpleFactoryImpl(logger *zap.SugaredLogger, cdWorkflowRepository pipelineConfig.CdWorkflowRepository, diff --git a/internal/sql/repository/AppListingRepository.go b/internal/sql/repository/AppListingRepository.go index 2b4a9f84f66..ecff1f94c22 100644 --- a/internal/sql/repository/AppListingRepository.go +++ b/internal/sql/repository/AppListingRepository.go @@ -429,7 +429,7 @@ func parseMaterialInfo(materialInfo string, source string) (json.RawMessage, err fmt.Printf("PARSEMATERIALINFO_MATERIAL_RECOVER, materialInfo: %s, source: %s, err: %s \n", materialInfo, source, r) } }() - if source != "GOCD" && source != "CI-RUNNER" && source != "EXTERNAL" { + if source != GOCD && source != CI_RUNNER && source != WEBHOOK && source != EXT { return nil, fmt.Errorf("datasource: %s not supported", source) } if materialInfo == "" { diff --git a/internal/sql/repository/CiArtifactRepository.go b/internal/sql/repository/CiArtifactRepository.go index 5915da86728..caf53ddb83f 100644 --- a/internal/sql/repository/CiArtifactRepository.go +++ b/internal/sql/repository/CiArtifactRepository.go @@ -22,6 +22,7 @@ import ( "fmt" "github.com/devtron-labs/devtron/internal/sql/repository/helper" "github.com/devtron-labs/devtron/pkg/sql" + "golang.org/x/exp/slices" "strings" "time" @@ -32,19 +33,23 @@ import ( ) type credentialsSource = string -type artifactsSourceType = string +type ArtifactsSourceType = string const ( GLOBAL_CONTAINER_REGISTRY credentialsSource = "global_container_registry" ) + +// List of possible DataSource Type for an artifact const ( - CI_RUNNER artifactsSourceType = "CI-RUNNER" - WEBHOOK artifactsSourceType = "EXTERNAL" - PRE_CD artifactsSourceType = "pre_cd" - POST_CD artifactsSourceType = "post_cd" - PRE_CI artifactsSourceType = "pre_ci" - POST_CI artifactsSourceType = "post_ci" - GOCD artifactsSourceType = "GOCD" + CI_RUNNER ArtifactsSourceType = "CI-RUNNER" + WEBHOOK ArtifactsSourceType = "EXTERNAL" // Currently in use instead of EXT + PRE_CD ArtifactsSourceType = "pre_cd" + POST_CD ArtifactsSourceType = "post_cd" + POST_CI ArtifactsSourceType = "post_ci" + GOCD ArtifactsSourceType = "GOCD" + // deprecated; Handled for backward compatibility + EXT ArtifactsSourceType = "ext" + // PRE_CI is not a valid DataSource for an artifact ) type CiArtifactWithExtraData struct { @@ -63,7 +68,7 @@ type CiArtifact struct { Image string `sql:"image,notnull"` ImageDigest string `sql:"image_digest,notnull"` MaterialInfo string `sql:"material_info"` // git material metadata json array string - DataSource string `sql:"data_source,notnull"` // possible values -> (CI_RUNNER,ext,post_ci,pre_cd,post_cd) CI_runner is for normal build ci + DataSource string `sql:"data_source,notnull"` // possible values -> (CI_RUNNER,EXTERNAL,post_ci,pre_cd,post_cd) CI_runner is for normal build ci WorkflowId *int `sql:"ci_workflow_id"` ParentCiArtifact int `sql:"parent_ci_artifact"` ScanEnabled bool `sql:"scan_enabled,notnull"` @@ -80,9 +85,20 @@ type CiArtifact struct { sql.AuditLog } +func (c *CiArtifact) IsMigrationRequired() bool { + validDataSourceTypeList := []string{CI_RUNNER, WEBHOOK, PRE_CD, POST_CD, POST_CI, GOCD} + if slices.Contains(validDataSourceTypeList, c.DataSource) { + return false + } + return true +} + type CiArtifactRepository interface { Save(artifact *CiArtifact) error Delete(artifact *CiArtifact) error + + // Get returns the CiArtifact of the given id. + // Note: Use Get along with MigrateToWebHookDataSourceType. For webhook artifacts, migration is required for column DataSource from 'ext' to 'EXTERNAL' Get(id int) (artifact *CiArtifact, err error) GetArtifactParentCiAndWorkflowDetailsByIds(ids []int) ([]*CiArtifact, error) GetByWfId(wfId int) (artifact *CiArtifact, err error) @@ -106,6 +122,8 @@ type CiArtifactRepository interface { GetArtifactsByDataSourceAndComponentId(dataSource string, componentId int) ([]CiArtifact, error) FindCiArtifactByImagePaths(images []string) ([]CiArtifact, error) + // MigrateToWebHookDataSourceType is used for backward compatibility. It'll migrate the deprecated DataSource type + MigrateToWebHookDataSourceType(id int) error UpdateLatestTimestamp(artifactIds []int) error } @@ -132,6 +150,14 @@ func (impl CiArtifactRepositoryImpl) SaveAll(artifacts []*CiArtifact) ([]*CiArti return artifacts, err } +func (impl CiArtifactRepositoryImpl) MigrateToWebHookDataSourceType(id int) error { + _, err := impl.dbConnection.Model(&CiArtifact{}). + Set("data_source = ?", WEBHOOK). + Where("id = ?", id). + Update() + return err +} + func (impl CiArtifactRepositoryImpl) UpdateLatestTimestamp(artifactIds []int) error { if len(artifactIds) == 0 { impl.logger.Debug("UpdateLatestTimestamp empty list of artifacts, not updating") @@ -477,7 +503,7 @@ func (impl CiArtifactRepositoryImpl) GetArtifactsByCDPipelineAndRunnerType(cdPip // return map of gitUrl:hash func (info *CiArtifact) ParseMaterialInfo() (map[string]string, error) { - if info.DataSource != "GOCD" && info.DataSource != "CI-RUNNER" && info.DataSource != "EXTERNAL" { + if info.DataSource != GOCD && info.DataSource != CI_RUNNER && info.DataSource != WEBHOOK && info.DataSource != EXT { return nil, fmt.Errorf("datasource: %s not supported", info.DataSource) } var ciMaterials []*CiMaterialInfo @@ -588,7 +614,7 @@ func (impl CiArtifactRepositoryImpl) GetArtifactsByCDPipelineV2(cdPipelineId int } func GetCiMaterialInfo(materialInfo string, source string) ([]CiMaterialInfo, error) { - if source != "GOCD" && source != "CI-RUNNER" && source != "EXTERNAL" && source != "post_ci" && source != "pre_cd" && source != "post_cd" { + if source != GOCD && source != CI_RUNNER && source != WEBHOOK && source != POST_CI && source != PRE_CD && source != POST_CD && source != EXT { return nil, fmt.Errorf("datasource: %s not supported", source) } var ciMaterials []CiMaterialInfo diff --git a/pkg/app/AppService.go b/pkg/app/AppService.go index 29e9c8e8260..fddb55626c5 100644 --- a/pkg/app/AppService.go +++ b/pkg/app/AppService.go @@ -118,9 +118,9 @@ type AppServiceImpl struct { tokenCache *util3.TokenCache acdAuthConfig *util3.ACDAuthConfig enforcer casbin.Enforcer - enforcerUtil rbac.EnforcerUtil - user user.UserService - appListingRepository repository.AppListingRepository + enforcerUtil rbac.EnforcerUtil + user user.UserService + appListingRepository repository.AppListingRepository appRepository app.AppRepository envRepository repository2.EnvironmentRepository pipelineConfigRepository chartConfig.PipelineConfigRepository diff --git a/pkg/appStore/deployment/service/InstalledAppService.go b/pkg/appStore/deployment/service/InstalledAppService.go index 47af5f5dc30..58c54eb5a11 100644 --- a/pkg/appStore/deployment/service/InstalledAppService.go +++ b/pkg/appStore/deployment/service/InstalledAppService.go @@ -124,9 +124,9 @@ type InstalledAppServiceImpl struct { ArgoK8sClient argocdServer.ArgoK8sClient gitFactory *util.GitFactory aCDAuthConfig *util2.ACDAuthConfig - gitOpsRepository repository3.GitOpsConfigRepository - userService user.UserService - appStoreDeploymentService AppStoreDeploymentService + gitOpsRepository repository3.GitOpsConfigRepository + userService user.UserService + appStoreDeploymentService AppStoreDeploymentService appStoreDeploymentFullModeService appStoreDeploymentFullMode.AppStoreDeploymentFullModeService installedAppRepositoryHistory repository2.InstalledAppVersionHistoryRepository argoUserService argo.ArgoUserService diff --git a/pkg/appStore/deployment/service/InstalledAppService_test.go b/pkg/appStore/deployment/service/InstalledAppService_test.go index 3f8bb5d4de3..7de0bb65743 100644 --- a/pkg/appStore/deployment/service/InstalledAppService_test.go +++ b/pkg/appStore/deployment/service/InstalledAppService_test.go @@ -43,9 +43,9 @@ func TestInstalledAppServiceImpl_DeployDefaultChartOnCluster(t *testing.T) { ArgoK8sClient argocdServer.ArgoK8sClient gitFactory *util.GitFactory aCDAuthConfig *util2.ACDAuthConfig - gitOpsRepository repository3.GitOpsConfigRepository - userService user.UserService - appStoreDeploymentService AppStoreDeploymentService + gitOpsRepository repository3.GitOpsConfigRepository + userService user.UserService + appStoreDeploymentService AppStoreDeploymentService appStoreDeploymentFullModeService appStoreDeploymentFullMode.AppStoreDeploymentFullModeService } type args struct { diff --git a/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go b/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go index 143a4e437bb..c861291f38d 100644 --- a/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go +++ b/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go @@ -74,9 +74,9 @@ type AppStoreDeploymentArgoCdServiceImpl struct { helmAppService client.HelmAppService gitOpsConfigRepository repository3.GitOpsConfigRepository appStatusService appStatus.AppStatusService - pipelineStatusTimelineService status.PipelineStatusTimelineService - userService user.UserService - pipelineStatusTimelineRepository pipelineConfig.PipelineStatusTimelineRepository + pipelineStatusTimelineService status.PipelineStatusTimelineService + userService user.UserService + pipelineStatusTimelineRepository pipelineConfig.PipelineStatusTimelineRepository appStoreApplicationVersionRepository appStoreDiscoverRepository.AppStoreApplicationVersionRepository argoClientWrapperService argocdServer.ArgoClientWrapperService acdConfig *argocdServer.ACDConfig diff --git a/pkg/auth/user/bean/bean.go b/pkg/auth/user/bean/bean.go index 93202f386e7..b4d7ea9b1ac 100644 --- a/pkg/auth/user/bean/bean.go +++ b/pkg/auth/user/bean/bean.go @@ -7,24 +7,24 @@ const ( ENV_TYPE = "environment" APP_TYPE = "app" WorkflowType = "workflow" - CHART_GROUP_TYPE = "chart-group" - MANAGER_TYPE RoleType = "manager" - ADMIN_TYPE RoleType = "admin" - TRIGGER_TYPE RoleType = "trigger" - VIEW_TYPE RoleType = "view" - ENTITY_ALL_TYPE RoleType = "entityAll" - ENTITY_VIEW_TYPE RoleType = "entityView" - ENTITY_SPECIFIC_TYPE RoleType = "entitySpecific" - ENTITY_SPECIFIC_ADMIN_TYPE RoleType = "entitySpecificAdmin" - ENTITY_SPECIFIC_VIEW_TYPE RoleType = "entitySpecificView" - ROLE_SPECIFIC_TYPE RoleType = "roleSpecific" - ENTITY_CLUSTER_ADMIN_TYPE RoleType = "clusterAdmin" - ENTITY_CLUSTER_VIEW_TYPE RoleType = "clusterView" - ADMIN_HELM_TYPE RoleType = "admin" - EDIT_HELM_TYPE RoleType = "edit" - VIEW_HELM_TYPE RoleType = "view" - ENTITY_CLUSTER_EDIT_TYPE RoleType = "clusterEdit" - DEVTRON_APP = "devtron-app" + CHART_GROUP_TYPE = "chart-group" + MANAGER_TYPE RoleType = "manager" + ADMIN_TYPE RoleType = "admin" + TRIGGER_TYPE RoleType = "trigger" + VIEW_TYPE RoleType = "view" + ENTITY_ALL_TYPE RoleType = "entityAll" + ENTITY_VIEW_TYPE RoleType = "entityView" + ENTITY_SPECIFIC_TYPE RoleType = "entitySpecific" + ENTITY_SPECIFIC_ADMIN_TYPE RoleType = "entitySpecificAdmin" + ENTITY_SPECIFIC_VIEW_TYPE RoleType = "entitySpecificView" + ROLE_SPECIFIC_TYPE RoleType = "roleSpecific" + ENTITY_CLUSTER_ADMIN_TYPE RoleType = "clusterAdmin" + ENTITY_CLUSTER_VIEW_TYPE RoleType = "clusterView" + ADMIN_HELM_TYPE RoleType = "admin" + EDIT_HELM_TYPE RoleType = "edit" + VIEW_HELM_TYPE RoleType = "view" + ENTITY_CLUSTER_EDIT_TYPE RoleType = "clusterEdit" + DEVTRON_APP = "devtron-app" SUPER_ADMIN = "super-admin" CLUSTER = "cluster" GLOBAL_ENTITY = "globalEntity" diff --git a/pkg/auth/user/repository/UserAuditRepository.go b/pkg/auth/user/repository/UserAuditRepository.go index e82382181f1..6568b571443 100644 --- a/pkg/auth/user/repository/UserAuditRepository.go +++ b/pkg/auth/user/repository/UserAuditRepository.go @@ -16,7 +16,7 @@ */ /* - @description: user crud +@description: user crud */ package repository diff --git a/pkg/auth/user/repository/UserRepository.go b/pkg/auth/user/repository/UserRepository.go index 31864907a17..191b296c070 100644 --- a/pkg/auth/user/repository/UserRepository.go +++ b/pkg/auth/user/repository/UserRepository.go @@ -66,8 +66,8 @@ type UserRoleModel struct { TableName struct{} `sql:"user_roles"` Id int `sql:"id,pk"` UserId int32 `sql:"user_id,notnull"` - RoleId int `sql:"role_id,notnull"` - User UserModel + RoleId int `sql:"role_id,notnull"` + User UserModel sql.AuditLog } diff --git a/pkg/deploymentGroup/DeploymentGroupService.go b/pkg/deploymentGroup/DeploymentGroupService.go index 9bf843e19f8..3ceb1357a29 100644 --- a/pkg/deploymentGroup/DeploymentGroupService.go +++ b/pkg/deploymentGroup/DeploymentGroupService.go @@ -610,7 +610,7 @@ func (impl *DeploymentGroupServiceImpl) GetArtifactsByCiPipeline(ciPipelineId in } func (impl *DeploymentGroupServiceImpl) parseMaterialInfo(materialInfo json.RawMessage, source string) (json.RawMessage, error) { - if source != "GOCD" && source != "CI-RUNNER" && source != "EXTERNAL" { + if source != repository.GOCD && source != repository.CI_RUNNER && source != repository.WEBHOOK && source != repository.EXT { return nil, fmt.Errorf("datasource: %s not supported", source) } var ciMaterials []repository.CiMaterialInfo diff --git a/pkg/notifier/NotificationConfigService.go b/pkg/notifier/NotificationConfigService.go index 43ca1f07e24..123caa3c09a 100644 --- a/pkg/notifier/NotificationConfigService.go +++ b/pkg/notifier/NotificationConfigService.go @@ -57,9 +57,9 @@ type NotificationConfigServiceImpl struct { smtpRepository repository.SMTPNotificationRepository teamRepository repository2.TeamRepository environmentRepository repository3.EnvironmentRepository - appRepository app.AppRepository - userRepository repository4.UserRepository - ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository + appRepository app.AppRepository + userRepository repository4.UserRepository + ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository } type NotificationSettingRequest struct { diff --git a/pkg/pipeline/AppArtifactManager.go b/pkg/pipeline/AppArtifactManager.go index 69dfbf762db..7ec6f4d57db 100644 --- a/pkg/pipeline/AppArtifactManager.go +++ b/pkg/pipeline/AppArtifactManager.go @@ -52,9 +52,9 @@ type AppArtifactManager interface { type AppArtifactManagerImpl struct { logger *zap.SugaredLogger - cdWorkflowRepository pipelineConfig.CdWorkflowRepository - userService user.UserService - imageTaggingService ImageTaggingService + cdWorkflowRepository pipelineConfig.CdWorkflowRepository + userService user.UserService + imageTaggingService ImageTaggingService ciArtifactRepository repository.CiArtifactRepository ciWorkflowRepository pipelineConfig.CiWorkflowRepository pipelineStageService PipelineStageService diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go index 50dadefe9d2..06dc8d03bc0 100644 --- a/pkg/pipeline/PipelineBuilder.go +++ b/pkg/pipeline/PipelineBuilder.go @@ -253,7 +253,7 @@ type ConfigMapSecretsResponse struct { } func parseMaterialInfo(materialInfo json.RawMessage, source string) (json.RawMessage, error) { - if source != repository.GOCD && source != repository.CI_RUNNER && source != repository.WEBHOOK && source != repository.PRE_CD && source != repository.POST_CD && source != repository.POST_CI { + if source != repository.GOCD && source != repository.CI_RUNNER && source != repository.WEBHOOK && source != repository.EXT && source != repository.PRE_CD && source != repository.POST_CD && source != repository.POST_CI { return nil, fmt.Errorf("datasource: %s not supported", source) } var ciMaterials []repository.CiMaterialInfo diff --git a/pkg/pipeline/WebhookService.go b/pkg/pipeline/WebhookService.go index fd236f912fc..f6960ddd63e 100644 --- a/pkg/pipeline/WebhookService.go +++ b/pkg/pipeline/WebhookService.go @@ -45,17 +45,17 @@ import ( ) type CiArtifactWebhookRequest struct { - Image string `json:"image"` - ImageDigest string `json:"imageDigest"` - MaterialInfo json.RawMessage `json:"materialInfo"` - DataSource string `json:"dataSource"` - PipelineName string `json:"pipelineName"` - WorkflowId *int `json:"workflowId"` - UserId int32 `json:"userId"` - IsArtifactUploaded bool `json:"isArtifactUploaded"` - FailureReason string `json:"failureReason"` - PluginRegistryArtifactDetails map[string][]string `json:"PluginRegistryArtifactDetails"` //map of registry and array of images generated by Copy container image plugin - PluginArtifactStage string `json:"pluginArtifactStage"` // at which stage of CI artifact was generated by plugin ("pre_ci/post_ci") + Image string `json:"image" validate:"required"` + ImageDigest string `json:"imageDigest"` + MaterialInfo json.RawMessage `json:"materialInfo"` + DataSource repository.ArtifactsSourceType `json:"dataSource" validate:"oneof=CI-RUNNER EXTERNAL pre_cd post_cd post_ci GOCD"` + PipelineName string `json:"pipelineName"` + WorkflowId *int `json:"workflowId"` + UserId int32 `json:"userId"` + IsArtifactUploaded bool `json:"isArtifactUploaded"` + FailureReason string `json:"failureReason"` + PluginRegistryArtifactDetails map[string][]string `json:"PluginRegistryArtifactDetails"` //map of registry and array of images generated by Copy container image plugin + PluginArtifactStage string `json:"pluginArtifactStage"` // at which stage of CI artifact was generated by plugin ("pre_ci/post_ci") } type WebhookService interface { @@ -195,9 +195,6 @@ func (impl WebhookServiceImpl) HandleCiSuccessEvent(ciPipelineId int, request *C if request.PipelineName == "" { request.PipelineName = pipeline.Name } - if request.DataSource == "" { - request.DataSource = "EXTERNAL" - } if err != nil { impl.logger.Errorw("unable to find pipeline", "name", request.PipelineName, "err", err) return 0, err @@ -218,10 +215,6 @@ func (impl WebhookServiceImpl) HandleCiSuccessEvent(ciPipelineId int, request *C if !imagePushedAt.IsZero() { createdOn = *imagePushedAt } - if pipeline.PipelineType == bean.CI_JOB && request.Image == "" { - impl.logger.Errorw("empty image artifact found!", "request", request) - return 0, fmt.Errorf("empty image artifact found") - } buildArtifact := &repository.CiArtifact{ Image: request.Image, ImageDigest: request.ImageDigest, @@ -374,9 +367,6 @@ func (impl WebhookServiceImpl) HandleExternalCiWebhook(externalCiId int, request } impl.logger.Infow("request of webhook external ci", "req", request) - if request.DataSource == "" { - request.DataSource = "EXTERNAL" - } materialJson, err := request.MaterialInfo.MarshalJSON() if err != nil { impl.logger.Errorw("unable to marshal material metadata", "err", err) diff --git a/pkg/pipeline/WorkflowDagExecutor.go b/pkg/pipeline/WorkflowDagExecutor.go index 7a8ac4a6dbc..c8df0a92ab9 100644 --- a/pkg/pipeline/WorkflowDagExecutor.go +++ b/pkg/pipeline/WorkflowDagExecutor.go @@ -922,6 +922,13 @@ func (impl *WorkflowDagExecutorImpl) HandlePreStageSuccessEvent(cdStageCompleteE if err != nil { return err } + // Migration of deprecated DataSource Type + if ciArtifact.IsMigrationRequired() { + migrationErr := impl.ciArtifactRepository.MigrateToWebHookDataSourceType(ciArtifact.Id) + if migrationErr != nil { + impl.logger.Warnw("unable to migrate deprecated DataSource", "artifactId", ciArtifact.Id) + } + } PreCDArtifacts, err := impl.SavePluginArtifacts(ciArtifact, cdStageCompleteEvent.PluginRegistryArtifactDetails, pipeline.Id, repository.PRE_CD, cdStageCompleteEvent.TriggeredBy) if err != nil { impl.logger.Errorw("error in saving plugin artifacts", "err", err) @@ -1262,6 +1269,13 @@ func (impl *WorkflowDagExecutorImpl) TriggerPostStage(cdWf *pipelineConfig.CdWor return err } } + // Migration of deprecated DataSource Type + if cdWf.CiArtifact.IsMigrationRequired() { + migrationErr := impl.ciArtifactRepository.MigrateToWebHookDataSourceType(cdWf.CiArtifact.Id) + if migrationErr != nil { + impl.logger.Warnw("unable to migrate deprecated DataSource", "artifactId", cdWf.CiArtifact.Id) + } + } //checking vulnerability for the selected image isVulnerable, err := impl.GetArtifactVulnerabilityStatus(cdWf.CiArtifact, pipeline, context.Background()) if err != nil { @@ -1426,7 +1440,13 @@ func (impl *WorkflowDagExecutorImpl) buildWFRequest(runner *pipelineConfig.CdWor if err != nil { return nil, err } - + // Migration of deprecated DataSource Type + if artifact.IsMigrationRequired() { + migrationErr := impl.ciArtifactRepository.MigrateToWebHookDataSourceType(artifact.Id) + if migrationErr != nil { + impl.logger.Warnw("unable to migrate deprecated DataSource", "artifactId", artifact.Id) + } + } ciMaterialInfo, err := repository.GetCiMaterialInfo(artifact.MaterialInfo, artifact.DataSource) if err != nil { impl.logger.Errorw("parsing error", "err", err) @@ -1750,7 +1770,7 @@ func (impl *WorkflowDagExecutorImpl) buildWFRequest(runner *pipelineConfig.CdWor cdStageWorkflowRequest.DockerRegistryType = string(ciTemplate.DockerRegistry.RegistryType) cdStageWorkflowRequest.DockerRegistryURL = ciTemplate.DockerRegistry.RegistryURL appLabels, err := impl.appLabelRepository.FindAllByAppId(cdPipeline.AppId) - cdStageWorkflowRequest.DockerRegistryId = ciPipeline.CiTemplate.DockerRegistry.Id + cdStageWorkflowRequest.DockerRegistryId = ciTemplate.DockerRegistry.Id if err != nil && err != pg.ErrNoRows { impl.logger.Errorw("error in getting labels by appId", "err", err, "appId", cdPipeline.AppId) return nil, err @@ -2289,6 +2309,13 @@ func (impl *WorkflowDagExecutorImpl) ManualCdTrigger(overrideRequest *bean.Value impl.logger.Errorw("error in getting CiArtifact", "CiArtifactId", overrideRequest.CiArtifactId, "err", err) return 0, err } + // Migration of deprecated DataSource Type + if artifact.IsMigrationRequired() { + migrationErr := impl.ciArtifactRepository.MigrateToWebHookDataSourceType(artifact.Id) + if migrationErr != nil { + impl.logger.Warnw("unable to migrate deprecated DataSource", "artifactId", artifact.Id) + } + } _, span = otel.Tracer("orchestrator").Start(ctx, "TriggerPreStage") err = impl.TriggerPreStage(ctx, nil, artifact, cdPipeline, overrideRequest.UserId, 0) span.End() @@ -2361,6 +2388,13 @@ func (impl *WorkflowDagExecutorImpl) ManualCdTrigger(overrideRequest *bean.Value impl.logger.Errorw("error in getting ciArtifact, ManualCdTrigger", "CiArtifactId", overrideRequest.CiArtifactId, "err", err) return 0, err } + // Migration of deprecated DataSource Type + if artifact.IsMigrationRequired() { + migrationErr := impl.ciArtifactRepository.MigrateToWebHookDataSourceType(artifact.Id) + if migrationErr != nil { + impl.logger.Warnw("unable to migrate deprecated DataSource", "artifactId", artifact.Id) + } + } isVulnerable, err := impl.GetArtifactVulnerabilityStatus(artifact, cdPipeline, ctx) if err != nil { impl.logger.Errorw("error in getting Artifact vulnerability status, ManualCdTrigger", "err", err) @@ -2589,14 +2623,21 @@ func (impl *WorkflowDagExecutorImpl) subscribeTriggerBulkAction() error { impl.cdWorkflowRepository.UpdateWorkFlow(wf) return } - artefact, err := impl.ciArtifactRepository.Get(cdWorkflow.CiArtifactId) + artifact, err := impl.ciArtifactRepository.Get(cdWorkflow.CiArtifactId) if err != nil { impl.logger.Errorw("error in fetching artefact", "err", err) wf.WorkflowStatus = pipelineConfig.TRIGGER_ERROR impl.cdWorkflowRepository.UpdateWorkFlow(wf) return } - err = impl.triggerStageForBulk(wf, pipeline, artefact, false, cdWorkflow.CreatedBy) + // Migration of deprecated DataSource Type + if artifact.IsMigrationRequired() { + migrationErr := impl.ciArtifactRepository.MigrateToWebHookDataSourceType(artifact.Id) + if migrationErr != nil { + impl.logger.Warnw("unable to migrate deprecated DataSource", "artifactId", artifact.Id) + } + } + err = impl.triggerStageForBulk(wf, pipeline, artifact, false, cdWorkflow.CreatedBy) if err != nil { impl.logger.Errorw("error in cd trigger ", "err", err) wf.WorkflowStatus = pipelineConfig.TRIGGER_ERROR diff --git a/pkg/security/ImageScanService.go b/pkg/security/ImageScanService.go index d4a8ffbf5ee..e8d027e5f1e 100644 --- a/pkg/security/ImageScanService.go +++ b/pkg/security/ImageScanService.go @@ -47,9 +47,9 @@ type ImageScanServiceImpl struct { scanResultRepository security.ImageScanResultRepository scanObjectMetaRepository security.ImageScanObjectMetaRepository cveStoreRepository security.CveStoreRepository - imageScanDeployInfoRepository security.ImageScanDeployInfoRepository - userService user.UserService - teamRepository repository2.TeamRepository + imageScanDeployInfoRepository security.ImageScanDeployInfoRepository + userService user.UserService + teamRepository repository2.TeamRepository appRepository repository1.AppRepository envService cluster.EnvironmentService ciArtifactRepository repository.CiArtifactRepository diff --git a/wire_gen.go b/wire_gen.go index 1ec6b644e15..3adce4bfbce 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -582,7 +582,7 @@ func InitializeApp() (*App, error) { if err != nil { return nil, err } - ciEventHandlerImpl := pubsub.NewCiEventHandlerImpl(sugaredLogger, pubSubClientServiceImpl, webhookServiceImpl, ciEventConfig) + ciEventHandlerImpl := pubsub.NewCiEventHandlerImpl(sugaredLogger, pubSubClientServiceImpl, webhookServiceImpl, validate, ciEventConfig) externalCiRestHandlerImpl := restHandler.NewExternalCiRestHandlerImpl(sugaredLogger, webhookServiceImpl, ciEventHandlerImpl, validate, userServiceImpl, enforcerImpl, enforcerUtilImpl) pubSubClientRestHandlerImpl := restHandler.NewPubSubClientRestHandlerImpl(pubSubClientServiceImpl, sugaredLogger, ciCdConfig) webhookRouterImpl := router.NewWebhookRouterImpl(gitWebhookRestHandlerImpl, pipelineConfigRestHandlerImpl, externalCiRestHandlerImpl, pubSubClientRestHandlerImpl)