Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: App template oss ent #6369

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -565,15 +565,12 @@ func (handler *PipelineConfigRestHandlerImpl) GetCiPipeline(w http.ResponseWrite
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
return
}
ciConf, err := handler.pipelineBuilder.GetCiPipeline(appId)
ciConf, err := handler.pipelineBuilder.GetCiPipelineRespResolved(appId)
if err != nil {
handler.Logger.Errorw("service err, GetCiPipeline", "err", err, "appId", appId)
handler.Logger.Errorw("service err, GetCiPipelineRespResolved", "appId", appId, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
if ciConf == nil || ciConf.Id == 0 {
err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no data found"}
}
common.WriteJsonResp(w, err, ciConf, http.StatusOK)
}

Expand Down Expand Up @@ -1286,13 +1283,12 @@ func (handler *PipelineConfigRestHandlerImpl) GetCIPipelineById(w http.ResponseW
}
}

ciPipeline, err := handler.pipelineBuilder.GetCiPipelineById(pipelineId)
ciPipeline, err := handler.pipelineBuilder.GetCiPipelineByIdWithDefaultTag(pipelineId)
if err != nil {
handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId)
handler.Logger.Infow("service error, GetCiPipelineByIdWithDefaultTag", "err", err, "appId", appId, "pipelineId", pipelineId)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
ciPipeline.DefaultTag = []string{"{git_hash}", "{ci_pipeline_id}", "{global_counter}"}
common.WriteJsonResp(w, err, ciPipeline, http.StatusOK)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ import (
"github.com/devtron-labs/devtron/pkg/bean"
"github.com/devtron-labs/devtron/pkg/chart"
"github.com/devtron-labs/devtron/pkg/generateManifest"
"github.com/devtron-labs/devtron/pkg/pipeline"
pipelineBean "github.com/devtron-labs/devtron/pkg/pipeline/bean"
resourceGroup2 "github.com/devtron-labs/devtron/pkg/resourceGroup"
"github.com/devtron-labs/devtron/pkg/resourceQualifiers"
Expand Down Expand Up @@ -1030,77 +1029,12 @@ func (handler *PipelineConfigRestHandlerImpl) GetDeploymentTemplate(w http.Respo
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
return
}

appConfigResponse := make(map[string]interface{})
appConfigResponse["globalConfig"] = nil

err = handler.chartRefService.CheckChartExists(chartRefId)
appConfigResponse, err := handler.chartService.GetDeploymentTemplateDataByAppIdAndCharRefId(appId, chartRefId)
if err != nil {
handler.Logger.Errorw("refChartDir Not Found err, JsonSchemaExtractFromFile", err)
common.WriteJsonResp(w, err, nil, http.StatusForbidden)
return
}

schema, readme, err := handler.chartRefService.GetSchemaAndReadmeForTemplateByChartRefId(chartRefId)
if err != nil {
handler.Logger.Errorw("err in getting schema and readme, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
}

template, err := handler.chartService.FindLatestChartForAppByAppId(appId)
if err != nil && pg.ErrNoRows != err {
handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
handler.Logger.Error("service err, GetDeploymentTemplateDataByAppIdAndCharRefId", "appId", appId, "chartRefId", chartRefId, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}

if pg.ErrNoRows == err {
appOverride, _, err := handler.chartRefService.GetAppOverrideForDefaultTemplate(chartRefId)
if err != nil {
handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
appOverride["schema"] = json.RawMessage(schema)
appOverride["readme"] = string(readme)
mapB, err := json.Marshal(appOverride)
if err != nil {
handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
return
}
appConfigResponse["globalConfig"] = json.RawMessage(mapB)
} else {
if template.ChartRefId != chartRefId {
templateRequested, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId)
if err != nil && err != pg.ErrNoRows {
handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}

if pg.ErrNoRows == err {
template.ChartRefId = chartRefId
template.Id = 0
template.Latest = false
} else {
template.ChartRefId = templateRequested.ChartRefId
template.Id = templateRequested.Id
template.ChartRepositoryId = templateRequested.ChartRepositoryId
template.RefChartTemplate = templateRequested.RefChartTemplate
template.RefChartTemplateVersion = templateRequested.RefChartTemplateVersion
template.Latest = templateRequested.Latest
}
}
template.Schema = schema
template.Readme = string(readme)
bytes, err := json.Marshal(template)
if err != nil {
handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
return
}
appOverride := json.RawMessage(bytes)
appConfigResponse["globalConfig"] = appOverride
}

common.WriteJsonResp(w, nil, appConfigResponse, http.StatusOK)
}

Expand Down Expand Up @@ -1985,15 +1919,9 @@ func (handler *PipelineConfigRestHandlerImpl) GetCdPipelineById(w http.ResponseW
return
}

cdPipeline, err := handler.pipelineBuilder.GetCdPipelineById(pipelineId)
if err != nil {
handler.Logger.Errorw("service err, GetCdPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
cdResp, err := pipeline.CreatePreAndPostStageResponse(cdPipeline, version)
cdResp, err := handler.pipelineBuilder.GetCdPipelineByIdResolved(pipelineId, version)
if err != nil {
handler.Logger.Errorw("service err, CheckForVersionAndCreatePreAndPostStagePayload", "err", err, "appId", appId, "pipelineId", pipelineId)
handler.Logger.Errorw("service err, GetCdPipelineByIdResolved", "appId", appId, "pipelineId", pipelineId, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
Expand Down
71 changes: 71 additions & 0 deletions pkg/chart/ChartService.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ type ChartService interface {
IsGitOpsRepoConfiguredForDevtronApp(appId int) (bool, error)
IsGitOpsRepoConfiguredForDevtronApps(appIds []int) (map[int]bool, error)
IsGitOpsRepoAlreadyRegistered(gitOpsRepoUrl string) (bool, error)

GetDeploymentTemplateDataByAppIdAndCharRefId(appId, chartRefId int) (map[string]interface{}, error)
}

type ChartServiceImpl struct {
Expand Down Expand Up @@ -1073,3 +1075,72 @@ func (impl *ChartServiceImpl) IsGitOpsRepoAlreadyRegistered(gitOpsRepoUrl string
impl.logger.Errorw("repository is already in use for devtron app", "repoUrl", gitOpsRepoUrl, "appId", chartModel.AppId)
return true, nil
}

func (impl *ChartServiceImpl) GetDeploymentTemplateDataByAppIdAndCharRefId(appId, chartRefId int) (map[string]interface{}, error) {
appConfigResponse := make(map[string]interface{})
appConfigResponse["globalConfig"] = nil

err := impl.chartRefService.CheckChartExists(chartRefId)
if err != nil {
impl.logger.Errorw("refChartDir Not Found err, JsonSchemaExtractFromFile", err)
return nil, err
}

schema, readme, err := impl.chartRefService.GetSchemaAndReadmeForTemplateByChartRefId(chartRefId)
if err != nil {
impl.logger.Errorw("err in getting schema and readme, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
}

template, err := impl.FindLatestChartForAppByAppId(appId)
if err != nil && pg.ErrNoRows != err {
impl.logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
return nil, err
}

if pg.ErrNoRows == err {
appOverride, _, err := impl.chartRefService.GetAppOverrideForDefaultTemplate(chartRefId)
if err != nil {
impl.logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
return nil, err
}
appOverride["schema"] = json.RawMessage(schema)
appOverride["readme"] = string(readme)
mapB, err := json.Marshal(appOverride)
if err != nil {
impl.logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
return nil, err
}
appConfigResponse["globalConfig"] = json.RawMessage(mapB)
} else {
if template.ChartRefId != chartRefId {
templateRequested, err := impl.GetByAppIdAndChartRefId(appId, chartRefId)
if err != nil && err != pg.ErrNoRows {
impl.logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
return nil, err
}

if pg.ErrNoRows == err {
template.ChartRefId = chartRefId
template.Id = 0
template.Latest = false
} else {
template.ChartRefId = templateRequested.ChartRefId
template.Id = templateRequested.Id
template.ChartRepositoryId = templateRequested.ChartRepositoryId
template.RefChartTemplate = templateRequested.RefChartTemplate
template.RefChartTemplateVersion = templateRequested.RefChartTemplateVersion
template.Latest = templateRequested.Latest
}
}
template.Schema = schema
template.Readme = string(readme)
bytes, err := json.Marshal(template)
if err != nil {
impl.logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId)
return nil, err
}
appOverride := json.RawMessage(bytes)
appConfigResponse["globalConfig"] = appOverride
}
return appConfigResponse, nil
}
25 changes: 25 additions & 0 deletions pkg/pipeline/BuildPipelineConfigService.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,16 @@ import (
)

type CiPipelineConfigService interface {
// GetCiPipelineRespResolved : gets the ci pipeline get response after resolving empty data response as expected by FE
GetCiPipelineRespResolved(appId int) (*bean.CiConfigRequest, error)
//GetCiPipeline : retrieves CI pipeline configuration (CiConfigRequest) for a specific application (appId).
// It fetches CI pipeline data, including pipeline materials, scripts, and associated configurations.
// It returns a detailed CiConfigRequest.
//If any errors occur during the retrieval process CI pipeline configuration remains nil.
//If you want less detail of ciPipeline ,Please refer GetCiPipelineMin
GetCiPipeline(appId int) (ciConfig *bean.CiConfigRequest, err error)
// GetCiPipelineByIdWithDefaultTag : Retrieve ciPipeline for given ciPipelineId with defaultTagData
GetCiPipelineByIdWithDefaultTag(pipelineId int) (ciPipeline *bean.CiPipeline, err error)
//GetCiPipelineById : Retrieve ciPipeline for given ciPipelineId
GetCiPipelineById(pipelineId int) (ciPipeline *bean.CiPipeline, err error)
//GetTriggerViewCiPipeline : retrieves a detailed view of the CI pipelines configured for a specific application (appId).
Expand Down Expand Up @@ -511,6 +515,17 @@ func (impl *CiPipelineConfigServiceImpl) getCiTemplateVariables(appId int) (ciCo
return ciConfig, err
}

func (impl *CiPipelineConfigServiceImpl) GetCiPipelineRespResolved(appId int) (*bean.CiConfigRequest, error) {
ciConf, err := impl.GetCiPipeline(appId)
if err != nil {
return nil, err
}
if ciConf == nil || ciConf.Id == 0 {
err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no data found"}
}
return ciConf, err
}

func (impl *CiPipelineConfigServiceImpl) GetCiPipeline(appId int) (ciConfig *bean.CiConfigRequest, err error) {
ciConfig, err = impl.getCiTemplateVariables(appId)
if err != nil {
Expand Down Expand Up @@ -675,6 +690,16 @@ func (impl *CiPipelineConfigServiceImpl) GetCiPipeline(appId int) (ciConfig *bea
return ciConfig, err
}

func (impl *CiPipelineConfigServiceImpl) GetCiPipelineByIdWithDefaultTag(pipelineId int) (ciPipeline *bean.CiPipeline, err error) {
ciPipeline, err = impl.GetCiPipelineById(pipelineId)
if err != nil {
impl.logger.Infow("service error, GetCIPipelineById", "pipelineId", pipelineId, "err", err)
return nil, err
}
ciPipeline.DefaultTag = []string{"{git_hash}", "{ci_pipeline_id}", "{global_counter}"}
return ciPipeline, nil
}

func (impl *CiPipelineConfigServiceImpl) GetCiPipelineById(pipelineId int) (ciPipeline *bean.CiPipeline, err error) {
pipeline, err := impl.ciPipelineRepository.FindById(pipelineId)
if err != nil && !util.IsErrNoRows(err) {
Expand Down
16 changes: 16 additions & 0 deletions pkg/pipeline/DeploymentPipelineConfigService.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ import (
)

type CdPipelineConfigService interface {
// GetCdPipelineByIdResolved : Retrieve cdPipeline for given cdPipelineId and update response as per version(change of pre/post stage data)
GetCdPipelineByIdResolved(pipelineId int, version string) (cdPipeline *bean.CDPipelineConfigObject, err error)
// GetCdPipelineById : Retrieve cdPipeline for given cdPipelineId.
// getting cdPipeline,environment and strategies ,preDeployStage, postDeployStage,appWorkflowMapping from respective repository and service layer
// converting above data in proper bean object and then assigning to CDPipelineConfigObject
Expand Down Expand Up @@ -224,6 +226,20 @@ func NewCdPipelineConfigServiceImpl(logger *zap.SugaredLogger, pipelineRepositor
}
}

func (impl *CdPipelineConfigServiceImpl) GetCdPipelineByIdResolved(pipelineId int, version string) (cdPipeline *bean.CDPipelineConfigObject, err error) {
cdPipeline, err = impl.GetCdPipelineById(pipelineId)
if err != nil {
impl.logger.Errorw("service err, GetCdPipelineById", "pipelineId", pipelineId, "err", err)
return
}
cdResp, err := CreatePreAndPostStageResponse(cdPipeline, version)
if err != nil {
impl.logger.Errorw("service err, CheckForVersionAndCreatePreAndPostStagePayload", "pipelineId", pipelineId, "err", err)
return
}
return cdResp, nil
}

func (impl *CdPipelineConfigServiceImpl) GetCdPipelineById(pipelineId int) (cdPipeline *bean.CDPipelineConfigObject, err error) {
dbPipeline, err := impl.pipelineRepository.FindById(pipelineId)
if err != nil && errors.IsNotFound(err) {
Expand Down