Skip to content

Commit aea70ec

Browse files
committed
Merge branch 'image-scan-fixes-oss' into further-refact-with-iter-1-image-scan-fixes
# Conflicts: # pkg/policyGovernance/security/imageScanning/ImageScanService.go
2 parents 89fec6b + 6fb5c6a commit aea70ec

File tree

12 files changed

+250
-35
lines changed

12 files changed

+250
-35
lines changed

internal/sql/repository/CiArtifactRepository.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ type CiArtifactRepository interface {
139139
// MigrateToWebHookDataSourceType is used for backward compatibility. It'll migrate the deprecated DataSource type
140140
MigrateToWebHookDataSourceType(id int) error
141141
UpdateLatestTimestamp(artifactIds []int) error
142+
143+
Update(ciArtifact *CiArtifact) error
142144
}
143145

144146
type CiArtifactRepositoryImpl struct {
@@ -858,3 +860,12 @@ func (impl CiArtifactRepositoryImpl) FindCiArtifactByImagePaths(images []string)
858860
}
859861
return ciArtifacts, nil
860862
}
863+
864+
func (impl CiArtifactRepositoryImpl) Update(ciArtifact *CiArtifact) error {
865+
err := impl.dbConnection.Update(ciArtifact)
866+
if err != nil {
867+
impl.logger.Errorw("error in updating ciArtifact", "ciArtifact", ciArtifact, "err", err)
868+
return err
869+
}
870+
return nil
871+
}

pkg/eventProcessor/bean/workflowEventBean.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ type CiCompleteEvent struct {
8282
ImageDetailsFromCR json.RawMessage `json:"imageDetailsFromCR"`
8383
PluginRegistryArtifactDetails map[string][]string `json:"PluginRegistryArtifactDetails"`
8484
PluginArtifactStage string `json:"pluginArtifactStage"`
85+
IsScanEnabled bool `json:"isScanEnabled"`
8586
pluginImageDetails *registry.ImageDetailsFromCR
8687
PluginArtifacts *PluginArtifacts `json:"pluginArtifacts"`
8788
}

