Skip to content

Commit 28a659e

Browse files
authored
Merge pull request #6369 from devtron-labs/app-template-oss-ent
chore: App template oss ent
2 parents 1c29859 + 12e06dd commit 28a659e

13 files changed

+297
-194
lines changed

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

+4-8
Original file line numberDiff line numberDiff line change
@@ -565,15 +565,12 @@ func (handler *PipelineConfigRestHandlerImpl) GetCiPipeline(w http.ResponseWrite
565565
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
566566
return
567567
}
568-
ciConf, err := handler.pipelineBuilder.GetCiPipeline(appId)
568+
ciConf, err := handler.pipelineBuilder.GetCiPipelineRespResolved(appId)
569569
if err != nil {
570-
handler.Logger.Errorw("service err, GetCiPipeline", "err", err, "appId", appId)
570+
handler.Logger.Errorw("service err, GetCiPipelineRespResolved", "appId", appId, "err", err)
571571
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
572572
return
573573
}
574-
if ciConf == nil || ciConf.Id == 0 {
575-
err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no data found"}
576-
}
577574
common.WriteJsonResp(w, err, ciConf, http.StatusOK)
578575
}
579576

@@ -1286,13 +1283,12 @@ func (handler *PipelineConfigRestHandlerImpl) GetCIPipelineById(w http.ResponseW
12861283
}
12871284
}
12881285

1289-
ciPipeline, err := handler.pipelineBuilder.GetCiPipelineById(pipelineId)
1286+
ciPipeline, err := handler.pipelineBuilder.GetCiPipelineByIdWithDefaultTag(pipelineId)
12901287
if err != nil {
1291-
handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId)
1288+
handler.Logger.Infow("service error, GetCiPipelineByIdWithDefaultTag", "err", err, "appId", appId, "pipelineId", pipelineId)
12921289
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
12931290
return
12941291
}
1295-
ciPipeline.DefaultTag = []string{"{git_hash}", "{ci_pipeline_id}", "{global_counter}"}
12961292
common.WriteJsonResp(w, err, ciPipeline, http.StatusOK)
12971293
}
12981294

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

