Skip to content

Commit 17d7fde

Browse files
authored
Merge pull request #6638 from devtron-labs/develop-main-sync-3jun-1
sync: Develop main sync
2 parents 20ab433 + 5fc7dfb commit 17d7fde

File tree

8 files changed

+64
-43
lines changed

8 files changed

+64
-43
lines changed

internal/sql/repository/pipelineConfig/CiTemplateOverrideRepository.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
repository2 "github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository"
2222
"github.com/devtron-labs/devtron/pkg/sql"
2323
"github.com/go-pg/pg"
24+
"github.com/go-pg/pg/orm"
2425
"go.uber.org/zap"
2526
)
2627

@@ -47,6 +48,7 @@ type CiTemplateOverrideRepository interface {
4748
FindByAppId(appId int) ([]*CiTemplateOverride, error)
4849
FindByCiPipelineIds(ciPipelineIds []int) ([]*CiTemplateOverride, error)
4950
FindByCiPipelineId(ciPipelineId int) (*CiTemplateOverride, error)
51+
FindIfTemplateOverrideExistsByCiPipelineIdsAndGitMaterialId(ciPipelineIds []int, gitMaterialId int) (bool, error)
5052
}
5153

5254
type CiTemplateOverrideRepositoryImpl struct {
@@ -125,3 +127,22 @@ func (repo *CiTemplateOverrideRepositoryImpl) FindByCiPipelineId(ciPipelineId in
125127
}
126128
return ciTemplateOverride, nil
127129
}
130+
131+
func (repo *CiTemplateOverrideRepositoryImpl) FindIfTemplateOverrideExistsByCiPipelineIdsAndGitMaterialId(ciPipelineIds []int, gitMaterialId int) (bool, error) {
132+
if len(ciPipelineIds) == 0 {
133+
return false, nil
134+
}
135+
count, err := repo.dbConnection.Model((*CiTemplateOverride)(nil)).
136+
Where("ci_pipeline_id in (?)", pg.In(ciPipelineIds)).
137+
WhereGroup(func(q *orm.Query) (*orm.Query, error) {
138+
return q.Where("git_material_id = ?", gitMaterialId).WhereOr("build_context_git_material_id = ?", gitMaterialId), nil
139+
}).
140+
Where("active = ?", true).
141+
Count()
142+
if err != nil {
143+
repo.logger.Errorw("error in checking if template override exists", "ciPipelineIds", ciPipelineIds, "gitMaterialId", gitMaterialId, "err", err)
144+
return false, err
145+
}
146+
return count > 0, nil
147+
148+
}

