Skip to content

Commit 30a4365

Browse files
feat: Change cd deployment type (#3332)
* api-exposed * wire * migration in db * delete request * mocks * delete request * DB change update * add-err-check * add logs * added log * add userid * change db update for pipeline * revert-version-changes * mocking * add check to mark delete argo app * add update func after deploy * change message * get-helm-app * delete-check-change * code-refactor * code-refactor * remove-print-call * refactor * remove-comments * refactor-response * refactor-response
1 parent 1ebf496 commit 30a4365

File tree

8 files changed

+460
-37
lines changed

8 files changed

+460
-37
lines changed

api/restHandler/AppListingRestHandler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ func (handler AppListingRestHandlerImpl) FetchResourceTree(w http.ResponseWriter
10351035
if cdPipeline.DeploymentAppType == util.PIPELINE_DEPLOYMENT_TYPE_ACD {
10361036
apiError, ok := err.(*util.ApiError)
10371037
if ok && apiError != nil {
1038-
if apiError.Code == constants.AppDetailResourceTreeNotFound && cdPipeline.DeploymentAppDeleteRequest == true {
1038+
if apiError.Code == constants.AppDetailResourceTreeNotFound && cdPipeline.DeploymentAppDeleteRequest == true && cdPipeline.DeploymentAppCreated == true {
10391039
acdAppFound, _ := handler.pipeline.MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDeleted(appId, envId, acdToken, cdPipeline)
10401040
if acdAppFound {
10411041
common.WriteJsonResp(w, fmt.Errorf("unable to fetch resource tree"), nil, http.StatusInternalServerError)

api/restHandler/app/DeploymentPipelineRestHandler.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ type DevtronAppDeploymentRestHandler interface {
2929
GetCdPipelineById(w http.ResponseWriter, r *http.Request)
3030
PatchCdPipeline(w http.ResponseWriter, r *http.Request)
3131
HandleChangeDeploymentRequest(w http.ResponseWriter, r *http.Request)
32+
HandleChangeDeploymentTypeRequest(w http.ResponseWriter, r *http.Request)
33+
HandleTriggerDeploymentAfterTypeChange(w http.ResponseWriter, r *http.Request)
3234
GetCdPipelines(w http.ResponseWriter, r *http.Request)
3335
GetCdPipelinesForAppAndEnv(w http.ResponseWriter, r *http.Request)
3436

@@ -357,6 +359,121 @@ func (handler PipelineConfigRestHandlerImpl) HandleChangeDeploymentRequest(w htt
357359
return
358360
}
359361

362+
func (handler PipelineConfigRestHandlerImpl) HandleChangeDeploymentTypeRequest(w http.ResponseWriter, r *http.Request) {
363+
364+
userId, err := handler.userAuthService.GetLoggedInUser(r)
365+
if userId == 0 || err != nil {
366+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
367+
return
368+
}
369+
370+
decoder := json.NewDecoder(r.Body)
371+
var deploymentTypeChangeRequest *bean.DeploymentAppTypeChangeRequest
372+
err = decoder.Decode(&deploymentTypeChangeRequest)
373+
if err != nil {
374+
handler.Logger.Errorw("request err, HandleChangeDeploymentTypeRequest", "err", err, "payload",
375+
deploymentTypeChangeRequest)
376+
377+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
378+
return
379+
}
380+
deploymentTypeChangeRequest.UserId = userId
381+
382+
err = handler.validator.Struct(deploymentTypeChangeRequest)
383+
if err != nil {
384+
handler.Logger.Errorw("validation err, HandleChangeDeploymentTypeRequest", "err", err, "payload",
385+
deploymentTypeChangeRequest)
386+
387+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
388+
return
389+
}
390+
391+
token := r.Header.Get("token")
392+
if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionDelete, "*"); !ok {
393+
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
394+
return
395+
}
396+
397+
acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken()
398+
if err != nil {
399+
handler.Logger.Errorw("error in getting acd token", "err", err)
400+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
401+
return
402+
}
403+
ctx := context.WithValue(r.Context(), "token", acdToken)
404+
405+
resp, err := handler.pipelineBuilder.ChangePipelineDeploymentType(ctx, deploymentTypeChangeRequest)
406+
407+
if err != nil {
408+
handler.Logger.Errorw(err.Error(), "payload", deploymentTypeChangeRequest, "err", err)
409+
410+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
411+
return
412+
}
413+
common.WriteJsonResp(w, nil, resp, http.StatusOK)
414+
return
415+
}
416+
417+
func (handler PipelineConfigRestHandlerImpl) HandleTriggerDeploymentAfterTypeChange(w http.ResponseWriter, r *http.Request) {
418+
419+
userId, err := handler.userAuthService.GetLoggedInUser(r)
420+
if userId == 0 || err != nil {
421+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
422+
return
423+
}
424+
425+
decoder := json.NewDecoder(r.Body)
426+
var deploymentAppTriggerRequest *bean.DeploymentAppTypeChangeRequest
427+
err = decoder.Decode(&deploymentAppTriggerRequest)
428+
if err != nil {
429+
handler.Logger.Errorw("request err, HandleChangeDeploymentTypeRequest", "err", err, "payload",
430+
deploymentAppTriggerRequest)
431+
432+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
433+
return
434+
}
435+
deploymentAppTriggerRequest.UserId = userId
436+
437+
err = handler.validator.Struct(deploymentAppTriggerRequest)
438+
if err != nil {
439+
handler.Logger.Errorw("validation err, HandleChangeDeploymentTypeRequest", "err", err, "payload",
440+
deploymentAppTriggerRequest)
441+
442+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
443+
return
444+
}
445+
446+
token := r.Header.Get("token")
447+
448+
if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionDelete, "*"); !ok {
449+
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
450+
return
451+
}
452+
453+
acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken()
454+
455+
if err != nil {
456+
handler.Logger.Errorw("error in getting acd token", "err", err)
457+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
458+
return
459+
}
460+
461+
ctx := context.WithValue(r.Context(), "token", acdToken)
462+
463+
resp, err := handler.pipelineBuilder.TriggerDeploymentAfterTypeChange(ctx, deploymentAppTriggerRequest)
464+
465+
if err != nil {
466+
handler.Logger.Errorw(err.Error(),
467+
"payload", deploymentAppTriggerRequest,
468+
"err", err)
469+
470+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
471+
return
472+
}
473+
common.WriteJsonResp(w, nil, resp, http.StatusOK)
474+
return
475+
}
476+
360477
func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.ResponseWriter, r *http.Request) {
361478
userId, err := handler.userAuthService.GetLoggedInUser(r)
362479
if userId == 0 || err != nil {

api/router/PipelineConfigRouter.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ func (router PipelineConfigRouterImpl) initPipelineConfigRouter(configRouter *mu
6969
configRouter.Path("/cd-pipeline").HandlerFunc(router.restHandler.CreateCdPipeline).Methods("POST")
7070
configRouter.Path("/cd-pipeline/patch").HandlerFunc(router.restHandler.PatchCdPipeline).Methods("POST")
7171
configRouter.Path("/cd-pipeline/patch/deployment").HandlerFunc(router.restHandler.HandleChangeDeploymentRequest).Methods("POST")
72+
configRouter.Path("/cd-pipeline/patch/deployment/type").HandlerFunc(router.restHandler.HandleChangeDeploymentTypeRequest).Methods("POST")
73+
configRouter.Path("/cd-pipeline/patch/deployment/trigger").HandlerFunc(router.restHandler.HandleTriggerDeploymentAfterTypeChange).Methods("POST")
7274
configRouter.Path("/cd-pipeline/{appId}").HandlerFunc(router.restHandler.GetCdPipelines).Methods("GET")
7375
configRouter.Path("/cd-pipeline/{appId}/env/{envId}").HandlerFunc(router.restHandler.GetCdPipelinesForAppAndEnv).Methods("GET")
7476
//save environment specific override

internal/sql/repository/pipelineConfig/PipelineRepository.go

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@ type PipelineRepository interface {
9595
FindActiveByNotFilter(envId int, appIdExcludes []int) (pipelines []*Pipeline, err error)
9696
FindAllPipelinesByChartsOverrideAndAppIdAndChartId(chartOverridden bool, appId int, chartId int) (pipelines []*Pipeline, err error)
9797
FindActiveByAppIdAndPipelineId(appId int, pipelineId int) ([]*Pipeline, error)
98-
UpdateCdPipeline(pipeline *Pipeline) error
99-
UpdateCdPipelineDeploymentAppInFilter(deploymentAppType string, cdPipelineIdIncludes []int, userId int32) error
98+
SetDeploymentAppCreatedInPipeline(deploymentAppCreated bool, pipelineId int, userId int32) error
99+
UpdateCdPipelineDeploymentAppInFilter(deploymentAppType string, cdPipelineIdIncludes []int, userId int32, deploymentAppCreated bool, delete bool) error
100+
UpdateCdPipelineAfterDeployment(deploymentAppType string, cdPipelineIdIncludes []int, userId int32, delete bool) error
100101
FindNumberOfAppsWithCdPipeline(appIds []int) (count int, err error)
101102
GetAppAndEnvDetailsForDeploymentAppTypePipeline(deploymentAppType string, clusterIds []int) ([]*Pipeline, error)
102103
GetArgoPipelinesHavingTriggersStuckInLastPossibleNonTerminalTimelines(pendingSinceSeconds int, timeForDegradation int) ([]*Pipeline, error)
@@ -490,25 +491,31 @@ func (impl PipelineRepositoryImpl) FindActiveByAppIdAndPipelineId(appId int, pip
490491
return pipelines, err
491492
}
492493

493-
func (impl PipelineRepositoryImpl) UpdateCdPipeline(pipeline *Pipeline) error {
494-
err := impl.dbConnection.Update(pipeline)
494+
func (impl PipelineRepositoryImpl) SetDeploymentAppCreatedInPipeline(deploymentAppCreated bool, pipelineId int, userId int32) error {
495+
query := "update pipeline set deployment_app_created=?, updated_on=?, updated_by=? where id=?;"
496+
var pipeline *Pipeline
497+
_, err := impl.dbConnection.Query(pipeline, query, deploymentAppCreated, time.Now(), userId, pipelineId)
495498
return err
496499
}
497500

498501
// UpdateCdPipelineDeploymentAppInFilter takes in deployment app type and list of cd pipeline ids and
499502
// updates the deployment_app_type and sets deployment_app_created to false in the table for given ids.
500503
func (impl PipelineRepositoryImpl) UpdateCdPipelineDeploymentAppInFilter(deploymentAppType string,
501-
cdPipelineIdIncludes []int, userId int32) error {
504+
cdPipelineIdIncludes []int, userId int32, deploymentAppCreated bool, isDeleted bool) error {
505+
query := "update pipeline set deployment_app_created = ?, deployment_app_type = ?, " +
506+
"updated_by = ?, updated_on = ?, deployment_app_delete_request = ? where id in (?);"
507+
var pipeline *Pipeline
508+
_, err := impl.dbConnection.Query(pipeline, query, deploymentAppCreated, deploymentAppType, userId, time.Now(), isDeleted, pg.In(cdPipelineIdIncludes))
502509

503-
query := "update pipeline set " +
504-
"deployment_app_created = false, " +
505-
"deployment_app_type = ?, " +
506-
"updated_by = ?, " +
507-
"updated_on = ? " +
508-
"where id in (?)"
510+
return err
511+
}
509512

513+
func (impl PipelineRepositoryImpl) UpdateCdPipelineAfterDeployment(deploymentAppType string,
514+
cdPipelineIdIncludes []int, userId int32, isDeleted bool) error {
515+
query := "update pipeline set deployment_app_type = ?, " +
516+
"updated_by = ?, updated_on = ?, deployment_app_delete_request = ? where id in (?);"
510517
var pipeline *Pipeline
511-
_, err := impl.dbConnection.Query(pipeline, query, deploymentAppType, userId, time.Now(), pg.In(cdPipelineIdIncludes))
518+
_, err := impl.dbConnection.Query(pipeline, query, deploymentAppType, userId, time.Now(), isDeleted, pg.In(cdPipelineIdIncludes))
512519

513520
return err
514521
}

internal/sql/repository/pipelineConfig/mocks/PipelineRepository.go

Lines changed: 50 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/app/AppService.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2425,10 +2425,7 @@ func (impl *AppServiceImpl) CreateHistoriesForDeploymentTrigger(pipeline *pipeli
24252425
}
24262426

24272427
func (impl *AppServiceImpl) updatePipeline(pipeline *pipelineConfig.Pipeline, userId int32) (bool, error) {
2428-
pipeline.DeploymentAppCreated = true
2429-
pipeline.UpdatedOn = time.Now()
2430-
pipeline.UpdatedBy = userId
2431-
err := impl.pipelineRepository.UpdateCdPipeline(pipeline)
2428+
err := impl.pipelineRepository.SetDeploymentAppCreatedInPipeline(true, pipeline.Id, userId)
24322429
if err != nil {
24332430
impl.logger.Errorw("error on updating cd pipeline for setting deployment app created", "err", err)
24342431
return false, err

pkg/bean/app.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -592,8 +592,10 @@ const (
592592
type Status string
593593

594594
const (
595-
Success Status = "Success"
596-
Failed Status = "Failed"
595+
Success Status = "Success"
596+
Failed Status = "Failed"
597+
INITIATED Status = "Migration initiated"
598+
NOT_YET_DELETED Status = "Not yet deleted"
597599
)
598600

599601
func (a CdPatchAction) String() string {

0 commit comments

Comments
 (0)