+17-115
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import (
4141
"github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin"
4242
"github.com/devtron-labs/devtron/pkg/bean"
4343
"github.com/devtron-labs/devtron/pkg/generateManifest"
44-
"github.com/devtron-labs/devtron/pkg/pipeline"
4544
pipelineBean "github.com/devtron-labs/devtron/pkg/pipeline/bean"
4645
resourceGroup2 "github.com/devtron-labs/devtron/pkg/resourceGroup"
4746
"github.com/devtron-labs/devtron/pkg/resourceQualifiers"
@@ -718,48 +717,22 @@ func (handler *PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.Res
718717
return
719718
}
720719

721-
createResp, err := handler.propertiesConfigService.CreateEnvironmentProperties(appId, &envConfigProperties)
722-
if err != nil {
723-
if err.Error() == bean4.NOCHARTEXIST {
724-
ctx, cancel := context.WithCancel(r.Context())
725-
if cn, ok := w.(http.CloseNotifier); ok {
726-
go func(done <-chan struct{}, closed <-chan bool) {
727-
select {
728-
case <-done:
729-
case <-closed:
730-
cancel()
731-
}
732-
}(ctx.Done(), cn.CloseNotify())
733-
}
734-
appMetrics := false
735-
if envConfigProperties.AppMetrics != nil {
736-
appMetrics = *envConfigProperties.AppMetrics
737-
}
738-
templateRequest := bean3.TemplateRequest{
739-
AppId: appId,
740-
ChartRefId: envConfigProperties.ChartRefId,
741-
ValuesOverride: []byte("{}"),
742-
UserId: userId,
743-
IsAppMetricsEnabled: appMetrics,
720+
ctx, cancel := context.WithCancel(r.Context())
721+
if cn, ok := w.(http.CloseNotifier); ok {
722+
go func(done <-chan struct{}, closed <-chan bool) {
723+
select {
724+
case <-done:
725+
case <-closed:
726+
cancel()
744727
}
728+
}(ctx.Done(), cn.CloseNotify())
729+
}
745730

746-
_, err = handler.chartService.CreateChartFromEnvOverride(templateRequest, ctx)
747-
if err != nil {
748-
handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties)
749-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
750-
return
751-
}
752-
createResp, err = handler.propertiesConfigService.CreateEnvironmentProperties(appId, &envConfigProperties)
753-
if err != nil {
754-
handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties)
755-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
756-
return
757-
}
758-
} else {
759-
handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties)
760-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
761-
return
762-
}
731+
createResp, err := handler.propertiesConfigService.CreateEnvironmentPropertiesAndBaseIfNeeded(ctx, appId, &envConfigProperties)
732+
if err != nil {
733+
handler.Logger.Errorw("service err, CreateEnvironmentPropertiesAndBaseIfNeeded", "payload", envConfigProperties, "err", err)
734+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
735+
return
763736
}
764737
common.WriteJsonResp(w, err, createResp, http.StatusOK)
765738
}
@@ -1037,77 +1010,12 @@ func (handler *PipelineConfigRestHandlerImpl) GetDeploymentTemplate(w http.Respo
10371010
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
10381011
return
10391012
}
1040-
1041-
appConfigResponse := make(map[string]interface{})
1042-
appConfigResponse["globalConfig"] = nil
1043-
1044-
err = handler.chartRefService.CheckChartExists(chartRefId)
1013+
appConfigResponse, err := handler.chartService.GetDeploymentTemplateDataByAppIdAndCharRefId(appId, chartRefId)
10451014
if err != nil {
10461015
handler.Logger.Errorw("refChartDir Not Found err, JsonSchemaExtractFromFile", err)
10471016
common.WriteJsonResp(w, err, nil, http.StatusForbidden)
10481017
return
10491018
}
1050-
1051-
schema, readme, err := handler.chartRefService.GetSchemaAndReadmeForTemplateByChartRefId(chartRefId)
1052-
if err != nil {
1053-
handler.Logger.Errorw("err in getting schema and readme, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
1054-
}
1055-
1056-
template, err := handler.chartReadService.FindLatestChartForAppByAppId(appId)
1057-
if err != nil && pg.ErrNoRows != err {
1058-
handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
1059-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
1060-
return
1061-
}
1062-
1063-
if pg.ErrNoRows == err {
1064-
appOverride, _, err := handler.chartRefService.GetAppOverrideForDefaultTemplate(chartRefId)
1065-
if err != nil {
1066-
handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
1067-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
1068-
return
1069-
}
1070-
appOverride["schema"] = json.RawMessage(schema)
1071-
appOverride["readme"] = string(readme)
1072-
mapB, err := json.Marshal(appOverride)
1073-
if err != nil {
1074-
handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
1075-
return
1076-
}
1077-
appConfigResponse["globalConfig"] = json.RawMessage(mapB)
1078-
} else {
1079-
if template.ChartRefId != chartRefId {
1080-
templateRequested, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId)
1081-
if err != nil && err != pg.ErrNoRows {
1082-
handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
1083-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
1084-
return
1085-
}
1086-
1087-
if pg.ErrNoRows == err {
1088-
template.ChartRefId = chartRefId
1089-
template.Id = 0
1090-
template.Latest = false
1091-
} else {
1092-
template.ChartRefId = templateRequested.ChartRefId
1093-
template.Id = templateRequested.Id
1094-
template.ChartRepositoryId = templateRequested.ChartRepositoryId
1095-
template.RefChartTemplate = templateRequested.RefChartTemplate
1096-
template.RefChartTemplateVersion = templateRequested.RefChartTemplateVersion
1097-
template.Latest = templateRequested.Latest
1098-
}
1099-
}
1100-
template.Schema = schema
1101-
template.Readme = string(readme)
1102-
bytes, err := json.Marshal(template)
1103-
if err != nil {
1104-
handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
1105-
return
1106-
}
1107-
appOverride := json.RawMessage(bytes)
1108-
appConfigResponse["globalConfig"] = appOverride
1109-
}
1110-
11111019
common.WriteJsonResp(w, nil, appConfigResponse, http.StatusOK)
11121020
}
11131021

