Skip to content

Commit 77914ad

Browse files
fix: prevent deletion of git material used in overridden CI templates (#6633)
1 parent 4ea9144 commit 77914ad

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

internal/sql/repository/pipelineConfig/CiTemplateOverrideRepository.go

Lines changed: 18 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,19 @@ 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+
count, err := repo.dbConnection.Model((*CiTemplateOverride)(nil)).
133+
Where("ci_pipeline_id in (?)", pg.In(ciPipelineIds)).
134+
WhereGroup(func(q *orm.Query) (*orm.Query, error) {
135+
return q.Where("git_material_id = ?", gitMaterialId).WhereOr("build_context_git_material_id = ?", gitMaterialId), nil
136+
}).
137+
Where("active = ?", true).
138+
Count()
139+
if err != nil {
140+
repo.logger.Errorw("error in checking if template override exists", "ciPipelineIds", ciPipelineIds, "gitMaterialId", gitMaterialId, "err", err)
141+
return false, err
142+
}
143+
return count > 0, nil
144+
145+
}

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/pipeline/CiMaterialConfigService.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,18 @@ 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"
2627
"github.com/devtron-labs/devtron/pkg/build/pipeline"
2728
"github.com/devtron-labs/devtron/pkg/pipeline/history"
2829
"github.com/devtron-labs/devtron/pkg/sql"
30+
"github.com/devtron-labs/devtron/util/sliceUtil"
2931
"github.com/go-pg/pg"
3032
"github.com/juju/errors"
3133
"go.uber.org/zap"
34+
"net/http"
3235
"strings"
3336
"time"
3437
)
@@ -123,6 +126,17 @@ func (impl *CiMaterialConfigServiceImpl) DeleteMaterial(request *bean.UpdateMate
123126
return fmt.Errorf("cannot delete git material, is being used in docker config")
124127
}
125128
}
129+
pipelineIds := sliceUtil.NewSliceFromFuncExec(pipelines, func(dbPipeline *pipelineConfig.CiPipeline) int {
130+
return dbPipeline.Id
131+
})
132+
exist, err := impl.ciTemplateService.CheckIfTemplateOverrideExists(pipelineIds, request.Material.Id)
133+
if err != nil {
134+
impl.logger.Errorw("error in checking if template override exists", "pipelineIds", pipelineIds, "gitMaterialId", request.Material.Id, "err", err)
135+
return err
136+
}
137+
if exist {
138+
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")
139+
}
126140
}
127141
existingMaterial, err := impl.gitMaterialReadService.FindById(request.Material.Id)
128142
if err != nil {

0 commit comments

Comments
 (0)