Skip to content

Commit b22a69c

Browse files
feat: change deployment type from gitops to non-gitops and vice-versa for chart store apps (#4666)
* extracting code from prev branch and pasting here with refactoring * minor fix * bringing leftover changes * running wire * removing unused dependencies * 1st level code review changes incorporated * minor fixes * external-app wire fix * wire fix * bug fixes * revert value * bug fixes * refactor * minor fix * logger added * ext app bug fix * comments added * code refactor * logging some more info
1 parent 63741cb commit b22a69c

21 files changed

+992
-78
lines changed

Wire.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,8 @@ func InitializeApp() (*App, error) {
541541
wire.Bind(new(FullMode.InstalledAppDBExtendedService), new(*FullMode.InstalledAppDBExtendedServiceImpl)),
542542
resource.NewInstalledAppResourceServiceImpl,
543543
wire.Bind(new(resource.InstalledAppResourceService), new(*resource.InstalledAppResourceServiceImpl)),
544+
FullMode.NewInstalledAppDeploymentTypeChangeServiceImpl,
545+
wire.Bind(new(FullMode.InstalledAppDeploymentTypeChangeService), new(*FullMode.InstalledAppDeploymentTypeChangeServiceImpl)),
544546

545547
appStoreRestHandler.NewAppStoreRouterImpl,
546548
wire.Bind(new(appStoreRestHandler.AppStoreRouter), new(*appStoreRestHandler.AppStoreRouterImpl)),

api/appStore/AppStoreRouter.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,9 @@ func (router AppStoreRouterImpl) Init(configRouter *mux.Router) {
106106
HandlerFunc(router.deployRestHandler.GetAllInstalledApp).Methods("GET")
107107
configRouter.Path("/cluster-component/install/{clusterId}").
108108
HandlerFunc(router.deployRestHandler.DefaultComponentInstallation).Methods("POST")
109+
110+
configRouter.Path("/installed-app/migrate").
111+
HandlerFunc(router.deployRestHandler.MigrateDeploymentTypeForChartStore).Methods("POST")
112+
configRouter.Path("/installed-app/trigger").
113+
HandlerFunc(router.deployRestHandler.TriggerChartStoreAppAfterMigration).Methods("POST")
109114
}

api/appStore/InstalledAppRestHandler.go

Lines changed: 132 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
client "github.com/devtron-labs/devtron/api/helm-app/gRPC"
2626
"github.com/devtron-labs/devtron/pkg/appStore/installedApp/service/FullMode"
2727
"github.com/devtron-labs/devtron/pkg/appStore/installedApp/service/FullMode/resource"
28+
"github.com/devtron-labs/devtron/pkg/bean"
2829
"net/http"
2930
"strconv"
3031
"strings"
@@ -69,27 +70,30 @@ type InstalledAppRestHandler interface {
6970
FetchResourceTree(w http.ResponseWriter, r *http.Request)
7071
FetchResourceTreeForACDApp(w http.ResponseWriter, r *http.Request)
7172
FetchNotesForArgoInstalledApp(w http.ResponseWriter, r *http.Request)
73+
MigrateDeploymentTypeForChartStore(w http.ResponseWriter, r *http.Request)
74+
TriggerChartStoreAppAfterMigration(w http.ResponseWriter, r *http.Request)
7275
}
7376

7477
type InstalledAppRestHandlerImpl struct {
75-
Logger *zap.SugaredLogger
76-
userAuthService user.UserService
77-
enforcer casbin.Enforcer
78-
enforcerUtil rbac.EnforcerUtil
79-
enforcerUtilHelm rbac.EnforcerUtilHelm
80-
installedAppService FullMode.InstalledAppDBExtendedService
81-
installedAppResourceService resource.InstalledAppResourceService
82-
chartGroupService chartGroup.ChartGroupService
83-
validator *validator.Validate
84-
clusterService cluster.ClusterService
85-
acdServiceClient application.ServiceClient
86-
appStoreDeploymentService service.AppStoreDeploymentService
87-
helmAppClient client.HelmAppClient
88-
argoUserService argo.ArgoUserService
89-
cdApplicationStatusUpdateHandler cron.CdApplicationStatusUpdateHandler
90-
installedAppRepository repository.InstalledAppRepository
91-
K8sApplicationService application2.K8sApplicationService
92-
appCrudOperationService app2.AppCrudOperationService
78+
Logger *zap.SugaredLogger
79+
userAuthService user.UserService
80+
enforcer casbin.Enforcer
81+
enforcerUtil rbac.EnforcerUtil
82+
enforcerUtilHelm rbac.EnforcerUtilHelm
83+
installedAppService FullMode.InstalledAppDBExtendedService
84+
installedAppResourceService resource.InstalledAppResourceService
85+
chartGroupService chartGroup.ChartGroupService
86+
validator *validator.Validate
87+
clusterService cluster.ClusterService
88+
acdServiceClient application.ServiceClient
89+
appStoreDeploymentService service.AppStoreDeploymentService
90+
helmAppClient client.HelmAppClient
91+
argoUserService argo.ArgoUserService
92+
cdApplicationStatusUpdateHandler cron.CdApplicationStatusUpdateHandler
93+
installedAppRepository repository.InstalledAppRepository
94+
K8sApplicationService application2.K8sApplicationService
95+
appCrudOperationService app2.AppCrudOperationService
96+
installedAppDeploymentTypeChangeService FullMode.InstalledAppDeploymentTypeChangeService
9397
}
9498

9599
func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService user.UserService,
@@ -100,25 +104,27 @@ func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService u
100104
helmAppClient client.HelmAppClient, argoUserService argo.ArgoUserService,
101105
cdApplicationStatusUpdateHandler cron.CdApplicationStatusUpdateHandler,
102106
installedAppRepository repository.InstalledAppRepository,
103-
appCrudOperationService app2.AppCrudOperationService) *InstalledAppRestHandlerImpl {
107+
appCrudOperationService app2.AppCrudOperationService,
108+
installedAppDeploymentTypeChangeService FullMode.InstalledAppDeploymentTypeChangeService) *InstalledAppRestHandlerImpl {
104109
return &InstalledAppRestHandlerImpl{
105-
Logger: Logger,
106-
userAuthService: userAuthService,
107-
enforcer: enforcer,
108-
enforcerUtil: enforcerUtil,
109-
enforcerUtilHelm: enforcerUtilHelm,
110-
installedAppService: installedAppService,
111-
installedAppResourceService: installedAppResourceService,
112-
chartGroupService: chartGroupService,
113-
validator: validator,
114-
clusterService: clusterService,
115-
acdServiceClient: acdServiceClient,
116-
appStoreDeploymentService: appStoreDeploymentService,
117-
helmAppClient: helmAppClient,
118-
argoUserService: argoUserService,
119-
cdApplicationStatusUpdateHandler: cdApplicationStatusUpdateHandler,
120-
installedAppRepository: installedAppRepository,
121-
appCrudOperationService: appCrudOperationService,
110+
Logger: Logger,
111+
userAuthService: userAuthService,
112+
enforcer: enforcer,
113+
enforcerUtil: enforcerUtil,
114+
enforcerUtilHelm: enforcerUtilHelm,
115+
installedAppService: installedAppService,
116+
installedAppResourceService: installedAppResourceService,
117+
chartGroupService: chartGroupService,
118+
validator: validator,
119+
clusterService: clusterService,
120+
acdServiceClient: acdServiceClient,
121+
appStoreDeploymentService: appStoreDeploymentService,
122+
helmAppClient: helmAppClient,
123+
argoUserService: argoUserService,
124+
cdApplicationStatusUpdateHandler: cdApplicationStatusUpdateHandler,
125+
installedAppRepository: installedAppRepository,
126+
appCrudOperationService: appCrudOperationService,
127+
installedAppDeploymentTypeChangeService: installedAppDeploymentTypeChangeService,
122128
}
123129
}
124130
func (handler *InstalledAppRestHandlerImpl) FetchAppOverview(w http.ResponseWriter, r *http.Request) {
@@ -843,3 +849,93 @@ func (handler *InstalledAppRestHandlerImpl) fetchResourceTreeWithHibernateForACD
843849
cn, _ := w.(http.CloseNotifier)
844850
handler.installedAppResourceService.FetchResourceTreeWithHibernateForACD(ctx, cn, appDetail)
845851
}
852+
853+
func (handler *InstalledAppRestHandlerImpl) MigrateDeploymentTypeForChartStore(w http.ResponseWriter, r *http.Request) {
854+
userId, err := handler.userAuthService.GetLoggedInUser(r)
855+
if userId == 0 || err != nil {
856+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
857+
return
858+
}
859+
860+
decoder := json.NewDecoder(r.Body)
861+
var migrateAndTriggerReq *bean.DeploymentAppTypeChangeRequest
862+
err = decoder.Decode(&migrateAndTriggerReq)
863+
if err != nil {
864+
handler.Logger.Errorw("request err, MigrateDeploymentTypeForChartStore", "payload", migrateAndTriggerReq, "err", err)
865+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
866+
return
867+
}
868+
migrateAndTriggerReq.UserId = userId
869+
870+
err = handler.validator.Struct(migrateAndTriggerReq)
871+
if err != nil {
872+
handler.Logger.Errorw("validation err, MigrateDeploymentTypeForChartStore", "payload", migrateAndTriggerReq, "err", err)
873+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
874+
return
875+
}
876+
877+
token := r.Header.Get("token")
878+
879+
if ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionDelete, "*"); !ok {
880+
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
881+
return
882+
}
883+
884+
resp, err := handler.installedAppDeploymentTypeChangeService.MigrateDeploymentType(r.Context(), migrateAndTriggerReq)
885+
if err != nil {
886+
handler.Logger.Errorw(err.Error(),
887+
"payload", migrateAndTriggerReq,
888+
"err", err)
889+
890+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
891+
return
892+
}
893+
common.WriteJsonResp(w, nil, resp, http.StatusOK)
894+
return
895+
}
896+
897+
func (handler *InstalledAppRestHandlerImpl) TriggerChartStoreAppAfterMigration(w http.ResponseWriter, r *http.Request) {
898+
userId, err := handler.userAuthService.GetLoggedInUser(r)
899+
if userId == 0 || err != nil {
900+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
901+
return
902+
}
903+
904+
decoder := json.NewDecoder(r.Body)
905+
var deploymentAppTriggerRequest *bean.DeploymentAppTypeChangeRequest
906+
err = decoder.Decode(&deploymentAppTriggerRequest)
907+
if err != nil {
908+
handler.Logger.Errorw("request err, TriggerChartStoreAppAfterMigration", "payload", deploymentAppTriggerRequest, "err", err)
909+
910+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
911+
return
912+
}
913+
deploymentAppTriggerRequest.UserId = userId
914+
915+
err = handler.validator.Struct(deploymentAppTriggerRequest)
916+
if err != nil {
917+
handler.Logger.Errorw("validation err, TriggerChartStoreAppAfterMigration", "payload", deploymentAppTriggerRequest, "err", err)
918+
919+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
920+
return
921+
}
922+
923+
token := r.Header.Get("token")
924+
925+
if ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionCreate, "*"); !ok {
926+
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
927+
return
928+
}
929+
930+
resp, err := handler.installedAppDeploymentTypeChangeService.TriggerAfterMigration(r.Context(), deploymentAppTriggerRequest)
931+
if err != nil {
932+
handler.Logger.Errorw(err.Error(),
933+
"payload", deploymentAppTriggerRequest,
934+
"err", err)
935+
936+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
937+
return
938+
}
939+
common.WriteJsonResp(w, nil, resp, http.StatusOK)
940+
return
941+
}

