@@ -51,6 +51,7 @@ type DevtronAppDeploymentRestHandler interface {
5151 GetCdPipelinesByEnvironment (w http.ResponseWriter , r * http.Request )
5252 GetCdPipelinesByEnvironmentMin (w http.ResponseWriter , r * http.Request )
5353 PerformDeploymentApprovalAction (w http.ResponseWriter , r * http.Request )
54+ ChangeChartRef (w http.ResponseWriter , r * http.Request )
5455}
5556
5657type DevtronAppDeploymentConfigRestHandler interface {
@@ -498,6 +499,150 @@ func (handler PipelineConfigRestHandlerImpl) HandleTriggerDeploymentAfterTypeCha
498499 return
499500}
500501
502+ func (handler PipelineConfigRestHandlerImpl ) ChangeChartRef (w http.ResponseWriter , r * http.Request ) {
503+ userId , err := handler .userAuthService .GetLoggedInUser (r )
504+ if userId == 0 || err != nil {
505+ common .WriteJsonResp (w , err , "Unauthorized User" , http .StatusUnauthorized )
506+ return
507+ }
508+ decoder := json .NewDecoder (r .Body )
509+ var request chart.ChartRefChangeRequest
510+ err = decoder .Decode (& request )
511+ if err != nil || request .EnvId == 0 || request .TargetChartRefId == 0 || request .AppId == 0 {
512+ handler .Logger .Errorw ("request err, ChangeChartRef" , "err" , err , "payload" , request )
513+ common .WriteJsonResp (w , err , request , http .StatusBadRequest )
514+ return
515+ }
516+ envConfigProperties , err := handler .propertiesConfigService .GetLatestEnvironmentProperties (request .AppId , request .EnvId )
517+ if err != nil || envConfigProperties == nil {
518+ handler .Logger .Errorw ("env properties not found, ChangeChartRef" , "err" , err , "payload" , request )
519+ common .WriteJsonResp (w , err , "env properties not found" , http .StatusNotFound )
520+ return
521+ }
522+ if ! envConfigProperties .IsOverride {
523+ handler .Logger .Errorw ("isOverride is not true, ChangeChartRef" , "err" , err , "payload" , request )
524+ common .WriteJsonResp (w , err , "specific environment is not overriden" , http .StatusUnprocessableEntity )
525+ return
526+ }
527+ compatible , oldChartType , newChartType := handler .chartService .ChartRefIdsCompatible (envConfigProperties .ChartRefId , request .TargetChartRefId )
528+ if ! compatible {
529+ common .WriteJsonResp (w , fmt .Errorf ("charts not compatible" ), "chart not compatible" , http .StatusUnprocessableEntity )
530+ return
531+ }
532+
533+ envConfigProperties .EnvOverrideValues , err = handler .chartService .PatchEnvOverrides (envConfigProperties .EnvOverrideValues , oldChartType , newChartType )
534+ if err != nil {
535+ common .WriteJsonResp (w , err , "error in patching env override" , http .StatusInternalServerError )
536+ return
537+ }
538+
539+ if newChartType == chart .RolloutChartType {
540+ enabled , err := handler .chartService .FlaggerCanaryEnabled (envConfigProperties .EnvOverrideValues )
541+ if err != nil || enabled {
542+ handler .Logger .Errorw ("rollout charts do not support flaggerCanary, ChangeChartRef" , "err" , err , "payload" , request )
543+ common .WriteJsonResp (w , err , "rollout charts do not support flaggerCanary, ChangeChartRef" , http .StatusBadRequest )
544+ return
545+ }
546+ }
547+
548+ envMetrics , err := handler .propertiesConfigService .FindEnvLevelAppMetricsByAppIdAndEnvId (request .AppId , request .EnvId )
549+ if err != nil {
550+ handler .Logger .Errorw ("could not find envMetrics for, ChangeChartRef" , "err" , err , "payload" , request )
551+ common .WriteJsonResp (w , err , "env metric could not be fetched" , http .StatusBadRequest )
552+ return
553+ }
554+ envConfigProperties .ChartRefId = request .TargetChartRefId
555+ envConfigProperties .UserId = userId
556+ envConfigProperties .EnvironmentId = request .EnvId
557+ envConfigProperties .AppMetrics = envMetrics .AppMetrics
558+
559+ token := r .Header .Get ("token" )
560+ handler .Logger .Infow ("request payload, EnvConfigOverrideCreate" , "payload" , request )
561+ resourceName := handler .enforcerUtil .GetAppRBACNameByAppId (request .AppId )
562+ if ok := handler .enforcer .Enforce (token , casbin .ResourceApplications , casbin .ActionCreate , resourceName ); ! ok {
563+ common .WriteJsonResp (w , fmt .Errorf ("unauthorized user" ), "Unauthorized User" , http .StatusForbidden )
564+ return
565+ }
566+ object := handler .enforcerUtil .GetEnvRBACNameByAppId (request .AppId , request .EnvId )
567+ if ok := handler .enforcer .Enforce (token , casbin .ResourceEnvironment , casbin .ActionUpdate , object ); ! ok {
568+ common .WriteJsonResp (w , fmt .Errorf ("unauthorized user" ), "Unauthorized User" , http .StatusForbidden )
569+ return
570+ }
571+
572+ validate , err2 := handler .chartService .DeploymentTemplateValidate (r .Context (), envConfigProperties .EnvOverrideValues , envConfigProperties .ChartRefId )
573+ if ! validate {
574+ handler .Logger .Errorw ("validation err, UpdateAppOverride" , "err" , err2 , "payload" , request )
575+ common .WriteJsonResp (w , err2 , "validation err, UpdateAppOverrid" , http .StatusBadRequest )
576+ return
577+ }
578+ envConfigPropertiesOld , err := handler .propertiesConfigService .FetchEnvProperties (request .AppId , request .EnvId , request .TargetChartRefId )
579+ if err == nil {
580+ envConfigProperties .Id = envConfigPropertiesOld .Id
581+ createResp , err := handler .propertiesConfigService .UpdateEnvironmentProperties (request .AppId , envConfigProperties , userId )
582+ if err != nil {
583+ handler .Logger .Errorw ("service err, EnvConfigOverrideUpdate" , "err" , err , "payload" , envConfigProperties )
584+ common .WriteJsonResp (w , err , createResp , http .StatusInternalServerError )
585+ return
586+ }
587+ common .WriteJsonResp (w , err , createResp , http .StatusOK )
588+ return
589+ }
590+ createResp , err := handler .propertiesConfigService .CreateEnvironmentProperties (request .AppId , envConfigProperties )
591+
592+ if err != nil {
593+ if err .Error () == bean2 .NOCHARTEXIST {
594+ ctx , cancel := context .WithCancel (r .Context ())
595+ if cn , ok := w .(http.CloseNotifier ); ok {
596+ go func (done <- chan struct {}, closed <- chan bool ) {
597+ select {
598+ case <- done :
599+ case <- closed :
600+ cancel ()
601+ }
602+ }(ctx .Done (), cn .CloseNotify ())
603+ }
604+ acdToken , err := handler .argoUserService .GetLatestDevtronArgoCdUserToken ()
605+ if err != nil {
606+ handler .Logger .Errorw ("error in getting acd token" , "err" , err )
607+ common .WriteJsonResp (w , err , "error in getting acd token" , http .StatusInternalServerError )
608+ return
609+ }
610+ ctx = context .WithValue (r .Context (), "token" , acdToken )
611+ appMetrics := false
612+ if envConfigProperties .AppMetrics != nil {
613+ appMetrics = * envMetrics .AppMetrics
614+ }
615+ templateRequest := chart.TemplateRequest {
616+ AppId : request .AppId ,
617+ ChartRefId : request .TargetChartRefId ,
618+ ValuesOverride : []byte ("{}" ),
619+ UserId : userId ,
620+ IsAppMetricsEnabled : appMetrics ,
621+ }
622+
623+ _ , err = handler .chartService .CreateChartFromEnvOverride (templateRequest , ctx )
624+ if err != nil {
625+ handler .Logger .Errorw ("service err, CreateChartFromEnvOverride" , "err" , err , "payload" , request )
626+ common .WriteJsonResp (w , err , "could not create chart from env override" , http .StatusInternalServerError )
627+ return
628+ }
629+ createResp , err = handler .propertiesConfigService .CreateEnvironmentProperties (request .AppId , envConfigProperties )
630+ if err != nil {
631+ handler .Logger .Errorw ("service err, CreateEnvironmentProperties" , "err" , err , "payload" , request )
632+ common .WriteJsonResp (w , err , "could not create env properties" , http .StatusInternalServerError )
633+ return
634+ }
635+ common .WriteJsonResp (w , err , createResp , http .StatusOK )
636+ return
637+ } else {
638+ handler .Logger .Errorw ("service err, EnvConfigOverrideCreate" , "err" , err , "payload" , request )
639+ common .WriteJsonResp (w , err , "service err, EnvConfigOverrideCreate" , http .StatusInternalServerError )
640+ return
641+ }
642+ }
643+ common .WriteJsonResp (w , err , createResp , http .StatusOK )
644+ }
645+
501646func (handler PipelineConfigRestHandlerImpl ) EnvConfigOverrideCreate (w http.ResponseWriter , r * http.Request ) {
502647 userId , err := handler .userAuthService .GetLoggedInUser (r )
503648 if userId == 0 || err != nil {
0 commit comments