Skip to content

Commit 44bb910

Browse files
Merge pull request #6493 from devtron-labs/approval-bypass-v1-oss
feat: Config Approval bypass v1 (for cm, cs and deployment template)
2 parents 55c5ac8 + 6eec9a7 commit 44bb910

11 files changed

+395
-46
lines changed

Wire.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ import (
152152
repository7 "github.com/devtron-labs/devtron/pkg/kubernetesResourceAuditLogs/repository"
153153
"github.com/devtron-labs/devtron/pkg/notifier"
154154
"github.com/devtron-labs/devtron/pkg/pipeline"
155+
"github.com/devtron-labs/devtron/pkg/pipeline/draftAwareConfigService"
155156
"github.com/devtron-labs/devtron/pkg/pipeline/executors"
156157
history3 "github.com/devtron-labs/devtron/pkg/pipeline/history"
157158
repository3 "github.com/devtron-labs/devtron/pkg/pipeline/history/repository"
@@ -531,6 +532,9 @@ func InitializeApp() (*App, error) {
531532
chartConfig.NewConfigMapRepositoryImpl,
532533
wire.Bind(new(chartConfig.ConfigMapRepository), new(*chartConfig.ConfigMapRepositoryImpl)),
533534

535+
draftAwareConfigService.NewDraftAwareResourceServiceImpl,
536+
wire.Bind(new(draftAwareConfigService.DraftAwareConfigService), new(*draftAwareConfigService.DraftAwareConfigServiceImpl)),
537+
534538
config.WireSet,
535539

536540
infraConfig.WireSet,

api/restHandler/ConfigMapRestHandler.go

Lines changed: 108 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package restHandler
1919
import (
2020
"encoding/json"
2121
"fmt"
22+
"github.com/devtron-labs/devtron/pkg/pipeline/draftAwareConfigService"
2223
"net/http"
2324
"strconv"
2425

@@ -63,31 +64,35 @@ type ConfigMapRestHandler interface {
6364
}
6465

6566
type ConfigMapRestHandlerImpl struct {
66-
pipelineBuilder pipeline.PipelineBuilder
67-
Logger *zap.SugaredLogger
68-
chartService chart.ChartService
69-
userAuthService user.UserService
70-
teamService team.TeamService
71-
enforcer casbin.Enforcer
72-
pipelineRepository pipelineConfig.PipelineRepository
73-
enforcerUtil rbac.EnforcerUtil
74-
configMapService pipeline.ConfigMapService
67+
pipelineBuilder pipeline.PipelineBuilder
68+
Logger *zap.SugaredLogger
69+
chartService chart.ChartService
70+
userAuthService user.UserService
71+
teamService team.TeamService
72+
enforcer casbin.Enforcer
73+
pipelineRepository pipelineConfig.PipelineRepository
74+
enforcerUtil rbac.EnforcerUtil
75+
configMapService pipeline.ConfigMapService
76+
draftAwareResourceService draftAwareConfigService.DraftAwareConfigService
7577
}
7678

7779
func NewConfigMapRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger *zap.SugaredLogger,
7880
chartService chart.ChartService, userAuthService user.UserService, teamService team.TeamService,
7981
enforcer casbin.Enforcer, pipelineRepository pipelineConfig.PipelineRepository,
80-
enforcerUtil rbac.EnforcerUtil, configMapService pipeline.ConfigMapService) *ConfigMapRestHandlerImpl {
82+
enforcerUtil rbac.EnforcerUtil, configMapService pipeline.ConfigMapService,
83+
draftAwareResourceService draftAwareConfigService.DraftAwareConfigService,
84+
) *ConfigMapRestHandlerImpl {
8185
return &ConfigMapRestHandlerImpl{
82-
pipelineBuilder: pipelineBuilder,
83-
Logger: Logger,
84-
chartService: chartService,
85-
userAuthService: userAuthService,
86-
teamService: teamService,
87-
enforcer: enforcer,
88-
pipelineRepository: pipelineRepository,
89-
enforcerUtil: enforcerUtil,
90-
configMapService: configMapService,
86+
pipelineBuilder: pipelineBuilder,
87+
Logger: Logger,
88+
chartService: chartService,
89+
userAuthService: userAuthService,
90+
teamService: teamService,
91+
enforcer: enforcer,
92+
pipelineRepository: pipelineRepository,
93+
enforcerUtil: enforcerUtil,
94+
configMapService: configMapService,
95+
draftAwareResourceService: draftAwareResourceService,
9196
}
9297
}
9398

@@ -118,8 +123,14 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalAddUpdate(w http.ResponseWriter,
118123
return
119124
}
120125
//RBAC END
121-
122-
res, err := handler.configMapService.CMGlobalAddUpdate(&configMapRequest)
126+
ctx := r.Context()
127+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
128+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
129+
if err != nil {
130+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
131+
return
132+
}
133+
res, err := handler.draftAwareResourceService.CMGlobalAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
123134
if err != nil {
124135
handler.Logger.Errorw("service err, CMGlobalAddUpdate", "err", err, "payload", configMapRequest)
125136
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -162,8 +173,14 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentAddUpdate(w http.ResponseWr
162173
}
163174
}
164175
//RBAC END
165-
166-
res, err := handler.configMapService.CMEnvironmentAddUpdate(&configMapRequest)
176+
ctx := r.Context()
177+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
178+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
179+
if err != nil {
180+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
181+
return
182+
}
183+
res, err := handler.draftAwareResourceService.CMEnvironmentAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
167184
if err != nil {
168185
handler.Logger.Errorw("service err, CMEnvironmentAddUpdate", "err", err, "payload", configMapRequest)
169186
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -359,8 +376,14 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalAddUpdate(w http.ResponseWriter,
359376
return
360377
}
361378
//RBAC END
362-
363-
res, err := handler.configMapService.CSGlobalAddUpdate(&configMapRequest)
379+
ctx := r.Context()
380+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
381+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
382+
if err != nil {
383+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
384+
return
385+
}
386+
res, err := handler.draftAwareResourceService.CSGlobalAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
364387
if err != nil {
365388
handler.Logger.Errorw("service err, CSGlobalAddUpdate", "err", err, "payload", configMapRequest)
366389
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -404,8 +427,14 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentAddUpdate(w http.ResponseWr
404427
}
405428
}
406429
//RBAC END
407-
408-
res, err := handler.configMapService.CSEnvironmentAddUpdate(&configMapRequest)
430+
ctx := r.Context()
431+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
432+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
433+
if err != nil {
434+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
435+
return
436+
}
437+
res, err := handler.draftAwareResourceService.CSEnvironmentAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
409438
if err != nil {
410439
handler.Logger.Errorw("service err, CSEnvironmentAddUpdate", "err", err, "payload", configMapRequest)
411440
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -517,8 +546,19 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalDelete(w http.ResponseWriter, r
517546
return
518547
}
519548
//RBAC END
520-
521-
res, err := handler.configMapService.CMGlobalDelete(name, id, userId)
549+
ctx := r.Context()
550+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
551+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
552+
if err != nil {
553+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
554+
return
555+
}
556+
deleteReq := &bean.ConfigDataRequest{
557+
Id: id,
558+
AppId: appId,
559+
UserId: userId,
560+
}
561+
res, err := handler.draftAwareResourceService.CMGlobalDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
522562
if err != nil {
523563
handler.Logger.Errorw("service err, CMGlobalDelete", "err", err, "appId", appId, "id", id, "name", name)
524564
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -572,8 +612,19 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentDelete(w http.ResponseWrite
572612
}
573613
}
574614
//RBAC END
575-
576-
res, err := handler.configMapService.CMEnvironmentDelete(name, id, userId)
615+
ctx := r.Context()
616+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
617+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
618+
if err != nil {
619+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
620+
return
621+
}
622+
deleteReq := &bean.ConfigDataRequest{
623+
Id: id,
624+
AppId: appId,
625+
UserId: userId,
626+
}
627+
res, err := handler.draftAwareResourceService.CMEnvironmentDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
577628
if err != nil {
578629
handler.Logger.Errorw("service err, CMEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id)
579630
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -613,8 +664,19 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalDelete(w http.ResponseWriter, r
613664
return
614665
}
615666
//RBAC END
616-
617-
res, err := handler.configMapService.CSGlobalDelete(name, id, userId)
667+
ctx := r.Context()
668+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
669+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
670+
if err != nil {
671+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
672+
return
673+
}
674+
deleteReq := &bean.ConfigDataRequest{
675+
Id: id,
676+
AppId: appId,
677+
UserId: userId,
678+
}
679+
res, err := handler.draftAwareResourceService.CSGlobalDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
618680
if err != nil {
619681
handler.Logger.Errorw("service err, CSGlobalDelete", "err", err, "appId", appId, "id", id, "name", name)
620682
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -668,8 +730,19 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentDelete(w http.ResponseWrite
668730
}
669731
}
670732
//RBAC END
671-
672-
res, err := handler.configMapService.CSEnvironmentDelete(name, id, userId)
733+
ctx := r.Context()
734+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
735+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
736+
if err != nil {
737+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
738+
return
739+
}
740+
deleteReq := &bean.ConfigDataRequest{
741+
Id: id,
742+
AppId: appId,
743+
UserId: userId,
744+
}
745+
res, err := handler.draftAwareResourceService.CSEnvironmentDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
673746
if err != nil {
674747
handler.Logger.Errorw("service err, CSEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id)
675748
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)

api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,14 @@ func (handler *PipelineConfigRestHandlerImpl) ConfigureDeploymentTemplateForApp(
176176
}
177177
}(ctx.Done(), cn.CloseNotify())
178178
}
179+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
180+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
181+
if err != nil {
182+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
183+
return
184+
}
179185

180-
createResp, err := handler.chartService.Create(templateRequest, r.Context())
186+
createResp, err := handler.draftAwareResourceService.Create(ctx, templateRequest, isSuperAdmin, userEmail)
181187
if err != nil {
182188
handler.Logger.Errorw("service err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest)
183189
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -619,6 +625,7 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.Res
619625
}
620626
envConfigProperties.UserId = userId
621627
envConfigProperties.EnvironmentId = environmentId
628+
envConfigProperties.AppId = appId
622629
handler.Logger.Infow("request payload, EnvConfigOverrideCreate", "payload", envConfigProperties)
623630

624631
resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId)
@@ -655,8 +662,13 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.Res
655662
}
656663
}(ctx.Done(), cn.CloseNotify())
657664
}
658-
659-
createResp, err := handler.propertiesConfigService.CreateEnvironmentPropertiesAndBaseIfNeeded(ctx, appId, &envConfigProperties)
665+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
666+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
667+
if err != nil {
668+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
669+
return
670+
}
671+
createResp, err := handler.draftAwareResourceService.CreateEnvironmentPropertiesAndBaseIfNeeded(ctx, &envConfigProperties, isSuperAdmin, userEmail)
660672
if err != nil {
661673
handler.Logger.Errorw("service err, CreateEnvironmentPropertiesAndBaseIfNeeded", "payload", envConfigProperties, "err", err)
662674
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -695,6 +707,7 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideUpdate(w http.Res
695707
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
696708
return
697709
}
710+
envConfigProperties.AppId = envConfigOverride.Chart.AppId
698711
appId := envConfigOverride.Chart.AppId
699712
envId := envConfigOverride.TargetEnvironment
700713
resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId)
@@ -720,8 +733,14 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideUpdate(w http.Res
720733
common.WriteJsonResp(w, err2, nil, http.StatusBadRequest)
721734
return
722735
}
723-
724-
createResp, err := handler.propertiesConfigService.UpdateEnvironmentProperties(appId, &envConfigProperties, userId)
736+
ctx := r.Context()
737+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
738+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
739+
if err != nil {
740+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
741+
return
742+
}
743+
createResp, err := handler.draftAwareResourceService.UpdateEnvironmentProperties(ctx, &envConfigProperties, token, isSuperAdmin, userEmail)
725744
if err != nil {
726745
handler.Logger.Errorw("service err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties)
727746
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -1317,9 +1336,15 @@ func (handler *PipelineConfigRestHandlerImpl) UpdateAppOverride(w http.ResponseW
13171336
common.WriteJsonResp(w, err2, nil, http.StatusBadRequest)
13181337
return
13191338
}
1339+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
1340+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
1341+
if err != nil {
1342+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
1343+
return
1344+
}
13201345

13211346
_, span = otel.Tracer("orchestrator").Start(ctx, "chartService.UpdateAppOverride")
1322-
createResp, err := handler.chartService.UpdateAppOverride(ctx, &templateRequest)
1347+
createResp, err := handler.draftAwareResourceService.UpdateAppOverride(ctx, &templateRequest, token, isSuperAdmin, userEmail)
13231348
span.End()
13241349
if err != nil {
13251350
handler.Logger.Errorw("service err, UpdateAppOverride", "err", err, "payload", templateRequest)
@@ -1459,7 +1484,20 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideReset(w http.Resp
14591484
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
14601485
return
14611486
}
1462-
isSuccess, err := handler.propertiesConfigService.ResetEnvironmentProperties(id, userId)
1487+
ctx := r.Context()
1488+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
1489+
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
1490+
if err != nil {
1491+
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
1492+
return
1493+
}
1494+
envProperties := &pipelineBean.EnvironmentProperties{
1495+
Id: id,
1496+
EnvironmentId: environmentId,
1497+
UserId: userId,
1498+
AppId: appId,
1499+
}
1500+
isSuccess, err := handler.draftAwareResourceService.ResetEnvironmentProperties(ctx, envProperties, isSuperAdmin, userEmail)
14631501
if err != nil {
14641502
handler.Logger.Errorw("service err, EnvConfigOverrideReset", "err", err, "appId", appId, "environmentId", environmentId)
14651503
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)

api/restHandler/app/pipeline/configure/PipelineConfigRestHandler.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
repository2 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository"
3232
"github.com/devtron-labs/devtron/pkg/deployment/manifest/deployedAppMetrics"
3333
"github.com/devtron-labs/devtron/pkg/deployment/manifest/deploymentTemplate/chartRef"
34+
"github.com/devtron-labs/devtron/pkg/pipeline/draftAwareConfigService"
3435
validator2 "github.com/devtron-labs/devtron/pkg/deployment/manifest/deploymentTemplate/validator"
3536
security2 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning"
3637
"github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/read"
@@ -138,6 +139,7 @@ type PipelineConfigRestHandlerImpl struct {
138139
teamReadService read3.TeamReadService
139140
environmentRepository repository2.EnvironmentRepository
140141
chartReadService read5.ChartReadService
142+
draftAwareResourceService draftAwareConfigService.DraftAwareConfigService
141143
}
142144

143145
func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger *zap.SugaredLogger,
@@ -171,7 +173,9 @@ func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger
171173
gitProviderReadService gitProviderRead.GitProviderReadService,
172174
teamReadService read3.TeamReadService,
173175
EnvironmentRepository repository2.EnvironmentRepository,
174-
chartReadService read5.ChartReadService) *PipelineConfigRestHandlerImpl {
176+
chartReadService read5.ChartReadService,
177+
draftAwareResourceService draftAwareConfigService.DraftAwareConfigService,
178+
) *PipelineConfigRestHandlerImpl {
175179
envConfig := &PipelineRestHandlerEnvConfig{}
176180
err := env.Parse(envConfig)
177181
if err != nil {
@@ -213,6 +217,7 @@ func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger
213217
teamReadService: teamReadService,
214218
environmentRepository: EnvironmentRepository,
215219
chartReadService: chartReadService,
220+
draftAwareResourceService: draftAwareResourceService,
216221
}
217222
}
218223

pkg/pipeline/bean/ConfigMapBean.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,14 @@ func (r ResourceType) ToString() string {
147147
return string(r)
148148
}
149149

150+
func (r ResourceType) IsCS() bool {
151+
return r == CS
152+
}
153+
154+
func (r ResourceType) IsCM() bool {
155+
return r == CM
156+
}
157+
150158
type ResolvedCmCsRequest struct {
151159
Scope resourceQualifiers.Scope
152160
AppId int

0 commit comments

Comments
 (0)