@@ -1992,15 +1900,9 @@ func (handler *PipelineConfigRestHandlerImpl) GetCdPipelineById(w http.ResponseW
19921900
return
19931901
}
19941902

1995-
cdPipeline, err := handler.pipelineBuilder.GetCdPipelineById(pipelineId)
1996-
if err != nil {
1997-
handler.Logger.Errorw("service err, GetCdPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId)
1998-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
1999-
return
2000-
}
2001-
cdResp, err := pipeline.CreatePreAndPostStageResponse(cdPipeline, version)
1903+
cdResp, err := handler.pipelineBuilder.GetCdPipelineByIdResolved(pipelineId, version)
20021904
if err != nil {
2003-
handler.Logger.Errorw("service err, CheckForVersionAndCreatePreAndPostStagePayload", "err", err, "appId", appId, "pipelineId", pipelineId)
1905+
handler.Logger.Errorw("service err, GetCdPipelineByIdResolved", "appId", appId, "pipelineId", pipelineId, "err", err)
20041906
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
20051907
return
20061908
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
security2 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning"
3636
"github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/read"
3737
read3 "github.com/devtron-labs/devtron/pkg/team/read"
38+
"github.com/devtron-labs/devtron/util/beHelper"
3839
"io"
3940
"net/http"
4041
"strconv"
@@ -60,7 +61,6 @@ import (
6061
"github.com/devtron-labs/devtron/pkg/bean"
6162
"github.com/devtron-labs/devtron/pkg/pipeline"
6263
"github.com/devtron-labs/devtron/pkg/team"
63-
util2 "github.com/devtron-labs/devtron/util"
6464
"github.com/devtron-labs/devtron/util/rbac"
6565
"github.com/gorilla/mux"
6666
"go.uber.org/zap"
@@ -663,7 +663,7 @@ func (handler *PipelineConfigRestHandlerImpl) PipelineNameSuggestion(w http.Resp
663663
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
664664
return
665665
}
666-
suggestedName := fmt.Sprintf("%s-%d-%s", pType, appId, util2.Generate(4))
666+
suggestedName := beHelper.GetPipelineNameByPipelineType(pType, appId)
667667
resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName)
668668
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, resourceName, casbin.ActionGet)
669669
if !ok {

api/restHandler/app/workflow/AppWorkflowRestHandler.go

+9-31
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,6 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r
188188
return
189189
}
190190
token := r.Header.Get("token")
191-
app, err := impl.pipelineBuilder.GetApp(appId)
192-
if err != nil {
193-
impl.Logger.Errorw("bad request", "err", err)
194-
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
195-
return
196-
}
197-
198191
v := r.URL.Query()
199192
envIdsString := v.Get("envIds")
200193
envIds := make([]int, 0)
@@ -207,16 +200,15 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r
207200
}
208201

209202
// RBAC enforcer applying
210-
object := impl.enforcerUtil.GetAppRBACName(app.AppName)
203+
object := impl.enforcerUtil.GetAppRBACNameByAppId(appId)
211204
impl.Logger.Debugw("rbac object for other environment list", "object", object)
212205
ok := impl.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionGet)
213206
if !ok {
214207
common.WriteJsonResp(w, err, "unauthorized user", http.StatusForbidden)
215208
return
216209
}
217-
// RBAC enforcer Ends
218-
workflows := make(map[string]interface{})
219-
workflowsList, err := impl.appWorkflowService.FindAppWorkflows(appId)
210+
//RBAC enforcer Ends
211+
workflowsListResp, appType, err := impl.appWorkflowService.FindAppWorkflowsListResolvedResp(appId)
220212
if err != nil {
221213
impl.Logger.Errorw("error in fetching workflows for app", "err", err)
222214
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -231,7 +223,7 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r
231223
return
232224
}
233225
triggerViewPayload := &bean2.TriggerViewWorkflowConfig{
234-
Workflows: workflowsList,
226+
Workflows: workflowsListResp.Workflows,
235227
CdPipelines: cdPipelineWfData,
236228
}
237229
queryParam := bean2.NewWorkflowsFilterQuery().WithEnvIds(envIds)
@@ -242,12 +234,10 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r
242234
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
243235
return
244236
}
245-
workflowsList = response.Workflows
237+
workflowsListResp.Workflows = response.Workflows
246238
}
247239