internal/sql/repository/pipelineConfig/PipelineRepository.go

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ type PipelineRepository interface {
118118
FindActiveByInFilter(envId int, appIdIncludes []int) (pipelines []*Pipeline, err error)
119119
FindActivePipelineAppIdsByInFilter(envId int, appIdIncludes []int) ([]int, error)
120120
FindActiveByNotFilter(envId int, appIdExcludes []int) (pipelines []*Pipeline, err error)
121-
FindAllPipelinesByChartsOverrideAndAppIdAndChartId(chartOverridden bool, appId int, chartId int) (pipelines []*Pipeline, err error)
121+
FindAllPipelinesWithoutOverriddenCharts(appId int) (pipelineIds []int, err error)
122122
FindActiveByAppIdAndPipelineId(appId int, pipelineId int) ([]*Pipeline, error)
123123
FindActiveByAppIdAndEnvId(appId int, envId int) (*Pipeline, error)
124124
SetDeploymentAppCreatedInPipeline(deploymentAppCreated bool, pipelineId int, userId int32) error
@@ -578,19 +578,16 @@ func (impl *PipelineRepositoryImpl) FindActiveByNotFilter(envId int, appIdExclud
578578
return pipelines, err
579579
}
580580

581-
func (impl *PipelineRepositoryImpl) FindAllPipelinesByChartsOverrideAndAppIdAndChartId(hasConfigOverridden bool, appId int, chartId int) (pipelines []*Pipeline, err error) {
582-
err = impl.dbConnection.Model(&pipelines).
583-
Column("pipeline.*").
584-
Join("inner join charts on pipeline.app_id = charts.app_id").
585-
Join("inner join chart_env_config_override ceco on charts.id = ceco.chart_id").
586-
Where("pipeline.app_id = ?", appId).
587-
Where("charts.id = ?", chartId).
588-
Where("ceco.is_override = ?", hasConfigOverridden).
589-
Where("pipeline.deleted = ?", false).
590-
Where("ceco.active = ?", true).
591-
Where("charts.active = ?", true).
592-
Select()
593-
return pipelines, err
581+
func (impl *PipelineRepositoryImpl) FindAllPipelinesWithoutOverriddenCharts(appId int) (pipelineIds []int, err error) {
582+
err = impl.dbConnection.Model().Table("pipeline").Column("pipeline.id").
583+
Where("pipeline.deleted = ?", false).Where("pipeline.app_id = ?", appId).
584+
Where(`pipeline.environment_id NOT IN (
585+
SELECT ceco.target_environment FROM chart_env_config_override ceco
586+
INNER JOIN charts ON charts.id = ceco.chart_id
587+
WHERE charts.app_id = ? AND charts.active = ? AND ceco.is_override = ?
588+
AND ceco.active = ? AND ceco.latest = ?)`, appId, true, true, true, true).
589+
Select(&pipelineIds)
590+
return pipelineIds, err
594591
}
595592

596593
func (impl *PipelineRepositoryImpl) FindActiveByAppIdAndPipelineId(appId int, pipelineId int) ([]*Pipeline, error) {

pkg/build/pipeline/CiTemplateReadService.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type CiTemplateReadService interface {
1818
GetAppliedDockerConfigForCiPipeline(ciPipelineId, appId int, isOverridden bool) (*types.DockerArtifactStoreBean, error)
1919
GetBaseDockerConfigForCiPipeline(appId int) (*types.DockerArtifactStoreBean, error)
2020
FindByAppIds(appIds []int) (map[int]*bean.CiTemplateBean, error)
21+
CheckIfTemplateOverrideExists(ciPipelineIds []int, gitMaterialId int) (bool, error)
2122
}
2223

2324
type CiTemplateReadServiceImpl struct {
@@ -181,3 +182,7 @@ func (impl *CiTemplateReadServiceImpl) FindByAppIds(appIds []int) (map[int]*bean
181182
}
182183
return ciTemplateMap, nil
183184
}
185+
186+
func (impl *CiTemplateReadServiceImpl) CheckIfTemplateOverrideExists(ciPipelineIds []int, gitMaterialId int) (bool, error) {
187+
return impl.CiTemplateOverrideRepository.FindIfTemplateOverrideExistsByCiPipelineIdsAndGitMaterialId(ciPipelineIds, gitMaterialId)
188+
}

pkg/deployment/manifest/deploymentTemplate/DeploymentTemplateHistoryService.go

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,16 @@ func NewDeploymentTemplateHistoryServiceImpl(logger *zap.SugaredLogger, deployme
7070

7171
func (impl DeploymentTemplateHistoryServiceImpl) CreateDeploymentTemplateHistoryFromGlobalTemplate(chart *chartRepoRepository.Chart, tx *pg.Tx, IsAppMetricsEnabled bool) (err error) {
7272
//getting all pipelines without overridden charts
73-
pipelines, err := impl.pipelineRepository.FindAllPipelinesByChartsOverrideAndAppIdAndChartId(false, chart.AppId, chart.Id)
73+
pipelineIds, err := impl.pipelineRepository.FindAllPipelinesWithoutOverriddenCharts(chart.AppId)
7474
if err != nil && err != pg.ErrNoRows {
7575
impl.logger.Errorw("err in getting pipelines, CreateDeploymentTemplateHistoryFromGlobalTemplate", "err", err, "chart", chart)
7676
return err
7777
}
78+
/*
79+
When creating base template entry, we also create entries for all pipeline whose env template is not overridden;
80+
as the change in base template will also impact them. Earlier we used to create individual entries for all pipelines
81+
but due to performance impact we are now saving the impacted pipelineIds in the base template entry itself (column pipeline_ids).
82+
*/
7883
chartRefDto, err := impl.chartRefService.FindById(chart.ChartRefId)
7984
if err != nil {
8085
impl.logger.Errorw("err in getting chartRef, CreateDeploymentTemplateHistoryFromGlobalTemplate", "err", err, "chart", chart)
@@ -89,6 +94,7 @@ func (impl DeploymentTemplateHistoryServiceImpl) CreateDeploymentTemplateHistory
8994
TemplateName: chartRefDto.Name,
9095
TemplateVersion: chartRefDto.Version,
9196
IsAppMetricsEnabled: IsAppMetricsEnabled,
97+
PipelineIds: pipelineIds,
9298
AuditLog: sql.AuditLog{
9399
CreatedOn: chart.CreatedOn,
94100
CreatedBy: chart.CreatedBy,
@@ -106,34 +112,6 @@ func (impl DeploymentTemplateHistoryServiceImpl) CreateDeploymentTemplateHistory
106112
impl.logger.Errorw("err in creating history entry for deployment template", "err", err, "history", historyModel)
107113
return err
108114
}
109-
for _, pipeline := range pipelines {
110-
historyModel := &repository.DeploymentTemplateHistory{
111-
AppId: chart.AppId,
112-
PipelineId: pipeline.Id,
113-
ImageDescriptorTemplate: chart.ImageDescriptorTemplate,
114-
Template: chart.GlobalOverride,
115-
Deployed: false,
116-
TemplateName: chartRefDto.Name,
117-
TemplateVersion: chartRefDto.Version,
118-
IsAppMetricsEnabled: IsAppMetricsEnabled,
119-
AuditLog: sql.AuditLog{
120-
CreatedOn: chart.CreatedOn,
121-
CreatedBy: chart.CreatedBy,
122-
UpdatedOn: chart.UpdatedOn,
123-
UpdatedBy: chart.UpdatedBy,
124-
},
125-
}
126-
//creating new entry
127-
if tx != nil {
128-
_, err = impl.deploymentTemplateHistoryRepository.CreateHistoryWithTxn(historyModel, tx)
129-
} else {
130-
_, err = impl.deploymentTemplateHistoryRepository.CreateHistory(historyModel)
131-
}
132-
if err != nil {
133-
impl.logger.Errorw("err in creating history entry for deployment template", "err", err, "history", historyModel)
134-
return err
135-
}
136-
}
137115
return err
138116
}
139117

pkg/pipeline/CiMaterialConfigService.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"github.com/devtron-labs/devtron/internal/sql/constants"
2222
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
23+
util2 "github.com/devtron-labs/devtron/internal/util"
2324
"github.com/devtron-labs/devtron/pkg/bean"
2425
"github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/read"
2526
"github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository"
@@ -29,6 +30,7 @@ import (
2930
"github.com/go-pg/pg"
3031
"github.com/juju/errors"
3132
"go.uber.org/zap"
33+
"net/http"
3234
"strings"
3335
"time"
3436
)
@@ -123,6 +125,20 @@ func (impl *CiMaterialConfigServiceImpl) DeleteMaterial(request *bean.UpdateMate
123125
return fmt.Errorf("cannot delete git material, is being used in docker config")
124126
}
125127
}
128+
overriddenPipelineIds := make([]int, 0, len(pipelines))
129+
for _, dbPipeline := range pipelines {
130+
if dbPipeline.IsDockerConfigOverridden {
131+
overriddenPipelineIds = append(overriddenPipelineIds, dbPipeline.Id)
132+
}
133+
}
134+
exist, err := impl.ciTemplateService.CheckIfTemplateOverrideExists(overriddenPipelineIds, request.Material.Id)
135+
if err != nil {
136+
impl.logger.Errorw("error in checking if template override exists", "pipelineIds", overriddenPipelineIds, "gitMaterialId", request.Material.Id, "err", err)
137+
return err
138+
}
139+
if exist {
140+
return util2.GetApiErrorAdapter(http.StatusBadRequest, "400", "cannot delete git material, is being used in overridden ci template", "cannot delete git material, is being used in overridden ci template")
141+
}
126142
}
127143
existingMaterial, err := impl.gitMaterialReadService.FindById(request.Material.Id)
128144
if err != nil {

pkg/pipeline/history/repository/DeploymentTemplateHistoryRepository.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type DeploymentTemplateHistory struct {
5757
DeployedOn time.Time `sql:"deployed_on"`
5858
DeployedBy int32 `sql:"deployed_by"`
5959
MergeStrategy string `sql:"merge_strategy"`
60+
PipelineIds []int `sql:"pipeline_ids,array"`
6061
sql.AuditLog
6162
//getting below data from cd_workflow_runner and users join
6263
DeploymentStatus string `sql:"-"`
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-- not dropping the added column as it is used for audit and data loss can be impactful. The old code can run with the column added and should not cause any issue.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE deployment_template_history
2+
ADD COLUMN IF NOT EXISTS pipeline_ids integer[];

0 commit comments

Comments
 (0)