client/argocdServer/k8sClient.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"encoding/json"
77
"fmt"
8+
"github.com/devtron-labs/common-lib/utils/k8s"
89
"github.com/devtron-labs/devtron/pkg/cluster/repository"
910
"go.uber.org/zap"
1011
"io/ioutil"
@@ -39,13 +40,16 @@ type ArgoK8sClient interface {
3940
GetArgoApplication(namespace string, appName string, cluster *repository.Cluster) (map[string]interface{}, error)
4041
}
4142
type ArgoK8sClientImpl struct {
42-
logger *zap.SugaredLogger
43+
logger *zap.SugaredLogger
44+
k8sUtil *k8s.K8sServiceImpl
4345
}
4446

4547
func NewArgoK8sClientImpl(logger *zap.SugaredLogger,
48+
k8sUtil *k8s.K8sServiceImpl,
4649
) *ArgoK8sClientImpl {
4750
return &ArgoK8sClientImpl{
48-
logger: logger,
51+
logger: logger,
52+
k8sUtil: k8sUtil,
4953
}
5054
}
5155

@@ -74,9 +78,9 @@ func (impl ArgoK8sClientImpl) CreateAcdApp(appRequest *AppTemplate, cluster *rep
7478
return "", err
7579
}
7680

77-
config, err := rest.InClusterConfig()
81+
config, err := impl.k8sUtil.GetK8sInClusterRestConfig()
7882
if err != nil {
79-
impl.logger.Errorw("error in config", "err", err)
83+
impl.logger.Errorw("error in getting in cluster rest config", "err", err)
8084
return "", err
8185
}
8286
config.GroupVersion = &schema.GroupVersion{Group: "argoproj.io", Version: "v1alpha1"}