pkg/eventProcessor/in/WorkflowEventProcessorService.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ func (impl *WorkflowEventProcessorImpl) BuildCiArtifactRequest(event bean.CiComp
682682
IsArtifactUploaded: event.IsArtifactUploaded,
683683
PluginRegistryArtifactDetails: pluginArtifacts,
684684
PluginArtifactStage: event.PluginArtifactStage,
685+
IsScanEnabled: event.IsScanEnabled,
685686
}
686687
// if DataSource is empty, repository.WEBHOOK is considered as default
687688
if request.DataSource == "" {

pkg/pipeline/PipelineStageService.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ type PipelineStageService interface {
5050
// , there was a bug(https://github.com/devtron-labs/devtron/issues/3826) where we were not deleting pipeline stage entry even after deleting all the pipelineStageSteps
5151
// , this will delete those pipelineStage entry
5252
DeletePipelineStageIfReq(stageReq *bean.PipelineStageDto, userId int32) (error, bool)
53+
IsScanPluginConfiguredAtPipelineStage(pipelineId int, pipelineStage repository.PipelineStageType, pluginName string) (bool, error)
5354
}
5455

5556
func NewPipelineStageService(logger *zap.SugaredLogger,
@@ -2168,3 +2169,20 @@ func (impl *PipelineStageServiceImpl) extractAndMapScopedVariables(stageReq *bea
21682169
return impl.scopedVariableManager.ExtractAndMapVariables(string(requestJson), stageReq.Id, repository3.EntityTypePipelineStage, userId, tx)
21692170

21702171
}
2172+
2173+
func (impl *PipelineStageServiceImpl) IsScanPluginConfiguredAtPipelineStage(pipelineId int, pipelineStage repository.PipelineStageType, pluginName string) (bool, error) {
2174+
plugin, err := impl.globalPluginRepository.GetPluginByName(pluginName)
2175+
if err != nil {
2176+
impl.logger.Errorw("error in getting image scanning plugin, Vulnerability Scanning", "pipelineId", pipelineId, "pipelineStage", pipelineStage, "err", err)
2177+
return false, err
2178+
}
2179+
if len(plugin) == 0 {
2180+
return false, nil
2181+
}
2182+
isScanPluginConfigured, err := impl.pipelineStageRepository.CheckIfPluginExistsInPipelineStage(pipelineId, pipelineStage, plugin[0].Id)
2183+
if err != nil {
2184+
impl.logger.Errorw("error in getting ci pipeline plugin", "err", err, "pipelineId", pipelineId, "pluginId", plugin[0].Id)
2185+
return false, err
2186+
}
2187+
return isScanPluginConfigured, nil
2188+
}

pkg/pipeline/repository/PipelineStageRepository.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,22 @@ const (
5353
PIPELINE_STAGE_STEP_VARIABLE_FORMAT_TYPE_DATE PipelineStageStepVariableFormatType = "DATE"
5454
)
5555

56+
func (r PipelineStageType) ToString() string {
57+
return string(r)
58+
}
59+
func (r PipelineStageType) IsStageTypePreCi() bool {
60+
return r == PIPELINE_STAGE_TYPE_PRE_CI
61+
}
62+
func (r PipelineStageType) IsStageTypePreCd() bool {
63+
return r == PIPELINE_STAGE_TYPE_PRE_CD
64+
}
65+
func (r PipelineStageType) IsStageTypePostCi() bool {
66+
return r == PIPELINE_STAGE_TYPE_POST_CI
67+
}
68+
func (r PipelineStageType) IsStageTypePostCd() bool {
69+
return r == PIPELINE_STAGE_TYPE_POST_CD
70+
}
71+
5672
type PipelineStage struct {
5773
tableName struct{} `sql:"pipeline_stage" pg:",discard_unknown_columns"`
5874
Id int `sql:"id,pk"`
@@ -184,6 +200,7 @@ type PipelineStageRepository interface {
184200
MarkStepsDeletedByStageId(stageId int) error
185201
MarkStepsDeletedExcludingActiveStepsInUpdateReq(activeStepIdsPresentInReq []int, stageId int) error
186202
GetActiveStepsByRefPluginId(refPluginId int) ([]*PipelineStageStep, error)
203+
CheckIfPluginExistsInPipelineStage(pipelineId int, stageType PipelineStageType, pluginId int) (bool, error)
187204

188205
CreatePipelineScript(pipelineScript *PluginPipelineScript, tx *pg.Tx) (*PluginPipelineScript, error)
189206
UpdatePipelineScript(pipelineScript *PluginPipelineScript) (*PluginPipelineScript, error)
@@ -873,3 +890,26 @@ func (impl *PipelineStageRepositoryImpl) MarkConditionsDeletedExcludingActiveVar
873890
}
874891
return nil
875892
}
893+
894+
func (impl *PipelineStageRepositoryImpl) CheckIfPluginExistsInPipelineStage(pipelineId int, stageType PipelineStageType, pluginId int) (bool, error) {
895+
var step PipelineStageStep
896+
query := impl.dbConnection.Model(&step).
897+
Column("pipeline_stage_step.*").
898+
Join("INNER JOIN pipeline_stage ps on ps.id = pipeline_stage_step.pipeline_stage_id").
899+
Where("pipeline_stage_step.ref_plugin_id = ?", pluginId).
900+
Where("ps.type = ?", stageType).
901+
Where("pipeline_stage_step.deleted=?", false).
902+
Where("ps.deleted= ?", false)
903+
904+
if stageType.IsStageTypePostCi() || stageType.IsStageTypePreCi() {
905+
query.Where("ps.ci_pipeline_id= ?", pipelineId)
906+
} else if stageType.IsStageTypePostCd() || stageType.IsStageTypePreCd() {
907+
query.Where("ps.cd_pipeline_id= ?", pipelineId)
908+
}
909+
exists, err := query.Exists()
910+
if err != nil {
911+
impl.logger.Errorw("error in getting plugin stage step by pipelineId, stageType nad plugin id", "pipelineId", pipelineId, "stageType", stageType.ToString(), "pluginId", pluginId, "err", err)
912+
return false, err
913+
}
914+
return exists, nil
915+
}

pkg/policyGovernance/security/imageScanning/ImageScanService.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
bean3 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/bean"
2525
repository3 "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/repository"
2626
securityBean "github.com/devtron-labs/devtron/pkg/policyGovernance/security/imageScanning/repository/bean"
27+
serverBean "github.com/devtron-labs/devtron/pkg/server/bean"
2728
"go.opentelemetry.io/otel"
2829
"time"
2930

@@ -43,6 +44,7 @@ type ImageScanService interface {
4344
FetchMinScanResultByAppIdAndEnvId(request *bean3.ImageScanRequest) (*bean3.ImageScanExecutionDetail, error)
4445
VulnerabilityExposure(request *repository3.VulnerabilityRequest) (*repository3.VulnerabilityExposureListingResponse, error)
4546
GetArtifactVulnerabilityStatus(ctx context.Context, request *bean2.VulnerabilityCheckRequest) (bool, error)
47+
IsImageScanExecutionCompleted(image, imageDigest string) (bool, error)
4648
}
4749

4850
type ImageScanServiceImpl struct {
@@ -644,3 +646,19 @@ func (impl ImageScanServiceImpl) updateCount(severity securityBean.Severity, cri
644646
}
645647
return criticalCount, highCount, moderateCount, lowCount, unkownCount
646648
}
649+
650+
func (impl ImageScanServiceImpl) IsImageScanExecutionCompleted(image, imageDigest string) (bool, error) {
651+
var isScanningCompleted bool
652+
allScanHistoryMappings, err := impl.scanToolExecutionHistoryMappingRepository.FetchScanHistoryMappingsUsingImageAndImageDigest(image, imageDigest)
653+
if err != nil {
654+
impl.Logger.Errorw("error in fetching all scan execution history mapping", "image", image, "imageDigest", imageDigest, "err", err)
655+
return false, err
656+
}
657+
658+
for _, scanHistoryMapping := range allScanHistoryMappings {
659+
if scanHistoryMapping.State == serverBean.ScanExecutionProcessStateCompleted {
660+
isScanningCompleted = true
661+
}
662+
}
663+
return isScanningCompleted, nil
664+
}

pkg/policyGovernance/security/imageScanning/repository/ScanToolExecutionHistoryMapping.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type ScanToolExecutionHistoryMappingRepository interface {
4545
GetAllScanHistoriesByState(state serverBean.ScanExecutionProcessState) ([]*ScanToolExecutionHistoryMapping, error)
4646
GetAllScanHistoriesByExecutionHistoryIdAndStates(executionHistoryId int, states []serverBean.ScanExecutionProcessState) ([]*ScanToolExecutionHistoryMapping, error)
4747
GetAllScanHistoriesByExecutionHistoryIds(ids []int) ([]*ScanToolExecutionHistoryMapping, error)
48+
FetchScanHistoryMappingsUsingImageAndImageDigest(image, imageDigest string) ([]*ScanToolExecutionHistoryMapping, error)
4849
}
4950

5051
type ScanToolExecutionHistoryMappingRepositoryImpl struct {
@@ -142,3 +143,18 @@ func (repo *ScanToolExecutionHistoryMappingRepositoryImpl) GetAllScanHistoriesBy
142143
}
143144
return models, nil
144145
}
146+
147+
func (repo *ScanToolExecutionHistoryMappingRepositoryImpl) FetchScanHistoryMappingsUsingImageAndImageDigest(image, imageDigest string) ([]*ScanToolExecutionHistoryMapping, error) {
148+
var models []*ScanToolExecutionHistoryMapping
149+
err := repo.dbConnection.Model(&models).
150+
Column("scan_tool_execution_history_mapping.*").
151+
Join("INNER JOIN image_scan_execution_history iseh on iseh.id=scan_tool_execution_history_mapping.image_scan_execution_history_id").
152+
Where("iseh.image = ?", image).
153+
Where("iseh.image_hash = ?", imageDigest).
154+
Select()
155+
if err != nil {
156+
repo.logger.Errorw("error in getting ScanToolExecutionHistoryMapping using image and image hash", "err", err)
157+
return nil, err
158+
}
159+
return models, nil
160+
}

0 commit comments

Comments
 (0)