248-
workflows["appId"] = app.Id
249-
workflows["appName"] = app.AppName
250-
if len(workflowsList) > 0 && app.AppType == helper.Job {
240+
if len(workflowsListResp.Workflows) > 0 && appType == helper.Job {
251241
// RBAC
252242

253243
var workflowNames []string
@@ -256,15 +246,15 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r
256246
var rbacObjects []string
257247
workNameObjectMap := make(map[string]bean2.AppWorkflowDto)
258248

259-
for _, workflow := range workflowsList {
249+
for _, workflow := range workflowsListResp.Workflows {
260250
workflowNames = append(workflowNames, workflow.Name)
261251
workflowIds = append(workflowIds, workflow.Id)
262252
}
263253
workflowIdToObjectMap := impl.enforcerUtil.GetAllWorkflowRBACObjectsByAppId(appId, workflowNames, workflowIds)
264254
itr := 0
265255
for _, val := range workflowIdToObjectMap {
266256
rbacObjects = append(rbacObjects, val)
267-
workNameObjectMap[val] = workflowsList[itr]
257+
workNameObjectMap[val] = workflowsListResp.Workflows[itr]
268258
itr++
269259
}
270260

@@ -277,20 +267,8 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r
277267
if len(updatedWorkflowList) == 0 {
278268
updatedWorkflowList = []bean2.AppWorkflowDto{}
279269
}
280-
workflows[bean3.Workflows] = updatedWorkflowList
281-
} else if len(workflowsList) > 0 {
282-
workflows[bean3.Workflows] = workflowsList
283-
} else {
284-
workflows[bean3.Workflows] = []bean2.AppWorkflowDto{}
285-
}
286-
isAppLevelGitOpsConfigured, err := impl.chartService.IsGitOpsRepoConfiguredForDevtronApp(appId)
287-
if err != nil && !util.IsErrNoRows(err) {
288-
impl.Logger.Errorw("service err, IsGitOpsRepoConfiguredForDevtronApp", "appId", appId, "envIds", envIds, "err", err)
289-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
290-
return
291270
}
292-
workflows["isGitOpsRepoNotConfigured"] = !isAppLevelGitOpsConfigured
293-
common.WriteJsonResp(w, nil, workflows, http.StatusOK)
271+
common.WriteJsonResp(w, nil, workflowsListResp, http.StatusOK)
294272
}
295273

296274
func (impl AppWorkflowRestHandlerImpl) FindAllWorkflows(w http.ResponseWriter, r *http.Request) {

pkg/appWorkflow/AppWorkflowService.go

+33
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package appWorkflow
1919
import (
2020
"errors"
2121
"fmt"
22+
"github.com/devtron-labs/devtron/internal/sql/repository/helper"
2223
bean4 "github.com/devtron-labs/devtron/pkg/appWorkflow/bean"
2324
"github.com/devtron-labs/devtron/pkg/deployment/common"
2425
util2 "github.com/devtron-labs/devtron/util"
@@ -46,6 +47,7 @@ import (
4647

4748
type AppWorkflowService interface {
4849
CreateAppWorkflow(req bean4.AppWorkflowDto) (bean4.AppWorkflowDto, error)
50+
FindAppWorkflowsListResolvedResp(appId int) (resp bean4.AppWorkflowListRespDto, appType helper.AppType, err error)
4951
FindAppWorkflows(appId int) ([]bean4.AppWorkflowDto, error)
5052
FindAppWorkflowById(Id int, appId int) (bean4.AppWorkflowDto, error)
5153
DeleteAppWorkflow(appWorkflowId int, userId int32) error
@@ -79,13 +81,15 @@ type AppWorkflowServiceImpl struct {
7981
userAuthService user.UserAuthService
8082
chartService chart.ChartService
8183
deploymentConfigService common.DeploymentConfigService
84+
pipelineBuilder pipeline.PipelineBuilder
8285
}
8386

8487
func NewAppWorkflowServiceImpl(logger *zap.SugaredLogger, appWorkflowRepository appWorkflow.AppWorkflowRepository,
8588
ciCdPipelineOrchestrator pipeline.CiCdPipelineOrchestrator, ciPipelineRepository pipelineConfig.CiPipelineRepository,
8689
pipelineRepository pipelineConfig.PipelineRepository, enforcerUtil rbac.EnforcerUtil, resourceGroupService resourceGroup2.ResourceGroupService,
8790
appRepository appRepository.AppRepository, userAuthService user.UserAuthService, chartService chart.ChartService,
8891
deploymentConfigService common.DeploymentConfigService,
92+
pipelineBuilder pipeline.PipelineBuilder,
8993
) *AppWorkflowServiceImpl {
9094
return &AppWorkflowServiceImpl{
9195
Logger: logger,
@@ -99,6 +103,7 @@ func NewAppWorkflowServiceImpl(logger *zap.SugaredLogger, appWorkflowRepository
99103
userAuthService: userAuthService,
100104
chartService: chartService,
101105
deploymentConfigService: deploymentConfigService,
106+
pipelineBuilder: pipelineBuilder,
102107
}
103108
}
104109

@@ -153,6 +158,34 @@ func (impl AppWorkflowServiceImpl) CreateAppWorkflow(req bean4.AppWorkflowDto) (
153158
return req, nil
154159
}
155160

161+
func (impl AppWorkflowServiceImpl) FindAppWorkflowsListResolvedResp(appId int) (resp bean4.AppWorkflowListRespDto, appType helper.AppType, err error) {
162+
app, err := impl.pipelineBuilder.GetApp(appId)
163+
if err != nil {
164+
impl.Logger.Errorw("error, GetApp", "appId", appId, "err", err)
165+
return resp, appType, err
166+
}
167+
workflowsList, err := impl.FindAppWorkflows(appId)
168+
if err != nil {
169+
impl.Logger.Errorw("error in fetching workflows for app", "appId", appId, "err", err)
170+
return resp, appType, err
171+
}
172+
isAppLevelGitOpsConfigured, err := impl.chartService.IsGitOpsRepoConfiguredForDevtronApp(appId)
173+
if err != nil && !util.IsErrNoRows(err) {
174+
impl.Logger.Errorw("service err, IsGitOpsRepoConfiguredForDevtronApp", "appId", appId, "err", err)
175+
return resp, appType, err
176+
}
177+
resp.AppId = app.Id
178+
resp.AppName = app.AppName
179+
resp.Workflows = workflowsList
180+
resp.IsGitOpsRepoNotConfigured = !isAppLevelGitOpsConfigured
181+
if len(workflowsList) > 0 {
182+
resp.Workflows = workflowsList
183+
} else {
184+
resp.Workflows = []bean4.AppWorkflowDto{}
185+
}
186+
return resp, app.AppType, nil
187+
}
188+
156189
func (impl AppWorkflowServiceImpl) FindAppWorkflows(appId int) ([]bean4.AppWorkflowDto, error) {
157190
appWorkflows, err := impl.appWorkflowRepository.FindByAppId(appId)
158191
if err != nil && err != pg.ErrNoRows {

0 commit comments

Comments
 (0)