internal/sql/repository/app/AppRepository.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ type AppRepository interface {
7878
FindAppAndProjectByIdsIn(ids []int) ([]*App, error)
7979
FetchAppIdsByDisplayNamesForJobs(names []string) (map[int]string, []int, error)
8080
GetActiveCiCdAppsCount() (int, error)
81+
82+
UpdateAppOfferingModeForAppIds(successAppIds []*int, appOfferingMode string, userId int32) error
8183
}
8284

8385
const DevtronApp = "DevtronApp"
@@ -472,3 +474,10 @@ func (repo AppRepositoryImpl) GetActiveCiCdAppsCount() (int, error) {
472474
Where("app_type=?", helper.CustomApp).
473475
Count()
474476
}
477+
478+
func (repo AppRepositoryImpl) UpdateAppOfferingModeForAppIds(successAppIds []*int, appOfferingMode string, userId int32) error {
479+
query := "update app set app_offering_mode = ?,updated_by = ?, updated_on = ? where id in (?);"
480+
var app *App
481+
_, err := repo.dbConnection.Query(app, query, appOfferingMode, userId, time.Now(), pg.In(successAppIds))
482+
return err
483+
}

internal/sql/repository/pipelineConfig/PipelineRepository.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ import (
2424
"github.com/devtron-labs/devtron/internal/sql/repository/app"
2525
"github.com/devtron-labs/devtron/internal/sql/repository/appWorkflow"
2626
"github.com/devtron-labs/devtron/internal/util"
27+
util2 "github.com/devtron-labs/devtron/pkg/appStore/util"
2728
"github.com/devtron-labs/devtron/pkg/cluster/repository"
2829
"github.com/devtron-labs/devtron/pkg/sql"
2930
"github.com/go-pg/pg"
3031
"go.uber.org/zap"
3132
"k8s.io/utils/pointer"
32-
"strconv"
3333
"time"
3434
)
3535

