diff --git a/Wire.go b/Wire.go index f1fd7160f2..7536b6d25f 100644 --- a/Wire.go +++ b/Wire.go @@ -85,6 +85,7 @@ import ( repocreds "github.com/devtron-labs/devtron/client/argocdServer/repocreds" repository2 "github.com/devtron-labs/devtron/client/argocdServer/repository" session2 "github.com/devtron-labs/devtron/client/argocdServer/session" + "github.com/devtron-labs/devtron/client/argocdServer/version" "github.com/devtron-labs/devtron/client/cron" "github.com/devtron-labs/devtron/client/dashboard" eClient "github.com/devtron-labs/devtron/client/events" @@ -167,7 +168,6 @@ import ( workflow3 "github.com/devtron-labs/devtron/pkg/workflow" "github.com/devtron-labs/devtron/pkg/workflow/dag" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" cron2 "github.com/devtron-labs/devtron/util/cron" "github.com/devtron-labs/devtron/util/rbac" "github.com/google/wire" @@ -449,8 +449,8 @@ func InitializeApp() (*App, error) { wire.Bind(new(repository8.ImageTaggingRepository), new(*repository8.ImageTaggingRepositoryImpl)), imageTagging.NewImageTaggingServiceImpl, wire.Bind(new(imageTagging.ImageTaggingService), new(*imageTagging.ImageTaggingServiceImpl)), - argocdServer.NewVersionServiceImpl, - wire.Bind(new(argocdServer.VersionService), new(*argocdServer.VersionServiceImpl)), + version.NewVersionServiceImpl, + wire.Bind(new(version.VersionService), new(*version.VersionServiceImpl)), router.NewGitProviderRouterImpl, wire.Bind(new(router.GitProviderRouter), new(*router.GitProviderRouterImpl)), @@ -801,9 +801,9 @@ func InitializeApp() (*App, error) { connection.NewArgoCDConnectionManagerImpl, wire.Bind(new(connection.ArgoCDConnectionManager), new(*connection.ArgoCDConnectionManagerImpl)), - argo.NewArgoUserServiceImpl, - wire.Bind(new(argo.ArgoUserService), new(*argo.ArgoUserServiceImpl)), - //util2.GetEnvironmentVariables, + //argo.NewArgoUserServiceImpl, + //wire.Bind(new(argo.ArgoUserService), new(*argo.ArgoUserServiceImpl)), + ////util2.GetEnvironmentVariables, // AuthWireSet, cron.NewCdApplicationStatusUpdateHandlerImpl, diff --git a/api/appStore/InstalledAppRestHandler.go b/api/appStore/InstalledAppRestHandler.go index be85c60e79..873e1b2494 100644 --- a/api/appStore/InstalledAppRestHandler.go +++ b/api/appStore/InstalledAppRestHandler.go @@ -27,6 +27,7 @@ import ( "github.com/devtron-labs/devtron/pkg/appStore/installedApp/service/FullMode/resource" util3 "github.com/devtron-labs/devtron/pkg/appStore/util" "github.com/devtron-labs/devtron/pkg/bean" + "github.com/devtron-labs/devtron/pkg/cluster/read" "gopkg.in/go-playground/validator.v9" "net/http" "reflect" @@ -50,7 +51,6 @@ import ( "github.com/devtron-labs/devtron/pkg/auth/user" "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/rbac" "github.com/devtron-labs/devtron/util/response" "github.com/go-pg/pg" @@ -88,11 +88,11 @@ type InstalledAppRestHandlerImpl struct { appStoreDeploymentService service.AppStoreDeploymentService appStoreDeploymentDBService service.AppStoreDeploymentDBService helmAppClient client.HelmAppClient - argoUserService argo.ArgoUserService cdApplicationStatusUpdateHandler cron.CdApplicationStatusUpdateHandler installedAppRepository repository.InstalledAppRepository appCrudOperationService app2.AppCrudOperationService installedAppDeploymentTypeChangeService deploymentTypeChange.InstalledAppDeploymentTypeChangeService + clusterReadService read.ClusterReadService } func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService user.UserService, @@ -102,11 +102,13 @@ func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService u chartGroupService chartGroup.ChartGroupService, validator *validator.Validate, clusterService cluster.ClusterService, acdServiceClient application.ServiceClient, appStoreDeploymentService service.AppStoreDeploymentService, appStoreDeploymentDBService service.AppStoreDeploymentDBService, - helmAppClient client.HelmAppClient, argoUserService argo.ArgoUserService, + helmAppClient client.HelmAppClient, + cdApplicationStatusUpdateHandler cron.CdApplicationStatusUpdateHandler, installedAppRepository repository.InstalledAppRepository, appCrudOperationService app2.AppCrudOperationService, - installedAppDeploymentTypeChangeService deploymentTypeChange.InstalledAppDeploymentTypeChangeService) *InstalledAppRestHandlerImpl { + installedAppDeploymentTypeChangeService deploymentTypeChange.InstalledAppDeploymentTypeChangeService, + clusterReadService read.ClusterReadService) *InstalledAppRestHandlerImpl { return &InstalledAppRestHandlerImpl{ Logger: Logger, userAuthService: userAuthService, @@ -122,11 +124,11 @@ func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService u appStoreDeploymentService: appStoreDeploymentService, appStoreDeploymentDBService: appStoreDeploymentDBService, helmAppClient: helmAppClient, - argoUserService: argoUserService, cdApplicationStatusUpdateHandler: cdApplicationStatusUpdateHandler, installedAppRepository: installedAppRepository, appCrudOperationService: appCrudOperationService, installedAppDeploymentTypeChangeService: installedAppDeploymentTypeChangeService, + clusterReadService: clusterReadService, } } func (handler *InstalledAppRestHandlerImpl) FetchAppOverview(w http.ResponseWriter, r *http.Request) { @@ -550,7 +552,7 @@ func (impl *InstalledAppRestHandlerImpl) DefaultComponentInstallation(w http.Res return } impl.Logger.Errorw("request payload, DefaultComponentInstallation", "clusterId", clusterId) - cluster, err := impl.clusterService.FindById(clusterId) + cluster, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.Logger.Errorw("service err, DefaultComponentInstallation", "error", err, "clusterId", clusterId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -648,13 +650,6 @@ func (handler *InstalledAppRestHandlerImpl) DeleteArgoInstalledAppWithNonCascade return } //rback block ends here - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) request := &appStoreBean.InstallAppVersionDTO{} request.InstalledAppId = installedAppId request.AppName = installedApp.AppName @@ -668,7 +663,7 @@ func (handler *InstalledAppRestHandlerImpl) DeleteArgoInstalledAppWithNonCascade request.Namespace = installedApp.Namespace request.AcdPartialDelete = true - request, err = handler.appStoreDeploymentService.DeleteInstalledApp(ctx, request) + request, err = handler.appStoreDeploymentService.DeleteInstalledApp(r.Context(), request) if err != nil { handler.Logger.Errorw("service err, DeleteInstalledApp", "err", err, "installAppId", installedAppId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) diff --git a/api/appStore/deployment/AppStoreDeploymentRestHandler.go b/api/appStore/deployment/AppStoreDeploymentRestHandler.go index f78186edbd..08bb4f43a5 100644 --- a/api/appStore/deployment/AppStoreDeploymentRestHandler.go +++ b/api/appStore/deployment/AppStoreDeploymentRestHandler.go @@ -33,7 +33,6 @@ import ( "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" "github.com/devtron-labs/devtron/pkg/auth/user" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/rbac" "github.com/go-pg/pg" "github.com/gorilla/mux" @@ -64,7 +63,6 @@ type AppStoreDeploymentRestHandlerImpl struct { appStoreDeploymentDBService service.AppStoreDeploymentDBService validator *validator.Validate helmAppService service2.HelmAppService - argoUserService argo.ArgoUserService installAppService EAMode.InstalledAppDBService attributesService attributes.AttributesService } @@ -73,8 +71,8 @@ func NewAppStoreDeploymentRestHandlerImpl(Logger *zap.SugaredLogger, userAuthSer enforcer casbin.Enforcer, enforcerUtil rbac.EnforcerUtil, enforcerUtilHelm rbac.EnforcerUtilHelm, appStoreDeploymentService service.AppStoreDeploymentService, appStoreDeploymentDBService service.AppStoreDeploymentDBService, - validator *validator.Validate, helmAppService service2.HelmAppService, - argoUserService argo.ArgoUserService, + validator *validator.Validate, + helmAppService service2.HelmAppService, installAppService EAMode.InstalledAppDBService, attributesService attributes.AttributesService) *AppStoreDeploymentRestHandlerImpl { return &AppStoreDeploymentRestHandlerImpl{ Logger: Logger, @@ -86,7 +84,6 @@ func NewAppStoreDeploymentRestHandlerImpl(Logger *zap.SugaredLogger, userAuthSer appStoreDeploymentDBService: appStoreDeploymentDBService, validator: validator, helmAppService: helmAppService, - argoUserService: argoUserService, installAppService: installAppService, attributesService: attributesService, } @@ -165,16 +162,7 @@ func (handler AppStoreDeploymentRestHandlerImpl) InstallApp(w http.ResponseWrite } if util2.IsBaseStack() || util2.IsHelmApp(request.AppOfferingMode) { ctx = context.WithValue(r.Context(), "token", token) - } else { - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) } - defer cancel() res, err := handler.appStoreDeploymentService.InstallApp(&request, ctx) if err != nil { @@ -348,14 +336,6 @@ func (handler AppStoreDeploymentRestHandlerImpl) DeleteInstalledApp(w http.Respo } if util2.IsBaseStack() || util2.IsHelmApp(request.AppOfferingMode) { ctx = context.WithValue(r.Context(), "token", token) - } else { - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) } request, err = handler.appStoreDeploymentService.DeleteInstalledApp(ctx, request) @@ -476,14 +456,6 @@ func (handler AppStoreDeploymentRestHandlerImpl) UpdateInstalledApp(w http.Respo } if util2.IsBaseStack() || util2.IsHelmApp(request.AppOfferingMode) { ctx = context.WithValue(r.Context(), "token", token) - } else { - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) } res, err := handler.appStoreDeploymentService.UpdateInstalledApp(ctx, &request) if err != nil { diff --git a/api/appStore/deployment/CommonDeploymentRestHandler.go b/api/appStore/deployment/CommonDeploymentRestHandler.go index a9840c5eea..2365082183 100644 --- a/api/appStore/deployment/CommonDeploymentRestHandler.go +++ b/api/appStore/deployment/CommonDeploymentRestHandler.go @@ -37,7 +37,6 @@ import ( "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" "github.com/devtron-labs/devtron/pkg/auth/user" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/rbac" "github.com/gorilla/mux" "go.opentelemetry.io/otel" @@ -61,7 +60,6 @@ type CommonDeploymentRestHandlerImpl struct { installedAppService EAMode.InstalledAppDBService validator *validator.Validate helmAppService service2.HelmAppService - argoUserService argo.ArgoUserService attributesService attributes.AttributesService } @@ -69,7 +67,7 @@ func NewCommonDeploymentRestHandlerImpl(Logger *zap.SugaredLogger, userAuthServi enforcer casbin.Enforcer, enforcerUtil rbac.EnforcerUtil, enforcerUtilHelm rbac.EnforcerUtilHelm, appStoreDeploymentService service.AppStoreDeploymentService, installedAppService EAMode.InstalledAppDBService, validator *validator.Validate, helmAppService service2.HelmAppService, - argoUserService argo.ArgoUserService, attributesService attributes.AttributesService) *CommonDeploymentRestHandlerImpl { + attributesService attributes.AttributesService) *CommonDeploymentRestHandlerImpl { return &CommonDeploymentRestHandlerImpl{ Logger: Logger, userAuthService: userAuthService, @@ -80,7 +78,6 @@ func NewCommonDeploymentRestHandlerImpl(Logger *zap.SugaredLogger, userAuthServi installedAppService: installedAppService, validator: validator, helmAppService: helmAppService, - argoUserService: argoUserService, attributesService: attributesService, } } @@ -305,14 +302,6 @@ func (handler *CommonDeploymentRestHandlerImpl) RollbackApplication(w http.Respo } if util2.IsBaseStack() || util2.IsHelmApp(appOfferingMode) { ctx = context.WithValue(r.Context(), "token", token) - } else { - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) } defer cancel() diff --git a/api/cluster/ClusterRestHandler.go b/api/cluster/ClusterRestHandler.go index a5e4aa3aa3..64aef695ea 100644 --- a/api/cluster/ClusterRestHandler.go +++ b/api/cluster/ClusterRestHandler.go @@ -37,7 +37,6 @@ import ( "github.com/devtron-labs/devtron/pkg/cluster" delete2 "github.com/devtron-labs/devtron/pkg/delete" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/go-pg/pg" "github.com/gorilla/mux" "go.uber.org/zap" @@ -72,7 +71,6 @@ type ClusterRestHandlerImpl struct { validator *validator.Validate enforcer casbin.Enforcer deleteService delete2.DeleteService - argoUserService argo.ArgoUserService environmentService environment.EnvironmentService clusterRbacService rbac.ClusterRbacService } @@ -85,7 +83,6 @@ func NewClusterRestHandlerImpl(clusterService cluster.ClusterService, validator *validator.Validate, enforcer casbin.Enforcer, deleteService delete2.DeleteService, - argoUserService argo.ArgoUserService, environmentService environment.EnvironmentService, clusterRbacService rbac.ClusterRbacService) *ClusterRestHandlerImpl { return &ClusterRestHandlerImpl{ @@ -97,7 +94,6 @@ func NewClusterRestHandlerImpl(clusterService cluster.ClusterService, validator: validator, enforcer: enforcer, deleteService: deleteService, - argoUserService: argoUserService, environmentService: environmentService, clusterRbacService: clusterRbacService, } @@ -139,14 +135,6 @@ func (impl ClusterRestHandlerImpl) SaveClusters(w http.ResponseWriter, r *http.R } if util2.IsBaseStack() { ctx = context.WithValue(ctx, "token", token) - } else { - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(ctx, "token", acdToken) } for _, bean := range beans { @@ -215,14 +203,6 @@ func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request) } if util2.IsBaseStack() { ctx = context.WithValue(ctx, "token", token) - } else { - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(ctx, "token", acdToken) } bean, err = impl.clusterService.Save(ctx, bean, userId) if err != nil { @@ -284,14 +264,6 @@ func (impl ClusterRestHandlerImpl) ValidateKubeconfig(w http.ResponseWriter, r * } if util2.IsBaseStack() { ctx = context.WithValue(ctx, "token", token) - } else { - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(ctx, "token", acdToken) } res, err := impl.clusterService.ValidateKubeconfig(bean.Config) if err != nil { @@ -434,14 +406,6 @@ func (impl ClusterRestHandlerImpl) Update(w http.ResponseWriter, r *http.Request } if util2.IsBaseStack() { ctx = context.WithValue(ctx, "token", token) - } else { - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(ctx, "token", acdToken) } _, err = impl.clusterService.Update(ctx, &bean, userId) if err != nil { diff --git a/api/helm-app/service/read/HelmAppReadService.go b/api/helm-app/service/read/HelmAppReadService.go index 24453de156..482a48894b 100644 --- a/api/helm-app/service/read/HelmAppReadService.go +++ b/api/helm-app/service/read/HelmAppReadService.go @@ -3,13 +3,13 @@ package read import ( "github.com/devtron-labs/common-lib/utils/k8s/commonBean" "github.com/devtron-labs/devtron/api/helm-app/gRPC" - "github.com/devtron-labs/devtron/pkg/cluster" + "github.com/devtron-labs/devtron/pkg/cluster/read" "go.uber.org/zap" ) type HelmAppReadServiceImpl struct { - logger *zap.SugaredLogger - clusterService cluster.ClusterService + logger *zap.SugaredLogger + clusterReadService read.ClusterReadService } type HelmAppReadService interface { @@ -17,16 +17,16 @@ type HelmAppReadService interface { } func NewHelmAppReadServiceImpl(logger *zap.SugaredLogger, - clusterService cluster.ClusterService, + clusterReadService read.ClusterReadService, ) *HelmAppReadServiceImpl { return &HelmAppReadServiceImpl{ - clusterService: clusterService, - logger: logger, + logger: logger, + clusterReadService: clusterReadService, } } func (impl *HelmAppReadServiceImpl) GetClusterConf(clusterId int) (*gRPC.ClusterConfig, error) { - cluster, err := impl.clusterService.FindById(clusterId) + cluster, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in fetching cluster detail", "err", err) return nil, err diff --git a/api/k8s/application/k8sApplicationRestHandler.go b/api/k8s/application/k8sApplicationRestHandler.go index 68dea01aa8..f8f2e8f9b8 100644 --- a/api/k8s/application/k8sApplicationRestHandler.go +++ b/api/k8s/application/k8sApplicationRestHandler.go @@ -37,12 +37,13 @@ import ( "github.com/devtron-labs/devtron/pkg/argoApplication/read" "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" "github.com/devtron-labs/devtron/pkg/auth/user" - "github.com/devtron-labs/devtron/pkg/cluster" + bean4 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" clientErrors "github.com/devtron-labs/devtron/pkg/errors" "github.com/devtron-labs/devtron/pkg/fluxApplication" "github.com/devtron-labs/devtron/pkg/k8s" application2 "github.com/devtron-labs/devtron/pkg/k8s/application" bean2 "github.com/devtron-labs/devtron/pkg/k8s/application/bean" + bean3 "github.com/devtron-labs/devtron/pkg/k8s/bean" "github.com/devtron-labs/devtron/pkg/terminal" "github.com/devtron-labs/devtron/util" "github.com/devtron-labs/devtron/util/rbac" @@ -126,7 +127,7 @@ func (handler *K8sApplicationRestHandlerImpl) RotatePod(w http.ResponseWriter, r return } decoder := json.NewDecoder(r.Body) - podRotateRequest := &k8s.RotatePodRequest{} + podRotateRequest := &bean3.RotatePodRequest{} err := decoder.Decode(podRotateRequest) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusBadRequest) @@ -148,7 +149,7 @@ func (handler *K8sApplicationRestHandlerImpl) RotatePod(w http.ResponseWriter, r } //RBAC enforcer Ends handler.logger.Infow("rotate pod request", "payload", podRotateRequest) - rotatePodRequest := &k8s.RotatePodRequest{ + rotatePodRequest := &bean3.RotatePodRequest{ ClusterId: appIdentifier.ClusterId, Resources: podRotateRequest.Resources, } @@ -162,7 +163,7 @@ func (handler *K8sApplicationRestHandlerImpl) RotatePod(w http.ResponseWriter, r func (handler *K8sApplicationRestHandlerImpl) GetResource(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) - var request k8s.ResourceRequestBean + var request bean3.ResourceRequestBean err := decoder.Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) @@ -376,7 +377,7 @@ func (handler *K8sApplicationRestHandlerImpl) GetHostUrlsByBatch(w http.Response } func (handler *K8sApplicationRestHandlerImpl) CreateResource(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) - var request k8s.ResourceRequestBean + var request bean3.ResourceRequestBean err := decoder.Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) @@ -410,7 +411,7 @@ func (handler *K8sApplicationRestHandlerImpl) CreateResource(w http.ResponseWrit } func (handler *K8sApplicationRestHandlerImpl) UpdateResource(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) - var request k8s.ResourceRequestBean + var request bean3.ResourceRequestBean token := r.Header.Get("token") err := decoder.Decode(&request) if err != nil { @@ -448,7 +449,7 @@ func (handler *K8sApplicationRestHandlerImpl) UpdateResource(w http.ResponseWrit } common.WriteJsonResp(w, nil, resource, http.StatusOK) } -func (handler *K8sApplicationRestHandlerImpl) handleRbac(r *http.Request, w http.ResponseWriter, request k8s.ResourceRequestBean, token string, casbinAction string) bool { +func (handler *K8sApplicationRestHandlerImpl) handleRbac(r *http.Request, w http.ResponseWriter, request bean3.ResourceRequestBean, token string, casbinAction string) bool { // assume direct update in cluster allowed, err := handler.k8sApplicationService.ValidateClusterResourceRequest(r.Context(), &request, handler.getRbacCallbackForResource(token, casbinAction)) if err != nil { @@ -466,7 +467,7 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteResource(w http.ResponseWrit common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } - var request k8s.ResourceRequestBean + var request bean3.ResourceRequestBean err = json.NewDecoder(r.Body).Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) @@ -505,7 +506,7 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteResource(w http.ResponseWrit errCode = apiErr.HttpStatusCode switch errCode { case http.StatusNotFound: - errorMessage := k8s.ResourceNotFoundErr + errorMessage := bean3.ResourceNotFoundErr err = fmt.Errorf("%s: %w", errorMessage, err) } } @@ -518,7 +519,7 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteResource(w http.ResponseWrit func (handler *K8sApplicationRestHandlerImpl) ListEvents(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) token := r.Header.Get("token") - var request k8s.ResourceRequestBean + var request bean3.ResourceRequestBean err := decoder.Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) @@ -676,7 +677,7 @@ func generatePodLogsFilename(filename string) string { return fmt.Sprintf("podlogs-%s-%s.log", filename, uuid.New().String()) } -func (handler *K8sApplicationRestHandlerImpl) requestValidationAndRBAC(w http.ResponseWriter, r *http.Request, token string, request *k8s.ResourceRequestBean) { +func (handler *K8sApplicationRestHandlerImpl) requestValidationAndRBAC(w http.ResponseWriter, r *http.Request, token string, request *bean3.ResourceRequestBean) { if request.AppType == bean2.HelmAppType && request.AppIdentifier != nil { if request.DeploymentType == bean2.HelmInstalledType { if err := handler.k8sApplicationService.ValidateResourceRequest(r.Context(), request.AppIdentifier, request.K8sRequest); err != nil { @@ -918,7 +919,7 @@ func (handler *K8sApplicationRestHandlerImpl) GetAllApiResources(w http.Response func (handler *K8sApplicationRestHandlerImpl) GetResourceList(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) token := r.Header.Get("token") - var request k8s.ResourceRequestBean + var request bean3.ResourceRequestBean err := decoder.Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) @@ -931,7 +932,7 @@ func (handler *K8sApplicationRestHandlerImpl) GetResourceList(w http.ResponseWri } clusterRbacFunc := handler.verifyRbacForCluster if isSuperAdmin { - clusterRbacFunc = func(token, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool { + clusterRbacFunc = func(token, clusterName string, request bean3.ResourceRequestBean, casbinAction string) bool { return true } } @@ -978,7 +979,7 @@ func (handler *K8sApplicationRestHandlerImpl) verifyRbacForResource(token string return handler.enforcer.Enforce(token, strings.ToLower(resourceName), casbinAction, objectName) } -func (handler *K8sApplicationRestHandlerImpl) verifyRbacForCluster(token string, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool { +func (handler *K8sApplicationRestHandlerImpl) verifyRbacForCluster(token string, clusterName string, request bean3.ResourceRequestBean, casbinAction string) bool { k8sRequest := request.K8sRequest return handler.verifyRbacForResource(token, clusterName, k8sRequest.ResourceIdentifier, casbinAction) } @@ -991,7 +992,7 @@ func (handler *K8sApplicationRestHandlerImpl) CreateEphemeralContainer(w http.Re return } decoder := json.NewDecoder(r.Body) - var request cluster.EphemeralContainerRequest + var request bean4.EphemeralContainerRequest err = decoder.Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) @@ -1039,7 +1040,7 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteEphemeralContainer(w http.Re return } decoder := json.NewDecoder(r.Body) - var request cluster.EphemeralContainerRequest + var request bean4.EphemeralContainerRequest err = decoder.Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) @@ -1080,7 +1081,7 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteEphemeralContainer(w http.Re } -func (handler *K8sApplicationRestHandlerImpl) handleEphemeralRBAC(podName, namespace string, w http.ResponseWriter, r *http.Request) *k8s.ResourceRequestBean { +func (handler *K8sApplicationRestHandlerImpl) handleEphemeralRBAC(podName, namespace string, w http.ResponseWriter, r *http.Request) *bean3.ResourceRequestBean { token := r.Header.Get("token") _, resourceRequestBean, err := handler.k8sApplicationService.ValidateTerminalRequestQuery(r) if err != nil { @@ -1141,7 +1142,7 @@ func (handler *K8sApplicationRestHandlerImpl) handleEphemeralRBAC(podName, names false and err !=nil --> during the validation of resources, we got an error, resulting the StatusBadRequest false and err == nil --> denotes that user is not authorized, resulting in Unauthorized */ -func (handler *K8sApplicationRestHandlerImpl) verifyRbacForAppRequests(token string, request *k8s.ResourceRequestBean, r *http.Request, actionType string) (bool, error) { +func (handler *K8sApplicationRestHandlerImpl) verifyRbacForAppRequests(token string, request *bean3.ResourceRequestBean, r *http.Request, actionType string) (bool, error) { rbacObject := "" rbacObject2 := "" envObject := "" diff --git a/api/k8s/capacity/k8sCapacityRestHandler.go b/api/k8s/capacity/k8sCapacityRestHandler.go index 99f13bf9aa..a33edd1f7f 100644 --- a/api/k8s/capacity/k8sCapacityRestHandler.go +++ b/api/k8s/capacity/k8sCapacityRestHandler.go @@ -24,7 +24,8 @@ import ( bean2 "github.com/devtron-labs/devtron/pkg/cluster/bean" "github.com/devtron-labs/devtron/pkg/cluster/environment" "github.com/devtron-labs/devtron/pkg/cluster/rbac" - "github.com/devtron-labs/devtron/pkg/k8s" + "github.com/devtron-labs/devtron/pkg/cluster/read" + bean3 "github.com/devtron-labs/devtron/pkg/k8s/bean" "net/http" "strconv" @@ -58,6 +59,7 @@ type K8sCapacityRestHandlerImpl struct { clusterService cluster.ClusterService environmentService environment.EnvironmentService clusterRbacService rbac.ClusterRbacService + clusterReadService read.ClusterReadService } func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger, @@ -65,7 +67,8 @@ func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger, enforcer casbin.Enforcer, clusterService cluster.ClusterService, environmentService environment.EnvironmentService, - clusterRbacService rbac.ClusterRbacService) *K8sCapacityRestHandlerImpl { + clusterRbacService rbac.ClusterRbacService, + clusterReadService read.ClusterReadService) *K8sCapacityRestHandlerImpl { return &K8sCapacityRestHandlerImpl{ logger: logger, k8sCapacityService: k8sCapacityService, @@ -74,6 +77,7 @@ func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger, clusterService: clusterService, environmentService: environmentService, clusterRbacService: clusterRbacService, + clusterReadService: clusterReadService, } } @@ -173,7 +177,7 @@ func (handler *K8sCapacityRestHandlerImpl) GetClusterDetail(w http.ResponseWrite } token := r.Header.Get("token") // RBAC enforcer applying - cluster, err := handler.clusterService.FindById(clusterId) + cluster, err := handler.clusterReadService.FindById(clusterId) if err != nil { handler.logger.Errorw("error in getting cluster by id", "err", err, "clusterId", clusterId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -213,7 +217,7 @@ func (handler *K8sCapacityRestHandlerImpl) GetNodeList(w http.ResponseWriter, r } // RBAC enforcer applying token := r.Header.Get("token") - cluster, err := handler.clusterService.FindById(clusterId) + cluster, err := handler.clusterReadService.FindById(clusterId) if err != nil { handler.logger.Errorw("error in getting cluster by id", "err", err, "clusterId", clusterId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -254,7 +258,7 @@ func (handler *K8sCapacityRestHandlerImpl) GetNodeDetail(w http.ResponseWriter, } // RBAC enforcer applying token := r.Header.Get("token") - cluster, err := handler.clusterService.FindById(clusterId) + cluster, err := handler.clusterReadService.FindById(clusterId) if err != nil { handler.logger.Errorw("error in getting cluster by id", "err", err, "clusterId", clusterId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -342,7 +346,7 @@ func (handler *K8sCapacityRestHandlerImpl) DeleteNode(w http.ResponseWriter, r * errCode = apiErr.HttpStatusCode switch errCode { case http.StatusNotFound: - errorMessage := k8s.ResourceNotFoundErr + errorMessage := bean3.ResourceNotFoundErr err = fmt.Errorf("%s: %w", errorMessage, err) } } diff --git a/api/restHandler/BatchOperationRestHandler.go b/api/restHandler/BatchOperationRestHandler.go index d9494766c2..ff50ba96a4 100644 --- a/api/restHandler/BatchOperationRestHandler.go +++ b/api/restHandler/BatchOperationRestHandler.go @@ -29,7 +29,6 @@ import ( "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" "github.com/devtron-labs/devtron/pkg/auth/user" "github.com/devtron-labs/devtron/pkg/team" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/rbac" "go.uber.org/zap" ) @@ -45,12 +44,10 @@ type BatchOperationRestHandlerImpl struct { teamService team.TeamService logger *zap.SugaredLogger enforcerUtil rbac.EnforcerUtil - argoUserService argo.ArgoUserService } func NewBatchOperationRestHandlerImpl(userAuthService user.UserService, enforcer casbin.Enforcer, workflowAction batch.WorkflowAction, - teamService team.TeamService, logger *zap.SugaredLogger, enforcerUtil rbac.EnforcerUtil, - argoUserService argo.ArgoUserService) *BatchOperationRestHandlerImpl { + teamService team.TeamService, logger *zap.SugaredLogger, enforcerUtil rbac.EnforcerUtil) *BatchOperationRestHandlerImpl { return &BatchOperationRestHandlerImpl{ userAuthService: userAuthService, enforcer: enforcer, @@ -58,7 +55,6 @@ func NewBatchOperationRestHandlerImpl(userAuthService user.UserService, enforcer teamService: teamService, logger: logger, enforcerUtil: enforcerUtil, - argoUserService: argoUserService, } } @@ -115,14 +111,7 @@ func (handler BatchOperationRestHandlerImpl) Operate(w http.ResponseWriter, r *h } }(ctx.Done(), cn.CloseNotify()) } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) - err = handler.workflowAction.Execute(&workflow, emptyProps, ctx) + err = handler.workflowAction.Execute(&workflow, emptyProps, r.Context()) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return diff --git a/api/restHandler/BulkUpdateRestHandler.go b/api/restHandler/BulkUpdateRestHandler.go index 12b2f1b2e9..2db6a9497e 100644 --- a/api/restHandler/BulkUpdateRestHandler.go +++ b/api/restHandler/BulkUpdateRestHandler.go @@ -17,7 +17,6 @@ package restHandler import ( - "context" "encoding/json" "fmt" "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository" @@ -40,7 +39,6 @@ import ( "github.com/devtron-labs/devtron/pkg/chart" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/team" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/rbac" "github.com/gorilla/mux" "go.uber.org/zap" @@ -82,7 +80,6 @@ type BulkUpdateRestHandlerImpl struct { cdHandelr pipeline.CdHandler appCloneService appClone.AppCloneService materialRepository repository.MaterialRepository - argoUserService argo.ArgoUserService } func NewBulkUpdateRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, logger *zap.SugaredLogger, @@ -103,7 +100,7 @@ func NewBulkUpdateRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, logg appCloneService appClone.AppCloneService, appWorkflowService appWorkflow.AppWorkflowService, materialRepository repository.MaterialRepository, - argoUserService argo.ArgoUserService) *BulkUpdateRestHandlerImpl { +) *BulkUpdateRestHandlerImpl { return &BulkUpdateRestHandlerImpl{ pipelineBuilder: pipelineBuilder, logger: logger, @@ -127,7 +124,6 @@ func NewBulkUpdateRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, logg appCloneService: appCloneService, appWorkflowService: appWorkflowService, materialRepository: materialRepository, - argoUserService: argoUserService, } } @@ -283,15 +279,8 @@ func (handler BulkUpdateRestHandlerImpl) BulkHibernate(w http.ResponseWriter, r return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) token := r.Header.Get("token") - response, err := handler.bulkUpdateService.BulkHibernate(&request, ctx, w, token, handler.checkAuthForBulkHibernateAndUnhibernate) + response, err := handler.bulkUpdateService.BulkHibernate(&request, r.Context(), w, token, handler.checkAuthForBulkHibernateAndUnhibernate) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return @@ -320,15 +309,8 @@ func (handler BulkUpdateRestHandlerImpl) BulkUnHibernate(w http.ResponseWriter, return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) token := r.Header.Get("token") - response, err := handler.bulkUpdateService.BulkUnHibernate(&request, ctx, w, token, handler.checkAuthForBulkHibernateAndUnhibernate) + response, err := handler.bulkUpdateService.BulkUnHibernate(&request, r.Context(), w, token, handler.checkAuthForBulkHibernateAndUnhibernate) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return @@ -385,15 +367,8 @@ func (handler BulkUpdateRestHandlerImpl) BulkBuildTrigger(w http.ResponseWriter, common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) token := r.Header.Get("token") - response, err := handler.bulkUpdateService.BulkBuildTrigger(&request, ctx, w, token, handler.checkAuthForBulkActions) + response, err := handler.bulkUpdateService.BulkBuildTrigger(&request, r.Context(), w, token, handler.checkAuthForBulkActions) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return @@ -479,14 +454,8 @@ func (handler BulkUpdateRestHandlerImpl) HandleCdPipelineBulkAction(w http.Respo return } } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) - resp, err := handler.bulkUpdateService.PerformBulkActionOnCdPipelines(&cdPipelineBulkActionReq, impactedPipelines, ctx, dryRun, impactedAppWfIds, impactedCiPipelineIds) + + resp, err := handler.bulkUpdateService.PerformBulkActionOnCdPipelines(&cdPipelineBulkActionReq, impactedPipelines, r.Context(), dryRun, impactedAppWfIds, impactedCiPipelineIds) if err != nil { handler.logger.Errorw("service err, HandleCdPipelineBulkAction", "err", err, "payload", cdPipelineBulkActionReq) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) diff --git a/api/restHandler/CoreAppRestHandler.go b/api/restHandler/CoreAppRestHandler.go index 8c1cb37e37..3fe96406c5 100644 --- a/api/restHandler/CoreAppRestHandler.go +++ b/api/restHandler/CoreAppRestHandler.go @@ -55,7 +55,6 @@ import ( "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/team" "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/rbac" "github.com/go-pg/pg" "github.com/gorilla/mux" @@ -99,7 +98,6 @@ type CoreAppRestHandlerImpl struct { environmentRepository repository.EnvironmentRepository configMapRepository chartConfig.ConfigMapRepository chartRepo chartRepoRepository.ChartRepository - argoUserService argo.ArgoUserService pipelineStageService pipeline.PipelineStageService ciPipelineRepository pipelineConfig.CiPipelineRepository teamReadService read3.TeamReadService @@ -111,7 +109,7 @@ func NewCoreAppRestHandlerImpl(logger *zap.SugaredLogger, userAuthService user.U propertiesConfigService pipeline.PropertiesConfigService, appWorkflowService appWorkflow.AppWorkflowService, appWorkflowRepository appWorkflow2.AppWorkflowRepository, environmentRepository repository.EnvironmentRepository, configMapRepository chartConfig.ConfigMapRepository, chartRepo chartRepoRepository.ChartRepository, teamService team.TeamService, - argoUserService argo.ArgoUserService, pipelineStageService pipeline.PipelineStageService, ciPipelineRepository pipelineConfig.CiPipelineRepository, + pipelineStageService pipeline.PipelineStageService, ciPipelineRepository pipelineConfig.CiPipelineRepository, gitProviderReadService read.GitProviderReadService, gitMaterialReadService read2.GitMaterialReadService, teamReadService read3.TeamReadService) *CoreAppRestHandlerImpl { @@ -135,7 +133,6 @@ func NewCoreAppRestHandlerImpl(logger *zap.SugaredLogger, userAuthService user.U environmentRepository: environmentRepository, configMapRepository: configMapRepository, chartRepo: chartRepo, - argoUserService: argoUserService, pipelineStageService: pipelineStageService, ciPipelineRepository: ciPipelineRepository, teamReadService: teamReadService, @@ -261,13 +258,8 @@ func (handler CoreAppRestHandlerImpl) CreateApp(w http.ResponseWriter, r *http.R return } token := r.Header.Get("token") - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + + ctx := r.Context() var createAppRequest appBean.AppDetail err = decoder.Decode(&createAppRequest) if err != nil { @@ -2249,13 +2241,8 @@ func (handler CoreAppRestHandlerImpl) CreateAppWorkflow(w http.ResponseWriter, r return } token := r.Header.Get("token") - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + + ctx := r.Context() var createAppRequest appBean.AppWorkflowCloneDto err = decoder.Decode(&createAppRequest) if err != nil { diff --git a/api/restHandler/app/appList/AppListingRestHandler.go b/api/restHandler/app/appList/AppListingRestHandler.go index c2db370bcf..f5d3926067 100644 --- a/api/restHandler/app/appList/AppListingRestHandler.go +++ b/api/restHandler/app/appList/AppListingRestHandler.go @@ -61,7 +61,6 @@ import ( "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/argo" "github.com/devtron-labs/devtron/util/rbac" "github.com/go-pg/pg" "github.com/gorilla/mux" @@ -101,7 +100,6 @@ type AppListingRestHandlerImpl struct { // TODO fix me next helmAppClient gRPC.HelmAppClient // TODO refactoring: use HelmAppService helmAppReadService read.HelmAppReadService - argoUserService argo.ArgoUserService k8sCommonService k8s.K8sCommonService installedAppService FullMode.InstalledAppDBExtendedService installedAppResourceService resource.InstalledAppResourceService @@ -137,7 +135,7 @@ func NewAppListingRestHandlerImpl(application application.ServiceClient, logger *zap.SugaredLogger, enforcerUtil rbac.EnforcerUtil, deploymentGroupService deploymentGroup.DeploymentGroupService, userService user.UserService, helmAppClient gRPC.HelmAppClient, helmAppReadService read.HelmAppReadService, - argoUserService argo.ArgoUserService, k8sCommonService k8s.K8sCommonService, + k8sCommonService k8s.K8sCommonService, installedAppService FullMode.InstalledAppDBExtendedService, installedAppResourceService resource.InstalledAppResourceService, cdApplicationStatusUpdateHandler cron.CdApplicationStatusUpdateHandler, @@ -160,7 +158,6 @@ func NewAppListingRestHandlerImpl(application application.ServiceClient, userService: userService, helmAppClient: helmAppClient, helmAppReadService: helmAppReadService, - argoUserService: argoUserService, k8sCommonService: k8sCommonService, installedAppService: installedAppService, installedAppResourceService: installedAppResourceService, @@ -565,34 +562,29 @@ func (handler AppListingRestHandlerImpl) FetchResourceTree(w http.ResponseWriter common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("error in getting acd token"), nil, http.StatusInternalServerError) - return - } envDeploymentConfig, err := handler.deploymentConfigService.GetConfigForDevtronApps(appId, envId) if err != nil { handler.logger.Errorw("error in fetching deployment config", "appId", appId, "envId", envId, "err", err) common.WriteJsonResp(w, fmt.Errorf("error in getting deployment config for env"), nil, http.StatusInternalServerError) return } - resourceTree, err := handler.fetchResourceTree(w, r, appId, envId, acdToken, cdPipeline, envDeploymentConfig) + resourceTree, err := handler.fetchResourceTree(w, r, appId, envId, cdPipeline, envDeploymentConfig) if err != nil { handler.logger.Errorw("error in fetching resource tree", "err", err, "appId", appId, "envId", envId) - handler.handleResourceTreeErrAndDeletePipelineIfNeeded(w, err, acdToken, cdPipeline, envDeploymentConfig) + handler.handleResourceTreeErrAndDeletePipelineIfNeeded(w, err, cdPipeline, envDeploymentConfig) return } common.WriteJsonResp(w, err, resourceTree, http.StatusOK) } func (handler AppListingRestHandlerImpl) handleResourceTreeErrAndDeletePipelineIfNeeded(w http.ResponseWriter, err error, - acdToken string, cdPipeline *pipelineConfig.Pipeline, deploymentConfig *bean3.DeploymentConfig) { + cdPipeline *pipelineConfig.Pipeline, deploymentConfig *bean3.DeploymentConfig) { var apiError *util.ApiError ok := errors.As(err, &apiError) if deploymentConfig.DeploymentAppType == util.PIPELINE_DEPLOYMENT_TYPE_ACD { if ok && apiError != nil { if apiError.Code == constants.AppDetailResourceTreeNotFound && cdPipeline.DeploymentAppDeleteRequest == true && cdPipeline.DeploymentAppCreated == true { - acdAppFound, appDeleteErr := handler.pipeline.MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDeleted(acdToken, cdPipeline) + acdAppFound, appDeleteErr := handler.pipeline.MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDeleted(cdPipeline) if appDeleteErr != nil { apiError.UserMessage = constants.ErrorDeletingPipelineForDeletedArgoAppMsg common.WriteJsonResp(w, apiError, nil, http.StatusInternalServerError) @@ -863,11 +855,6 @@ func (handler AppListingRestHandlerImpl) GetHostUrlsByBatch(w http.ResponseWrite resourceTree = resourceTreeAndNotesContainer.ResourceTree } else { - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - common.WriteJsonResp(w, fmt.Errorf("error in getting acd token"), nil, http.StatusInternalServerError) - return - } pipelines, err := handler.pipelineRepository.FindActiveByAppIdAndEnvironmentId(appId, envId) if err != nil && err != pg.ErrNoRows { handler.logger.Errorw("error in fetching pipelines from db", "appId", appId, "envId", envId) @@ -890,7 +877,7 @@ func (handler AppListingRestHandlerImpl) GetHostUrlsByBatch(w http.ResponseWrite common.WriteJsonResp(w, fmt.Errorf("error in getting deployment config for env"), nil, http.StatusInternalServerError) return } - resourceTree, err = handler.fetchResourceTree(w, r, appId, envId, acdToken, cdPipeline, envDeploymentConfig) + resourceTree, err = handler.fetchResourceTree(w, r, appId, envId, cdPipeline, envDeploymentConfig) } _, ok := resourceTree["nodes"] if !ok { @@ -938,7 +925,7 @@ func (handler AppListingRestHandlerImpl) getAppDetails(ctx context.Context, appI } // TODO: move this to service -func (handler AppListingRestHandlerImpl) fetchResourceTree(w http.ResponseWriter, r *http.Request, appId int, envId int, acdToken string, cdPipeline *pipelineConfig.Pipeline, deploymentConfig *bean3.DeploymentConfig) (map[string]interface{}, error) { +func (handler AppListingRestHandlerImpl) fetchResourceTree(w http.ResponseWriter, r *http.Request, appId int, envId int, cdPipeline *pipelineConfig.Pipeline, deploymentConfig *bean3.DeploymentConfig) (map[string]interface{}, error) { var resourceTree map[string]interface{} if !cdPipeline.DeploymentAppCreated { handler.logger.Infow("deployment for this pipeline does not exist", "pipelineId", cdPipeline.Id) @@ -961,7 +948,6 @@ func (handler AppListingRestHandlerImpl) fetchResourceTree(w http.ResponseWriter }(ctx.Done(), cn.CloseNotify()) } defer cancel() - ctx = context.WithValue(ctx, "token", acdToken) start := time.Now() resp, err := handler.argoApplicationService.ResourceTree(ctx, query) elapsed := time.Since(start) diff --git a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go index b87d320df1..6b12a03169 100644 --- a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go +++ b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go @@ -173,14 +173,8 @@ func (handler *PipelineConfigRestHandlerImpl) ConfigureDeploymentTemplateForApp( } }(ctx.Done(), cn.CloseNotify()) } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) - createResp, err := handler.chartService.Create(templateRequest, ctx) + + createResp, err := handler.chartService.Create(templateRequest, r.Context()) if err != nil { handler.Logger.Errorw("service err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -260,14 +254,8 @@ func (handler *PipelineConfigRestHandlerImpl) CreateCdPipeline(w http.ResponseWr } } //RBAC - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) - createResp, err := handler.pipelineBuilder.CreateCdPipelines(&cdPipeline, ctx) + + createResp, err := handler.pipelineBuilder.CreateCdPipelines(&cdPipeline, r.Context()) if err != nil { handler.Logger.Errorw("service err, CreateCdPipeline", "err", err, "payload", cdPipeline) @@ -353,13 +341,7 @@ func (handler *PipelineConfigRestHandlerImpl) PatchCdPipeline(w http.ResponseWri common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + ctx := r.Context() createResp, err := handler.pipelineBuilder.PatchCdPipelines(&cdPipeline, ctx) if err != nil { handler.Logger.Errorw("service err, PatchCdPipeline", "err", err, "payload", cdPipeline) @@ -415,13 +397,8 @@ func (handler *PipelineConfigRestHandlerImpl) HandleChangeDeploymentRequest(w ht } // Retrieve argocd token - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + + ctx := r.Context() resp, err := handler.pipelineBuilder.ChangeDeploymentType(ctx, deploymentAppTypeChangeRequest) @@ -473,14 +450,7 @@ func (handler *PipelineConfigRestHandlerImpl) HandleChangeDeploymentTypeRequest( return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) - + ctx := r.Context() resp, err := handler.pipelineBuilder.ChangePipelineDeploymentType(ctx, deploymentTypeChangeRequest) if err != nil { @@ -529,16 +499,7 @@ func (handler *PipelineConfigRestHandlerImpl) HandleTriggerDeploymentAfterTypeCh return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - ctx := context.WithValue(r.Context(), "token", acdToken) - + ctx := r.Context() resp, err := handler.pipelineBuilder.TriggerDeploymentAfterTypeChange(ctx, deploymentAppTriggerRequest) if err != nil { @@ -661,13 +622,6 @@ func (handler *PipelineConfigRestHandlerImpl) ChangeChartRef(w http.ResponseWrit } }(ctx.Done(), cn.CloseNotify()) } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, "error in getting acd token", http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) appMetrics := false if envConfigProperties.AppMetrics != nil { appMetrics = envMetrics @@ -770,13 +724,6 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.Res } }(ctx.Done(), cn.CloseNotify()) } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) appMetrics := false if envConfigProperties.AppMetrics != nil { appMetrics = *envConfigProperties.AppMetrics @@ -2311,13 +2258,6 @@ func (handler *PipelineConfigRestHandlerImpl) UpgradeForAllApps(w http.ResponseW } }(ctx.Done(), cn.CloseNotify()) } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) var appIds []int if chartUpgradeRequest.All || len(chartUpgradeRequest.AppIds) == 0 { @@ -2534,13 +2474,7 @@ func (handler *PipelineConfigRestHandlerImpl) SaveGitOpsConfiguration(w http.Res return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + ctx := r.Context() _, span := otel.Tracer("orchestrator").Start(ctx, "chartService.SaveAppLevelGitOpsConfiguration") err = handler.devtronAppGitOpConfigService.SaveAppLevelGitOpsConfiguration(&appGitOpsConfigRequest, app.AppName, ctx) diff --git a/api/restHandler/app/pipeline/configure/PipelineConfigRestHandler.go b/api/restHandler/app/pipeline/configure/PipelineConfigRestHandler.go index e602531835..5d3bc11ebd 100644 --- a/api/restHandler/app/pipeline/configure/PipelineConfigRestHandler.go +++ b/api/restHandler/app/pipeline/configure/PipelineConfigRestHandler.go @@ -47,7 +47,6 @@ import ( "github.com/devtron-labs/devtron/pkg/chart" "github.com/devtron-labs/devtron/pkg/generateManifest" resourceGroup2 "github.com/devtron-labs/devtron/pkg/resourceGroup" - "github.com/devtron-labs/devtron/util/argo" "github.com/go-pg/pg" "go.opentelemetry.io/otel" @@ -126,7 +125,6 @@ type PipelineConfigRestHandlerImpl struct { policyService security2.PolicyService imageScanResultReadService read.ImageScanResultReadService gitProviderReadService gitProviderRead.GitProviderReadService - argoUserService argo.ArgoUserService imageTaggingReadService imageTaggingRead.ImageTaggingReadService imageTaggingService imageTagging.ImageTaggingService deploymentTemplateService generateManifest.DeploymentTemplateService @@ -159,7 +157,7 @@ func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger appWorkflowService appWorkflow.AppWorkflowService, gitMaterialReadService read2.GitMaterialReadService, policyService security2.PolicyService, imageScanResultReadService read.ImageScanResultReadService, - argoUserService argo.ArgoUserService, ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository, + ciPipelineMaterialRepository pipelineConfig.CiPipelineMaterialRepository, imageTaggingReadService imageTaggingRead.ImageTaggingReadService, imageTaggingService imageTagging.ImageTaggingService, ciArtifactRepository repository.CiArtifactRepository, @@ -196,7 +194,6 @@ func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger gitMaterialReadService: gitMaterialReadService, policyService: policyService, imageScanResultReadService: imageScanResultReadService, - argoUserService: argoUserService, ciPipelineMaterialRepository: ciPipelineMaterialRepository, imageTaggingReadService: imageTaggingReadService, imageTaggingService: imageTaggingService, @@ -311,13 +308,7 @@ func (handler *PipelineConfigRestHandlerImpl) DeleteACDAppWithNonCascade(w http. return } // rbac enforcer ends - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + pipelines, err := handler.pipelineRepository.FindActiveByAppIdAndEnvironmentId(appId, envId) if err != nil && err != pg.ErrNoRows { handler.Logger.Errorw("error in fetching pipelines from db", "appId", appId, "envId", envId) @@ -331,7 +322,7 @@ func (handler *PipelineConfigRestHandlerImpl) DeleteACDAppWithNonCascade(w http. return } cdPipeline := pipelines[0] - err = handler.pipelineBuilder.DeleteACDAppCdPipelineWithNonCascade(cdPipeline, ctx, forceDelete, userId) + err = handler.pipelineBuilder.DeleteACDAppCdPipelineWithNonCascade(cdPipeline, r.Context(), forceDelete, userId) if err != nil { handler.Logger.Errorw("service err, NonCascadeDeleteCdPipeline", "err", err, "payload", cdPipeline) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) @@ -398,14 +389,6 @@ func (handler *PipelineConfigRestHandlerImpl) CreateApp(w http.ResponseWriter, r } }(ctx.Done(), cn.CloseNotify()) } - var acdToken string - acdToken, err = handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.Logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx = context.WithValue(r.Context(), "token", acdToken) createResp, err = handler.appCloneService.CloneApp(&createRequest, ctx) } if err != nil { diff --git a/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go b/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go index d8705860f1..08b43625b1 100644 --- a/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go +++ b/api/restHandler/app/pipeline/trigger/PipelineTriggerRestHandler.go @@ -17,7 +17,6 @@ package trigger import ( - "context" "encoding/json" "fmt" util2 "github.com/devtron-labs/devtron/internal/util" @@ -42,7 +41,6 @@ import ( "github.com/devtron-labs/devtron/pkg/deploymentGroup" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/team" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/rbac" "go.uber.org/zap" "gopkg.in/go-playground/validator.v9" @@ -66,7 +64,6 @@ type PipelineTriggerRestHandlerImpl struct { logger *zap.SugaredLogger enforcerUtil rbac.EnforcerUtil deploymentGroupService deploymentGroup.DeploymentGroupService - argoUserService argo.ArgoUserService deploymentConfigService pipeline.PipelineDeploymentConfigService deployedAppService deployedApp.DeployedAppService cdTriggerService devtronApps.TriggerService @@ -76,7 +73,7 @@ type PipelineTriggerRestHandlerImpl struct { func NewPipelineRestHandler(appService app.AppService, userAuthService user.UserService, validator *validator.Validate, enforcer casbin.Enforcer, teamService team.TeamService, logger *zap.SugaredLogger, enforcerUtil rbac.EnforcerUtil, deploymentGroupService deploymentGroup.DeploymentGroupService, - argoUserService argo.ArgoUserService, deploymentConfigService pipeline.PipelineDeploymentConfigService, + deploymentConfigService pipeline.PipelineDeploymentConfigService, deployedAppService deployedApp.DeployedAppService, cdTriggerService devtronApps.TriggerService, workflowEventPublishService out.WorkflowEventPublishService) *PipelineTriggerRestHandlerImpl { @@ -89,7 +86,6 @@ func NewPipelineRestHandler(appService app.AppService, userAuthService user.User logger: logger, enforcerUtil: enforcerUtil, deploymentGroupService: deploymentGroupService, - argoUserService: argoUserService, deploymentConfigService: deploymentConfigService, deployedAppService: deployedAppService, cdTriggerService: cdTriggerService, @@ -139,13 +135,7 @@ func (handler PipelineTriggerRestHandlerImpl) OverrideConfig(w http.ResponseWrit common.WriteJsonResp(w, rbacErr, nil, http.StatusForbidden) return } - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + ctx := r.Context() _, span := otel.Tracer("orchestrator").Start(ctx, "workflowDagExecutor.ManualCdTrigger") triggerContext := bean3.TriggerContext{ Context: ctx, @@ -238,13 +228,7 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopApp(w http.ResponseWriter return } //rback block ends here - acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - handler.logger.Errorw("error in getting acd token", "err", err) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - ctx := context.WithValue(r.Context(), "token", acdToken) + ctx := r.Context() mergeResp, err := handler.deployedAppService.StopStartApp(ctx, &overrideRequest) if err != nil { handler.logger.Errorw("service err, StartStopApp", "err", err, "payload", overrideRequest) diff --git a/client/argocdServer/application/Application.go b/client/argocdServer/application/Application.go index 858fd87517..ffc2908b17 100644 --- a/client/argocdServer/application/Application.go +++ b/client/argocdServer/application/Application.go @@ -18,7 +18,6 @@ package application import ( "context" - "errors" "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" argoApplication "github.com/devtron-labs/devtron/client/argocdServer/bean" @@ -70,11 +69,7 @@ func NewApplicationClientImpl( } func (c *ServiceClientImpl) GetArgoClient(ctxt context.Context) (application.ApplicationServiceClient, *grpc.ClientConn, error) { - token, ok := ctxt.Value("token").(string) - if !ok { - return nil, nil, errors.New("unauthorized") - } - conn := c.argoCDConnectionManager.GetConnection(token) + conn := c.argoCDConnectionManager.GetConnection() asc := application.NewApplicationServiceClient(conn) return asc, conn, nil } @@ -98,27 +93,26 @@ func (c *ServiceClientImpl) ResourceTree(ctxt context.Context, query *applicatio func (c ServiceClientImpl) Patch(ctxt context.Context, query *application.ApplicationPatchRequest) (*v1alpha1.Application, error) { ctx, cancel := context.WithTimeout(ctxt, argoApplication.TimeoutLazy) defer cancel() - token, ok := ctxt.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") + asc, conn, err := c.GetArgoClient(ctxt) + if err != nil { + c.logger.Errorw("error getting ArgoCD client", "error", err) + return nil, err } - conn := c.argoCDConnectionManager.GetConnection(token) defer util.Close(conn, c.logger) - asc := application.NewApplicationServiceClient(conn) resp, err := asc.Patch(ctx, query) return resp, err } func (c ServiceClientImpl) Get(ctx context.Context, query *application.ApplicationQuery) (*v1alpha1.Application, error) { - token, ok := ctx.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") - } + newCtx, cancel := context.WithTimeout(ctx, argoApplication.TimeoutFast) defer cancel() - conn := c.argoCDConnectionManager.GetConnection(token) + asc, conn, err := c.GetArgoClient(ctx) + if err != nil { + c.logger.Errorw("error getting ArgoCD client", "error", err) + return nil, err + } defer util.Close(conn, c.logger) - asc := application.NewApplicationServiceClient(conn) resp, err := asc.Get(newCtx, query) return resp, err } @@ -126,13 +120,12 @@ func (c ServiceClientImpl) Get(ctx context.Context, query *application.Applicati func (c ServiceClientImpl) Update(ctxt context.Context, query *application.ApplicationUpdateRequest) (*v1alpha1.Application, error) { ctx, cancel := context.WithTimeout(ctxt, argoApplication.TimeoutFast) defer cancel() - token, ok := ctxt.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") + asc, conn, err := c.GetArgoClient(ctx) + if err != nil { + c.logger.Errorw("error getting ArgoCD client", "error", err) + return nil, err } - conn := c.argoCDConnectionManager.GetConnection(token) defer util.Close(conn, c.logger) - asc := application.NewApplicationServiceClient(conn) resp, err := asc.Update(ctx, query) return resp, err } @@ -140,13 +133,12 @@ func (c ServiceClientImpl) Update(ctxt context.Context, query *application.Appli func (c ServiceClientImpl) Sync(ctxt context.Context, query *application.ApplicationSyncRequest) (*v1alpha1.Application, error) { ctx, cancel := context.WithTimeout(ctxt, argoApplication.TimeoutFast) defer cancel() - token, ok := ctxt.Value("token").(string) - if !ok { - return nil, argoApplication.NewErrUnauthorized("Unauthorized") + asc, conn, err := c.GetArgoClient(ctx) + if err != nil { + c.logger.Errorw("error getting ArgoCD client", "error", err) + return nil, err } - conn := c.argoCDConnectionManager.GetConnection(token) defer util.Close(conn, c.logger) - asc := application.NewApplicationServiceClient(conn) resp, err := asc.Sync(ctx, query) return resp, err } @@ -154,38 +146,35 @@ func (c ServiceClientImpl) Sync(ctxt context.Context, query *application.Applica func (c ServiceClientImpl) GetResource(ctxt context.Context, query *application.ApplicationResourceRequest) (*application.ApplicationResourceResponse, error) { ctx, cancel := context.WithTimeout(ctxt, argoApplication.TimeoutFast) defer cancel() - token, ok := ctxt.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") + asc, conn, err := c.GetArgoClient(ctx) + if err != nil { + c.logger.Errorw("error getting ArgoCD client", "error", err) + return nil, err } - conn := c.argoCDConnectionManager.GetConnection(token) defer util.Close(conn, c.logger) - asc := application.NewApplicationServiceClient(conn) return asc.GetResource(ctx, query) } func (c ServiceClientImpl) Delete(ctxt context.Context, query *application.ApplicationDeleteRequest) (*application.ApplicationResponse, error) { ctx, cancel := context.WithTimeout(ctxt, argoApplication.TimeoutSlow) defer cancel() - token, ok := ctxt.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") + asc, conn, err := c.GetArgoClient(ctx) + if err != nil { + c.logger.Errorw("error getting ArgoCD client", "error", err) + return nil, err } - conn := c.argoCDConnectionManager.GetConnection(token) defer util.Close(conn, c.logger) - asc := application.NewApplicationServiceClient(conn) return asc.Delete(ctx, query) } func (c ServiceClientImpl) TerminateOperation(ctxt context.Context, query *application.OperationTerminateRequest) (*application.OperationTerminateResponse, error) { ctx, cancel := context.WithTimeout(ctxt, argoApplication.TimeoutFast) defer cancel() - token, ok := ctxt.Value("token").(string) - if !ok { - return nil, argoApplication.NewErrUnauthorized("Unauthorized") + asc, conn, err := c.GetArgoClient(ctx) + if err != nil { + c.logger.Errorw("error getting ArgoCD client", "error", err) + return nil, err } - conn := c.argoCDConnectionManager.GetConnection(token) defer util.Close(conn, c.logger) - asc := application.NewApplicationServiceClient(conn) resp, err := asc.TerminateOperation(ctx, query) return resp, err } diff --git a/client/argocdServer/bean/bean.go b/client/argocdServer/bean/bean.go index 78b07d8aad..1493b5e56a 100644 --- a/client/argocdServer/bean/bean.go +++ b/client/argocdServer/bean/bean.go @@ -99,3 +99,11 @@ func NewErrUnauthorized(message string) *ErrUnauthorized { func (e *ErrUnauthorized) Error() string { return e.message } + +type AcdAuthConfig struct { + ClusterId int + DevtronSecretName string + DevtronDexSecretNamespace string + UserName string + Password string +} diff --git a/client/argocdServer/certificate/Certificate.go b/client/argocdServer/certificate/Certificate.go index 5d553bd7f9..de8f5d8381 100644 --- a/client/argocdServer/certificate/Certificate.go +++ b/client/argocdServer/certificate/Certificate.go @@ -2,11 +2,9 @@ package certificate import ( "context" - "errors" "github.com/argoproj/argo-cd/v2/pkg/apiclient/certificate" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" "github.com/devtron-labs/devtron/client/argocdServer/connection" - "github.com/devtron-labs/devtron/util/argo" "go.uber.org/zap" "google.golang.org/grpc" "time" @@ -21,26 +19,20 @@ type Client interface { type ServiceClientImpl struct { logger *zap.SugaredLogger argoCDConnectionManager connection.ArgoCDConnectionManager - argoUserService argo.ArgoUserService } func NewServiceClientImpl( logger *zap.SugaredLogger, - argoCDConnectionManager connection.ArgoCDConnectionManager, - argoUserService argo.ArgoUserService) *ServiceClientImpl { + argoCDConnectionManager connection.ArgoCDConnectionManager) *ServiceClientImpl { return &ServiceClientImpl{ logger: logger, argoCDConnectionManager: argoCDConnectionManager, - argoUserService: argoUserService, } } func (c *ServiceClientImpl) getService(ctx context.Context) (certificate.CertificateServiceClient, error) { - token, ok := ctx.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") - } - conn := c.argoCDConnectionManager.GetConnection(token) + + conn := c.argoCDConnectionManager.GetConnection() //defer conn.Close() return certificate.NewCertificateServiceClient(conn), nil } diff --git a/client/argocdServer/cluster/Cluster.go b/client/argocdServer/cluster/Cluster.go index 4cc36a79b9..0d64dd183b 100644 --- a/client/argocdServer/cluster/Cluster.go +++ b/client/argocdServer/cluster/Cluster.go @@ -18,7 +18,6 @@ package cluster import ( "context" - "errors" "github.com/argoproj/argo-cd/v2/pkg/apiclient/cluster" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" "github.com/devtron-labs/devtron/client/argocdServer/connection" @@ -54,11 +53,7 @@ func NewServiceClientImpl(logger *zap.SugaredLogger, argoCdConnection connection } func (c ServiceClientImpl) getService(ctx context.Context) (cluster.ClusterServiceClient, error) { - token, ok := ctx.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") - } - conn := c.argoCdConnection.GetConnection(token) + conn := c.argoCdConnection.GetConnection() //defer conn.Close() return cluster.NewClusterServiceClient(conn), nil } diff --git a/client/argocdServer/connection/Connection.go b/client/argocdServer/connection/Connection.go index b2a70f50dc..d7ba0ebfb1 100644 --- a/client/argocdServer/connection/Connection.go +++ b/client/argocdServer/connection/Connection.go @@ -19,38 +19,88 @@ package connection import ( "context" "fmt" + "github.com/argoproj/argo-cd/v2/pkg/apiclient/account" "github.com/argoproj/argo-cd/v2/util/settings" + "github.com/devtron-labs/common-lib/utils/k8s" + "github.com/devtron-labs/devtron/client/argocdServer/bean" + "github.com/devtron-labs/devtron/client/argocdServer/session" + "github.com/devtron-labs/devtron/client/argocdServer/version" + bean2 "github.com/devtron-labs/devtron/pkg/cluster/bean" + "github.com/devtron-labs/devtron/pkg/deployment/gitOps/config" + k8s2 "github.com/devtron-labs/devtron/pkg/k8s" moduleRepo "github.com/devtron-labs/devtron/pkg/module/repo" + util2 "github.com/devtron-labs/devtron/util" "github.com/go-pg/pg" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "go.uber.org/zap" + "golang.org/x/crypto/bcrypt" "google.golang.org/grpc" + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" + "math/rand" + "strconv" + "strings" ) func init() { grpc_prometheus.EnableClientHandlingTimeHistogram() } +const ( + DEVTRON_USER = "devtron" + DEVTRONCD_NAMESPACE = "devtroncd" + ARGOCD_CM = "argocd-cm" + ARGOCD_SECRET = "argocd-secret" + ARGO_USER_APIKEY_CAPABILITY = "apiKey" + ARGO_USER_LOGIN_CAPABILITY = "login" + DEVTRON_ARGOCD_USERNAME_KEY = "DEVTRON_ACD_USER_NAME" + DEVTRON_ARGOCD_USER_PASSWORD_KEY = "DEVTRON_ACD_USER_PASSWORD" + DEVTRON_ARGOCD_TOKEN_KEY = "DEVTRON_ACD_TOKEN" +) + type ArgoCDConnectionManager interface { - GetConnection(token string) *grpc.ClientConn + GetConnection() *grpc.ClientConn + GetOrUpdateArgoCdUserDetail() string } type ArgoCDConnectionManagerImpl struct { - logger *zap.SugaredLogger - settingsManager *settings.SettingsManager - moduleRepository moduleRepo.ModuleRepository - argoCDSettings *settings.ArgoCDSettings + logger *zap.SugaredLogger + settingsManager *settings.SettingsManager + moduleRepository moduleRepo.ModuleRepository + argoCDSettings *settings.ArgoCDSettings + devtronSecretConfig *util2.DevtronSecretConfig + k8sUtil *k8s.K8sServiceImpl + k8sCommonService k8s2.K8sCommonService + versionService version.VersionService + gitOpsConfigReadService config.GitOpsConfigReadService + runTimeConfig *k8s.RuntimeConfig } func NewArgoCDConnectionManagerImpl(Logger *zap.SugaredLogger, settingsManager *settings.SettingsManager, - moduleRepository moduleRepo.ModuleRepository) (*ArgoCDConnectionManagerImpl, error) { + moduleRepository moduleRepo.ModuleRepository, + environmentVariables *util2.EnvironmentVariables, + k8sUtil *k8s.K8sServiceImpl, + k8sCommonService k8s2.K8sCommonService, + versionService version.VersionService, + gitOpsConfigReadService config.GitOpsConfigReadService, + runTimeConfig *k8s.RuntimeConfig) (*ArgoCDConnectionManagerImpl, error) { argoUserServiceImpl := &ArgoCDConnectionManagerImpl{ - logger: Logger, - settingsManager: settingsManager, - moduleRepository: moduleRepository, - argoCDSettings: nil, + logger: Logger, + settingsManager: settingsManager, + moduleRepository: moduleRepository, + argoCDSettings: nil, + devtronSecretConfig: environmentVariables.DevtronSecretConfig, + k8sUtil: k8sUtil, + k8sCommonService: k8sCommonService, + versionService: versionService, + gitOpsConfigReadService: gitOpsConfigReadService, + runTimeConfig: runTimeConfig, + } + if !runTimeConfig.LocalDevMode { + go argoUserServiceImpl.ValidateGitOpsAndGetOrUpdateArgoCdUserDetail() } return argoUserServiceImpl, nil } @@ -60,8 +110,31 @@ const ( ModuleStatusInstalled string = "installed" ) +func (impl *ArgoCDConnectionManagerImpl) ValidateGitOpsAndGetOrUpdateArgoCdUserDetail() string { + gitOpsConfigurationStatus, err := impl.gitOpsConfigReadService.IsGitOpsConfigured() + if err != nil || !gitOpsConfigurationStatus.IsGitOpsConfigured { + return "" + } + return impl.GetOrUpdateArgoCdUserDetail() +} + // GetConnection - this function will call only for acd connection -func (impl *ArgoCDConnectionManagerImpl) GetConnection(token string) *grpc.ClientConn { +func (impl *ArgoCDConnectionManagerImpl) GetConnection() *grpc.ClientConn { + //TODO: acdAuthConfig should be passed as arg in function + acdAuthConfig := &bean.AcdAuthConfig{ + ClusterId: bean2.DefaultClusterId, + DevtronSecretName: impl.devtronSecretConfig.DevtronSecretName, + DevtronDexSecretNamespace: impl.devtronSecretConfig.DevtronDexSecretNamespace, + } + token, err := impl.GetLatestDevtronArgoCdUserToken(acdAuthConfig) + if err != nil { + impl.logger.Errorw("error in getting latest devtron argocd user token", "err", err) + } + return impl.getConnectionWithToken(token) +} + +func (impl *ArgoCDConnectionManagerImpl) getConnectionWithToken(token string) *grpc.ClientConn { + //TODO: config should be passed to this function as argument conf, err := GetConfig() if err != nil { impl.logger.Errorw("error on get acd config while creating connection", "err", err) @@ -81,6 +154,328 @@ func (impl *ArgoCDConnectionManagerImpl) GetConnection(token string) *grpc.Clien return conn } +func (impl *ArgoCDConnectionManagerImpl) GetLatestDevtronArgoCdUserToken(authConfig *bean.AcdAuthConfig) (string, error) { + gitOpsConfigurationStatus, err := impl.gitOpsConfigReadService.IsGitOpsConfigured() + if err != nil { + impl.logger.Errorw("error while checking if gitOps is configured", "err", err) + return "", err + } + if !gitOpsConfigurationStatus.IsGitOpsConfigured { + //here acd token only required in context for argo cd calls + return "", nil + } + var k8sClient *v1.CoreV1Client + if authConfig.ClusterId == bean2.DefaultClusterId { + k8sClient, err = impl.k8sUtil.GetCoreV1ClientInCluster() + if err != nil { + impl.logger.Errorw("error in getting k8s client for default cluster", "err", err) + return "", err + } + } else { + _, k8sClient, err = impl.k8sCommonService.GetCoreClientByClusterId(authConfig.ClusterId) + if err != nil { + impl.logger.Errorw("error in getting k8s client for default cluster", "err", err) + } + } + devtronSecret, err := getSecret(impl.devtronSecretConfig.DevtronDexSecretNamespace, impl.devtronSecretConfig.DevtronSecretName, k8sClient) + if err != nil { + impl.logger.Errorw("error in getting devtron secret", "err", err) + return "", err + } + secretData := devtronSecret.Data + username := secretData[DEVTRON_ARGOCD_USERNAME_KEY] + password := secretData[DEVTRON_ARGOCD_USER_PASSWORD_KEY] + latestTokenNo := 1 + var token string + for key, value := range secretData { + if strings.HasPrefix(key, DEVTRON_ARGOCD_TOKEN_KEY) { + keySplits := strings.Split(key, "_") + keyLen := len(keySplits) + tokenNo, err := strconv.Atoi(keySplits[keyLen-1]) + if err != nil { + impl.logger.Errorw("error in converting token no string to integer", "err", err, "tokenNoString", keySplits[keyLen-1]) + return "", err + } + if tokenNo > latestTokenNo { + latestTokenNo = tokenNo + token = string(value) + } + } + } + + if len(token) == 0 { + newTokenNo := latestTokenNo + 1 + token, err = impl.createNewArgoCdTokenForDevtron(string(username), string(password), newTokenNo, k8sClient) + if err != nil { + impl.logger.Errorw("error in creating new argo cd token for devtron", "err", err) + return "", err + } + } + return token, nil +} + +func (impl *ArgoCDConnectionManagerImpl) GetOrUpdateArgoCdUserDetail() string { + + //TODO: authConfig should be passed as argument to this function + authConfig := &bean.AcdAuthConfig{ + ClusterId: bean2.DefaultClusterId, + DevtronSecretName: impl.devtronSecretConfig.DevtronSecretName, + DevtronDexSecretNamespace: impl.devtronSecretConfig.DevtronDexSecretNamespace, + } + + token := "" + var ( + k8sClient *v1.CoreV1Client + err error + ) + + if authConfig.ClusterId == bean2.DefaultClusterId { + k8sClient, err = impl.k8sUtil.GetCoreV1ClientInCluster() + if err != nil { + impl.logger.Errorw("error in getting k8s client for default cluster", "err", err) + return "" + } + } else { + _, k8sClient, err = impl.k8sCommonService.GetCoreClientByClusterId(authConfig.ClusterId) + if err != nil { + impl.logger.Errorw("error in getting k8s client for default cluster", "err", err) + return "" + } + } + devtronSecret, err := getSecret(authConfig.DevtronDexSecretNamespace, authConfig.DevtronSecretName, k8sClient) + if err != nil { + impl.logger.Errorw("error in getting devtron secret", "err", err) + } + secretData := devtronSecret.Data + username, usernameOk := secretData[DEVTRON_ARGOCD_USERNAME_KEY] + password, passwordOk := secretData[DEVTRON_ARGOCD_USER_PASSWORD_KEY] + userNameStr := string(username) + PasswordStr := string(password) + if !usernameOk || !passwordOk { + username, password, err := impl.createNewArgoCdUserForDevtron(k8sClient) + if err != nil { + impl.logger.Errorw("error in creating new argo cd user for devtron", "err", err) + } + userNameStr = username + PasswordStr = password + } + isTokenAvailable := false + for key, val := range secretData { + if strings.HasPrefix(key, DEVTRON_ARGOCD_TOKEN_KEY) { + isTokenAvailable = true + token = string(val) + } + } + if !isTokenAvailable { + token, err = impl.createNewArgoCdTokenForDevtron(userNameStr, PasswordStr, 1, k8sClient) + if err != nil { + impl.logger.Errorw("error in creating new argo cd token for devtron", "err", err) + } + } + return token +} + +func (impl *ArgoCDConnectionManagerImpl) createNewArgoCdUserForDevtron(k8sClient *v1.CoreV1Client) (string, string, error) { + username := DEVTRON_USER + password := getNewPassword() + userCapabilities := []string{ARGO_USER_APIKEY_CAPABILITY, ARGO_USER_LOGIN_CAPABILITY} + //create new user at argo cd side + err := impl.createNewArgoCdUser(username, password, userCapabilities, k8sClient) + if err != nil { + impl.logger.Errorw("error in creating new argocd user", "err", err) + return "", "", err + } + //updating username and password in devtron-secret + userCredentialMap := make(map[string]string) + userCredentialMap[DEVTRON_ARGOCD_USERNAME_KEY] = username + userCredentialMap[DEVTRON_ARGOCD_USER_PASSWORD_KEY] = password + //updating username and password at devtron side + err = impl.updateArgoCdUserInfoInDevtronSecret(userCredentialMap, k8sClient) + if err != nil { + impl.logger.Errorw("error in updating devtron-secret with argo-cd credentials", "err", err) + return "", "", err + } + return username, password, nil +} + +func (impl *ArgoCDConnectionManagerImpl) createNewArgoCdTokenForDevtron(username, password string, tokenNo int, k8sClient *v1.CoreV1Client) (string, error) { + //create new user at argo cd side + token, err := impl.createTokenForArgoCdUser(username, password) + if err != nil { + impl.logger.Errorw("error in creating new argocd user", "err", err) + return "", err + } + //updating username and password in devtron-secret + tokenMap := make(map[string]string) + updatedTokenKey := fmt.Sprintf("%s_%d", DEVTRON_ARGOCD_TOKEN_KEY, tokenNo) + tokenMap[updatedTokenKey] = token + //updating username and password at devtron side + err = impl.updateArgoCdUserInfoInDevtronSecret(tokenMap, k8sClient) + if err != nil { + impl.logger.Errorw("error in updating devtron-secret with argo-cd token", "err", err) + return "", err + } + return token, nil +} + +func (impl *ArgoCDConnectionManagerImpl) updateArgoCdUserInfoInDevtronSecret(userinfo map[string]string, k8sClient *v1.CoreV1Client) error { + devtronSecret, err := getSecret(impl.devtronSecretConfig.DevtronDexSecretNamespace, impl.devtronSecretConfig.DevtronSecretName, k8sClient) + if err != nil { + impl.logger.Errorw("error in getting devtron secret", "err", err) + return err + } + secretData := devtronSecret.Data + if secretData == nil { + secretData = make(map[string][]byte) + } + for key, value := range userinfo { + secretData[key] = []byte(value) + } + devtronSecret.Data = secretData + _, err = updateSecret(impl.devtronSecretConfig.DevtronDexSecretNamespace, devtronSecret, k8sClient) + if err != nil { + impl.logger.Errorw("error in updating devtron secret", "err", err) + return err + } + return nil +} + +func (impl *ArgoCDConnectionManagerImpl) createNewArgoCdUser(username, password string, capabilities []string, k8sClient *v1.CoreV1Client) error { + //getting bcrypt hash of this password + passwordHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + impl.logger.Errorw("error in getting bcrypt hash for password", "err", err) + return err + } + //adding account name in configmap + acdConfigmap, err := getConfigMap(DEVTRONCD_NAMESPACE, ARGOCD_CM, k8sClient) + if err != nil { + impl.logger.Errorw("error in getting argo cd configmap", "err", err) + return err + } + cmData := acdConfigmap.Data + if cmData == nil { + cmData = make(map[string]string) + } + //updating data + capabilitiesString := "" + for i, capability := range capabilities { + if i == 0 { + capabilitiesString += capability + } else { + capabilitiesString += fmt.Sprintf(", %s", capability) + } + } + newUserCmKey := fmt.Sprintf("accounts.%s", username) + newUserCmValue := capabilitiesString + cmData[newUserCmKey] = newUserCmValue + acdConfigmap.Data = cmData + _, err = updateConfigMap(DEVTRONCD_NAMESPACE, acdConfigmap, k8sClient) + if err != nil { + impl.logger.Errorw("error in updating argo cd configmap", "err", err) + return err + } + acdSecret, err := getSecret(DEVTRONCD_NAMESPACE, ARGOCD_SECRET, k8sClient) + if err != nil { + impl.logger.Errorw("error in getting argo cd secret", "err", err) + return err + } + secretData := acdSecret.Data + if secretData == nil { + secretData = make(map[string][]byte) + } + newUserSecretKey := fmt.Sprintf("accounts.%s.password", username) + newUserSecretValue := passwordHash + secretData[newUserSecretKey] = newUserSecretValue + acdSecret.Data = secretData + _, err = updateSecret(DEVTRONCD_NAMESPACE, acdSecret, k8sClient) + if err != nil { + impl.logger.Errorw("error in updating argo cd secret", "err", err) + return err + } + return nil +} + +func (impl *ArgoCDConnectionManagerImpl) createTokenForArgoCdUser(username, password string) (string, error) { + token, err := impl.passwordLogin(username, password) + if err != nil { + impl.logger.Errorw("error in getting jwt token with username & password", "err", err) + return "", err + } + ctx := context.Background() + ctx = context.WithValue(ctx, "token", token) + clientConn := impl.getConnectionWithToken(token) + accountServiceClient := account.NewAccountServiceClient(clientConn) + acdToken, err := accountServiceClient.CreateToken(ctx, &account.CreateTokenRequest{ + Name: username, + }) + if err != nil { + impl.logger.Errorw("error in creating acdToken in ArgoCd", "err", err) + return "", err + } + + // just checking and logging the ArgoCd version + err = impl.versionService.CheckVersion(clientConn) + if err != nil { + impl.logger.Errorw("error found while checking ArgoCd Version", "err", err) + return "", err + } + return acdToken.Token, nil +} + +func (impl *ArgoCDConnectionManagerImpl) passwordLogin(username, password string) (string, error) { + conn := impl.getConnectionWithToken("") + serviceClient := session.NewSessionServiceClient(conn) + jwtToken, err := serviceClient.Create(context.Background(), username, password) + return jwtToken, err +} + +func getNewPassword() string { + var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + + s := make([]rune, 16) + for i := range s { + s[i] = letters[rand.Intn(len(letters))] + } + return string(s) +} + +func getSecret(namespace string, name string, client *v1.CoreV1Client) (*apiv1.Secret, error) { + secret, err := client.Secrets(namespace).Get(context.Background(), name, metav1.GetOptions{}) + if err != nil { + return nil, err + } else { + return secret, nil + } +} + +func updateSecret(namespace string, secret *apiv1.Secret, client *v1.CoreV1Client) (*apiv1.Secret, error) { + secret, err := client.Secrets(namespace).Update(context.Background(), secret, metav1.UpdateOptions{}) + if err != nil { + return nil, err + } else { + return secret, nil + } +} + +func getConfigMap(namespace string, name string, client *v1.CoreV1Client) (*apiv1.ConfigMap, error) { + cm, err := client.ConfigMaps(namespace).Get(context.Background(), name, metav1.GetOptions{}) + if err != nil { + return nil, err + } else { + return cm, nil + } +} + +func updateConfigMap(namespace string, cm *apiv1.ConfigMap, client *v1.CoreV1Client) (*apiv1.ConfigMap, error) { + cm, err := client.ConfigMaps(namespace).Update(context.Background(), cm, metav1.UpdateOptions{}) + if err != nil { + return nil, err + } else { + return cm, nil + } +} + func SettingsManager(cfg *Config) (*settings.SettingsManager, error) { clientSet, kubeConfig := getK8sClient() namespace, _, err := kubeConfig.Namespace() diff --git a/client/argocdServer/repocreds/repocreds.go b/client/argocdServer/repocreds/repocreds.go index 8965a84008..ee5bb8573e 100644 --- a/client/argocdServer/repocreds/repocreds.go +++ b/client/argocdServer/repocreds/repocreds.go @@ -18,7 +18,6 @@ package repository import ( "context" - "errors" repocreds "github.com/argoproj/argo-cd/v2/pkg/apiclient/repocreds" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" argoApplication "github.com/devtron-labs/devtron/client/argocdServer/bean" @@ -43,11 +42,7 @@ func NewServiceClientImpl(logger *zap.SugaredLogger, argoCDConnectionManager con } func (r ServiceClientImpl) getService(ctx context.Context) (repocreds.RepoCredsServiceClient, error) { - token, ok := ctx.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") - } - conn := r.argoCDConnectionManager.GetConnection(token) + conn := r.argoCDConnectionManager.GetConnection() //defer conn.Close() return repocreds.NewRepoCredsServiceClient(conn), nil } diff --git a/client/argocdServer/repository/Repository.go b/client/argocdServer/repository/Repository.go index c74329cd0f..3f56cc5b2e 100644 --- a/client/argocdServer/repository/Repository.go +++ b/client/argocdServer/repository/Repository.go @@ -18,7 +18,6 @@ package repository import ( "context" - "errors" repository2 "github.com/argoproj/argo-cd/v2/pkg/apiclient/repository" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" "github.com/argoproj/argo-cd/v2/reposerver/apiclient" @@ -55,11 +54,8 @@ func NewServiceClientImpl(logger *zap.SugaredLogger, argoCDConnectionManager con } func (r ServiceClientImpl) getService(ctx context.Context) (repository2.RepositoryServiceClient, error) { - token, ok := ctx.Value("token").(string) - if !ok { - return nil, errors.New("Unauthorized") - } - conn := r.argoCDConnectionManager.GetConnection(token) + + conn := r.argoCDConnectionManager.GetConnection() //defer conn.Close() return repository2.NewRepositoryServiceClient(conn), nil } diff --git a/client/argocdServer/session/Session.go b/client/argocdServer/session/Session.go index 115ed5393f..bcb3a0d0fa 100644 --- a/client/argocdServer/session/Session.go +++ b/client/argocdServer/session/Session.go @@ -19,7 +19,7 @@ package session import ( "context" "github.com/argoproj/argo-cd/v2/pkg/apiclient/session" - "github.com/devtron-labs/devtron/client/argocdServer/connection" + "google.golang.org/grpc" "time" ) @@ -31,9 +31,8 @@ type ServiceClientImpl struct { ssc session.SessionServiceClient } -func NewSessionServiceClient(argoCDConnectionManager connection.ArgoCDConnectionManager) *ServiceClientImpl { +func NewSessionServiceClient(conn *grpc.ClientConn) *ServiceClientImpl { // this function only called when gitops configured and user ask for creating acd token - conn := argoCDConnectionManager.GetConnection("") ssc := session.NewSessionServiceClient(conn) return &ServiceClientImpl{ssc: ssc} } diff --git a/client/argocdServer/Version.go b/client/argocdServer/version/Version.go similarity index 63% rename from client/argocdServer/Version.go rename to client/argocdServer/version/Version.go index 18789d7e64..3e3ae6d48b 100644 --- a/client/argocdServer/Version.go +++ b/client/argocdServer/version/Version.go @@ -14,32 +14,30 @@ * limitations under the License. */ -package argocdServer +package version import ( "context" "github.com/argoproj/argo-cd/v2/pkg/apiclient/version" - "github.com/devtron-labs/devtron/client/argocdServer/connection" "github.com/golang/protobuf/ptypes/empty" "go.uber.org/zap" + "google.golang.org/grpc" ) type VersionService interface { - CheckVersion() (err error) - GetVersion() (apiVersion string, err error) + CheckVersion(conn *grpc.ClientConn) (err error) + GetVersion(conn *grpc.ClientConn) (apiVersion string, err error) } type VersionServiceImpl struct { - logger *zap.SugaredLogger - argoCDConnectionManager connection.ArgoCDConnectionManager + logger *zap.SugaredLogger } -func NewVersionServiceImpl(logger *zap.SugaredLogger, argoCDConnectionManager connection.ArgoCDConnectionManager) *VersionServiceImpl { - return &VersionServiceImpl{logger: logger, argoCDConnectionManager: argoCDConnectionManager} +func NewVersionServiceImpl(logger *zap.SugaredLogger) *VersionServiceImpl { + return &VersionServiceImpl{logger: logger} } -func (service VersionServiceImpl) CheckVersion() (err error) { - conn := service.argoCDConnectionManager.GetConnection("") +func (service VersionServiceImpl) CheckVersion(conn *grpc.ClientConn) (err error) { version, err := version.NewVersionServiceClient(conn).Version(context.Background(), &empty.Empty{}) if err != nil { return err @@ -49,8 +47,7 @@ func (service VersionServiceImpl) CheckVersion() (err error) { } // GetVersion deprecated -func (service VersionServiceImpl) GetVersion() (apiVersion string, err error) { - conn := service.argoCDConnectionManager.GetConnection("") +func (service VersionServiceImpl) GetVersion(conn *grpc.ClientConn) (apiVersion string, err error) { version, err := version.NewVersionServiceClient(conn).Version(context.Background(), &empty.Empty{}) if err != nil { return "", err diff --git a/cmd/external-app/wire.go b/cmd/external-app/wire.go index b8e731a2d2..b835100fb0 100644 --- a/cmd/external-app/wire.go +++ b/cmd/external-app/wire.go @@ -82,7 +82,6 @@ import ( "github.com/devtron-labs/devtron/pkg/sql" util2 "github.com/devtron-labs/devtron/pkg/util" util3 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/cron" "github.com/devtron-labs/devtron/util/rbac" "github.com/google/wire" @@ -201,8 +200,8 @@ func InitializeApp() (*App, error) { new(*dashboardEvent.DashboardTelemetryRouterImpl)), //binding argoUserService to helm via dummy implementation(HelmUserServiceImpl) - argo.NewHelmUserServiceImpl, - wire.Bind(new(argo.ArgoUserService), new(*argo.HelmUserServiceImpl)), + //argo.NewHelmUserServiceImpl, + //wire.Bind(new(argo.ArgoUserService), new(*argo.HelmUserServiceImpl)), router.NewUserAttributesRouterImpl, wire.Bind(new(router.UserAttributesRouter), new(*router.UserAttributesRouterImpl)), diff --git a/cmd/external-app/wire_gen.go b/cmd/external-app/wire_gen.go index 011194093f..b4d20a3efb 100644 --- a/cmd/external-app/wire_gen.go +++ b/cmd/external-app/wire_gen.go @@ -30,7 +30,7 @@ import ( client2 "github.com/devtron-labs/devtron/api/helm-app" "github.com/devtron-labs/devtron/api/helm-app/gRPC" "github.com/devtron-labs/devtron/api/helm-app/service" - read3 "github.com/devtron-labs/devtron/api/helm-app/service/read" + read4 "github.com/devtron-labs/devtron/api/helm-app/service/read" application2 "github.com/devtron-labs/devtron/api/k8s/application" capacity2 "github.com/devtron-labs/devtron/api/k8s/capacity" module2 "github.com/devtron-labs/devtron/api/module" @@ -62,7 +62,7 @@ import ( "github.com/devtron-labs/devtron/pkg/appStore/chartProvider" "github.com/devtron-labs/devtron/pkg/appStore/discover/repository" service3 "github.com/devtron-labs/devtron/pkg/appStore/discover/service" - read2 "github.com/devtron-labs/devtron/pkg/appStore/installedApp/read" + read3 "github.com/devtron-labs/devtron/pkg/appStore/installedApp/read" repository6 "github.com/devtron-labs/devtron/pkg/appStore/installedApp/repository" service2 "github.com/devtron-labs/devtron/pkg/appStore/installedApp/service" "github.com/devtron-labs/devtron/pkg/appStore/installedApp/service/EAMode" @@ -71,7 +71,7 @@ import ( "github.com/devtron-labs/devtron/pkg/appStore/values/repository" service4 "github.com/devtron-labs/devtron/pkg/appStore/values/service" "github.com/devtron-labs/devtron/pkg/argoApplication" - read5 "github.com/devtron-labs/devtron/pkg/argoApplication/read" + read6 "github.com/devtron-labs/devtron/pkg/argoApplication/read" config2 "github.com/devtron-labs/devtron/pkg/argoApplication/read/config" "github.com/devtron-labs/devtron/pkg/argoRepositoryCreds" "github.com/devtron-labs/devtron/pkg/attributes" @@ -80,15 +80,16 @@ import ( "github.com/devtron-labs/devtron/pkg/auth/sso" "github.com/devtron-labs/devtron/pkg/auth/user" "github.com/devtron-labs/devtron/pkg/auth/user/repository" - read6 "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/read" + read7 "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/read" repository12 "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository" "github.com/devtron-labs/devtron/pkg/chartRepo" "github.com/devtron-labs/devtron/pkg/chartRepo/repository" "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/cluster/environment" - read4 "github.com/devtron-labs/devtron/pkg/cluster/environment/read" + read5 "github.com/devtron-labs/devtron/pkg/cluster/environment/read" repository4 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" rbac2 "github.com/devtron-labs/devtron/pkg/cluster/rbac" + read2 "github.com/devtron-labs/devtron/pkg/cluster/read" repository3 "github.com/devtron-labs/devtron/pkg/cluster/repository" "github.com/devtron-labs/devtron/pkg/clusterTerminalAccess" delete2 "github.com/devtron-labs/devtron/pkg/delete" @@ -122,7 +123,6 @@ import ( util3 "github.com/devtron-labs/devtron/pkg/util" "github.com/devtron-labs/devtron/pkg/webhook/helm" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/devtron-labs/devtron/util/cron" "github.com/devtron-labs/devtron/util/rbac" ) @@ -219,14 +219,15 @@ func InitializeApp() (*App, error) { syncMap := informer.NewGlobalMapClusterNamespace() k8sInformerFactoryImpl := informer.NewK8sInformerFactoryImpl(sugaredLogger, syncMap, k8sServiceImpl) cronLoggerImpl := cron.NewCronLoggerImpl(sugaredLogger) - clusterServiceImpl, err := cluster.NewClusterServiceImpl(clusterRepositoryImpl, sugaredLogger, k8sServiceImpl, k8sInformerFactoryImpl, userAuthRepositoryImpl, userRepositoryImpl, roleGroupRepositoryImpl, environmentVariables, cronLoggerImpl) + clusterReadServiceImpl := read2.NewClusterReadServiceImpl(sugaredLogger, clusterRepositoryImpl) + clusterServiceImpl, err := cluster.NewClusterServiceImpl(clusterRepositoryImpl, sugaredLogger, k8sServiceImpl, k8sInformerFactoryImpl, userAuthRepositoryImpl, userRepositoryImpl, roleGroupRepositoryImpl, environmentVariables, cronLoggerImpl, clusterReadServiceImpl) if err != nil { return nil, err } appStatusRepositoryImpl := appStatus.NewAppStatusRepositoryImpl(db, sugaredLogger) environmentRepositoryImpl := repository4.NewEnvironmentRepositoryImpl(db, sugaredLogger, appStatusRepositoryImpl) attributesRepositoryImpl := repository5.NewAttributesRepositoryImpl(db) - environmentServiceImpl := environment.NewEnvironmentServiceImpl(environmentRepositoryImpl, clusterServiceImpl, sugaredLogger, k8sServiceImpl, k8sInformerFactoryImpl, userAuthServiceImpl, attributesRepositoryImpl) + environmentServiceImpl := environment.NewEnvironmentServiceImpl(environmentRepositoryImpl, clusterServiceImpl, sugaredLogger, k8sServiceImpl, k8sInformerFactoryImpl, userAuthServiceImpl, attributesRepositoryImpl, clusterReadServiceImpl) chartRepoRepositoryImpl := chartRepoRepository.NewChartRepoRepositoryImpl(db) acdAuthConfig, err := util3.GetACDAuthConfig() if err != nil { @@ -250,7 +251,7 @@ func InitializeApp() (*App, error) { helmAppClientImpl := gRPC.NewHelmAppClientImpl(sugaredLogger, helmClientConfig, configuration) pumpImpl := connector.NewPumpImpl(sugaredLogger) appRepositoryImpl := app.NewAppRepositoryImpl(db, sugaredLogger) - installedAppReadServiceEAImpl := read2.NewInstalledAppReadServiceEAImpl(sugaredLogger, installedAppRepositoryImpl) + installedAppReadServiceEAImpl := read3.NewInstalledAppReadServiceEAImpl(sugaredLogger, installedAppRepositoryImpl) dbMigrationServiceImpl := dbMigration.NewDbMigrationServiceImpl(sugaredLogger, appRepositoryImpl, installedAppReadServiceEAImpl) enforcerUtilHelmImpl := rbac.NewEnforcerUtilHelmImpl(sugaredLogger, clusterRepositoryImpl, teamRepositoryImpl, appRepositoryImpl, installedAppRepositoryImpl, dbMigrationServiceImpl) serverDataStoreServerDataStore := serverDataStore.InitServerDataStore() @@ -260,7 +261,7 @@ func InitializeApp() (*App, error) { if err != nil { return nil, err } - helmAppReadServiceImpl := read3.NewHelmAppReadServiceImpl(sugaredLogger, clusterServiceImpl) + helmAppReadServiceImpl := read4.NewHelmAppReadServiceImpl(sugaredLogger, clusterReadServiceImpl) helmAppServiceImpl := service.NewHelmAppServiceImpl(sugaredLogger, clusterServiceImpl, helmAppClientImpl, pumpImpl, enforcerUtilHelmImpl, serverDataStoreServerDataStore, serverEnvConfigServerEnvConfig, appStoreApplicationVersionRepositoryImpl, environmentServiceImpl, pipelineRepositoryImpl, installedAppRepositoryImpl, appRepositoryImpl, clusterRepositoryImpl, k8sServiceImpl, helmReleaseConfig, helmAppReadServiceImpl) dockerArtifactStoreRepositoryImpl := repository7.NewDockerArtifactStoreRepositoryImpl(db) dockerRegistryIpsConfigRepositoryImpl := repository7.NewDockerRegistryIpsConfigRepositoryImpl(db) @@ -282,14 +283,10 @@ func InitializeApp() (*App, error) { genericNoteServiceImpl := genericNotes.NewGenericNoteServiceImpl(genericNoteRepositoryImpl, genericNoteHistoryServiceImpl, userRepositoryImpl, sugaredLogger) clusterDescriptionRepositoryImpl := repository3.NewClusterDescriptionRepositoryImpl(db, sugaredLogger) clusterDescriptionServiceImpl := cluster.NewClusterDescriptionServiceImpl(clusterDescriptionRepositoryImpl, userRepositoryImpl, sugaredLogger) - helmUserServiceImpl, err := argo.NewHelmUserServiceImpl(sugaredLogger) - if err != nil { - return nil, err - } ciPipelineRepositoryImpl := pipelineConfig.NewCiPipelineRepositoryImpl(db, sugaredLogger, transactionUtilImpl) enforcerUtilImpl := rbac.NewEnforcerUtilImpl(sugaredLogger, teamRepositoryImpl, appRepositoryImpl, environmentRepositoryImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, clusterRepositoryImpl, enforcerImpl, dbMigrationServiceImpl, teamReadServiceImpl) - clusterRbacServiceImpl := rbac2.NewClusterRbacServiceImpl(environmentServiceImpl, enforcerImpl, enforcerUtilImpl, clusterServiceImpl, sugaredLogger, userServiceImpl) - clusterRestHandlerImpl := cluster2.NewClusterRestHandlerImpl(clusterServiceImpl, genericNoteServiceImpl, clusterDescriptionServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceImpl, helmUserServiceImpl, environmentServiceImpl, clusterRbacServiceImpl) + clusterRbacServiceImpl := rbac2.NewClusterRbacServiceImpl(environmentServiceImpl, enforcerImpl, enforcerUtilImpl, clusterServiceImpl, sugaredLogger, userServiceImpl, clusterReadServiceImpl) + clusterRestHandlerImpl := cluster2.NewClusterRestHandlerImpl(clusterServiceImpl, genericNoteServiceImpl, clusterDescriptionServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceImpl, environmentServiceImpl, clusterRbacServiceImpl) clusterRouterImpl := cluster2.NewClusterRouterImpl(clusterRestHandlerImpl) dashboardConfig, err := dashboard.GetConfig() if err != nil { @@ -312,7 +309,7 @@ func InitializeApp() (*App, error) { appStoreDeploymentCommonServiceImpl := appStoreDeploymentCommon.NewAppStoreDeploymentCommonServiceImpl(sugaredLogger, appStoreApplicationVersionRepositoryImpl, chartTemplateServiceImpl, userServiceImpl, helmAppServiceImpl, installedAppDBServiceImpl) eaModeDeploymentServiceImpl := deployment.NewEAModeDeploymentServiceImpl(sugaredLogger, helmAppServiceImpl, appStoreApplicationVersionRepositoryImpl, helmAppClientImpl, installedAppRepositoryImpl, ociRegistryConfigRepositoryImpl, appStoreDeploymentCommonServiceImpl, helmAppReadServiceImpl) appStoreValidatorImpl := service2.NewAppAppStoreValidatorImpl(sugaredLogger) - appStoreDeploymentDBServiceImpl := service2.NewAppStoreDeploymentDBServiceImpl(sugaredLogger, installedAppRepositoryImpl, appStoreApplicationVersionRepositoryImpl, appRepositoryImpl, environmentServiceImpl, clusterServiceImpl, installedAppVersionHistoryRepositoryImpl, environmentVariables, gitOpsConfigReadServiceImpl, deploymentTypeOverrideServiceImpl, eaModeDeploymentServiceImpl, appStoreValidatorImpl, installedAppDBServiceImpl, deploymentConfigServiceImpl) + appStoreDeploymentDBServiceImpl := service2.NewAppStoreDeploymentDBServiceImpl(sugaredLogger, installedAppRepositoryImpl, appStoreApplicationVersionRepositoryImpl, appRepositoryImpl, environmentServiceImpl, installedAppVersionHistoryRepositoryImpl, environmentVariables, gitOpsConfigReadServiceImpl, deploymentTypeOverrideServiceImpl, eaModeDeploymentServiceImpl, appStoreValidatorImpl, installedAppDBServiceImpl, deploymentConfigServiceImpl, clusterReadServiceImpl) chartGroupDeploymentRepositoryImpl := repository9.NewChartGroupDeploymentRepositoryImpl(db, sugaredLogger) acdConfig, err := argocdServer.GetACDDeploymentConfig() if err != nil { @@ -324,21 +321,21 @@ func InitializeApp() (*App, error) { k8sResourceHistoryRepositoryImpl := repository10.NewK8sResourceHistoryRepositoryImpl(db, sugaredLogger) k8sResourceHistoryServiceImpl := kubernetesResourceAuditLogs.Newk8sResourceHistoryServiceImpl(k8sResourceHistoryRepositoryImpl, sugaredLogger, appRepositoryImpl, environmentRepositoryImpl) argoApplicationConfigServiceImpl := config2.NewArgoApplicationConfigServiceImpl(sugaredLogger, k8sServiceImpl, clusterRepositoryImpl) - k8sCommonServiceImpl := k8s2.NewK8sCommonServiceImpl(sugaredLogger, k8sServiceImpl, clusterServiceImpl, argoApplicationConfigServiceImpl) + k8sCommonServiceImpl := k8s2.NewK8sCommonServiceImpl(sugaredLogger, k8sServiceImpl, argoApplicationConfigServiceImpl, clusterReadServiceImpl) ephemeralContainersRepositoryImpl := repository3.NewEphemeralContainersRepositoryImpl(db, transactionUtilImpl) ephemeralContainerServiceImpl := cluster.NewEphemeralContainerServiceImpl(ephemeralContainersRepositoryImpl, sugaredLogger) - terminalSessionHandlerImpl := terminal.NewTerminalSessionHandlerImpl(environmentServiceImpl, clusterServiceImpl, sugaredLogger, k8sServiceImpl, ephemeralContainerServiceImpl, argoApplicationConfigServiceImpl) - k8sApplicationServiceImpl, err := application.NewK8sApplicationServiceImpl(sugaredLogger, clusterServiceImpl, pumpImpl, helmAppServiceImpl, k8sServiceImpl, acdAuthConfig, k8sResourceHistoryServiceImpl, k8sCommonServiceImpl, terminalSessionHandlerImpl, ephemeralContainerServiceImpl, ephemeralContainersRepositoryImpl, fluxApplicationServiceImpl) + terminalSessionHandlerImpl := terminal.NewTerminalSessionHandlerImpl(environmentServiceImpl, sugaredLogger, k8sServiceImpl, ephemeralContainerServiceImpl, argoApplicationConfigServiceImpl, clusterReadServiceImpl) + k8sApplicationServiceImpl, err := application.NewK8sApplicationServiceImpl(sugaredLogger, clusterServiceImpl, pumpImpl, helmAppServiceImpl, k8sServiceImpl, acdAuthConfig, k8sResourceHistoryServiceImpl, k8sCommonServiceImpl, terminalSessionHandlerImpl, ephemeralContainerServiceImpl, ephemeralContainersRepositoryImpl, fluxApplicationServiceImpl, clusterReadServiceImpl) if err != nil { return nil, err } - argoApplicationServiceImpl := argoApplication.NewArgoApplicationServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, helmUserServiceImpl, helmAppClientImpl, helmAppServiceImpl, k8sApplicationServiceImpl, argoApplicationConfigServiceImpl) + argoApplicationServiceImpl := argoApplication.NewArgoApplicationServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, helmAppClientImpl, helmAppServiceImpl, k8sApplicationServiceImpl, argoApplicationConfigServiceImpl) helmAppRestHandlerImpl := client2.NewHelmAppRestHandlerImpl(sugaredLogger, helmAppServiceImpl, enforcerImpl, clusterServiceImpl, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, installedAppDBServiceImpl, userServiceImpl, attributesServiceImpl, serverEnvConfigServerEnvConfig, fluxApplicationServiceImpl, argoApplicationServiceImpl) helmAppRouterImpl := client2.NewHelmAppRouterImpl(helmAppRestHandlerImpl) - environmentReadServiceImpl := read4.NewEnvironmentReadServiceImpl(sugaredLogger, environmentRepositoryImpl) + environmentReadServiceImpl := read5.NewEnvironmentReadServiceImpl(sugaredLogger, environmentRepositoryImpl) environmentRestHandlerImpl := cluster2.NewEnvironmentRestHandlerImpl(environmentServiceImpl, environmentReadServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceImpl, k8sServiceImpl, k8sCommonServiceImpl) environmentRouterImpl := cluster2.NewEnvironmentRouterImpl(environmentRestHandlerImpl) - argoApplicationReadServiceImpl := read5.NewArgoApplicationReadServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, helmUserServiceImpl, helmAppClientImpl, helmAppServiceImpl) + argoApplicationReadServiceImpl := read6.NewArgoApplicationReadServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, helmAppClientImpl, helmAppServiceImpl) k8sApplicationRestHandlerImpl := application2.NewK8sApplicationRestHandlerImpl(sugaredLogger, k8sApplicationServiceImpl, pumpImpl, terminalSessionHandlerImpl, enforcerImpl, enforcerUtilHelmImpl, enforcerUtilImpl, helmAppServiceImpl, userServiceImpl, k8sCommonServiceImpl, validate, environmentVariables, fluxApplicationServiceImpl, argoApplicationReadServiceImpl) k8sApplicationRouterImpl := application2.NewK8sApplicationRouterImpl(k8sApplicationRestHandlerImpl) chartRepositoryRestHandlerImpl := chartRepo2.NewChartRepositoryRestHandlerImpl(sugaredLogger, userServiceImpl, chartRepositoryServiceImpl, enforcerImpl, validate, deleteServiceImpl, attributesServiceImpl) @@ -350,7 +347,7 @@ func InitializeApp() (*App, error) { appStoreValuesServiceImpl := service4.NewAppStoreValuesServiceImpl(sugaredLogger, appStoreApplicationVersionRepositoryImpl, installedAppRepositoryImpl, installedAppReadServiceEAImpl, appStoreVersionValuesRepositoryImpl, userServiceImpl) appStoreValuesRestHandlerImpl := appStoreValues.NewAppStoreValuesRestHandlerImpl(sugaredLogger, userServiceImpl, appStoreValuesServiceImpl) appStoreValuesRouterImpl := appStoreValues.NewAppStoreValuesRouterImpl(appStoreValuesRestHandlerImpl) - appStoreDeploymentRestHandlerImpl := appStoreDeployment.NewAppStoreDeploymentRestHandlerImpl(sugaredLogger, userServiceImpl, enforcerImpl, enforcerUtilImpl, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, appStoreDeploymentDBServiceImpl, validate, helmAppServiceImpl, helmUserServiceImpl, installedAppDBServiceImpl, attributesServiceImpl) + appStoreDeploymentRestHandlerImpl := appStoreDeployment.NewAppStoreDeploymentRestHandlerImpl(sugaredLogger, userServiceImpl, enforcerImpl, enforcerUtilImpl, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, appStoreDeploymentDBServiceImpl, validate, helmAppServiceImpl, installedAppDBServiceImpl, attributesServiceImpl) appStoreDeploymentRouterImpl := appStoreDeployment.NewAppStoreDeploymentRouterImpl(appStoreDeploymentRestHandlerImpl) chartProviderServiceImpl := chartProvider.NewChartProviderServiceImpl(sugaredLogger, chartRepoRepositoryImpl, chartRepositoryServiceImpl, dockerArtifactStoreRepositoryImpl, ociRegistryConfigRepositoryImpl) chartProviderRestHandlerImpl := chartProvider2.NewChartProviderRestHandlerImpl(sugaredLogger, userServiceImpl, validate, chartProviderServiceImpl, enforcerImpl) @@ -369,7 +366,7 @@ func InitializeApp() (*App, error) { } dashboardTelemetryRestHandlerImpl := dashboardEvent.NewDashboardTelemetryRestHandlerImpl(sugaredLogger, telemetryEventClientImpl) dashboardTelemetryRouterImpl := dashboardEvent.NewDashboardTelemetryRouterImpl(dashboardTelemetryRestHandlerImpl) - commonDeploymentRestHandlerImpl := appStoreDeployment.NewCommonDeploymentRestHandlerImpl(sugaredLogger, userServiceImpl, enforcerImpl, enforcerUtilImpl, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, installedAppDBServiceImpl, validate, helmAppServiceImpl, helmUserServiceImpl, attributesServiceImpl) + commonDeploymentRestHandlerImpl := appStoreDeployment.NewCommonDeploymentRestHandlerImpl(sugaredLogger, userServiceImpl, enforcerImpl, enforcerUtilImpl, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, installedAppDBServiceImpl, validate, helmAppServiceImpl, attributesServiceImpl) commonDeploymentRouterImpl := appStoreDeployment.NewCommonDeploymentRouterImpl(commonDeploymentRestHandlerImpl) externalLinkMonitoringToolRepositoryImpl := externalLink.NewExternalLinkMonitoringToolRepositoryImpl(db) externalLinkIdentifierMappingRepositoryImpl := externalLink.NewExternalLinkIdentifierMappingRepositoryImpl(db) @@ -415,7 +412,7 @@ func InitializeApp() (*App, error) { apiTokenRestHandlerImpl := apiToken2.NewApiTokenRestHandlerImpl(sugaredLogger, apiTokenServiceImpl, userServiceImpl, enforcerImpl, validate) apiTokenRouterImpl := apiToken2.NewApiTokenRouterImpl(apiTokenRestHandlerImpl) k8sCapacityServiceImpl := capacity.NewK8sCapacityServiceImpl(sugaredLogger, k8sApplicationServiceImpl, k8sServiceImpl, k8sCommonServiceImpl) - k8sCapacityRestHandlerImpl := capacity2.NewK8sCapacityRestHandlerImpl(sugaredLogger, k8sCapacityServiceImpl, userServiceImpl, enforcerImpl, clusterServiceImpl, environmentServiceImpl, clusterRbacServiceImpl) + k8sCapacityRestHandlerImpl := capacity2.NewK8sCapacityRestHandlerImpl(sugaredLogger, k8sCapacityServiceImpl, userServiceImpl, enforcerImpl, clusterServiceImpl, environmentServiceImpl, clusterRbacServiceImpl, clusterReadServiceImpl) k8sCapacityRouterImpl := capacity2.NewK8sCapacityRouterImpl(k8sCapacityRestHandlerImpl) webhookHelmServiceImpl := webhookHelm.NewWebhookHelmServiceImpl(sugaredLogger, helmAppServiceImpl, clusterServiceImpl, chartRepositoryServiceImpl, attributesServiceImpl) webhookHelmRestHandlerImpl := webhookHelm2.NewWebhookHelmRestHandlerImpl(sugaredLogger, webhookHelmServiceImpl, userServiceImpl, enforcerImpl, validate) @@ -445,7 +442,7 @@ func InitializeApp() (*App, error) { return nil, err } materialRepositoryImpl := repository12.NewMaterialRepositoryImpl(db) - gitMaterialReadServiceImpl := read6.NewGitMaterialReadServiceImpl(sugaredLogger, materialRepositoryImpl) + gitMaterialReadServiceImpl := read7.NewGitMaterialReadServiceImpl(sugaredLogger, materialRepositoryImpl) appCrudOperationServiceImpl := app2.NewAppCrudOperationServiceImpl(appLabelRepositoryImpl, sugaredLogger, appRepositoryImpl, userRepositoryImpl, installedAppRepositoryImpl, genericNoteServiceImpl, installedAppDBServiceImpl, crudOperationServiceConfig, dbMigrationServiceImpl, gitMaterialReadServiceImpl) appInfoRestHandlerImpl := appInfo.NewAppInfoRestHandlerImpl(sugaredLogger, appCrudOperationServiceImpl, userServiceImpl, validate, enforcerUtilImpl, enforcerImpl, helmAppServiceImpl, enforcerUtilHelmImpl, genericNoteServiceImpl) appInfoRouterImpl := appInfo2.NewAppInfoRouterImpl(sugaredLogger, appInfoRestHandlerImpl) diff --git a/pkg/app/AppListingService.go b/pkg/app/AppListingService.go index 5d66938f16..e729f1e936 100644 --- a/pkg/app/AppListingService.go +++ b/pkg/app/AppListingService.go @@ -33,7 +33,6 @@ import ( "github.com/devtron-labs/devtron/pkg/dockerRegistry" "github.com/devtron-labs/devtron/pkg/pipeline/constants" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" errors2 "github.com/juju/errors" "go.opentelemetry.io/otel" "golang.org/x/exp/slices" @@ -139,7 +138,6 @@ type AppListingServiceImpl struct { linkoutsRepository repository.LinkoutsRepository pipelineOverrideRepository chartConfig.PipelineOverrideRepository environmentRepository repository2.EnvironmentRepository - argoUserService argo.ArgoUserService chartRepository chartRepoRepository.ChartRepository ciPipelineRepository pipelineConfig.CiPipelineRepository dockerRegistryIpsConfigService dockerRegistry.DockerRegistryIpsConfigService @@ -155,7 +153,6 @@ func NewAppListingServiceImpl(Logger *zap.SugaredLogger, appListingRepository re appListingViewBuilder AppListingViewBuilder, pipelineRepository pipelineConfig.PipelineRepository, linkoutsRepository repository.LinkoutsRepository, cdWorkflowRepository pipelineConfig.CdWorkflowRepository, pipelineOverrideRepository chartConfig.PipelineOverrideRepository, environmentRepository repository2.EnvironmentRepository, - argoUserService argo.ArgoUserService, chartRepository chartRepoRepository.ChartRepository, ciPipelineRepository pipelineConfig.CiPipelineRepository, dockerRegistryIpsConfigService dockerRegistry.DockerRegistryIpsConfigService, userRepository userrepository.UserRepository, deployedAppMetricsService deployedAppMetrics.DeployedAppMetricsService, ciArtifactRepository repository.CiArtifactRepository, @@ -172,7 +169,6 @@ func NewAppListingServiceImpl(Logger *zap.SugaredLogger, appListingRepository re cdWorkflowRepository: cdWorkflowRepository, pipelineOverrideRepository: pipelineOverrideRepository, environmentRepository: environmentRepository, - argoUserService: argoUserService, chartRepository: chartRepository, ciPipelineRepository: ciPipelineRepository, dockerRegistryIpsConfigService: dockerRegistryIpsConfigService, diff --git a/pkg/app/AppService.go b/pkg/app/AppService.go index b82bfb2a9e..c44ef7a040 100644 --- a/pkg/app/AppService.go +++ b/pkg/app/AppService.go @@ -69,7 +69,6 @@ import ( "github.com/devtron-labs/devtron/pkg/variables" _ "github.com/devtron-labs/devtron/pkg/variables/repository" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" util "github.com/devtron-labs/devtron/util/event" "github.com/go-pg/pg" "go.uber.org/zap" @@ -113,7 +112,6 @@ type AppServiceImpl struct { cdWorkflowRepository pipelineConfig.CdWorkflowRepository commonService commonService.CommonService chartTemplateService ChartTemplateService - argoUserService argo.ArgoUserService pipelineStatusTimelineRepository pipelineConfig.PipelineStatusTimelineRepository pipelineStatusTimelineResourcesService status2.PipelineStatusTimelineResourcesService pipelineStatusSyncDetailService status2.PipelineStatusSyncDetailService @@ -157,7 +155,7 @@ func NewAppService( chartRepository chartRepoRepository.ChartRepository, cdWorkflowRepository pipelineConfig.CdWorkflowRepository, commonService commonService.CommonService, - chartTemplateService ChartTemplateService, argoUserService argo.ArgoUserService, + chartTemplateService ChartTemplateService, cdPipelineStatusTimelineRepo pipelineConfig.PipelineStatusTimelineRepository, pipelineStatusTimelineResourcesService status2.PipelineStatusTimelineResourcesService, pipelineStatusSyncDetailService status2.PipelineStatusSyncDetailService, @@ -185,7 +183,6 @@ func NewAppService( cdWorkflowRepository: cdWorkflowRepository, commonService: commonService, chartTemplateService: chartTemplateService, - argoUserService: argoUserService, pipelineStatusTimelineRepository: cdPipelineStatusTimelineRepo, pipelineStatusTimelineResourcesService: pipelineStatusTimelineResourcesService, pipelineStatusSyncDetailService: pipelineStatusSyncDetailService, @@ -787,18 +784,6 @@ type ValuesOverrideResponse struct { ManifestPushTemplate *bean3.ManifestPushTemplate } -func (impl *AppServiceImpl) buildACDContext() (acdContext context.Context, err error) { - // this method should only call in case of argo-integration and gitops configured - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return nil, err - } - ctx := context.Background() - ctx = context.WithValue(ctx, "token", acdToken) - return ctx, nil -} - func (impl *AppServiceImpl) GetDeployedManifestByPipelineIdAndCDWorkflowId(appId int, envId int, cdWorkflowId int, ctx context.Context) ([]byte, error) { manifestByteArray := make([]byte, 0) diff --git a/pkg/appStore/chartGroup/ChartGroupService.go b/pkg/appStore/chartGroup/ChartGroupService.go index 1dc9050bfd..c9a92eedcc 100644 --- a/pkg/appStore/chartGroup/ChartGroupService.go +++ b/pkg/appStore/chartGroup/ChartGroupService.go @@ -41,7 +41,6 @@ import ( "github.com/devtron-labs/devtron/pkg/eventProcessor/out" "github.com/devtron-labs/devtron/pkg/team/read" repository3 "github.com/devtron-labs/devtron/pkg/team/repository" - "github.com/devtron-labs/devtron/util/argo" "io/ioutil" "os" "strconv" @@ -75,7 +74,6 @@ type ChartGroupServiceImpl struct { appStoreValuesService service.AppStoreValuesService appStoreDeploymentService service2.AppStoreDeploymentService appStoreDeploymentDBService service2.AppStoreDeploymentDBService - argoUserService argo.ArgoUserService pipelineStatusTimelineService status.PipelineStatusTimelineService acdConfig *argocdServer.ACDConfig fullModeDeploymentService deployment.FullModeDeploymentService @@ -100,7 +98,6 @@ func NewChartGroupServiceImpl(logger *zap.SugaredLogger, appStoreValuesService service.AppStoreValuesService, appStoreDeploymentService service2.AppStoreDeploymentService, appStoreDeploymentDBService service2.AppStoreDeploymentDBService, - argoUserService argo.ArgoUserService, pipelineStatusTimelineService status.PipelineStatusTimelineService, acdConfig *argocdServer.ACDConfig, fullModeDeploymentService deployment.FullModeDeploymentService, @@ -123,7 +120,6 @@ func NewChartGroupServiceImpl(logger *zap.SugaredLogger, appStoreValuesService: appStoreValuesService, appStoreDeploymentService: appStoreDeploymentService, appStoreDeploymentDBService: appStoreDeploymentDBService, - argoUserService: argoUserService, pipelineStatusTimelineService: pipelineStatusTimelineService, acdConfig: acdConfig, fullModeDeploymentService: fullModeDeploymentService, @@ -908,12 +904,7 @@ func (impl *ChartGroupServiceImpl) PerformDeployStage(installedAppVersionId int, installedAppVersion.InstalledAppVersionHistoryId = installedAppVersionHistoryId if util.IsAcdApp(installedAppVersion.DeploymentAppType) { //this method should only call in case of argo-integration installed and git-ops has configured - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return nil, err - } - ctx = context.WithValue(ctx, "token", acdToken) + timeline := &pipelineConfig.PipelineStatusTimeline{ InstalledAppVersionHistoryId: installedAppVersion.InstalledAppVersionHistoryId, Status: timelineStatus.TIMELINE_STATUS_DEPLOYMENT_INITIATED, diff --git a/pkg/appStore/installedApp/service/AppStoreDeploymentDBService.go b/pkg/appStore/installedApp/service/AppStoreDeploymentDBService.go index 6656801f99..e666c26068 100644 --- a/pkg/appStore/installedApp/service/AppStoreDeploymentDBService.go +++ b/pkg/appStore/installedApp/service/AppStoreDeploymentDBService.go @@ -33,9 +33,9 @@ import ( "github.com/devtron-labs/devtron/pkg/appStore/installedApp/service/FullMode/deployment" util4 "github.com/devtron-labs/devtron/pkg/appStore/util" "github.com/devtron-labs/devtron/pkg/bean" - clusterService "github.com/devtron-labs/devtron/pkg/cluster" environment2 "github.com/devtron-labs/devtron/pkg/cluster/environment" clutserBean "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" + "github.com/devtron-labs/devtron/pkg/cluster/read" "github.com/devtron-labs/devtron/pkg/deployment/common" bean2 "github.com/devtron-labs/devtron/pkg/deployment/common/bean" "github.com/devtron-labs/devtron/pkg/deployment/gitOps/config" @@ -77,7 +77,6 @@ type AppStoreDeploymentDBServiceImpl struct { appStoreApplicationVersionRepository discoverRepository.AppStoreApplicationVersionRepository appRepository app.AppRepository environmentService environment2.EnvironmentService - clusterService clusterService.ClusterService installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository deploymentTypeConfig *globalUtil.DeploymentServiceTypeConfig gitOpsConfigReadService config.GitOpsConfigReadService @@ -86,6 +85,7 @@ type AppStoreDeploymentDBServiceImpl struct { appStoreValidator AppStoreValidator installedAppDbService EAMode.InstalledAppDBService deploymentConfigService common.DeploymentConfigService + clusterReadService read.ClusterReadService } func NewAppStoreDeploymentDBServiceImpl(logger *zap.SugaredLogger, @@ -93,21 +93,20 @@ func NewAppStoreDeploymentDBServiceImpl(logger *zap.SugaredLogger, appStoreApplicationVersionRepository discoverRepository.AppStoreApplicationVersionRepository, appRepository app.AppRepository, environmentService environment2.EnvironmentService, - clusterService clusterService.ClusterService, installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository, envVariables *globalUtil.EnvironmentVariables, gitOpsConfigReadService config.GitOpsConfigReadService, deploymentTypeOverrideService providerConfig.DeploymentTypeOverrideService, fullModeDeploymentService deployment.FullModeDeploymentService, appStoreValidator AppStoreValidator, installedAppDbService EAMode.InstalledAppDBService, - deploymentConfigService common.DeploymentConfigService) *AppStoreDeploymentDBServiceImpl { + deploymentConfigService common.DeploymentConfigService, + clusterReadService read.ClusterReadService) *AppStoreDeploymentDBServiceImpl { return &AppStoreDeploymentDBServiceImpl{ logger: logger, installedAppRepository: installedAppRepository, appStoreApplicationVersionRepository: appStoreApplicationVersionRepository, appRepository: appRepository, environmentService: environmentService, - clusterService: clusterService, installedAppRepositoryHistory: installedAppRepositoryHistory, deploymentTypeConfig: envVariables.DeploymentServiceTypeConfig, gitOpsConfigReadService: gitOpsConfigReadService, @@ -116,6 +115,7 @@ func NewAppStoreDeploymentDBServiceImpl(logger *zap.SugaredLogger, appStoreValidator: appStoreValidator, installedAppDbService: installedAppDbService, deploymentConfigService: deploymentConfigService, + clusterReadService: clusterReadService, } } @@ -641,7 +641,7 @@ func (impl *AppStoreDeploymentDBServiceImpl) createEnvironmentIfNotExists(instal return env, nil } else { // create env - cluster, err := impl.clusterService.FindById(clusterId) + cluster, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in getting cluster details", "clusterId", clusterId) return nil, &util.ApiError{ diff --git a/pkg/appStore/installedApp/service/FullMode/deployment/FullModeDeploymentService.go b/pkg/appStore/installedApp/service/FullMode/deployment/FullModeDeploymentService.go index 0ce21b6ef1..587a91814f 100644 --- a/pkg/appStore/installedApp/service/FullMode/deployment/FullModeDeploymentService.go +++ b/pkg/appStore/installedApp/service/FullMode/deployment/FullModeDeploymentService.go @@ -48,7 +48,6 @@ import ( "github.com/devtron-labs/devtron/pkg/appStore/installedApp/repository" "github.com/devtron-labs/devtron/pkg/auth/user" "github.com/devtron-labs/devtron/pkg/sql" - "github.com/devtron-labs/devtron/util/argo" "github.com/go-pg/pg" "go.opentelemetry.io/otel" "go.uber.org/zap" @@ -83,7 +82,6 @@ type FullModeDeploymentServiceImpl struct { chartGroupDeploymentRepository repository2.ChartGroupDeploymentRepository installedAppRepository repository.InstalledAppRepository installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository - argoUserService argo.ArgoUserService appStoreDeploymentCommonService appStoreDeploymentCommon.AppStoreDeploymentCommonService helmAppService client.HelmAppService appStatusService appStatus.AppStatusService @@ -110,7 +108,6 @@ func NewFullModeDeploymentServiceImpl( chartGroupDeploymentRepository repository2.ChartGroupDeploymentRepository, installedAppRepository repository.InstalledAppRepository, installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository, - argoUserService argo.ArgoUserService, appStoreDeploymentCommonService appStoreDeploymentCommon.AppStoreDeploymentCommonService, helmAppService client.HelmAppService, appStatusService appStatus.AppStatusService, @@ -135,7 +132,6 @@ func NewFullModeDeploymentServiceImpl( chartGroupDeploymentRepository: chartGroupDeploymentRepository, installedAppRepository: installedAppRepository, installedAppRepositoryHistory: installedAppRepositoryHistory, - argoUserService: argoUserService, appStoreDeploymentCommonService: appStoreDeploymentCommonService, helmAppService: helmAppService, appStatusService: appStatusService, diff --git a/pkg/appStore/installedApp/service/FullMode/deployment/InstalledAppArgoCdService.go b/pkg/appStore/installedApp/service/FullMode/deployment/InstalledAppArgoCdService.go index 0a00348f08..d2b30dcab3 100644 --- a/pkg/appStore/installedApp/service/FullMode/deployment/InstalledAppArgoCdService.go +++ b/pkg/appStore/installedApp/service/FullMode/deployment/InstalledAppArgoCdService.go @@ -52,15 +52,8 @@ type InstalledAppArgoCdService interface { func (impl *FullModeDeploymentServiceImpl) GetAcdAppGitOpsRepoName(appName string, environmentName string) (string, error) { //this method should only call in case of argo-integration and gitops configured - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.Logger.Errorw("error in getting acd token", "err", err) - return "", err - } - ctx := context.Background() - ctx = context.WithValue(ctx, "token", acdToken) acdAppName := util2.BuildDeployedAppName(appName, environmentName) - return impl.argoClientWrapperService.GetGitOpsRepoName(ctx, acdAppName) + return impl.argoClientWrapperService.GetGitOpsRepoName(context.Background(), acdAppName) } func (impl *FullModeDeploymentServiceImpl) DeleteACDAppObject(ctx context.Context, appName string, environmentName string, installAppVersionRequest *appStoreBean.InstallAppVersionDTO) error { @@ -91,16 +84,7 @@ func (impl *FullModeDeploymentServiceImpl) DeleteACDAppObject(ctx context.Contex } func (impl *FullModeDeploymentServiceImpl) CheckIfArgoAppExists(acdAppName string) (isFound bool, err error) { - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.Logger.Errorw("error in getting acd token", "err", err) - return isFound, fmt.Errorf("error in getting acd token") - } - - ctx := context.Background() - ctx = context.WithValue(ctx, "token", acdToken) - - _, acdAppGetErr := impl.acdClient.Get(ctx, &application.ApplicationQuery{Name: &acdAppName}) + _, acdAppGetErr := impl.acdClient.Get(context.Background(), &application.ApplicationQuery{Name: &acdAppName}) isFound = acdAppGetErr == nil return isFound, nil } @@ -234,13 +218,7 @@ func (impl *FullModeDeploymentServiceImpl) patchAcdApp(ctx context.Context, inst } func (impl *FullModeDeploymentServiceImpl) GetAcdAppGitOpsRepoURL(appName string, environmentName string) (string, error) { - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.Logger.Errorw("error in getting acd token", "err", err) - return "", err - } ctx := context.Background() - ctx = context.WithValue(ctx, "token", acdToken) acdAppName := util2.BuildDeployedAppName(appName, environmentName) return impl.argoClientWrapperService.GetGitOpsRepoURL(ctx, acdAppName) } diff --git a/pkg/appStore/installedApp/service/FullMode/deploymentTypeChange/InstalledAppDeploymentTypeChangeService.go b/pkg/appStore/installedApp/service/FullMode/deploymentTypeChange/InstalledAppDeploymentTypeChangeService.go index fb028b9b4b..d9abc1ce24 100644 --- a/pkg/appStore/installedApp/service/FullMode/deploymentTypeChange/InstalledAppDeploymentTypeChangeService.go +++ b/pkg/appStore/installedApp/service/FullMode/deploymentTypeChange/InstalledAppDeploymentTypeChangeService.go @@ -50,7 +50,6 @@ import ( bean2 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/bean" "github.com/devtron-labs/devtron/pkg/k8s" util3 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/go-pg/pg" "go.uber.org/zap" "k8s.io/apimachinery/pkg/runtime/schema" @@ -82,7 +81,6 @@ type InstalledAppDeploymentTypeChangeServiceImpl struct { argoClientWrapperService argocdServer.ArgoClientWrapperService chartGroupService chartGroup.ChartGroupService helmAppService client.HelmAppService - argoUserService argo.ArgoUserService clusterService cluster.ClusterService clusterReadService read.ClusterReadService deploymentConfigService common.DeploymentConfigService @@ -100,7 +98,7 @@ func NewInstalledAppDeploymentTypeChangeServiceImpl(logger *zap.SugaredLogger, eaModeDeploymentService deployment2.EAModeDeploymentService, argoClientWrapperService argocdServer.ArgoClientWrapperService, chartGroupService chartGroup.ChartGroupService, helmAppService client.HelmAppService, - argoUserService argo.ArgoUserService, clusterService cluster.ClusterService, + clusterService cluster.ClusterService, clusterReadService read.ClusterReadService, appRepository appRepository.AppRepository, deploymentConfigService common.DeploymentConfigService, @@ -120,7 +118,6 @@ func NewInstalledAppDeploymentTypeChangeServiceImpl(logger *zap.SugaredLogger, argoClientWrapperService: argoClientWrapperService, chartGroupService: chartGroupService, helmAppService: helmAppService, - argoUserService: argoUserService, clusterService: clusterService, clusterReadService: clusterReadService, appRepository: appRepository, @@ -135,11 +132,6 @@ func (impl *InstalledAppDeploymentTypeChangeServiceImpl) MigrateDeploymentType(c DesiredDeploymentType: request.DesiredDeploymentType, } var err error - ctx, err = impl.argoUserService.SetAcdTokenInContext(ctx) - if err != nil { - impl.logger.Errorw("error in setting acd token in context", "err", err) - return response, err - } var deleteDeploymentType bean2.DeploymentType var deployStatus appStoreBean.AppstoreDeploymentStatus @@ -444,11 +436,6 @@ func (impl *InstalledAppDeploymentTypeChangeServiceImpl) TriggerAfterMigration(c DesiredDeploymentType: request.DesiredDeploymentType, } var err error - ctx, err = impl.argoUserService.SetAcdTokenInContext(ctx) - if err != nil { - impl.logger.Errorw("error in setting acd token in context", "err", err) - return response, err - } installedApps, err := impl.installedAppRepository.GetActiveInstalledAppByEnvIdAndDeploymentType(request.EnvId, request.DesiredDeploymentType, util2.ConvertIntArrayToStringArray(request.ExcludeApps), util2.ConvertIntArrayToStringArray(request.IncludeApps)) diff --git a/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go b/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go index 140dbe2245..69cea7de60 100644 --- a/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go +++ b/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go @@ -43,7 +43,6 @@ import ( application3 "github.com/devtron-labs/devtron/pkg/k8s/application" util3 "github.com/devtron-labs/devtron/pkg/util" util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/tidwall/gjson" "go.uber.org/zap" "net/http" @@ -67,7 +66,6 @@ type InstalledAppResourceServiceImpl struct { acdClient application2.ServiceClient aCDAuthConfig *util3.ACDAuthConfig installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository - argoUserService argo.ArgoUserService helmAppClient gRPC.HelmAppClient helmAppService service.HelmAppService helmAppReadService read.HelmAppReadService @@ -86,7 +84,7 @@ func NewInstalledAppResourceServiceImpl(logger *zap.SugaredLogger, acdClient application2.ServiceClient, aCDAuthConfig *util3.ACDAuthConfig, installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository, - argoUserService argo.ArgoUserService, helmAppClient gRPC.HelmAppClient, helmAppService service.HelmAppService, + helmAppClient gRPC.HelmAppClient, helmAppService service.HelmAppService, helmAppReadService read.HelmAppReadService, appStatusService appStatus.AppStatusService, k8sCommonService k8s.K8sCommonService, k8sApplicationService application3.K8sApplicationService, K8sUtil k8s2.K8sService, @@ -100,7 +98,6 @@ func NewInstalledAppResourceServiceImpl(logger *zap.SugaredLogger, acdClient: acdClient, aCDAuthConfig: aCDAuthConfig, installedAppRepositoryHistory: installedAppRepositoryHistory, - argoUserService: argoUserService, helmAppClient: helmAppClient, helmAppService: helmAppService, helmAppReadService: helmAppReadService, @@ -202,12 +199,6 @@ func (impl *InstalledAppResourceServiceImpl) FetchResourceTreeWithHibernateForAC } }(ctx.Done(), cn.CloseNotify()) } - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return *appDetail - } - ctx = context.WithValue(ctx, "token", acdToken) defer cancel() deploymentAppName := util2.BuildDeployedAppName(appDetail.AppName, appDetail.EnvironmentName) resourceTree, err := impl.fetchResourceTreeForACD(rctx, cn, appDetail.InstalledAppId, appDetail.EnvironmentId, appDetail.ClusterId, deploymentAppName, appDetail.Namespace) @@ -237,12 +228,6 @@ func (impl *InstalledAppResourceServiceImpl) fetchResourceTreeForACD(rctx contex } }(ctx.Done(), cn.CloseNotify()) } - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return resourceTree, err - } - ctx = context.WithValue(ctx, "token", acdToken) defer cancel() start := time.Now() resp, err := impl.argoApplicationService.ResourceTree(ctx, query) diff --git a/pkg/argoApplication/ArgoApplicationService.go b/pkg/argoApplication/ArgoApplicationService.go index 1987f349e2..6688d2f02f 100644 --- a/pkg/argoApplication/ArgoApplicationService.go +++ b/pkg/argoApplication/ArgoApplicationService.go @@ -31,10 +31,9 @@ import ( "github.com/devtron-labs/devtron/pkg/argoApplication/read/config" "github.com/devtron-labs/devtron/pkg/cluster/adapter" clusterRepository "github.com/devtron-labs/devtron/pkg/cluster/repository" - k8s2 "github.com/devtron-labs/devtron/pkg/k8s" "github.com/devtron-labs/devtron/pkg/k8s/application" + k8s2 "github.com/devtron-labs/devtron/pkg/k8s/bean" "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "go.uber.org/zap" "k8s.io/apimachinery/pkg/api/errors" "net/http" @@ -54,7 +53,6 @@ type ArgoApplicationServiceImpl struct { logger *zap.SugaredLogger clusterRepository clusterRepository.ClusterRepository k8sUtil *k8s.K8sServiceImpl - argoUserService argo.ArgoUserService helmAppClient gRPC.HelmAppClient helmAppService service.HelmAppService k8sApplicationService application.K8sApplicationService @@ -64,7 +62,7 @@ type ArgoApplicationServiceImpl struct { func NewArgoApplicationServiceImpl(logger *zap.SugaredLogger, clusterRepository clusterRepository.ClusterRepository, k8sUtil *k8s.K8sServiceImpl, - argoUserService argo.ArgoUserService, helmAppClient gRPC.HelmAppClient, + helmAppClient gRPC.HelmAppClient, helmAppService service.HelmAppService, k8sApplicationService application.K8sApplicationService, argoApplicationConfigService config.ArgoApplicationConfigService) *ArgoApplicationServiceImpl { @@ -72,7 +70,6 @@ func NewArgoApplicationServiceImpl(logger *zap.SugaredLogger, logger: logger, clusterRepository: clusterRepository, k8sUtil: k8sUtil, - argoUserService: argoUserService, helmAppService: helmAppService, helmAppClient: helmAppClient, k8sApplicationService: k8sApplicationService, diff --git a/pkg/argoApplication/ArgoApplicationServiceExtended.go b/pkg/argoApplication/ArgoApplicationServiceExtended.go index 018cf5c92c..d94b4ee36a 100644 --- a/pkg/argoApplication/ArgoApplicationServiceExtended.go +++ b/pkg/argoApplication/ArgoApplicationServiceExtended.go @@ -17,7 +17,6 @@ import ( clusterRepository "github.com/devtron-labs/devtron/pkg/cluster/repository" "github.com/devtron-labs/devtron/pkg/k8s/application" "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "go.uber.org/zap" v12 "k8s.io/api/apps/v1" "strings" @@ -32,7 +31,7 @@ type ArgoApplicationServiceExtendedImpl struct { func NewArgoApplicationServiceExtendedServiceImpl(logger *zap.SugaredLogger, clusterRepository clusterRepository.ClusterRepository, k8sUtil *k8s.K8sServiceImpl, - argoUserService argo.ArgoUserService, helmAppClient gRPC.HelmAppClient, + helmAppClient gRPC.HelmAppClient, helmAppService service.HelmAppService, k8sApplicationService application.K8sApplicationService, argoApplicationConfigService config.ArgoApplicationConfigService, acdClient application3.ServiceClient) *ArgoApplicationServiceExtendedImpl { @@ -41,7 +40,6 @@ func NewArgoApplicationServiceExtendedServiceImpl(logger *zap.SugaredLogger, logger: logger, clusterRepository: clusterRepository, k8sUtil: k8sUtil, - argoUserService: argoUserService, helmAppService: helmAppService, helmAppClient: helmAppClient, k8sApplicationService: k8sApplicationService, diff --git a/pkg/argoApplication/read/ArgoApplicationReadService.go b/pkg/argoApplication/read/ArgoApplicationReadService.go index 7d4af9b31c..faf9195639 100644 --- a/pkg/argoApplication/read/ArgoApplicationReadService.go +++ b/pkg/argoApplication/read/ArgoApplicationReadService.go @@ -13,7 +13,6 @@ import ( "github.com/devtron-labs/devtron/pkg/cluster/adapter" clusterRepository "github.com/devtron-labs/devtron/pkg/cluster/repository" clientErrors "github.com/devtron-labs/devtron/pkg/errors" - "github.com/devtron-labs/devtron/util/argo" "go.uber.org/zap" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -29,7 +28,6 @@ type ArgoApplicationReadServiceImpl struct { logger *zap.SugaredLogger clusterRepository clusterRepository.ClusterRepository k8sUtil *k8s.K8sServiceImpl - argoUserService argo.ArgoUserService helmAppClient gRPC.HelmAppClient helmAppService service.HelmAppService } @@ -37,13 +35,12 @@ type ArgoApplicationReadServiceImpl struct { func NewArgoApplicationReadServiceImpl(logger *zap.SugaredLogger, clusterRepository clusterRepository.ClusterRepository, k8sUtil *k8s.K8sServiceImpl, - argoUserService argo.ArgoUserService, helmAppClient gRPC.HelmAppClient, + helmAppClient gRPC.HelmAppClient, helmAppService service.HelmAppService) *ArgoApplicationReadServiceImpl { return &ArgoApplicationReadServiceImpl{ logger: logger, clusterRepository: clusterRepository, k8sUtil: k8sUtil, - argoUserService: argoUserService, helmAppService: helmAppService, helmAppClient: helmAppClient, } diff --git a/pkg/cluster/ClusterService.go b/pkg/cluster/ClusterService.go index b7c7d4b3dd..72359a54d1 100644 --- a/pkg/cluster/ClusterService.go +++ b/pkg/cluster/ClusterService.go @@ -24,6 +24,7 @@ import ( "github.com/devtron-labs/devtron/pkg/cluster/adapter" "github.com/devtron-labs/devtron/pkg/cluster/bean" repository2 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" + "github.com/devtron-labs/devtron/pkg/cluster/read" cronUtil "github.com/devtron-labs/devtron/util/cron" "github.com/robfig/cron/v3" "log" @@ -106,6 +107,7 @@ type ClusterServiceImpl struct { userAuthRepository repository3.UserAuthRepository userRepository repository3.UserRepository roleGroupRepository repository3.RoleGroupRepository + clusterReadService read.ClusterReadService } func NewClusterServiceImpl(repository repository.ClusterRepository, logger *zap.SugaredLogger, @@ -113,7 +115,8 @@ func NewClusterServiceImpl(repository repository.ClusterRepository, logger *zap. userAuthRepository repository3.UserAuthRepository, userRepository repository3.UserRepository, roleGroupRepository repository3.RoleGroupRepository, envVariables *globalUtil.EnvironmentVariables, - cronLogger *cronUtil.CronLoggerImpl) (*ClusterServiceImpl, error) { + cronLogger *cronUtil.CronLoggerImpl, + clusterReadService read.ClusterReadService) (*ClusterServiceImpl, error) { clusterService := &ClusterServiceImpl{ clusterRepository: repository, logger: logger, @@ -122,6 +125,7 @@ func NewClusterServiceImpl(repository repository.ClusterRepository, logger *zap. userAuthRepository: userAuthRepository, userRepository: userRepository, roleGroupRepository: roleGroupRepository, + clusterReadService: clusterReadService, } // initialise cron newCron := cron.New(cron.WithChain(cron.Recover(cronLogger))) @@ -345,7 +349,7 @@ func (impl *ClusterServiceImpl) FindById(id int) (*bean.ClusterBean, error) { } func (impl *ClusterServiceImpl) FindByIdWithoutConfig(id int) (*bean.ClusterBean, error) { - model, err := impl.FindById(id) + model, err := impl.clusterReadService.FindById(id) if err != nil { return nil, err } @@ -655,7 +659,7 @@ func (impl *ClusterServiceImpl) GetAllClusterNamespaces() map[string][]string { func (impl *ClusterServiceImpl) FindAllNamespacesByUserIdAndClusterId(userId int32, clusterId int, isActionUserSuperAdmin bool) ([]string, error) { result := make([]string, 0) - clusterBean, err := impl.FindById(clusterId) + clusterBean, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("failed to find cluster for id", "error", err, "clusterId", clusterId) return nil, err @@ -1062,7 +1066,7 @@ func (impl *ClusterServiceImpl) ConvertClusterBeanObjectToCluster(bean *bean.Clu } func (impl *ClusterServiceImpl) GetClusterConfigByClusterId(clusterId int) (*k8s.ClusterConfig, error) { - clusterBean, err := impl.FindById(clusterId) + clusterBean, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in getting clusterBean by cluster id", "err", err, "clusterId", clusterId) return nil, err diff --git a/pkg/cluster/EphemeralConatinersService.go b/pkg/cluster/EphemeralConatinersService.go index bcf0773628..b7d5debd31 100644 --- a/pkg/cluster/EphemeralConatinersService.go +++ b/pkg/cluster/EphemeralConatinersService.go @@ -18,45 +18,14 @@ package cluster import ( "errors" + "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" "github.com/devtron-labs/devtron/pkg/cluster/repository" "go.uber.org/zap" "time" ) -type EphemeralContainerRequest struct { - BasicData *EphemeralContainerBasicData `json:"basicData"` - AdvancedData *EphemeralContainerAdvancedData `json:"advancedData"` - Namespace string `json:"namespace" validate:"required"` - ClusterId int `json:"clusterId" validate:"gt=0"` - PodName string `json:"podName" validate:"required"` - ExternalArgoApplicationName string `json:"externalArgoApplicationName,omitempty"` - UserId int32 `json:"-"` -} - -type EphemeralContainerAdvancedData struct { - Manifest string `json:"manifest"` -} - -type EphemeralContainerBasicData struct { - ContainerName string `json:"containerName"` - TargetContainerName string `json:"targetContainerName"` - Image string `json:"image"` -} - -func (request EphemeralContainerRequest) getContainerBean() repository.EphemeralContainerBean { - return repository.EphemeralContainerBean{ - Name: request.BasicData.ContainerName, - ClusterId: request.ClusterId, - Namespace: request.Namespace, - PodName: request.PodName, - TargetContainer: request.BasicData.TargetContainerName, - Config: request.AdvancedData.Manifest, - IsExternallyCreated: false, - } -} - type EphemeralContainerService interface { - AuditEphemeralContainerAction(model EphemeralContainerRequest, actionType repository.ContainerAction) error + AuditEphemeralContainerAction(model bean.EphemeralContainerRequest, actionType repository.ContainerAction) error } type EphemeralContainerServiceImpl struct { @@ -71,7 +40,7 @@ func NewEphemeralContainerServiceImpl(repository repository.EphemeralContainersR } } -func (impl *EphemeralContainerServiceImpl) AuditEphemeralContainerAction(model EphemeralContainerRequest, actionType repository.ContainerAction) error { +func (impl *EphemeralContainerServiceImpl) AuditEphemeralContainerAction(model bean.EphemeralContainerRequest, actionType repository.ContainerAction) error { container, err := impl.repository.FindContainerByName(model.ClusterId, model.Namespace, model.PodName, model.BasicData.ContainerName) if err != nil { @@ -99,7 +68,7 @@ func (impl *EphemeralContainerServiceImpl) AuditEphemeralContainerAction(model E var auditLogBean repository.EphemeralContainerAction if container == nil { - bean := model.getContainerBean() + bean := model.GetContainerBean() if actionType != repository.ActionCreate { // if a container is not present in database and the user is trying to access/terminate it means it is externally created bean.IsExternallyCreated = true diff --git a/pkg/cluster/bean/bean.go b/pkg/cluster/bean/bean.go index 308d64405b..3ff44f887b 100644 --- a/pkg/cluster/bean/bean.go +++ b/pkg/cluster/bean/bean.go @@ -5,6 +5,10 @@ import ( "github.com/devtron-labs/common-lib/utils/k8s/commonBean" ) +const ( + DefaultClusterId = 1 +) + type PrometheusAuth struct { UserName string `json:"userName,omitempty"` Password string `json:"password,omitempty"` diff --git a/pkg/cluster/environment/EnvironmentService.go b/pkg/cluster/environment/EnvironmentService.go index 7a0b60fe22..3a0b55f2c5 100644 --- a/pkg/cluster/environment/EnvironmentService.go +++ b/pkg/cluster/environment/EnvironmentService.go @@ -25,6 +25,7 @@ import ( adapter2 "github.com/devtron-labs/devtron/pkg/cluster/environment/adapter" bean2 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" + "github.com/devtron-labs/devtron/pkg/cluster/read" "strconv" "strings" "sync" @@ -78,13 +79,15 @@ type EnvironmentServiceImpl struct { //propertiesConfigService pipeline.PropertiesConfigService userAuthService user.UserAuthService attributesRepository repository2.AttributesRepository + clusterReadService read.ClusterReadService } func NewEnvironmentServiceImpl(environmentRepository repository.EnvironmentRepository, clusterService cluster.ClusterService, logger *zap.SugaredLogger, K8sUtil *util2.K8sServiceImpl, k8sInformerFactory informer.K8sInformerFactory, // propertiesConfigService pipeline.PropertiesConfigService, - userAuthService user.UserAuthService, attributesRepository repository2.AttributesRepository) *EnvironmentServiceImpl { + userAuthService user.UserAuthService, attributesRepository repository2.AttributesRepository, + clusterReadService read.ClusterReadService) *EnvironmentServiceImpl { return &EnvironmentServiceImpl{ environmentRepository: environmentRepository, logger: logger, @@ -94,6 +97,7 @@ func NewEnvironmentServiceImpl(environmentRepository repository.EnvironmentRepos //propertiesConfigService: propertiesConfigService, userAuthService: userAuthService, attributesRepository: attributesRepository, + clusterReadService: clusterReadService, } } @@ -108,7 +112,7 @@ func (impl EnvironmentServiceImpl) Create(mappings *bean2.EnvironmentBean, userI return nil, err } - clusterBean, err := impl.clusterService.FindById(mappings.ClusterId) + clusterBean, err := impl.clusterReadService.FindById(mappings.ClusterId) if err != nil { return nil, err } @@ -242,7 +246,7 @@ func (impl EnvironmentServiceImpl) Update(mappings *bean2.EnvironmentBean, userI isNamespaceChange = true }*/ - clusterBean, err := impl.clusterService.FindById(mappings.ClusterId) + clusterBean, err := impl.clusterReadService.FindById(mappings.ClusterId) if err != nil { return nil, err } diff --git a/pkg/cluster/environment/bean/ephemeralContainerBean.go b/pkg/cluster/environment/bean/ephemeralContainerBean.go new file mode 100644 index 0000000000..577c2dac1c --- /dev/null +++ b/pkg/cluster/environment/bean/ephemeralContainerBean.go @@ -0,0 +1,35 @@ +package bean + +import "github.com/devtron-labs/devtron/pkg/cluster/repository" + +type EphemeralContainerRequest struct { + BasicData *EphemeralContainerBasicData `json:"basicData"` + AdvancedData *EphemeralContainerAdvancedData `json:"advancedData"` + Namespace string `json:"namespace" validate:"required"` + ClusterId int `json:"clusterId" validate:"gt=0"` + PodName string `json:"podName" validate:"required"` + ExternalArgoApplicationName string `json:"externalArgoApplicationName,omitempty"` + UserId int32 `json:"-"` +} + +type EphemeralContainerAdvancedData struct { + Manifest string `json:"manifest"` +} + +type EphemeralContainerBasicData struct { + ContainerName string `json:"containerName"` + TargetContainerName string `json:"targetContainerName"` + Image string `json:"image"` +} + +func (request EphemeralContainerRequest) GetContainerBean() repository.EphemeralContainerBean { + return repository.EphemeralContainerBean{ + Name: request.BasicData.ContainerName, + ClusterId: request.ClusterId, + Namespace: request.Namespace, + PodName: request.PodName, + TargetContainer: request.BasicData.TargetContainerName, + Config: request.AdvancedData.Manifest, + IsExternallyCreated: false, + } +} diff --git a/pkg/cluster/rbac/ClusterRbacService.go b/pkg/cluster/rbac/ClusterRbacService.go index a61b543d99..f4e2f33a1d 100644 --- a/pkg/cluster/rbac/ClusterRbacService.go +++ b/pkg/cluster/rbac/ClusterRbacService.go @@ -21,6 +21,7 @@ import ( "github.com/devtron-labs/common-lib/utils/k8s" "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/cluster/environment" + "github.com/devtron-labs/devtron/pkg/cluster/read" "github.com/devtron-labs/devtron/pkg/k8s/application/bean" "github.com/devtron-labs/devtron/util/rbac" "k8s.io/apimachinery/pkg/runtime/schema" @@ -45,6 +46,7 @@ type ClusterRbacServiceImpl struct { enforcerUtil rbac.EnforcerUtil clusterService cluster.ClusterService userService user.UserService + clusterReadService read.ClusterReadService } func NewClusterRbacServiceImpl(environmentService environment.EnvironmentService, @@ -52,7 +54,9 @@ func NewClusterRbacServiceImpl(environmentService environment.EnvironmentService enforcerUtil rbac.EnforcerUtil, clusterService cluster.ClusterService, logger *zap.SugaredLogger, - userService user.UserService) *ClusterRbacServiceImpl { + userService user.UserService, + clusterReadService read.ClusterReadService, +) *ClusterRbacServiceImpl { clusterRbacService := &ClusterRbacServiceImpl{ logger: logger, environmentService: environmentService, @@ -60,13 +64,14 @@ func NewClusterRbacServiceImpl(environmentService environment.EnvironmentService enforcerUtil: enforcerUtil, clusterService: clusterService, userService: userService, + clusterReadService: clusterReadService, } return clusterRbacService } func (impl *ClusterRbacServiceImpl) CheckAuthorisationForNodeWithClusterId(token string, clusterId int, nodeName string, action string) (authenticated bool, err error) { - cluster, err := impl.clusterService.FindById(clusterId) + cluster, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error encountered in CheckAuthorisationForNodeWithClusterId", "clusterId", clusterId, "err", err) return false, err diff --git a/pkg/cluster/read/ClusterReadService.go b/pkg/cluster/read/ClusterReadService.go index 5a5f55624f..10b278bdd6 100644 --- a/pkg/cluster/read/ClusterReadService.go +++ b/pkg/cluster/read/ClusterReadService.go @@ -1,12 +1,15 @@ package read import ( + "github.com/devtron-labs/devtron/pkg/cluster/adapter" + "github.com/devtron-labs/devtron/pkg/cluster/bean" "github.com/devtron-labs/devtron/pkg/cluster/repository" "go.uber.org/zap" ) type ClusterReadService interface { IsClusterReachable(clusterId int) (bool, error) + FindById(id int) (*bean.ClusterBean, error) } type ClusterReadServiceImpl struct { @@ -34,3 +37,12 @@ func (impl *ClusterReadServiceImpl) IsClusterReachable(clusterId int) (bool, err return true, nil } + +func (impl *ClusterReadServiceImpl) FindById(id int) (*bean.ClusterBean, error) { + model, err := impl.clusterRepository.FindById(id) + if err != nil { + return nil, err + } + bean := adapter.GetClusterBean(*model) + return &bean, nil +} diff --git a/pkg/clusterTerminalAccess/UserTerminalAccessService.go b/pkg/clusterTerminalAccess/UserTerminalAccessService.go index f3b5df8ecf..b6ab4a6b09 100644 --- a/pkg/clusterTerminalAccess/UserTerminalAccessService.go +++ b/pkg/clusterTerminalAccess/UserTerminalAccessService.go @@ -28,6 +28,7 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository" utils1 "github.com/devtron-labs/devtron/pkg/clusterTerminalAccess/clusterTerminalUtils" "github.com/devtron-labs/devtron/pkg/k8s" + bean2 "github.com/devtron-labs/devtron/pkg/k8s/bean" "github.com/devtron-labs/devtron/pkg/k8s/capacity" "github.com/devtron-labs/devtron/pkg/terminal" "github.com/devtron-labs/devtron/util" @@ -742,7 +743,7 @@ func (impl *UserTerminalAccessServiceImpl) DeleteTerminalResource(ctx context.Co }, }, } - resourceRequest := &k8s.ResourceRequestBean{ + resourceRequest := &bean2.ResourceRequestBean{ K8sRequest: k8sRequest, ClusterId: clusterId, } @@ -776,7 +777,7 @@ func (impl *UserTerminalAccessServiceImpl) applyTemplate(ctx context.Context, cl }, }, } - request := &k8s.ResourceRequestBean{ + request := &bean2.ResourceRequestBean{ K8sRequest: k8sRequest, ClusterId: clusterId, } @@ -846,7 +847,7 @@ func (impl *UserTerminalAccessServiceImpl) getPodManifest(ctx context.Context, c return response.ManifestResponse, nil } -func (impl *UserTerminalAccessServiceImpl) getPodRequestBean(clusterId int, podName string, namespace string) (*k8s.ResourceRequestBean, error) { +func (impl *UserTerminalAccessServiceImpl) getPodRequestBean(clusterId int, podName string, namespace string) (*bean2.ResourceRequestBean, error) { terminalAccessPodTemplate, err := impl.TerminalAccessRepository.FetchTerminalAccessTemplate(models.TerminalAccessPodTemplateName) if err != nil { impl.Logger.Errorw("error occurred while fetching template", "template", models.TerminalAccessPodTemplateName, "err", err) @@ -858,7 +859,7 @@ func (impl *UserTerminalAccessServiceImpl) getPodRequestBean(clusterId int, podN impl.Logger.Errorw("error occurred while extracting data for gvk", "gvkDataString", gvkDataString, "err", err) return nil, err } - request := &k8s.ResourceRequestBean{ + request := &bean2.ResourceRequestBean{ ClusterId: clusterId, AppIdentifier: &bean.AppIdentifier{ ClusterId: clusterId, diff --git a/pkg/deployment/deployedApp/DeployedAppService.go b/pkg/deployment/deployedApp/DeployedAppService.go index 4765720aa1..9609e9ee56 100644 --- a/pkg/deployment/deployedApp/DeployedAppService.go +++ b/pkg/deployment/deployedApp/DeployedAppService.go @@ -30,13 +30,14 @@ import ( "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps" bean3 "github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/bean" "github.com/devtron-labs/devtron/pkg/k8s" + bean4 "github.com/devtron-labs/devtron/pkg/k8s/bean" "github.com/go-pg/pg" "go.uber.org/zap" ) type DeployedAppService interface { StopStartApp(ctx context.Context, stopRequest *bean.StopAppRequest) (int, error) - RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest) (*k8s.RotatePodResponse, error) + RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest) (*bean4.RotatePodResponse, error) } type DeployedAppServiceImpl struct { @@ -118,7 +119,7 @@ func (impl *DeployedAppServiceImpl) StopStartApp(ctx context.Context, stopReques return id, err } -func (impl *DeployedAppServiceImpl) RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest) (*k8s.RotatePodResponse, error) { +func (impl *DeployedAppServiceImpl) RotatePods(ctx context.Context, podRotateRequest *bean.PodRotateRequest) (*bean4.RotatePodResponse, error) { impl.logger.Infow("rotate pod request", "payload", podRotateRequest) //extract cluster id and namespace from env id environmentId := podRotateRequest.EnvironmentId @@ -132,7 +133,7 @@ func (impl *DeployedAppServiceImpl) RotatePods(ctx context.Context, podRotateReq resourceIdentifier.Namespace = environment.Namespace resourceIdentifiers = append(resourceIdentifiers, resourceIdentifier) } - rotatePodRequest := &k8s.RotatePodRequest{ + rotatePodRequest := &bean4.RotatePodRequest{ ClusterId: environment.ClusterId, Resources: resourceIdentifiers, } diff --git a/pkg/deployment/manifest/ManifestCreationService.go b/pkg/deployment/manifest/ManifestCreationService.go index 525d8c9c1b..7ed01df206 100644 --- a/pkg/deployment/manifest/ManifestCreationService.go +++ b/pkg/deployment/manifest/ManifestCreationService.go @@ -45,6 +45,7 @@ import ( "github.com/devtron-labs/devtron/pkg/dockerRegistry" "github.com/devtron-labs/devtron/pkg/imageDigestPolicy" "github.com/devtron-labs/devtron/pkg/k8s" + bean4 "github.com/devtron-labs/devtron/pkg/k8s/bean" repository3 "github.com/devtron-labs/devtron/pkg/pipeline/history/repository" "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/variables" @@ -841,7 +842,7 @@ func (impl *ManifestCreationServiceImpl) getK8sHPAResourceManifest(ctx context.C WithInternalMessage("unable to find preferred version for hpa resource"). WithUserDetailMessage("unable to find preferred version for hpa resource") } - k8sReq := &k8s.ResourceRequestBean{ + k8sReq := &bean4.ResourceRequestBean{ ClusterId: clusterId, K8sRequest: k8sUtil.NewK8sRequestBean(). WithResourceIdentifier( diff --git a/pkg/deployment/trigger/devtronApps/TriggerService.go b/pkg/deployment/trigger/devtronApps/TriggerService.go index 423ce89b94..102cf9158f 100644 --- a/pkg/deployment/trigger/devtronApps/TriggerService.go +++ b/pkg/deployment/trigger/devtronApps/TriggerService.go @@ -82,7 +82,6 @@ import ( "github.com/devtron-labs/devtron/pkg/variables" "github.com/devtron-labs/devtron/pkg/workflow/cd" globalUtil "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" util2 "github.com/devtron-labs/devtron/util/event" "github.com/devtron-labs/devtron/util/rbac" "github.com/go-pg/pg" @@ -130,7 +129,6 @@ type TriggerServiceImpl struct { workflowEventPublishService out.WorkflowEventPublishService manifestCreationService manifest.ManifestCreationService deployedConfigurationHistoryService history.DeployedConfigurationHistoryService - argoUserService argo.ArgoUserService pipelineStageService pipeline.PipelineStageService globalPluginService plugin.GlobalPluginService customTagService pipeline.CustomTagService @@ -188,7 +186,6 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, workflowEventPublishService out.WorkflowEventPublishService, manifestCreationService manifest.ManifestCreationService, deployedConfigurationHistoryService history.DeployedConfigurationHistoryService, - argoUserService argo.ArgoUserService, pipelineStageService pipeline.PipelineStageService, globalPluginService plugin.GlobalPluginService, customTagService pipeline.CustomTagService, @@ -247,7 +244,6 @@ func NewTriggerServiceImpl(logger *zap.SugaredLogger, workflowEventPublishService: workflowEventPublishService, manifestCreationService: manifestCreationService, deployedConfigurationHistoryService: deployedConfigurationHistoryService, - argoUserService: argoUserService, pipelineStageService: pipelineStageService, globalPluginService: globalPluginService, customTagService: customTagService, @@ -748,13 +744,8 @@ func (impl *TriggerServiceImpl) releasePipeline(ctx context.Context, pipeline *p adapter.SetPipelineFieldsInOverrideRequest(request, pipeline, envDeploymentConfig) - releaseCtx, err := impl.argoUserService.GetACDContext(ctx) - if err != nil { - impl.logger.Errorw("error in creating acd sync context", "pipelineId", pipeline.Id, "artifactId", artifact.Id, "err", err) - return err - } // setting deployedBy as 1(system user) since case of auto trigger - id, _, err := impl.handleCDTriggerRelease(releaseCtx, request, envDeploymentConfig, triggeredAt, 1) + id, _, err := impl.handleCDTriggerRelease(ctx, request, envDeploymentConfig, triggeredAt, 1) if err != nil { impl.logger.Errorw("error in auto cd pipeline trigger", "pipelineId", pipeline.Id, "artifactId", artifact.Id, "err", err) } else { diff --git a/pkg/dockerRegistry/DockerRegistryIpsConfigService.go b/pkg/dockerRegistry/DockerRegistryIpsConfigService.go index bdd684d9de..8e8dcd57ee 100644 --- a/pkg/dockerRegistry/DockerRegistryIpsConfigService.go +++ b/pkg/dockerRegistry/DockerRegistryIpsConfigService.go @@ -24,8 +24,8 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/dockerRegistry" util2 "github.com/devtron-labs/devtron/internal/util" ciConfig "github.com/devtron-labs/devtron/pkg/build/pipeline/read" - "github.com/devtron-labs/devtron/pkg/cluster" repository2 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" + "github.com/devtron-labs/devtron/pkg/cluster/read" "github.com/go-pg/pg" "go.opentelemetry.io/otel" "go.uber.org/zap" @@ -45,21 +45,22 @@ type DockerRegistryIpsConfigServiceImpl struct { logger *zap.SugaredLogger dockerRegistryIpsConfigRepository repository.DockerRegistryIpsConfigRepository k8sUtil *k8s.K8sServiceImpl - clusterService cluster.ClusterService dockerArtifactStoreRepository repository.DockerArtifactStoreRepository + clusterReadService read.ClusterReadService ciPipelineConfigReadService ciConfig.CiPipelineConfigReadService } func NewDockerRegistryIpsConfigServiceImpl(logger *zap.SugaredLogger, dockerRegistryIpsConfigRepository repository.DockerRegistryIpsConfigRepository, - k8sUtil *k8s.K8sServiceImpl, clusterService cluster.ClusterService, + k8sUtil *k8s.K8sServiceImpl, dockerArtifactStoreRepository repository.DockerArtifactStoreRepository, + clusterReadService read.ClusterReadService, ciPipelineConfigReadService ciConfig.CiPipelineConfigReadService) *DockerRegistryIpsConfigServiceImpl { return &DockerRegistryIpsConfigServiceImpl{ logger: logger, dockerRegistryIpsConfigRepository: dockerRegistryIpsConfigRepository, k8sUtil: k8sUtil, - clusterService: clusterService, dockerArtifactStoreRepository: dockerArtifactStoreRepository, + clusterReadService: clusterReadService, ciPipelineConfigReadService: ciPipelineConfigReadService, } } @@ -205,7 +206,7 @@ func (impl DockerRegistryIpsConfigServiceImpl) createOrUpdateDockerRegistryImage } } - clusterBean, err := impl.clusterService.FindById(clusterId) + clusterBean, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in getting cluster", "clusterId", clusterId, "error", err) return err diff --git a/pkg/eventProcessor/in/CDPipelineEventProcessorService.go b/pkg/eventProcessor/in/CDPipelineEventProcessorService.go index d1b6add0aa..5a54759107 100644 --- a/pkg/eventProcessor/in/CDPipelineEventProcessorService.go +++ b/pkg/eventProcessor/in/CDPipelineEventProcessorService.go @@ -29,7 +29,6 @@ import ( "github.com/devtron-labs/devtron/pkg/eventProcessor/bean" "github.com/devtron-labs/devtron/pkg/workflow/cd" "github.com/devtron-labs/devtron/pkg/workflow/status" - "github.com/devtron-labs/devtron/util/argo" "go.uber.org/zap" "k8s.io/utils/pointer" ) @@ -40,7 +39,6 @@ type CDPipelineEventProcessorImpl struct { cdWorkflowCommonService cd.CdWorkflowCommonService workflowStatusService status.WorkflowStatusService cdTriggerService devtronApps.TriggerService - argoUserService argo.ArgoUserService pipelineRepository pipelineConfig.PipelineRepository installedAppReadService installedAppReader.InstalledAppReadService } @@ -50,7 +48,6 @@ func NewCDPipelineEventProcessorImpl(logger *zap.SugaredLogger, cdWorkflowCommonService cd.CdWorkflowCommonService, workflowStatusService status.WorkflowStatusService, cdTriggerService devtronApps.TriggerService, - argoUserService argo.ArgoUserService, pipelineRepository pipelineConfig.PipelineRepository, installedAppReadService installedAppReader.InstalledAppReadService) *CDPipelineEventProcessorImpl { cdPipelineEventProcessorImpl := &CDPipelineEventProcessorImpl{ @@ -59,7 +56,6 @@ func NewCDPipelineEventProcessorImpl(logger *zap.SugaredLogger, cdWorkflowCommonService: cdWorkflowCommonService, workflowStatusService: workflowStatusService, cdTriggerService: cdTriggerService, - argoUserService: argoUserService, pipelineRepository: pipelineRepository, installedAppReadService: installedAppReadService, } @@ -77,14 +73,10 @@ func (impl *CDPipelineEventProcessorImpl) SubscribeCDBulkTriggerTopic() error { } event.ValuesOverrideRequest.UserId = event.UserId // trigger - ctx, err := impl.argoUserService.GetACDContext(context2.Background()) - if err != nil { - impl.logger.Errorw("error in creating acd context", "err", err) - return - } + triggerContext := bean2.TriggerContext{ ReferenceId: pointer.String(msg.MsgId), - Context: ctx, + Context: context2.Background(), } _, _, _, err = impl.cdTriggerService.ManualCdTrigger(triggerContext, event.ValuesOverrideRequest) if err != nil { diff --git a/pkg/eventProcessor/in/WorkflowEventProcessorService.go b/pkg/eventProcessor/in/WorkflowEventProcessorService.go index d14aa96ca4..b3057da86b 100644 --- a/pkg/eventProcessor/in/WorkflowEventProcessorService.go +++ b/pkg/eventProcessor/in/WorkflowEventProcessorService.go @@ -53,7 +53,6 @@ import ( "github.com/devtron-labs/devtron/pkg/workflow/dag" wrokflowDagBean "github.com/devtron-labs/devtron/pkg/workflow/dag/bean" globalUtil "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" error2 "github.com/devtron-labs/devtron/util/error" eventUtil "github.com/devtron-labs/devtron/util/event" "github.com/go-pg/pg" @@ -75,7 +74,6 @@ type WorkflowEventProcessorImpl struct { cdWorkflowRunnerService cd.CdWorkflowRunnerService cdWorkflowRunnerReadService read.CdWorkflowRunnerReadService workflowDagExecutor dag.WorkflowDagExecutor - argoUserService argo.ArgoUserService ciHandler pipeline.CiHandler cdHandler pipeline.CdHandler eventFactory client.EventFactory @@ -107,7 +105,6 @@ func NewWorkflowEventProcessorImpl(logger *zap.SugaredLogger, cdWorkflowRunnerService cd.CdWorkflowRunnerService, cdWorkflowRunnerReadService read.CdWorkflowRunnerReadService, workflowDagExecutor dag.WorkflowDagExecutor, - argoUserService argo.ArgoUserService, ciHandler pipeline.CiHandler, cdHandler pipeline.CdHandler, eventFactory client.EventFactory, eventClient client.EventClient, cdTriggerService devtronApps.TriggerService, @@ -129,7 +126,6 @@ func NewWorkflowEventProcessorImpl(logger *zap.SugaredLogger, cdWorkflowReadService: cdWorkflowReadService, cdWorkflowRunnerService: cdWorkflowRunnerService, cdWorkflowRunnerReadService: cdWorkflowRunnerReadService, - argoUserService: argoUserService, ciHandler: ciHandler, cdHandler: cdHandler, eventFactory: eventFactory, @@ -351,11 +347,7 @@ func (impl *WorkflowEventProcessorImpl) SubscribeHibernateBulkAction() error { RequestType: deploymentGroupAppWithEnv.RequestType, ReferenceId: pointer.String(msg.MsgId), } - ctx, err := impl.argoUserService.GetACDContext(context.Background()) - if err != nil { - impl.logger.Errorw("error in creating acd sync context", "err", err) - return - } + ctx := context.Background() _, err = impl.deployedAppService.StopStartApp(ctx, stopAppRequest) if err != nil { impl.logger.Errorw("error in stop app request", "err", err) @@ -938,12 +930,8 @@ func (impl *WorkflowEventProcessorImpl) ProcessConcurrentAsyncDeploymentReq(ctx return err } impl.logger.Debugw("currently in ProcessConcurrentAsyncDeploymentReq", "pipelineId", pipelineId, "cdWfrId", cdWfrId) - acdCtx, err := impl.argoUserService.GetACDContext(newCtx) - if err != nil { - impl.logger.Errorw("error in creating ArgoCd context", "err", err) - return err - } - releaseContext, skipRequest, err := impl.getDevtronAppReleaseContextWithLock(acdCtx, cdAsyncInstallReq, cdWfr) + + releaseContext, skipRequest, err := impl.getDevtronAppReleaseContextWithLock(newCtx, cdAsyncInstallReq, cdWfr) if err != nil { impl.logger.Errorw("error, getDevtronAppReleaseContextWithLock", "err", err, "cdWfrId", cdWfrId, "cdWfrStatus", cdWfr.Status, "pipelineId", pipelineId) return err diff --git a/pkg/gitops/GitOpsConfigService.go b/pkg/gitops/GitOpsConfigService.go index 6d0ce2af14..d938e47fff 100644 --- a/pkg/gitops/GitOpsConfigService.go +++ b/pkg/gitops/GitOpsConfigService.go @@ -27,6 +27,7 @@ import ( "github.com/devtron-labs/devtron/api/bean" apiBean "github.com/devtron-labs/devtron/api/bean/gitOps" "github.com/devtron-labs/devtron/client/argocdServer/certificate" + "github.com/devtron-labs/devtron/client/argocdServer/connection" repocreds "github.com/devtron-labs/devtron/client/argocdServer/repocreds" repository2 "github.com/devtron-labs/devtron/client/argocdServer/repository" "github.com/devtron-labs/devtron/pkg/deployment/gitOps/config" @@ -45,7 +46,6 @@ import ( "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/sql" util3 "github.com/devtron-labs/devtron/pkg/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/go-pg/pg" "go.uber.org/zap" "k8s.io/apimachinery/pkg/api/errors" @@ -67,7 +67,6 @@ type GitOpsConfigServiceImpl struct { K8sUtil *util4.K8sServiceImpl aCDAuthConfig *util3.ACDAuthConfig clusterService cluster.ClusterService - argoUserService argo.ArgoUserService clusterServiceCD cluster2.ServiceClient gitOpsConfigReadService config.GitOpsConfigReadService gitOperationService git.GitOperationService @@ -75,27 +74,29 @@ type GitOpsConfigServiceImpl struct { argoCertificateClient certificate.Client argoRepoService repository2.ServiceClient repocreds repocreds.ServiceClient + devtronSecretConfig *util2.DevtronSecretConfig + argoCDConnectionManager connection.ArgoCDConnectionManager } func NewGitOpsConfigServiceImpl(Logger *zap.SugaredLogger, gitOpsRepository repository.GitOpsConfigRepository, K8sUtil *util4.K8sServiceImpl, aCDAuthConfig *util3.ACDAuthConfig, clusterService cluster.ClusterService, - argoUserService argo.ArgoUserService, clusterServiceCD cluster2.ServiceClient, gitOperationService git.GitOperationService, gitOpsConfigReadService config.GitOpsConfigReadService, gitOpsValidationService validation.GitOpsValidationService, argoCertificateClient certificate.Client, argoRepoService repository2.ServiceClient, - repocreds repocreds.ServiceClient) *GitOpsConfigServiceImpl { + repocreds repocreds.ServiceClient, + environmentVariables *util2.EnvironmentVariables, + argoCDConnectionManager connection.ArgoCDConnectionManager) *GitOpsConfigServiceImpl { return &GitOpsConfigServiceImpl{ logger: Logger, gitOpsRepository: gitOpsRepository, K8sUtil: K8sUtil, aCDAuthConfig: aCDAuthConfig, clusterService: clusterService, - argoUserService: argoUserService, clusterServiceCD: clusterServiceCD, gitOpsConfigReadService: gitOpsConfigReadService, gitOperationService: gitOperationService, @@ -103,6 +104,8 @@ func NewGitOpsConfigServiceImpl(Logger *zap.SugaredLogger, argoCertificateClient: argoCertificateClient, argoRepoService: argoRepoService, repocreds: repocreds, + devtronSecretConfig: environmentVariables.DevtronSecretConfig, + argoCDConnectionManager: argoCDConnectionManager, } } @@ -110,9 +113,8 @@ func (impl *GitOpsConfigServiceImpl) ValidateAndCreateGitOpsConfig(config *apiBe detailedErrorGitOpsConfigResponse := impl.GitOpsValidateDryRun(config) if len(detailedErrorGitOpsConfigResponse.StageErrorMap) == 0 { //create argo-cd user, if not created, here argo-cd integration has to be installed - token := impl.argoUserService.GetOrUpdateArgoCdUserDetail() - ctx := context.WithValue(context.Background(), "token", token) - _, err := impl.createGitOpsConfig(ctx, config) + _ = impl.argoCDConnectionManager.GetOrUpdateArgoCdUserDetail() + _, err := impl.createGitOpsConfig(context.Background(), config) if err != nil { impl.logger.Errorw("service err, SaveGitRepoConfig", "err", err, "payload", config) return detailedErrorGitOpsConfigResponse, err @@ -164,6 +166,7 @@ func (impl *GitOpsConfigServiceImpl) ValidateAndUpdateGitOpsConfig(config *apiBe } } } + _ = impl.argoCDConnectionManager.GetOrUpdateArgoCdUserDetail() detailedErrorGitOpsConfigResponse := impl.GitOpsValidateDryRun(config) if len(detailedErrorGitOpsConfigResponse.StageErrorMap) == 0 { err := impl.updateGitOpsConfig(config) @@ -560,19 +563,12 @@ func (impl *GitOpsConfigServiceImpl) updateGitOpsConfig(request *apiBean.GitOpsC if model.EnableTLSVerification { - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return err - } - ctx := context.WithValue(context.Background(), "token", acdToken) - err = impl.gitOperationService.UpdateGitHostUrlByProvider(request) if err != nil { return err } - _, err = impl.repocreds.CreateRepoCreds(ctx, &repocreds2.RepoCredsCreateRequest{ + _, err = impl.repocreds.CreateRepoCreds(context.Background(), &repocreds2.RepoCredsCreateRequest{ Creds: &v1alpha1.RepoCreds{ URL: request.Host, Username: model.Username, @@ -587,7 +583,7 @@ func (impl *GitOpsConfigServiceImpl) updateGitOpsConfig(request *apiBean.GitOpsC return err } - err = impl.addCACertInArgoIfPresent(ctx, model) + err = impl.addCACertInArgoIfPresent(context.Background(), model) if err != nil { impl.logger.Errorw("error in adding ca cert to argo", "err", err) return err diff --git a/pkg/k8s/K8sCommonService.go b/pkg/k8s/K8sCommonService.go index 223b7bac15..c717614562 100644 --- a/pkg/k8s/K8sCommonService.go +++ b/pkg/k8s/K8sCommonService.go @@ -26,9 +26,11 @@ import ( helmBean "github.com/devtron-labs/devtron/api/helm-app/service/bean" internalUtil "github.com/devtron-labs/devtron/internal/util" "github.com/devtron-labs/devtron/pkg/argoApplication/read/config" - "github.com/devtron-labs/devtron/pkg/cluster" bean2 "github.com/devtron-labs/devtron/pkg/cluster/bean" + bean4 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" + "github.com/devtron-labs/devtron/pkg/cluster/read" bean3 "github.com/devtron-labs/devtron/pkg/k8s/application/bean" + bean5 "github.com/devtron-labs/devtron/pkg/k8s/bean" "github.com/devtron-labs/devtron/util" "go.opentelemetry.io/otel" "go.uber.org/zap" @@ -47,21 +49,21 @@ import ( ) type K8sCommonService interface { - GetResource(ctx context.Context, request *ResourceRequestBean) (resp *ResourceGetResponse, err error) - GetDataFromConfigMaps(ctx context.Context, request *CmCsRequestBean) (map[string]*apiV1.ConfigMap, error) - GetDataFromSecrets(ctx context.Context, request *CmCsRequestBean) (map[string]*apiV1.Secret, error) - UpdateResource(ctx context.Context, request *ResourceRequestBean) (resp *k8s.ManifestResponse, err error) - DeleteResource(ctx context.Context, request *ResourceRequestBean) (resp *k8s.ManifestResponse, err error) - ListEvents(ctx context.Context, request *ResourceRequestBean) (*k8s.EventsResponse, error) + GetResource(ctx context.Context, request *bean5.ResourceRequestBean) (resp *bean5.ResourceGetResponse, err error) + GetDataFromConfigMaps(ctx context.Context, request *bean5.CmCsRequestBean) (map[string]*apiV1.ConfigMap, error) + GetDataFromSecrets(ctx context.Context, request *bean5.CmCsRequestBean) (map[string]*apiV1.Secret, error) + UpdateResource(ctx context.Context, request *bean5.ResourceRequestBean) (resp *k8s.ManifestResponse, err error) + DeleteResource(ctx context.Context, request *bean5.ResourceRequestBean) (resp *k8s.ManifestResponse, err error) + ListEvents(ctx context.Context, request *bean5.ResourceRequestBean) (*k8s.EventsResponse, error) GetRestConfigByClusterId(ctx context.Context, clusterId int) (*rest.Config, error, *bean2.ClusterBean) - GetManifestsByBatch(ctx context.Context, request []ResourceRequestBean) ([]BatchResourceResponse, error) - FilterK8sResources(ctx context.Context, resourceTreeInf map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string, externalArgoAppName string) []ResourceRequestBean - RotatePods(ctx context.Context, request *RotatePodRequest) (*RotatePodResponse, error) + GetManifestsByBatch(ctx context.Context, request []bean5.ResourceRequestBean) ([]bean5.BatchResourceResponse, error) + FilterK8sResources(ctx context.Context, resourceTreeInf map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string, externalArgoAppName string) []bean5.ResourceRequestBean + RotatePods(ctx context.Context, request *bean5.RotatePodRequest) (*bean5.RotatePodResponse, error) GetCoreClientByClusterId(clusterId int) (*kubernetes.Clientset, *clientV1.CoreV1Client, error) - GetCoreClientByClusterIdForExternalArgoApps(req *cluster.EphemeralContainerRequest) (*kubernetes.Clientset, *clientV1.CoreV1Client, error) + GetCoreClientByClusterIdForExternalArgoApps(req *bean4.EphemeralContainerRequest) (*kubernetes.Clientset, *clientV1.CoreV1Client, error) GetK8sServerVersion(clusterId int) (*version.Info, error) - PortNumberExtraction(resp []BatchResourceResponse, resourceTree map[string]interface{}) map[string]interface{} - GetRestConfigOfCluster(ctx context.Context, request *ResourceRequestBean) (*rest.Config, error) + PortNumberExtraction(resp []bean5.BatchResourceResponse, resourceTree map[string]interface{}) map[string]interface{} + GetRestConfigOfCluster(ctx context.Context, request *bean5.ResourceRequestBean) (*rest.Config, error) GetK8sConfigAndClients(ctx context.Context, cluster *bean2.ClusterBean) (*rest.Config, *http.Client, *kubernetes.Clientset, error) GetK8sConfigAndClientsByClusterId(ctx context.Context, clusterId int) (*rest.Config, *http.Client, *kubernetes.Clientset, error) GetPreferredVersionForAPIGroup(ctx context.Context, clusterId int, groupName string) (string, error) @@ -70,9 +72,9 @@ type K8sCommonService interface { type K8sCommonServiceImpl struct { logger *zap.SugaredLogger K8sUtil *k8s.K8sServiceImpl - clusterService cluster.ClusterService K8sApplicationServiceConfig *K8sApplicationServiceConfig argoApplicationConfigService config.ArgoApplicationConfigService + ClusterReadService read.ClusterReadService } type K8sApplicationServiceConfig struct { BatchSize int `env:"BATCH_SIZE" envDefault:"5"` @@ -80,8 +82,8 @@ type K8sApplicationServiceConfig struct { } func NewK8sCommonServiceImpl(Logger *zap.SugaredLogger, k8sUtils *k8s.K8sServiceImpl, - clusterService cluster.ClusterService, - argoApplicationConfigService config.ArgoApplicationConfigService) *K8sCommonServiceImpl { + argoApplicationConfigService config.ArgoApplicationConfigService, + ClusterReadService read.ClusterReadService) *K8sCommonServiceImpl { cfg := &K8sApplicationServiceConfig{} err := env.Parse(cfg) if err != nil { @@ -90,13 +92,13 @@ func NewK8sCommonServiceImpl(Logger *zap.SugaredLogger, k8sUtils *k8s.K8sService return &K8sCommonServiceImpl{ logger: Logger, K8sUtil: k8sUtils, - clusterService: clusterService, K8sApplicationServiceConfig: cfg, argoApplicationConfigService: argoApplicationConfigService, + ClusterReadService: ClusterReadService, } } -func (impl *K8sCommonServiceImpl) GetResource(ctx context.Context, request *ResourceRequestBean) (*ResourceGetResponse, error) { +func (impl *K8sCommonServiceImpl) GetResource(ctx context.Context, request *bean5.ResourceRequestBean) (*bean5.ResourceGetResponse, error) { clusterId := request.ClusterId //getting rest config by clusterId resourceIdentifier := request.K8sRequest.ResourceIdentifier @@ -111,13 +113,13 @@ func (impl *K8sCommonServiceImpl) GetResource(ctx context.Context, request *Reso impl.logger.Errorw("error in getting resource", "err", err, "resource", resourceIdentifier.Name) return nil, err } - response := &ResourceGetResponse{ + response := &bean5.ResourceGetResponse{ ManifestResponse: resp, } return response, nil } -func (impl *K8sCommonServiceImpl) GetDataFromConfigMaps(ctx context.Context, request *CmCsRequestBean) (map[string]*apiV1.ConfigMap, error) { +func (impl *K8sCommonServiceImpl) GetDataFromConfigMaps(ctx context.Context, request *bean5.CmCsRequestBean) (map[string]*apiV1.ConfigMap, error) { newCtx, span := otel.Tracer("orchestrator").Start(ctx, "K8sCommonServiceImpl.GetDataFromConfigMaps") defer span.End() response := make(map[string]*apiV1.ConfigMap, len(request.GetExternalCmList())) @@ -126,7 +128,7 @@ func (impl *K8sCommonServiceImpl) GetDataFromConfigMaps(ctx context.Context, req } _, v1Client, err := impl.GetCoreClientByClusterId(request.GetClusterId()) if err != nil { - impl.logger.Errorw("error in getting coreV1 client by clusterId", "clusterId", request.clusterId, "err", err) + impl.logger.Errorw("error in getting coreV1 client by clusterId", "clusterId", request.GetClusterId(), "err", err) return nil, err } // using for loop instead of getting all configMaps at once since request.GetExternalCmList() will be small @@ -141,7 +143,7 @@ func (impl *K8sCommonServiceImpl) GetDataFromConfigMaps(ctx context.Context, req return response, nil } -func (impl *K8sCommonServiceImpl) GetDataFromSecrets(ctx context.Context, request *CmCsRequestBean) (map[string]*apiV1.Secret, error) { +func (impl *K8sCommonServiceImpl) GetDataFromSecrets(ctx context.Context, request *bean5.CmCsRequestBean) (map[string]*apiV1.Secret, error) { newCtx, span := otel.Tracer("orchestrator").Start(ctx, "K8sCommonServiceImpl.GetDataFromConfigMaps") defer span.End() response := make(map[string]*apiV1.Secret, len(request.GetExternalCmList())) @@ -150,14 +152,14 @@ func (impl *K8sCommonServiceImpl) GetDataFromSecrets(ctx context.Context, reques } _, v1Client, err := impl.GetCoreClientByClusterId(request.GetClusterId()) if err != nil { - impl.logger.Errorw("error in getting coreV1 client by clusterId", "clusterId", request.clusterId, "err", err) + impl.logger.Errorw("error in getting coreV1 client by clusterId", "clusterId", request.GetClusterId(), "err", err) return nil, err } // using for loop instead of getting all secrets at once since request.GetExternalCsList() will be small for _, csName := range request.GetExternalCsList() { secret, err := impl.K8sUtil.GetSecretWithCtx(newCtx, request.GetNamespace(), csName, v1Client) if err != nil { - impl.logger.Errorw("error in getting configMap", "namespace", request.namespace, "csName", csName, "err", err) + impl.logger.Errorw("error in getting configMap", "namespace", request.GetNamespace(), "csName", csName, "err", err) return nil, err } response[csName] = secret @@ -165,7 +167,7 @@ func (impl *K8sCommonServiceImpl) GetDataFromSecrets(ctx context.Context, reques return response, nil } -func (impl *K8sCommonServiceImpl) UpdateResource(ctx context.Context, request *ResourceRequestBean) (*k8s.ManifestResponse, error) { +func (impl *K8sCommonServiceImpl) UpdateResource(ctx context.Context, request *bean5.ResourceRequestBean) (*k8s.ManifestResponse, error) { //getting rest config by clusterId clusterId := request.ClusterId @@ -187,7 +189,7 @@ func (impl *K8sCommonServiceImpl) UpdateResource(ctx context.Context, request *R } return resp, nil } -func (impl *K8sCommonServiceImpl) GetRestConfigOfCluster(ctx context.Context, request *ResourceRequestBean) (*rest.Config, error) { +func (impl *K8sCommonServiceImpl) GetRestConfigOfCluster(ctx context.Context, request *bean5.ResourceRequestBean) (*rest.Config, error) { //getting rest config by clusterId clusterId := request.ClusterId if len(request.ExternalArgoApplicationName) > 0 { @@ -207,7 +209,7 @@ func (impl *K8sCommonServiceImpl) GetRestConfigOfCluster(ctx context.Context, re } } -func (impl *K8sCommonServiceImpl) DeleteResource(ctx context.Context, request *ResourceRequestBean) (*k8s.ManifestResponse, error) { +func (impl *K8sCommonServiceImpl) DeleteResource(ctx context.Context, request *bean5.ResourceRequestBean) (*k8s.ManifestResponse, error) { //getting rest config by clusterId clusterId := request.ClusterId restConfig, err := impl.GetRestConfigOfCluster(ctx, request) @@ -224,7 +226,7 @@ func (impl *K8sCommonServiceImpl) DeleteResource(ctx context.Context, request *R return resp, nil } -func (impl *K8sCommonServiceImpl) ListEvents(ctx context.Context, request *ResourceRequestBean) (*k8s.EventsResponse, error) { +func (impl *K8sCommonServiceImpl) ListEvents(ctx context.Context, request *bean5.ResourceRequestBean) (*k8s.EventsResponse, error) { resourceIdentifier := request.K8sRequest.ResourceIdentifier restConfig, err := impl.GetRestConfigOfCluster(ctx, request) if err != nil { @@ -241,8 +243,8 @@ func (impl *K8sCommonServiceImpl) ListEvents(ctx context.Context, request *Resou } -func (impl *K8sCommonServiceImpl) FilterK8sResources(ctx context.Context, resourceTree map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string, externalArgoAppName string) []ResourceRequestBean { - validRequests := make([]ResourceRequestBean, 0) +func (impl *K8sCommonServiceImpl) FilterK8sResources(ctx context.Context, resourceTree map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string, externalArgoAppName string) []bean5.ResourceRequestBean { + validRequests := make([]bean5.ResourceRequestBean, 0) kindsToBeFilteredMap := util.ConvertStringSliceToMap(kindsToBeFiltered) resourceTreeNodes, ok := resourceTree["nodes"] if !ok { @@ -263,7 +265,7 @@ func (impl *K8sCommonServiceImpl) FilterK8sResources(ctx context.Context, resour if kindsToBeFilteredMap[kind] { group := impl.extractResourceValue(resourceItem, k8sCommonBean.Group) version := impl.extractResourceValue(resourceItem, k8sCommonBean.Version) - req := ResourceRequestBean{ + req := bean5.ResourceRequestBean{ AppId: appId, ClusterId: appDetail.ClusterId, AppIdentifier: &helmBean.AppIdentifier{ @@ -288,9 +290,9 @@ func (impl *K8sCommonServiceImpl) FilterK8sResources(ctx context.Context, resour return validRequests } -func (impl *K8sCommonServiceImpl) GetManifestsByBatch(ctx context.Context, requests []ResourceRequestBean) ([]BatchResourceResponse, error) { - ch := make(chan []BatchResourceResponse) - var res []BatchResourceResponse +func (impl *K8sCommonServiceImpl) GetManifestsByBatch(ctx context.Context, requests []bean5.ResourceRequestBean) ([]bean5.BatchResourceResponse, error) { + ch := make(chan []bean5.BatchResourceResponse) + var res []bean5.BatchResourceResponse ctx, cancel := context.WithTimeout(ctx, time.Duration(impl.K8sApplicationServiceConfig.TimeOutInSeconds)*time.Second) defer cancel() go func() { @@ -315,7 +317,7 @@ func (impl *K8sCommonServiceImpl) GetManifestsByBatch(ctx context.Context, reque func (impl *K8sCommonServiceImpl) GetRestConfigByClusterId(ctx context.Context, clusterId int) (*rest.Config, error, *bean2.ClusterBean) { _, span := otel.Tracer("orchestrator").Start(ctx, "K8sApplicationService.GetRestConfigByClusterId") defer span.End() - cluster, err := impl.clusterService.FindById(clusterId) + cluster, err := impl.ClusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in getting cluster by ID", "err", err, "clusterId", clusterId) return nil, err, nil @@ -329,7 +331,7 @@ func (impl *K8sCommonServiceImpl) GetRestConfigByClusterId(ctx context.Context, return restConfig, nil, cluster } -func (impl *K8sCommonServiceImpl) RotatePods(ctx context.Context, request *RotatePodRequest) (*RotatePodResponse, error) { +func (impl *K8sCommonServiceImpl) RotatePods(ctx context.Context, request *bean5.RotatePodRequest) (*bean5.RotatePodResponse, error) { clusterId := request.ClusterId restConfig, err, _ := impl.GetRestConfigByClusterId(ctx, clusterId) @@ -337,7 +339,7 @@ func (impl *K8sCommonServiceImpl) RotatePods(ctx context.Context, request *Rotat impl.logger.Errorw("error in getting rest config by cluster", "clusterId", clusterId, "err", err) return nil, err } - response := &RotatePodResponse{} + response := &bean5.RotatePodResponse{} var resourceResponses []*bean3.RotatePodResourceResponse var containsError bool for _, resourceIdentifier := range request.Resources { @@ -378,7 +380,7 @@ func (impl *K8sCommonServiceImpl) RotatePods(ctx context.Context, request *Rotat return response, nil } -func (impl *K8sCommonServiceImpl) getManifestsByBatch(ctx context.Context, requests []ResourceRequestBean) []BatchResourceResponse { +func (impl *K8sCommonServiceImpl) getManifestsByBatch(ctx context.Context, requests []bean5.ResourceRequestBean) []bean5.BatchResourceResponse { //total batch length batchSize := impl.K8sApplicationServiceConfig.BatchSize if requests == nil { @@ -386,7 +388,7 @@ func (impl *K8sCommonServiceImpl) getManifestsByBatch(ctx context.Context, reque } requestsLength := len(requests) //final batch responses - res := make([]BatchResourceResponse, requestsLength) + res := make([]bean5.BatchResourceResponse, requestsLength) for i := 0; i < requestsLength; { //requests left to process remainingBatch := requestsLength - i @@ -397,7 +399,7 @@ func (impl *K8sCommonServiceImpl) getManifestsByBatch(ctx context.Context, reque for j := 0; j < batchSize; j++ { wg.Add(1) go func(j int) { - resp := BatchResourceResponse{} + resp := bean5.BatchResourceResponse{} response, err := impl.GetResource(ctx, &requests[i+j]) if response != nil { resp.ManifestResponse = response.ManifestResponse @@ -435,7 +437,7 @@ func (impl *K8sCommonServiceImpl) GetK8sServerVersion(clusterId int) (*version.I } func (impl *K8sCommonServiceImpl) GetCoreClientByClusterId(clusterId int) (*kubernetes.Clientset, *clientV1.CoreV1Client, error) { - clusterBean, err := impl.clusterService.FindById(clusterId) + clusterBean, err := impl.ClusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error occurred in finding clusterBean by Id", "clusterId", clusterId, "err", err) return nil, nil, err @@ -457,7 +459,7 @@ func (impl *K8sCommonServiceImpl) GetCoreClientByClusterId(clusterId int) (*kube return clientSet, v1Client, nil } -func (impl *K8sCommonServiceImpl) GetCoreClientByClusterIdForExternalArgoApps(req *cluster.EphemeralContainerRequest) (*kubernetes.Clientset, *clientV1.CoreV1Client, error) { +func (impl *K8sCommonServiceImpl) GetCoreClientByClusterIdForExternalArgoApps(req *bean4.EphemeralContainerRequest) (*kubernetes.Clientset, *clientV1.CoreV1Client, error) { restConfig, err := impl.argoApplicationConfigService.GetRestConfigForExternalArgo(context.Background(), req.ClusterId, req.ExternalArgoApplicationName) if err != nil { impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", req.ClusterId, "externalArgoApplicationName", req.ExternalArgoApplicationName) @@ -478,7 +480,7 @@ func (impl *K8sCommonServiceImpl) GetCoreClientByClusterIdForExternalArgoApps(re return clientSet, v1Client, nil } -func (impl *K8sCommonServiceImpl) PortNumberExtraction(resp []BatchResourceResponse, resourceTree map[string]interface{}) map[string]interface{} { +func (impl *K8sCommonServiceImpl) PortNumberExtraction(resp []bean5.BatchResourceResponse, resourceTree map[string]interface{}) map[string]interface{} { servicePortMapping := make(map[string]interface{}) endpointPortMapping := make(map[string]interface{}) endpointSlicePortMapping := make(map[string]interface{}) @@ -726,7 +728,7 @@ func (impl *K8sCommonServiceImpl) GetPreferredVersionForAPIGroup(ctx context.Con } func (impl *K8sCommonServiceImpl) getClusterBean(clusterId int) (*bean2.ClusterBean, error) { - clusterDto, err := impl.clusterService.FindById(clusterId) + clusterDto, err := impl.ClusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in getting cluster by ID", "err", err, "clusterId", clusterId) return nil, err diff --git a/pkg/k8s/application/k8sApplicationService.go b/pkg/k8s/application/k8sApplicationService.go index b795e1c048..3898bfc71f 100644 --- a/pkg/k8s/application/k8sApplicationService.go +++ b/pkg/k8s/application/k8sApplicationService.go @@ -27,9 +27,12 @@ import ( "github.com/devtron-labs/devtron/api/helm-app/service/bean" "github.com/devtron-labs/devtron/pkg/argoApplication/helper" "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" + bean5 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" + "github.com/devtron-labs/devtron/pkg/cluster/read" clientErrors "github.com/devtron-labs/devtron/pkg/errors" "github.com/devtron-labs/devtron/pkg/fluxApplication" bean2 "github.com/devtron-labs/devtron/pkg/fluxApplication/bean" + bean4 "github.com/devtron-labs/devtron/pkg/k8s/bean" "io" v1 "k8s.io/client-go/kubernetes/typed/core/v1" "net/http" @@ -68,28 +71,28 @@ import ( ) type K8sApplicationService interface { - ValidatePodLogsRequestQuery(r *http.Request) (*k8s.ResourceRequestBean, error) - ValidateTerminalRequestQuery(r *http.Request) (*terminal.TerminalSessionRequest, *k8s.ResourceRequestBean, error) + ValidatePodLogsRequestQuery(r *http.Request) (*bean4.ResourceRequestBean, error) + ValidateTerminalRequestQuery(r *http.Request) (*terminal.TerminalSessionRequest, *bean4.ResourceRequestBean, error) DecodeDevtronAppId(applicationId string) (*bean3.DevtronAppIdentifier, error) - GetPodLogs(ctx context.Context, request *k8s.ResourceRequestBean) (io.ReadCloser, error) + GetPodLogs(ctx context.Context, request *bean4.ResourceRequestBean) (io.ReadCloser, error) ValidateResourceRequest(ctx context.Context, appIdentifier *bean.AppIdentifier, request *k8s2.K8sRequestBean) error - ValidateClusterResourceRequest(ctx context.Context, clusterResourceRequest *k8s.ResourceRequestBean, + ValidateClusterResourceRequest(ctx context.Context, clusterResourceRequest *bean4.ResourceRequestBean, rbacCallback func(clusterName string, resourceIdentifier k8s2.ResourceIdentifier) bool) (bool, error) ValidateClusterResourceBean(ctx context.Context, clusterId int, manifest unstructured.Unstructured, gvk schema.GroupVersionKind, rbacCallback func(clusterName string, resourceIdentifier k8s2.ResourceIdentifier) bool) bool GetResourceInfo(ctx context.Context) (*bean3.ResourceInfo, error) GetAllApiResourceGVKWithoutAuthorization(ctx context.Context, clusterId int) (*k8s2.GetAllApiResourcesResponse, error) GetAllApiResources(ctx context.Context, clusterId int, isSuperAdmin bool, userId int32) (*k8s2.GetAllApiResourcesResponse, error) - GetResourceList(ctx context.Context, token string, request *k8s.ResourceRequestBean, validateResourceAccess func(token string, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool) (*k8s2.ClusterResourceListMap, error) - GetResourceListWithRestConfig(ctx context.Context, token string, request *k8s.ResourceRequestBean, validateResourceAccess func(token string, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool, + GetResourceList(ctx context.Context, token string, request *bean4.ResourceRequestBean, validateResourceAccess func(token string, clusterName string, request bean4.ResourceRequestBean, casbinAction string) bool) (*k8s2.ClusterResourceListMap, error) + GetResourceListWithRestConfig(ctx context.Context, token string, request *bean4.ResourceRequestBean, validateResourceAccess func(token string, clusterName string, request bean4.ResourceRequestBean, casbinAction string) bool, restConfig *rest.Config, clusterName string) (*k8s2.ClusterResourceListMap, error) - ApplyResources(ctx context.Context, token string, request *k8s2.ApplyResourcesRequest, resourceRbacHandler func(token string, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool) ([]*k8s2.ApplyResourcesResponse, error) - CreatePodEphemeralContainers(req *cluster.EphemeralContainerRequest) error - TerminatePodEphemeralContainer(req cluster.EphemeralContainerRequest) (bool, error) - GetPodContainersList(clusterId int, namespace, podName string) (*k8s.PodContainerList, error) + ApplyResources(ctx context.Context, token string, request *k8s2.ApplyResourcesRequest, resourceRbacHandler func(token string, clusterName string, request bean4.ResourceRequestBean, casbinAction string) bool) ([]*k8s2.ApplyResourcesResponse, error) + CreatePodEphemeralContainers(req *bean5.EphemeralContainerRequest) error + TerminatePodEphemeralContainer(req bean5.EphemeralContainerRequest) (bool, error) + GetPodContainersList(clusterId int, namespace, podName string) (*bean4.PodContainerList, error) GetPodListByLabel(clusterId int, namespace, label string) ([]corev1.Pod, error) - RecreateResource(ctx context.Context, request *k8s.ResourceRequestBean) (*k8s2.ManifestResponse, error) - DeleteResourceWithAudit(ctx context.Context, request *k8s.ResourceRequestBean, userId int32) (*k8s2.ManifestResponse, error) - GetUrlsByBatchForIngress(ctx context.Context, resp []k8s.BatchResourceResponse) []interface{} + RecreateResource(ctx context.Context, request *bean4.ResourceRequestBean) (*k8s2.ManifestResponse, error) + DeleteResourceWithAudit(ctx context.Context, request *bean4.ResourceRequestBean, userId int32) (*k8s2.ManifestResponse, error) + GetUrlsByBatchForIngress(ctx context.Context, resp []bean4.BatchResourceResponse) []interface{} ValidateFluxResourceRequest(ctx context.Context, appIdentifier *bean2.FluxAppIdentifier, request *k8s2.K8sRequestBean) (bool, error) } @@ -108,13 +111,15 @@ type K8sApplicationServiceImpl struct { ephemeralContainerConfig *EphemeralContainerConfig //argoApplicationService argoApplication.ArgoApplicationService fluxApplicationService fluxApplication.FluxApplicationService + clusterReadService read.ClusterReadService } func NewK8sApplicationServiceImpl(Logger *zap.SugaredLogger, clusterService cluster.ClusterService, pump connector.Pump, helmAppService client.HelmAppService, K8sUtil *k8s2.K8sServiceImpl, aCDAuthConfig *util3.ACDAuthConfig, K8sResourceHistoryService kubernetesResourceAuditLogs.K8sResourceHistoryService, k8sCommonService k8s.K8sCommonService, terminalSession terminal.TerminalSessionHandler, ephemeralContainerService cluster.EphemeralContainerService, ephemeralContainerRepository repository.EphemeralContainersRepository, - fluxApplicationService fluxApplication.FluxApplicationService) (*K8sApplicationServiceImpl, error) { + fluxApplicationService fluxApplication.FluxApplicationService, + clusterReadService read.ClusterReadService) (*K8sApplicationServiceImpl, error) { ephemeralContainerConfig := &EphemeralContainerConfig{} err := env.Parse(ephemeralContainerConfig) if err != nil { @@ -136,6 +141,7 @@ func NewK8sApplicationServiceImpl(Logger *zap.SugaredLogger, clusterService clus ephemeralContainerConfig: ephemeralContainerConfig, //argoApplicationService: argoApplicationService, fluxApplicationService: fluxApplicationService, + clusterReadService: clusterReadService, }, nil } @@ -143,9 +149,9 @@ type EphemeralContainerConfig struct { EphemeralServerVersionRegex string `env:"EPHEMERAL_SERVER_VERSION_REGEX" envDefault:"v[1-9]\\.\\b(2[3-9]|[3-9][0-9])\\b.*"` } -func (impl *K8sApplicationServiceImpl) ValidatePodLogsRequestQuery(r *http.Request) (*k8s.ResourceRequestBean, error) { +func (impl *K8sApplicationServiceImpl) ValidatePodLogsRequestQuery(r *http.Request) (*bean4.ResourceRequestBean, error) { v, vars := r.URL.Query(), mux.Vars(r) - request := &k8s.ResourceRequestBean{} + request := &bean4.ResourceRequestBean{} var err error request.ExternalArgoApplicationName = v.Get("externalArgoApplicationName") appTypeStr := v.Get("appType") @@ -307,7 +313,7 @@ func (impl *K8sApplicationServiceImpl) ValidatePodLogsRequestQuery(r *http.Reque return request, nil } -func (impl *K8sApplicationServiceImpl) ValidateTerminalRequestQuery(r *http.Request) (*terminal.TerminalSessionRequest, *k8s.ResourceRequestBean, error) { +func (impl *K8sApplicationServiceImpl) ValidateTerminalRequestQuery(r *http.Request) (*terminal.TerminalSessionRequest, *bean4.ResourceRequestBean, error) { request := &terminal.TerminalSessionRequest{} v := r.URL.Query() vars := mux.Vars(r) @@ -315,7 +321,7 @@ func (impl *K8sApplicationServiceImpl) ValidateTerminalRequestQuery(r *http.Requ request.Namespace = vars["namespace"] request.PodName = vars["pod"] request.Shell = vars["shell"] - resourceRequestBean := &k8s.ResourceRequestBean{} + resourceRequestBean := &bean4.ResourceRequestBean{} identifier := vars["identifier"] if strings.Contains(identifier, "|") { // Validate App Type @@ -418,7 +424,7 @@ func (impl *K8sApplicationServiceImpl) DecodeDevtronAppId(applicationId string) }, nil } -func (impl *K8sApplicationServiceImpl) GetPodLogs(ctx context.Context, request *k8s.ResourceRequestBean) (io.ReadCloser, error) { +func (impl *K8sApplicationServiceImpl) GetPodLogs(ctx context.Context, request *bean4.ResourceRequestBean) (io.ReadCloser, error) { clusterId := request.ClusterId resourceIdentifier := request.K8sRequest.ResourceIdentifier podLogsRequest := request.K8sRequest.PodLogsRequest @@ -435,10 +441,10 @@ func (impl *K8sApplicationServiceImpl) GetPodLogs(ctx context.Context, request * return resp, nil } -func (impl *K8sApplicationServiceImpl) ValidateClusterResourceRequest(ctx context.Context, clusterResourceRequest *k8s.ResourceRequestBean, +func (impl *K8sApplicationServiceImpl) ValidateClusterResourceRequest(ctx context.Context, clusterResourceRequest *bean4.ResourceRequestBean, rbacCallback func(clusterName string, resourceIdentifier k8s2.ResourceIdentifier) bool) (bool, error) { clusterId := clusterResourceRequest.ClusterId - clusterBean, err := impl.clusterService.FindById(clusterId) + clusterBean, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in getting clusterBean by cluster Id", "clusterId", clusterId, "err", err) return false, err @@ -469,7 +475,7 @@ func (impl *K8sApplicationServiceImpl) validateResourceManifest(clusterName stri } func (impl *K8sApplicationServiceImpl) ValidateClusterResourceBean(ctx context.Context, clusterId int, manifest unstructured.Unstructured, gvk schema.GroupVersionKind, rbacCallback func(clusterName string, resourceIdentifier k8s2.ResourceIdentifier) bool) bool { - clusterBean, err := impl.clusterService.FindById(clusterId) + clusterBean, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in getting clusterBean by cluster Id", "clusterId", clusterId, "err", err) return false @@ -654,7 +660,7 @@ func (impl *K8sApplicationServiceImpl) GetAllApiResources(ctx context.Context, c allowedAll := isSuperAdmin filteredApiResources := make([]*k8s2.K8sApiResource, 0) if !isSuperAdmin { - clusterBean, err := impl.clusterService.FindById(clusterId) + clusterBean, err := impl.clusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("failed to find cluster for id", "err", err, "clusterId", clusterId) return nil, err @@ -722,7 +728,7 @@ func (impl *K8sApplicationServiceImpl) GetAllApiResources(ctx context.Context, c return response, nil } -func (impl *K8sApplicationServiceImpl) GetResourceList(ctx context.Context, token string, request *k8s.ResourceRequestBean, validateResourceAccess func(token string, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool) (*k8s2.ClusterResourceListMap, error) { +func (impl *K8sApplicationServiceImpl) GetResourceList(ctx context.Context, token string, request *bean4.ResourceRequestBean, validateResourceAccess func(token string, clusterName string, request bean4.ResourceRequestBean, casbinAction string) bool) (*k8s2.ClusterResourceListMap, error) { resourceList := &k8s2.ClusterResourceListMap{} clusterId := request.ClusterId restConfig, err, clusterBean := impl.k8sCommonService.GetRestConfigByClusterId(ctx, clusterId) @@ -733,8 +739,8 @@ func (impl *K8sApplicationServiceImpl) GetResourceList(ctx context.Context, toke return impl.GetResourceListWithRestConfig(ctx, token, request, validateResourceAccess, restConfig, clusterBean.ClusterName) } -func (impl *K8sApplicationServiceImpl) GetResourceListWithRestConfig(ctx context.Context, token string, request *k8s.ResourceRequestBean, - validateResourceAccess func(token string, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool, +func (impl *K8sApplicationServiceImpl) GetResourceListWithRestConfig(ctx context.Context, token string, request *bean4.ResourceRequestBean, + validateResourceAccess func(token string, clusterName string, request bean4.ResourceRequestBean, casbinAction string) bool, restConfig *rest.Config, clusterName string) (*k8s2.ClusterResourceListMap, error) { resourceList := &k8s2.ClusterResourceListMap{} k8sRequest := request.K8sRequest @@ -766,7 +772,7 @@ func (impl *K8sApplicationServiceImpl) GetResourceListWithRestConfig(ctx context return resourceList, nil } -func (impl *K8sApplicationServiceImpl) ApplyResources(ctx context.Context, token string, request *k8s2.ApplyResourcesRequest, validateResourceAccess func(token string, clusterName string, request k8s.ResourceRequestBean, casbinAction string) bool) ([]*k8s2.ApplyResourcesResponse, error) { +func (impl *K8sApplicationServiceImpl) ApplyResources(ctx context.Context, token string, request *k8s2.ApplyResourcesRequest, validateResourceAccess func(token string, clusterName string, request bean4.ResourceRequestBean, casbinAction string) bool) ([]*k8s2.ApplyResourcesResponse, error) { manifests, err := yamlUtil.SplitYAMLs([]byte(request.Manifest)) if err != nil { impl.logger.Errorw("error in splitting yaml in manifest", "err", err) @@ -794,7 +800,7 @@ func (impl *K8sApplicationServiceImpl) ApplyResources(ctx context.Context, token Name: manifest.GetName(), Kind: manifest.GetKind(), } - resourceRequestBean := k8s.ResourceRequestBean{ + resourceRequestBean := bean4.ResourceRequestBean{ ClusterId: clusterId, K8sRequest: &k8s2.K8sRequestBean{ ResourceIdentifier: k8s2.ResourceIdentifier{ @@ -835,7 +841,7 @@ func (impl *K8sApplicationServiceImpl) applyResourceFromManifest(ctx context.Con return isUpdateResource, err } jsonStr := string(jsonStrByteErr) - request := &k8s.ResourceRequestBean{ + request := &bean4.ResourceRequestBean{ K8sRequest: k8sRequestBean, ClusterId: clusterId, } @@ -867,7 +873,7 @@ func (impl *K8sApplicationServiceImpl) applyResourceFromManifest(ctx context.Con return isUpdateResource, nil } -func (impl *K8sApplicationServiceImpl) CreatePodEphemeralContainers(req *cluster.EphemeralContainerRequest) error { +func (impl *K8sApplicationServiceImpl) CreatePodEphemeralContainers(req *bean5.EphemeralContainerRequest) error { var clientSet *kubernetes.Clientset var v1Client *v1.CoreV1Client var err error @@ -956,10 +962,10 @@ func (impl *K8sApplicationServiceImpl) CreatePodEphemeralContainers(req *cluster impl.logger.Errorw("error occurred in unMarshaling debugContainer object", "debugContainerJs", debugContainer, "err", err) return fmt.Errorf("error creating JSON for pod: %v", err) } - req.AdvancedData = &cluster.EphemeralContainerAdvancedData{ + req.AdvancedData = &bean5.EphemeralContainerAdvancedData{ Manifest: string(debugContainerJs), } - req.BasicData = &cluster.EphemeralContainerBasicData{ + req.BasicData = &bean5.EphemeralContainerBasicData{ ContainerName: debugContainer.Name, TargetContainerName: debugContainer.TargetContainerName, Image: debugContainer.Image, @@ -976,7 +982,7 @@ func (impl *K8sApplicationServiceImpl) CreatePodEphemeralContainers(req *cluster return err } -func (impl *K8sApplicationServiceImpl) generateDebugContainer(pod *corev1.Pod, req cluster.EphemeralContainerRequest) (*corev1.Pod, *corev1.EphemeralContainer, error) { +func (impl *K8sApplicationServiceImpl) generateDebugContainer(pod *corev1.Pod, req bean5.EphemeralContainerRequest) (*corev1.Pod, *corev1.EphemeralContainer, error) { copied := pod.DeepCopy() ephemeralContainer := &corev1.EphemeralContainer{} if req.AdvancedData != nil { @@ -1015,7 +1021,7 @@ func (impl *K8sApplicationServiceImpl) generateDebugContainer(pod *corev1.Pod, r } -func (impl *K8sApplicationServiceImpl) TerminatePodEphemeralContainer(req cluster.EphemeralContainerRequest) (bool, error) { +func (impl *K8sApplicationServiceImpl) TerminatePodEphemeralContainer(req bean5.EphemeralContainerRequest) (bool, error) { terminalReq := &terminal.TerminalSessionRequest{ PodName: req.PodName, ClusterId: req.ClusterId, @@ -1057,7 +1063,7 @@ func (impl *K8sApplicationServiceImpl) TerminatePodEphemeralContainer(req cluste return true, nil } -func (impl *K8sApplicationServiceImpl) GetPodContainersList(clusterId int, namespace, podName string) (*k8s.PodContainerList, error) { +func (impl *K8sApplicationServiceImpl) GetPodContainersList(clusterId int, namespace, podName string) (*bean4.PodContainerList, error) { _, v1Client, err := impl.k8sCommonService.GetCoreClientByClusterId(clusterId) if err != nil { impl.logger.Errorw("error in getting coreV1 client by clusterId", "clusterId", clusterId, "err", err) @@ -1094,7 +1100,7 @@ func (impl *K8sApplicationServiceImpl) GetPodContainersList(clusterId int, names initContainers[i] = ic.Name } - return &k8s.PodContainerList{ + return &bean4.PodContainerList{ Containers: containers, EphemeralContainers: ephemeralContainers, InitContainers: initContainers, @@ -1115,7 +1121,7 @@ func (impl *K8sApplicationServiceImpl) GetPodListByLabel(clusterId int, namespac return pods, err } -func (impl *K8sApplicationServiceImpl) RecreateResource(ctx context.Context, request *k8s.ResourceRequestBean) (*k8s2.ManifestResponse, error) { +func (impl *K8sApplicationServiceImpl) RecreateResource(ctx context.Context, request *bean4.ResourceRequestBean) (*k8s2.ManifestResponse, error) { resourceIdentifier := &openapi.ResourceIdentifier{ Name: &request.K8sRequest.ResourceIdentifier.Name, Namespace: &request.K8sRequest.ResourceIdentifier.Namespace, @@ -1152,14 +1158,14 @@ func (impl *K8sApplicationServiceImpl) RecreateResource(ctx context.Context, req return resp, nil } -func (impl *K8sApplicationServiceImpl) DeleteResourceWithAudit(ctx context.Context, request *k8s.ResourceRequestBean, userId int32) (*k8s2.ManifestResponse, error) { +func (impl *K8sApplicationServiceImpl) DeleteResourceWithAudit(ctx context.Context, request *bean4.ResourceRequestBean, userId int32) (*k8s2.ManifestResponse, error) { resp, err := impl.k8sCommonService.DeleteResource(ctx, request) if err != nil { if k8s.IsResourceNotFoundErr(err) { return nil, &utils.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, InternalMessage: err.Error(), - UserMessage: k8s.ResourceNotFoundErr} + UserMessage: bean4.ResourceNotFoundErr} } impl.logger.Errorw("error in deleting resource", "err", err) return nil, err @@ -1174,7 +1180,7 @@ func (impl *K8sApplicationServiceImpl) DeleteResourceWithAudit(ctx context.Conte return resp, nil } -func (impl *K8sApplicationServiceImpl) GetUrlsByBatchForIngress(ctx context.Context, resp []k8s.BatchResourceResponse) []interface{} { +func (impl *K8sApplicationServiceImpl) GetUrlsByBatchForIngress(ctx context.Context, resp []bean4.BatchResourceResponse) []interface{} { result := make([]interface{}, 0) for _, res := range resp { err := res.Err diff --git a/pkg/k8s/application/k8sApplicationService_test.go b/pkg/k8s/application/k8sApplicationService_test.go index f9bf5add20..d8b7a5427d 100644 --- a/pkg/k8s/application/k8sApplicationService_test.go +++ b/pkg/k8s/application/k8sApplicationService_test.go @@ -24,8 +24,8 @@ import ( helmBean "github.com/devtron-labs/devtron/api/helm-app/service/bean" bean2 "github.com/devtron-labs/devtron/pkg/cluster/bean" "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" - "github.com/devtron-labs/devtron/pkg/k8s" "github.com/devtron-labs/devtron/pkg/k8s/application/bean" + bean3 "github.com/devtron-labs/devtron/pkg/k8s/bean" "github.com/stretchr/testify/mock" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" @@ -240,8 +240,8 @@ func (n NewK8sClientServiceImplMock) ListEvents(restConfig *rest.Config, request // }) // // } -func generateTestResourceRequest(kind string) k8s.ResourceRequestBean { - return k8s.ResourceRequestBean{ +func generateTestResourceRequest(kind string) bean3.ResourceRequestBean { + return bean3.ResourceRequestBean{ AppIdentifier: &helmBean.AppIdentifier{}, K8sRequest: &k8s2.K8sRequestBean{ ResourceIdentifier: k8s2.ResourceIdentifier{ diff --git a/pkg/k8s/application/mocks/K8sApplicationService.go b/pkg/k8s/application/mocks/K8sApplicationService.go index 4ca80d9cbd..f67919d9b0 100644 --- a/pkg/k8s/application/mocks/K8sApplicationService.go +++ b/pkg/k8s/application/mocks/K8sApplicationService.go @@ -7,8 +7,8 @@ import ( bean "github.com/devtron-labs/devtron/api/bean" helmBean "github.com/devtron-labs/devtron/api/helm-app/service/bean" bean3 "github.com/devtron-labs/devtron/pkg/cluster/bean" - k8s2 "github.com/devtron-labs/devtron/pkg/k8s" bean2 "github.com/devtron-labs/devtron/pkg/k8s/application/bean" + k8s2 "github.com/devtron-labs/devtron/pkg/k8s/bean" cluster "github.com/devtron-labs/devtron/pkg/cluster" diff --git a/pkg/k8s/bean.go b/pkg/k8s/bean/bean.go similarity index 99% rename from pkg/k8s/bean.go rename to pkg/k8s/bean/bean.go index a39fba2ee8..19cb19ee9f 100644 --- a/pkg/k8s/bean.go +++ b/pkg/k8s/bean/bean.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package k8s +package bean import ( "github.com/devtron-labs/common-lib/utils/k8s" diff --git a/pkg/k8s/capacity/k8sCapacityService.go b/pkg/k8s/capacity/k8sCapacityService.go index 901a0b66eb..dd70446852 100644 --- a/pkg/k8s/capacity/k8sCapacityService.go +++ b/pkg/k8s/capacity/k8sCapacityService.go @@ -26,6 +26,7 @@ import ( bean2 "github.com/devtron-labs/devtron/pkg/cluster/bean" "github.com/devtron-labs/devtron/pkg/k8s" application2 "github.com/devtron-labs/devtron/pkg/k8s/application" + bean3 "github.com/devtron-labs/devtron/pkg/k8s/bean" "github.com/devtron-labs/devtron/pkg/k8s/capacity/bean" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" @@ -488,7 +489,7 @@ func (impl *K8sCapacityServiceImpl) updateManifestData(ctx context.Context, node }, }, } - request := &k8s.ResourceRequestBean{ + request := &bean3.ResourceRequestBean{ K8sRequest: manifestRequest, ClusterId: clusterId, } @@ -565,7 +566,7 @@ func (impl *K8sCapacityServiceImpl) UpdateNodeManifest(ctx context.Context, requ }, Patch: request.ManifestPatch, } - requestResourceBean := &k8s.ResourceRequestBean{K8sRequest: manifestUpdateReq, ClusterId: request.ClusterId} + requestResourceBean := &bean3.ResourceRequestBean{K8sRequest: manifestUpdateReq, ClusterId: request.ClusterId} manifestResponse, err := impl.k8sCommonService.UpdateResource(ctx, requestResourceBean) if err != nil { impl.logger.Errorw("error in updating node manifest", "err", err) @@ -585,7 +586,7 @@ func (impl *K8sCapacityServiceImpl) DeleteNode(ctx context.Context, request *bea }, }, } - resourceRequest := &k8s.ResourceRequestBean{K8sRequest: deleteReq, ClusterId: request.ClusterId} + resourceRequest := &bean3.ResourceRequestBean{K8sRequest: deleteReq, ClusterId: request.ClusterId} // Here Sending userId as 0 as appIdentifier is being sent nil so user id is not used in method. Update userid if appIdentifier is used manifestResponse, err := impl.k8sCommonService.DeleteResource(ctx, resourceRequest) if err != nil { @@ -593,7 +594,7 @@ func (impl *K8sCapacityServiceImpl) DeleteNode(ctx context.Context, request *bea return nil, &utils.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, InternalMessage: err.Error(), - UserMessage: k8s.ResourceNotFoundErr} + UserMessage: bean3.ResourceNotFoundErr} } impl.logger.Errorw("error in deleting node", "err", err) return nil, err diff --git a/pkg/k8s/helper.go b/pkg/k8s/helper.go index 9a84863b7e..fb57c83262 100644 --- a/pkg/k8s/helper.go +++ b/pkg/k8s/helper.go @@ -21,7 +21,7 @@ import ( "fmt" "github.com/Masterminds/semver" "github.com/devtron-labs/devtron/internal/util" - "github.com/devtron-labs/devtron/pkg/fluxApplication" + "github.com/devtron-labs/devtron/pkg/k8s/bean" k8sErrors "k8s.io/apimachinery/pkg/api/errors" "strings" ) @@ -78,15 +78,7 @@ func StripPrereleaseFromK8sVersion(k8sVersion string) string { return k8sVersion } -func NewCmCsRequestBean(clusterId int, namespace string) *CmCsRequestBean { - req := &CmCsRequestBean{} +func NewCmCsRequestBean(clusterId int, namespace string) *bean.CmCsRequestBean { + req := &bean.CmCsRequestBean{} return req.SetClusterId(clusterId).SetNamespace(namespace) } - -func IsClusterStringContainsFluxField(str string) bool { - _, err := fluxApplication.DecodeFluxExternalAppId(str) - if err != nil { - return false - } - return true -} diff --git a/pkg/pipeline/DeploymentPipelineConfigService.go b/pkg/pipeline/DeploymentPipelineConfigService.go index 61493151c8..12b23366b1 100644 --- a/pkg/pipeline/DeploymentPipelineConfigService.go +++ b/pkg/pipeline/DeploymentPipelineConfigService.go @@ -118,7 +118,7 @@ type CdPipelineConfigService interface { GetBulkActionImpactedPipelines(dto *bean.CdBulkActionRequestDto) ([]*pipelineConfig.Pipeline, error) //no usage // IsGitOpsRequiredForCD : Determine if GitOps is required for CD based on the provided pipeline creation request IsGitOpsRequiredForCD(pipelineCreateRequest *bean.CdPipelines) bool - MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDeleted(acdToken string, pipeline *pipelineConfig.Pipeline) (bool, error) + MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDeleted(pipeline *pipelineConfig.Pipeline) (bool, error) // GetEnvironmentListForAutocompleteFilter : lists environment for given configuration GetEnvironmentListForAutocompleteFilter(envName string, clusterIds []int, offset int, size int, token string, checkAuthBatch func(token string, appObject []string, envObject []string) (map[string]bool, map[string]bool), ctx context.Context) (*clutserBean.ResourceGroupingResponse, error) RegisterInACD(ctx context.Context, chartGitAttr *commonBean.ChartGitAttribute, userId int32) error @@ -1496,13 +1496,12 @@ func (impl *CdPipelineConfigServiceImpl) IsGitOpsRequiredForCD(pipelineCreateReq return haveAtLeastOneGitOps } -func (impl *CdPipelineConfigServiceImpl) MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDeleted(acdToken string, pipeline *pipelineConfig.Pipeline) (bool, error) { +func (impl *CdPipelineConfigServiceImpl) MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDeleted(pipeline *pipelineConfig.Pipeline) (bool, error) { acdAppFound := false - ctx := context.Background() - ctx = context.WithValue(ctx, "token", acdToken) + acdAppName := pipeline.DeploymentAppName - _, err := impl.application.Get(ctx, &application2.ApplicationQuery{Name: &acdAppName}) + _, err := impl.application.Get(context.Background(), &application2.ApplicationQuery{Name: &acdAppName}) if err == nil { // acd app is not yet deleted so return acdAppFound = true diff --git a/pkg/policyGovernance/security/imageScanning/CvePolicyService.go b/pkg/policyGovernance/security/imageScanning/CvePolicyService.go index 85bfb77cef..cea23fee8d 100644 --- a/pkg/policyGovernance/security/imageScanning/CvePolicyService.go +++ b/pkg/policyGovernance/security/imageScanning/CvePolicyService.go @@ -24,6 +24,7 @@ import ( repository1 "github.com/devtron-labs/devtron/internal/sql/repository/app" "github.com/devtron-labs/devtron/internal/sql/repository/helper" "github.com/devtron-labs/devtron/pkg/cluster/environment" + read2 "github.com/devtron-labs/devtron/pkg/cluster/read" "github.com/devtron-labs/devtron/pkg/pipeline/types" "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/read" repository3 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/repository" @@ -70,6 +71,7 @@ type PolicyServiceImpl struct { imageScanHistoryReadService read.ImageScanHistoryReadService cveStoreRepository repository3.CveStoreRepository ciTemplateRepository pipelineConfig.CiTemplateRepository + ClusterReadService read2.ClusterReadService } func NewPolicyServiceImpl(environmentService environment.EnvironmentService, @@ -85,7 +87,8 @@ func NewPolicyServiceImpl(environmentService environment.EnvironmentService, ciArtifactRepository repository.CiArtifactRepository, ciConfig *types.CiCdConfig, imageScanHistoryReadService read.ImageScanHistoryReadService, cveStoreRepository repository3.CveStoreRepository, - ciTemplateRepository pipelineConfig.CiTemplateRepository) *PolicyServiceImpl { + ciTemplateRepository pipelineConfig.CiTemplateRepository, + ClusterReadService read2.ClusterReadService) *PolicyServiceImpl { return &PolicyServiceImpl{ environmentService: environmentService, logger: logger, @@ -103,6 +106,7 @@ func NewPolicyServiceImpl(environmentService environment.EnvironmentService, imageScanHistoryReadService: imageScanHistoryReadService, cveStoreRepository: cveStoreRepository, ciTemplateRepository: ciTemplateRepository, + ClusterReadService: ClusterReadService, } } @@ -559,7 +563,7 @@ func (impl *PolicyServiceImpl) GetPolicies(policyLevel securityBean.PolicyLevel, return nil, fmt.Errorf("cluster id is missing") } // get cluster name - cluster, err := impl.clusterService.FindById(clusterId) + cluster, err := impl.ClusterReadService.FindById(clusterId) if err != nil { impl.logger.Errorw("error in fetching cluster details", "id", clusterId, "err", err) return nil, err diff --git a/pkg/terminal/terminalSesion.go b/pkg/terminal/terminalSesion.go index dec722b670..b2b5f2841a 100644 --- a/pkg/terminal/terminalSesion.go +++ b/pkg/terminal/terminalSesion.go @@ -30,6 +30,8 @@ import ( "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/cluster/bean" "github.com/devtron-labs/devtron/pkg/cluster/environment" + bean2 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean" + "github.com/devtron-labs/devtron/pkg/cluster/read" "github.com/devtron-labs/devtron/pkg/cluster/repository" errors1 "github.com/juju/errors" "go.uber.org/zap" @@ -450,23 +452,24 @@ type TerminalSessionHandler interface { type TerminalSessionHandlerImpl struct { environmentService environment.EnvironmentService - clusterService cluster.ClusterService logger *zap.SugaredLogger k8sUtil *k8s.K8sServiceImpl ephemeralContainerService cluster.EphemeralContainerService argoApplicationConfigService config.ArgoApplicationConfigService + ClusterReadService read.ClusterReadService } -func NewTerminalSessionHandlerImpl(environmentService environment.EnvironmentService, clusterService cluster.ClusterService, +func NewTerminalSessionHandlerImpl(environmentService environment.EnvironmentService, logger *zap.SugaredLogger, k8sUtil *k8s.K8sServiceImpl, ephemeralContainerService cluster.EphemeralContainerService, - argoApplicationConfigService config.ArgoApplicationConfigService) *TerminalSessionHandlerImpl { + argoApplicationConfigService config.ArgoApplicationConfigService, + ClusterReadService read.ClusterReadService) *TerminalSessionHandlerImpl { return &TerminalSessionHandlerImpl{ environmentService: environmentService, - clusterService: clusterService, logger: logger, k8sUtil: k8sUtil, ephemeralContainerService: ephemeralContainerService, argoApplicationConfigService: argoApplicationConfigService, + ClusterReadService: ClusterReadService, } } @@ -547,7 +550,7 @@ func (impl *TerminalSessionHandlerImpl) getClientSetAndRestConfigForTerminalConn return restConfig, clientSet, nil } else { if req.ClusterId != 0 { - clusterBean, err = impl.clusterService.FindById(req.ClusterId) + clusterBean, err = impl.ClusterReadService.FindById(req.ClusterId) if err != nil { impl.logger.Errorw("error in fetching cluster detail", "err", err, "clusterId", req.ClusterId) return nil, nil, err @@ -660,7 +663,7 @@ func (impl *TerminalSessionHandlerImpl) saveEphemeralContainerTerminalAccessAudi return err } } else { - clusterBean, err := impl.clusterService.FindById(req.ClusterId) + clusterBean, err := impl.ClusterReadService.FindById(req.ClusterId) if err != nil { impl.logger.Errorw("error occurred in finding clusterBean by Id", "clusterId", req.ClusterId, "err", err) return err @@ -699,16 +702,16 @@ func (impl *TerminalSessionHandlerImpl) saveEphemeralContainerTerminalAccessAudi impl.logger.Errorw("error occurred while marshaling ephemeralContainer object", "err", err, "ephemeralContainer", ephemeralContainer) return err } - ephemeralReq := cluster.EphemeralContainerRequest{ + ephemeralReq := bean2.EphemeralContainerRequest{ PodName: req.PodName, Namespace: req.Namespace, ClusterId: req.ClusterId, - BasicData: &cluster.EphemeralContainerBasicData{ + BasicData: &bean2.EphemeralContainerBasicData{ ContainerName: req.ContainerName, TargetContainerName: ephemeralContainer.TargetContainerName, Image: ephemeralContainer.Image, }, - AdvancedData: &cluster.EphemeralContainerAdvancedData{ + AdvancedData: &bean2.EphemeralContainerAdvancedData{ Manifest: string(ephemeralContainerJson), }, UserId: req.UserId, diff --git a/pkg/workflow/status/WorkflowStatusService.go b/pkg/workflow/status/WorkflowStatusService.go index ad6444e5d4..a8703d16d6 100644 --- a/pkg/workflow/status/WorkflowStatusService.go +++ b/pkg/workflow/status/WorkflowStatusService.go @@ -44,7 +44,6 @@ import ( "github.com/devtron-labs/devtron/pkg/sql" "github.com/devtron-labs/devtron/pkg/workflow/dag" util3 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/argo" "github.com/go-pg/pg" "go.uber.org/zap" "k8s.io/utils/strings/slices" @@ -74,7 +73,6 @@ type WorkflowStatusServiceImpl struct { appStatusService app_status.AppStatusService acdConfig *argocdServer.ACDConfig AppConfig *app.AppServiceConfig - argoUserService argo.ArgoUserService pipelineStatusSyncDetailService status.PipelineStatusSyncDetailService argocdClientWrapperService argocdServer.ArgoClientWrapperService cdPipelineEventPublishService out.CDPipelineEventPublishService @@ -99,7 +97,6 @@ func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, pipelineStatusTimelineService status.PipelineStatusTimelineService, appService app.AppService, appStatusService app_status.AppStatusService, acdConfig *argocdServer.ACDConfig, AppConfig *app.AppServiceConfig, - argoUserService argo.ArgoUserService, pipelineStatusSyncDetailService status.PipelineStatusSyncDetailService, argocdClientWrapperService argocdServer.ArgoClientWrapperService, cdPipelineEventPublishService out.CDPipelineEventPublishService, @@ -124,7 +121,6 @@ func NewWorkflowStatusServiceImpl(logger *zap.SugaredLogger, appStatusService: appStatusService, acdConfig: acdConfig, AppConfig: AppConfig, - argoUserService: argoUserService, pipelineStatusSyncDetailService: pipelineStatusSyncDetailService, argocdClientWrapperService: argocdClientWrapperService, cdPipelineEventPublishService: cdPipelineEventPublishService, @@ -240,15 +236,10 @@ func (impl *WorkflowStatusServiceImpl) UpdatePipelineTimelineAndStatusByLiveAppl } // this should only be called when we have git-ops configured // try fetching status from argo cd - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - } - ctx := context.WithValue(context.Background(), "token", acdToken) query := &application2.ApplicationQuery{ Name: &pipeline.DeploymentAppName, } - app, err := impl.application.Get(ctx, query) + app, err := impl.application.Get(context.Background(), query) if err != nil { impl.logger.Errorw("error in getting acd application", "err", err, "argoAppName", pipeline) // updating cdWfr status @@ -343,16 +334,10 @@ func (impl *WorkflowStatusServiceImpl) UpdatePipelineTimelineAndStatusByLiveAppl // this should only be called when we have git-ops configured // try fetching status from argo cd - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - } - - ctx := context.WithValue(context.Background(), "token", acdToken) query := &application2.ApplicationQuery{ Name: &acdAppName, } - app, err := impl.application.Get(ctx, query) + app, err := impl.application.Get(context.Background(), query) if err != nil { impl.logger.Errorw("error in getting acd application", "err", err, "installedApp", installedApp) // updating cdWfr status @@ -556,13 +541,7 @@ func (impl *WorkflowStatusServiceImpl) syncACDHelmApps(deployedBeforeMinutes int impl.logger.Errorw("error in fetching environment by envId", "err", err) } argoAppName := util3.BuildDeployedAppName(appDetails.AppName, envDetails.Name) - acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return err - } ctx := context.Background() - ctx = context.WithValue(ctx, "token", acdToken) syncTime := time.Now() syncErr := impl.argocdClientWrapperService.SyncArgoCDApplicationIfNeededAndRefresh(ctx, argoAppName) if syncErr != nil { diff --git a/util/argo/ArgoUserService.go b/util/argo/ArgoUserService.go deleted file mode 100644 index 2989a67d0c..0000000000 --- a/util/argo/ArgoUserService.go +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package argo - -import ( - "context" - "fmt" - "github.com/argoproj/argo-cd/v2/pkg/apiclient/account" - "github.com/devtron-labs/common-lib/utils/k8s" - "github.com/devtron-labs/devtron/client/argocdServer" - "github.com/devtron-labs/devtron/client/argocdServer/connection" - "github.com/devtron-labs/devtron/client/argocdServer/session" - "github.com/devtron-labs/devtron/pkg/cluster" - "github.com/devtron-labs/devtron/pkg/deployment/gitOps/config" - "github.com/devtron-labs/devtron/pkg/module" - util2 "github.com/devtron-labs/devtron/util" - "go.uber.org/zap" - "golang.org/x/crypto/bcrypt" - apiv1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - v1 "k8s.io/client-go/kubernetes/typed/core/v1" - "math/rand" - "strconv" - "strings" -) - -const ( - DEVTRON_USER = "devtron" - DEVTRONCD_NAMESPACE = "devtroncd" - ARGOCD_CM = "argocd-cm" - ARGOCD_SECRET = "argocd-secret" - ARGO_USER_APIKEY_CAPABILITY = "apiKey" - ARGO_USER_LOGIN_CAPABILITY = "login" - DEVTRON_ARGOCD_USERNAME_KEY = "DEVTRON_ACD_USER_NAME" - DEVTRON_ARGOCD_USER_PASSWORD_KEY = "DEVTRON_ACD_USER_PASSWORD" - DEVTRON_ARGOCD_TOKEN_KEY = "DEVTRON_ACD_TOKEN" - DEVTRON_CM = "devtron-cm" - DEVTRON_SECRET = "devtron-secret" -) - -type ArgoUserService interface { - GetLatestDevtronArgoCdUserToken() (string, error) - ValidateGitOpsAndGetOrUpdateArgoCdUserDetail() string - GetOrUpdateArgoCdUserDetail() string - - GetACDContext(ctx context.Context) (acdContext context.Context, err error) - SetAcdTokenInContext(ctx context.Context) (context.Context, error) -} - -type ArgoUserServiceImpl struct { - logger *zap.SugaredLogger - clusterService cluster.ClusterService - devtronSecretConfig *util2.DevtronSecretConfig - argoCDConnectionManager connection.ArgoCDConnectionManager - versionService argocdServer.VersionService - k8sUtil *k8s.K8sServiceImpl - gitOpsConfigReadService config.GitOpsConfigReadService - moduleService module.ModuleService -} - -func NewArgoUserServiceImpl(Logger *zap.SugaredLogger, clusterService cluster.ClusterService, - envVariables *util2.EnvironmentVariables, runTimeConfig *k8s.RuntimeConfig, - argoCDConnectionManager connection.ArgoCDConnectionManager, versionService argocdServer.VersionService, - k8sUtil *k8s.K8sServiceImpl, gitOpsConfigReadService config.GitOpsConfigReadService, - moduleService module.ModuleService) (*ArgoUserServiceImpl, error) { - argoUserServiceImpl := &ArgoUserServiceImpl{ - logger: Logger, - clusterService: clusterService, - devtronSecretConfig: envVariables.DevtronSecretConfig, - argoCDConnectionManager: argoCDConnectionManager, - versionService: versionService, - k8sUtil: k8sUtil, - gitOpsConfigReadService: gitOpsConfigReadService, - moduleService: moduleService, - } - if !runTimeConfig.LocalDevMode { - go argoUserServiceImpl.ValidateGitOpsAndGetOrUpdateArgoCdUserDetail() - } - return argoUserServiceImpl, nil -} - -func (impl *ArgoUserServiceImpl) GetACDContext(ctx context.Context) (acdContext context.Context, err error) { - //this part only accessible for acd apps hibernation, if acd configured it will fetch latest acdToken, else it will return error - acdToken, err := impl.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return nil, err - } - acdCtx := context.WithValue(ctx, "token", acdToken) - return acdCtx, nil -} - -func (impl *ArgoUserServiceImpl) SetAcdTokenInContext(ctx context.Context) (context.Context, error) { - acdToken, err := impl.GetLatestDevtronArgoCdUserToken() - if err != nil { - impl.logger.Errorw("error in getting acd token", "err", err) - return nil, err - } - ctx = context.WithValue(ctx, "token", acdToken) - return ctx, nil -} - -func (impl *ArgoUserServiceImpl) ValidateGitOpsAndGetOrUpdateArgoCdUserDetail() string { - gitOpsConfigurationStatus, err := impl.gitOpsConfigReadService.IsGitOpsConfigured() - if err != nil || !gitOpsConfigurationStatus.IsGitOpsConfigured { - return "" - } - return impl.GetOrUpdateArgoCdUserDetail() -} - -func (impl *ArgoUserServiceImpl) GetOrUpdateArgoCdUserDetail() string { - token := "" - k8sClient, err := impl.k8sUtil.GetCoreV1ClientInCluster() - if err != nil { - impl.logger.Errorw("error in getting k8s client for default cluster", "err", err) - } - devtronSecret, err := getSecret(impl.devtronSecretConfig.DevtronDexSecretNamespace, impl.devtronSecretConfig.DevtronSecretName, k8sClient) - if err != nil { - impl.logger.Errorw("error in getting devtron secret", "err", err) - } - secretData := devtronSecret.Data - username, usernameOk := secretData[DEVTRON_ARGOCD_USERNAME_KEY] - password, passwordOk := secretData[DEVTRON_ARGOCD_USER_PASSWORD_KEY] - userNameStr := string(username) - PasswordStr := string(password) - if !usernameOk || !passwordOk { - username, password, err := impl.createNewArgoCdUserForDevtron(k8sClient) - if err != nil { - impl.logger.Errorw("error in creating new argo cd user for devtron", "err", err) - } - userNameStr = username - PasswordStr = password - } - isTokenAvailable := false - for key, val := range secretData { - if strings.HasPrefix(key, DEVTRON_ARGOCD_TOKEN_KEY) { - isTokenAvailable = true - token = string(val) - } - } - if !isTokenAvailable { - token, err = impl.createNewArgoCdTokenForDevtron(userNameStr, PasswordStr, 1, k8sClient) - if err != nil { - impl.logger.Errorw("error in creating new argo cd token for devtron", "err", err) - } - } - return token -} - -func (impl *ArgoUserServiceImpl) createNewArgoCdUserForDevtron(k8sClient *v1.CoreV1Client) (string, string, error) { - username := DEVTRON_USER - password := getNewPassword() - userCapabilities := []string{ARGO_USER_APIKEY_CAPABILITY, ARGO_USER_LOGIN_CAPABILITY} - //create new user at argo cd side - err := impl.createNewArgoCdUser(username, password, userCapabilities, k8sClient) - if err != nil { - impl.logger.Errorw("error in creating new argocd user", "err", err) - return "", "", err - } - //updating username and password in devtron-secret - userCredentialMap := make(map[string]string) - userCredentialMap[DEVTRON_ARGOCD_USERNAME_KEY] = username - userCredentialMap[DEVTRON_ARGOCD_USER_PASSWORD_KEY] = password - //updating username and password at devtron side - err = impl.updateArgoCdUserInfoInDevtronSecret(userCredentialMap, k8sClient) - if err != nil { - impl.logger.Errorw("error in updating devtron-secret with argo-cd credentials", "err", err) - return "", "", err - } - return username, password, nil -} - -func (impl *ArgoUserServiceImpl) createNewArgoCdTokenForDevtron(username, password string, tokenNo int, k8sClient *v1.CoreV1Client) (string, error) { - //create new user at argo cd side - token, err := impl.createTokenForArgoCdUser(username, password) - if err != nil { - impl.logger.Errorw("error in creating new argocd user", "err", err) - return "", err - } - //updating username and password in devtron-secret - tokenMap := make(map[string]string) - updatedTokenKey := fmt.Sprintf("%s_%d", DEVTRON_ARGOCD_TOKEN_KEY, tokenNo) - tokenMap[updatedTokenKey] = token - //updating username and password at devtron side - err = impl.updateArgoCdUserInfoInDevtronSecret(tokenMap, k8sClient) - if err != nil { - impl.logger.Errorw("error in updating devtron-secret with argo-cd token", "err", err) - return "", err - } - return token, nil -} - -// note: this function also called for no gitops case, where apps are installed via helm -func (impl *ArgoUserServiceImpl) GetLatestDevtronArgoCdUserToken() (string, error) { - gitOpsConfigurationStatus, err := impl.gitOpsConfigReadService.IsGitOpsConfigured() - if err != nil { - impl.logger.Errorw("error while checking if gitOps is configured", "err", err) - return "", err - } - if !gitOpsConfigurationStatus.IsGitOpsConfigured { - //here acd token only required in context for argo cd calls - return "", nil - } - k8sClient, err := impl.k8sUtil.GetClientForInCluster() - if err != nil { - impl.logger.Errorw("error in getting k8s client for default cluster", "err", err) - return "", err - } - devtronSecret, err := getSecret(impl.devtronSecretConfig.DevtronDexSecretNamespace, impl.devtronSecretConfig.DevtronSecretName, k8sClient) - if err != nil { - impl.logger.Errorw("error in getting devtron secret", "err", err) - return "", err - } - secretData := devtronSecret.Data - username := secretData[DEVTRON_ARGOCD_USERNAME_KEY] - password := secretData[DEVTRON_ARGOCD_USER_PASSWORD_KEY] - latestTokenNo := 1 - var token string - for key, value := range secretData { - if strings.HasPrefix(key, DEVTRON_ARGOCD_TOKEN_KEY) { - keySplits := strings.Split(key, "_") - keyLen := len(keySplits) - tokenNo, err := strconv.Atoi(keySplits[keyLen-1]) - if err != nil { - impl.logger.Errorw("error in converting token no string to integer", "err", err, "tokenNoString", keySplits[keyLen-1]) - return "", err - } - if tokenNo > latestTokenNo { - latestTokenNo = tokenNo - token = string(value) - } - } - } - - if len(token) == 0 { - newTokenNo := latestTokenNo + 1 - token, err = impl.createNewArgoCdTokenForDevtron(string(username), string(password), newTokenNo, k8sClient) - if err != nil { - impl.logger.Errorw("error in creating new argo cd token for devtron", "err", err) - return "", err - } - } - return token, nil -} - -func (impl *ArgoUserServiceImpl) updateArgoCdUserInfoInDevtronSecret(userinfo map[string]string, k8sClient *v1.CoreV1Client) error { - devtronSecret, err := getSecret(impl.devtronSecretConfig.DevtronDexSecretNamespace, impl.devtronSecretConfig.DevtronSecretName, k8sClient) - if err != nil { - impl.logger.Errorw("error in getting devtron secret", "err", err) - return err - } - secretData := devtronSecret.Data - if secretData == nil { - secretData = make(map[string][]byte) - } - for key, value := range userinfo { - secretData[key] = []byte(value) - } - devtronSecret.Data = secretData - _, err = updateSecret(impl.devtronSecretConfig.DevtronDexSecretNamespace, devtronSecret, k8sClient) - if err != nil { - impl.logger.Errorw("error in updating devtron secret", "err", err) - return err - } - return nil -} - -func (impl *ArgoUserServiceImpl) createNewArgoCdUser(username, password string, capabilities []string, k8sClient *v1.CoreV1Client) error { - //getting bcrypt hash of this password - passwordHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) - if err != nil { - impl.logger.Errorw("error in getting bcrypt hash for password", "err", err) - return err - } - //adding account name in configmap - acdConfigmap, err := getConfigMap(DEVTRONCD_NAMESPACE, ARGOCD_CM, k8sClient) - if err != nil { - impl.logger.Errorw("error in getting argo cd configmap", "err", err) - return err - } - cmData := acdConfigmap.Data - if cmData == nil { - cmData = make(map[string]string) - } - //updating data - capabilitiesString := "" - for i, capability := range capabilities { - if i == 0 { - capabilitiesString += capability - } else { - capabilitiesString += fmt.Sprintf(", %s", capability) - } - } - newUserCmKey := fmt.Sprintf("accounts.%s", username) - newUserCmValue := capabilitiesString - cmData[newUserCmKey] = newUserCmValue - acdConfigmap.Data = cmData - _, err = updateConfigMap(DEVTRONCD_NAMESPACE, acdConfigmap, k8sClient) - if err != nil { - impl.logger.Errorw("error in updating argo cd configmap", "err", err) - return err - } - acdSecret, err := getSecret(DEVTRONCD_NAMESPACE, ARGOCD_SECRET, k8sClient) - if err != nil { - impl.logger.Errorw("error in getting argo cd secret", "err", err) - return err - } - secretData := acdSecret.Data - if secretData == nil { - secretData = make(map[string][]byte) - } - newUserSecretKey := fmt.Sprintf("accounts.%s.password", username) - newUserSecretValue := passwordHash - secretData[newUserSecretKey] = newUserSecretValue - acdSecret.Data = secretData - _, err = updateSecret(DEVTRONCD_NAMESPACE, acdSecret, k8sClient) - if err != nil { - impl.logger.Errorw("error in updating argo cd secret", "err", err) - return err - } - return nil -} - -func (impl *ArgoUserServiceImpl) createTokenForArgoCdUser(username, password string) (string, error) { - token, err := impl.passwordLogin(username, password) - if err != nil { - impl.logger.Errorw("error in getting jwt token with username & password", "err", err) - return "", err - } - ctx := context.Background() - ctx = context.WithValue(ctx, "token", token) - clientConn := impl.argoCDConnectionManager.GetConnection(token) - accountServiceClient := account.NewAccountServiceClient(clientConn) - acdToken, err := accountServiceClient.CreateToken(ctx, &account.CreateTokenRequest{ - Name: username, - }) - if err != nil { - impl.logger.Errorw("error in creating acdToken in ArgoCd", "err", err) - return "", err - } - - // just checking and logging the ArgoCd version - err = impl.versionService.CheckVersion() - if err != nil { - impl.logger.Errorw("error found while checking ArgoCd Version", "err", err) - return "", err - } - return acdToken.Token, nil -} - -func (impl *ArgoUserServiceImpl) passwordLogin(username, password string) (string, error) { - serviceClient := session.NewSessionServiceClient(impl.argoCDConnectionManager) - jwtToken, err := serviceClient.Create(context.Background(), username, password) - return jwtToken, err -} - -func getNewPassword() string { - var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - - s := make([]rune, 16) - for i := range s { - s[i] = letters[rand.Intn(len(letters))] - } - return string(s) -} - -func getSecret(namespace string, name string, client *v1.CoreV1Client) (*apiv1.Secret, error) { - secret, err := client.Secrets(namespace).Get(context.Background(), name, metav1.GetOptions{}) - if err != nil { - return nil, err - } else { - return secret, nil - } -} - -func updateSecret(namespace string, secret *apiv1.Secret, client *v1.CoreV1Client) (*apiv1.Secret, error) { - secret, err := client.Secrets(namespace).Update(context.Background(), secret, metav1.UpdateOptions{}) - if err != nil { - return nil, err - } else { - return secret, nil - } -} - -func getConfigMap(namespace string, name string, client *v1.CoreV1Client) (*apiv1.ConfigMap, error) { - cm, err := client.ConfigMaps(namespace).Get(context.Background(), name, metav1.GetOptions{}) - if err != nil { - return nil, err - } else { - return cm, nil - } -} - -func updateConfigMap(namespace string, cm *apiv1.ConfigMap, client *v1.CoreV1Client) (*apiv1.ConfigMap, error) { - cm, err := client.ConfigMaps(namespace).Update(context.Background(), cm, metav1.UpdateOptions{}) - if err != nil { - return nil, err - } else { - return cm, nil - } -} diff --git a/util/argo/HelmUserService.go b/util/argo/HelmUserService.go deleted file mode 100644 index edb378aad5..0000000000 --- a/util/argo/HelmUserService.go +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package argo - -import ( - "context" - "errors" - "go.uber.org/zap" -) - -// TODO : remove this service completely -type HelmUserServiceImpl struct { - logger *zap.SugaredLogger -} - -func NewHelmUserServiceImpl(Logger *zap.SugaredLogger) (*HelmUserServiceImpl, error) { - helmUserServiceImpl := &HelmUserServiceImpl{ - logger: Logger, - } - return helmUserServiceImpl, nil -} - -func (impl *HelmUserServiceImpl) GetLatestDevtronArgoCdUserToken() (string, error) { - return "", errors.New("method GetLatestDevtronArgoCdUserToken not implemented") -} - -func (impl *HelmUserServiceImpl) ValidateGitOpsAndGetOrUpdateArgoCdUserDetail() string { - return "" -} - -func (impl *HelmUserServiceImpl) GetOrUpdateArgoCdUserDetail() string { - return "" -} - -func (impl *HelmUserServiceImpl) GetACDContext(context.Context) (acdContext context.Context, err error) { - return context.Background(), nil -} - -func (impl *HelmUserServiceImpl) SetAcdTokenInContext(ctx context.Context) (context.Context, error) { - return context.Background(), nil -}