@@ -332,15 +332,9 @@ func (impl PipelineRepositoryImpl) FindActiveByEnvIdAndDeploymentType(environmen
332332
deploymentAppType string, exclusionList []int, includeApps []int) ([]*Pipeline, error) {
333333

334334
// NOTE: PG query throws error with slice of integer
335-
exclusionListString := []string{}
336-
for _, appId := range exclusionList {
337-
exclusionListString = append(exclusionListString, strconv.Itoa(appId))
338-
}
335+
exclusionListString := util2.ConvertIntArrayToStringArray(exclusionList)
339336

340-
inclusionListString := []string{}
341-
for _, appId := range includeApps {
342-
inclusionListString = append(inclusionListString, strconv.Itoa(appId))
343-
}
337+
inclusionListString := util2.ConvertIntArrayToStringArray(includeApps)
344338

345339
var pipelines []*Pipeline
346340

pkg/appStore/bean/bean.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,4 +373,8 @@ const (
373373
HELM_RELEASE_STATUS_FAILED = "Failed"
374374
HELM_RELEASE_STATUS_PROGRESSING = "Progressing"
375375
HELM_RELEASE_STATUS_UNKNOWN = "Unknown"
376+
FAILED_TO_REGISTER_IN_ACD_ERROR = "failed to register app on ACD with error: "
377+
FAILED_TO_DELETE_APP_PREFIX_ERROR = "error deleting app with error: "
378+
COULD_NOT_FETCH_APP_NAME_AND_ENV_NAME_ERR = "could not fetch app name or environment name"
379+
APP_NOT_DELETED_YET_ERROR = "App Not Yet Deleted."
376380
)

pkg/appStore/chartGroup/ChartGroupService.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ type ChartGroupService interface {
140140

141141
DeployBulk(chartGroupInstallRequest *ChartGroupInstallRequest) (*ChartGroupInstallAppRes, error)
142142
DeployDefaultChartOnCluster(bean *cluster2.ClusterBean, userId int32) (bool, error)
143+
TriggerDeploymentEvent(installAppVersions []*appStoreBean.InstallAppVersionDTO)
143144
}
144145

145146
type ChartGroupList struct {
@@ -605,7 +606,7 @@ func (impl *ChartGroupServiceImpl) DeployBulk(chartGroupInstallRequest *ChartGro
605606
return nil, err
606607
}
607608
//nats event
608-
impl.triggerDeploymentEvent(installAppVersions)
609+
impl.TriggerDeploymentEvent(installAppVersions)
609610
// TODO refactoring: why empty obj ??
610611
return &ChartGroupInstallAppRes{}, nil
611612
}
@@ -670,7 +671,7 @@ func createChartGroupEntryObject(installAppVersionDTO *appStoreBean.InstallAppVe
670671
}
671672
}
672673

673-
func (impl *ChartGroupServiceImpl) triggerDeploymentEvent(installAppVersions []*appStoreBean.InstallAppVersionDTO) {
674+
func (impl *ChartGroupServiceImpl) TriggerDeploymentEvent(installAppVersions []*appStoreBean.InstallAppVersionDTO) {
674675
for _, versions := range installAppVersions {
675676
var installedAppDeploymentStatus appStoreBean.AppstoreDeploymentStatus
676677
payload := &appStoreBean.DeployPayload{InstalledAppVersionId: versions.InstalledAppVersionId, InstalledAppVersionHistoryId: versions.InstalledAppVersionHistoryId}

0 commit comments

Comments
 (0)