diff --git a/cmd/whitesourceExecuteScan.go b/cmd/whitesourceExecuteScan.go index 57143e6a9a..b00e8ba6e0 100644 --- a/cmd/whitesourceExecuteScan.go +++ b/cmd/whitesourceExecuteScan.go @@ -470,34 +470,35 @@ func validateProductVersion(version string) string { func wsScanOptions(config *ScanOptions) *ws.ScanOptions { return &ws.ScanOptions{ - BuildTool: config.BuildTool, - ScanType: "", // no longer provided via config - OrgToken: config.OrgToken, - UserToken: config.UserToken, - ProductName: config.ProductName, - ProductToken: config.ProductToken, - ProductVersion: config.Version, - ProjectName: config.ProjectName, - BuildDescriptorFile: config.BuildDescriptorFile, - BuildDescriptorExcludeList: config.BuildDescriptorExcludeList, - PomPath: config.BuildDescriptorFile, - M2Path: config.M2Path, - GlobalSettingsFile: config.GlobalSettingsFile, - ProjectSettingsFile: config.ProjectSettingsFile, - InstallArtifacts: config.InstallArtifacts, - DefaultNpmRegistry: config.DefaultNpmRegistry, - AgentDownloadURL: config.AgentDownloadURL, - AgentFileName: config.AgentFileName, - ConfigFilePath: config.ConfigFilePath, - Includes: config.Includes, - Excludes: config.Excludes, - JreDownloadURL: config.JreDownloadURL, - AgentURL: config.AgentURL, - ServiceURL: config.ServiceURL, - ScanPath: config.ScanPath, - InstallCommand: config.InstallCommand, - Verbose: GeneralConfig.Verbose, - SkipParentProjectResolution: config.SkipParentProjectResolution, + BuildTool: config.BuildTool, + ScanType: "", // no longer provided via config + OrgToken: config.OrgToken, + UserToken: config.UserToken, + ProductName: config.ProductName, + ProductToken: config.ProductToken, + ProductVersion: config.Version, + ProjectName: config.ProjectName, + BuildDescriptorFile: config.BuildDescriptorFile, + BuildDescriptorExcludeList: config.BuildDescriptorExcludeList, + PomPath: config.BuildDescriptorFile, + M2Path: config.M2Path, + GlobalSettingsFile: config.GlobalSettingsFile, + ProjectSettingsFile: config.ProjectSettingsFile, + InstallArtifacts: config.InstallArtifacts, + DefaultNpmRegistry: config.DefaultNpmRegistry, + AgentDownloadURL: config.AgentDownloadURL, + AgentFileName: config.AgentFileName, + ConfigFilePath: config.ConfigFilePath, + Includes: config.Includes, + Excludes: config.Excludes, + JreDownloadURL: config.JreDownloadURL, + AgentURL: config.AgentURL, + ServiceURL: config.ServiceURL, + ScanPath: config.ScanPath, + InstallCommand: config.InstallCommand, + Verbose: GeneralConfig.Verbose, + SkipParentProjectResolution: config.SkipParentProjectResolution, + SkipModulesWithDuplicatedNames: config.SkipModulesWithDuplicatedNames, } } diff --git a/cmd/whitesourceExecuteScan_generated.go b/cmd/whitesourceExecuteScan_generated.go index 0d4220a97c..24cb0181cb 100644 --- a/cmd/whitesourceExecuteScan_generated.go +++ b/cmd/whitesourceExecuteScan_generated.go @@ -80,6 +80,7 @@ type whitesourceExecuteScanOptions struct { PrivateModules string `json:"privateModules,omitempty"` PrivateModulesGitToken string `json:"privateModulesGitToken,omitempty"` SkipProjectsWithEmptyTokens bool `json:"SkipProjectsWithEmptyTokens,omitempty"` + SkipModulesWithDuplicatedNames bool `json:"skipModulesWithDuplicatedNames,omitempty"` } type whitesourceExecuteScanCommonPipelineEnvironment struct { @@ -379,6 +380,7 @@ func addWhitesourceExecuteScanFlags(cmd *cobra.Command, stepConfig *whitesourceE cmd.Flags().StringVar(&stepConfig.PrivateModules, "privateModules", os.Getenv("PIPER_privateModules"), "Tells go which modules shall be considered to be private (by setting [GOPRIVATE](https://pkg.go.dev/cmd/go#hdr-Configuration_for_downloading_non_public_code)).") cmd.Flags().StringVar(&stepConfig.PrivateModulesGitToken, "privateModulesGitToken", os.Getenv("PIPER_privateModulesGitToken"), "GitHub personal access token as per https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line.") cmd.Flags().BoolVar(&stepConfig.SkipProjectsWithEmptyTokens, "SkipProjectsWithEmptyTokens", false, "Skips projects with empty tokens after scanning. This is for testing purposes only and should not be used until we roll out the new parameter") + cmd.Flags().BoolVar(&stepConfig.SkipModulesWithDuplicatedNames, "skipModulesWithDuplicatedNames", false, "This parameter was added only for testing purposes. It should be removed in the future.") cmd.MarkFlagRequired("buildTool") cmd.MarkFlagRequired("orgToken") @@ -1052,6 +1054,15 @@ func whitesourceExecuteScanMetadata() config.StepData { Aliases: []config.Alias{}, Default: false, }, + { + Name: "skipModulesWithDuplicatedNames", + ResourceRef: []config.ResourceReference{}, + Scope: []string{"GENERAL", "PARAMETERS", "STAGES", "STEPS"}, + Type: "bool", + Mandatory: false, + Aliases: []config.Alias{}, + Default: false, + }, }, }, Containers: []config.Container{ diff --git a/cmd/whitesourceExecuteScan_test.go b/cmd/whitesourceExecuteScan_test.go index b9c7e22b59..3aa94049e9 100644 --- a/cmd/whitesourceExecuteScan_test.go +++ b/cmd/whitesourceExecuteScan_test.go @@ -484,7 +484,7 @@ func TestCheckPolicyViolations(t *testing.T) { ctx := context.Background() config := ScanOptions{ProductName: "mock-product", Version: "1"} scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -513,7 +513,7 @@ func TestCheckPolicyViolations(t *testing.T) { ctx := context.Background() config := ScanOptions{} scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -534,7 +534,7 @@ func TestCheckPolicyViolations(t *testing.T) { ctx := context.Background() config := ScanOptions{FailOnSevereVulnerabilities: true} scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -562,7 +562,7 @@ func TestCheckPolicyViolations(t *testing.T) { ctx := context.Background() config := ScanOptions{} scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -579,7 +579,7 @@ func TestCheckPolicyViolations(t *testing.T) { ctx := context.Background() config := ScanOptions{} scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -597,7 +597,7 @@ func TestCheckPolicyViolations(t *testing.T) { ctx := context.Background() config := ScanOptions{ProductName: "mock-product", Version: "1"} scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -623,7 +623,7 @@ func TestCheckSecurityViolations(t *testing.T) { CvssSeverityLimit: "7", } scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -678,7 +678,7 @@ func TestCheckSecurityViolations(t *testing.T) { FailOnSevereVulnerabilities: true, } scan := newWhitesourceScan(&config) - if err := scan.AppendScannedProject("testProject1"); err != nil { + if err := scan.AppendScannedProject("testProject1", false); err != nil { t.Fail() } systemMock := ws.NewSystemMock("ignored") @@ -832,7 +832,7 @@ func TestPersistScannedProjects(t *testing.T) { cpe := whitesourceExecuteScanCommonPipelineEnvironment{} config := &ScanOptions{Version: "1"} scan := newWhitesourceScan(config) - _ = scan.AppendScannedProject("project") + _ = scan.AppendScannedProject("project", false) // test persistScannedProjects(config, scan, &cpe) // assert @@ -843,8 +843,8 @@ func TestPersistScannedProjects(t *testing.T) { cpe := whitesourceExecuteScanCommonPipelineEnvironment{} config := &ScanOptions{Version: "1"} scan := newWhitesourceScan(config) - _ = scan.AppendScannedProject("project-app") - _ = scan.AppendScannedProject("project-db") + _ = scan.AppendScannedProject("project-app", false) + _ = scan.AppendScannedProject("project-db", false) // test persistScannedProjects(config, scan, &cpe) // assert diff --git a/pkg/whitesource/reporting_test.go b/pkg/whitesource/reporting_test.go index 94abeb6d9d..beee3b86fb 100644 --- a/pkg/whitesource/reporting_test.go +++ b/pkg/whitesource/reporting_test.go @@ -29,7 +29,7 @@ func TestCreateCustomVulnerabilityReport(t *testing.T) { AggregateProjectName: config.ProjectName, ProductVersion: config.ProductVersion, } - scan.AppendScannedProject("testProject") + scan.AppendScannedProject("testProject", false) alerts := []Alert{ {Library: Library{Filename: "vul1"}, Vulnerability: Vulnerability{CVSS3Score: 7.0, Score: 6}}, {Library: Library{Filename: "vul2"}, Vulnerability: Vulnerability{CVSS3Score: 8.0, TopFix: Fix{Message: "this is the top fix"}}}, @@ -77,7 +77,7 @@ func TestCreateCycloneSBOM(t *testing.T) { ProductVersion: config.ProductVersion, Coordinates: versioning.Coordinates{GroupID: "com.sap", ArtifactID: "myproduct", Version: "1.3.4"}, } - scan.AppendScannedProject("testProject") + scan.AppendScannedProject("testProject", false) alerts := []Alert{ {Library: Library{KeyID: 42, Name: "log4j", GroupID: "apache-logging", ArtifactID: "log4j", Filename: "vul1"}, Vulnerability: Vulnerability{CVSS3Score: 7.0, Score: 6}}, {Library: Library{KeyID: 43, Name: "commons-lang", GroupID: "apache-commons", ArtifactID: "commons-lang", Filename: "vul2"}, Vulnerability: Vulnerability{CVSS3Score: 8.0, TopFix: Fix{Message: "this is the top fix"}}}, @@ -126,7 +126,7 @@ func TestCreateCycloneSBOM(t *testing.T) { ProductToken: "productToken-123", Coordinates: versioning.Coordinates{GroupID: "com.sap", ArtifactID: "myproduct", Version: "1.3.4"}, } - scan.AppendScannedProject("testProject") + scan.AppendScannedProject("testProject", false) lib3 := Library{KeyID: 43, Name: "commons-lang", GroupID: "apache-commons", ArtifactID: "commons-lang", Version: "2.4.30", LibType: "Java", Filename: "vul2"} lib4 := Library{KeyID: 45, Name: "commons-lang", GroupID: "apache-commons", ArtifactID: "commons-lang", Version: "3.15", LibType: "Java", Filename: "novul"} @@ -177,7 +177,7 @@ func TestWriteCycloneSBOM(t *testing.T) { func TestCreateSarifResultFile(t *testing.T) { scan := &Scan{ProductVersion: "1"} - scan.AppendScannedProject("project1") + scan.AppendScannedProject("project1", false) scan.AgentName = "Some test agent" scan.AgentVersion = "1.2.6" alerts := []Alert{ @@ -203,8 +203,8 @@ func TestWriteCustomVulnerabilityReports(t *testing.T) { t.Run("success", func(t *testing.T) { productName := "mock-product" scan := &Scan{ProductVersion: "1"} - scan.AppendScannedProject("project1") - scan.AppendScannedProject("project2") + scan.AppendScannedProject("project1", false) + scan.AppendScannedProject("project2", false) scanReport := reporting.ScanReport{} var utilsMock piperutils.FileUtils @@ -240,7 +240,7 @@ func TestWriteCustomVulnerabilityReports(t *testing.T) { t.Run("failed to write json report", func(t *testing.T) { productName := "mock-product" scan := &Scan{ProductVersion: "1"} - scan.AppendScannedProject("project1") + scan.AppendScannedProject("project1", false) scanReport := reporting.ScanReport{} utilsMock := &mock.FilesMock{} utilsMock.FileWriteErrors = map[string]error{ diff --git a/pkg/whitesource/scan.go b/pkg/whitesource/scan.go index ff1b547db3..d64000a3f4 100644 --- a/pkg/whitesource/scan.go +++ b/pkg/whitesource/scan.go @@ -11,6 +11,10 @@ import ( "github.com/SAP/jenkins-library/pkg/versioning" ) +var ( + ErrDuplicatedProjectName = fmt.Errorf("project with the same name was already scanned") +) + // Scan stores information about scanned WhiteSource projects (modules). type Scan struct { // AggregateProjectName stores the name of the WhiteSource project where scans shall be aggregated. @@ -43,19 +47,19 @@ func (s *Scan) versionSuffix() string { // AppendScannedProject checks that no Project with the same name is already contained in the list of scanned projects, // and appends a new Project with the given name. The global product version is appended to the name. -func (s *Scan) AppendScannedProject(projectName string) error { +func (s *Scan) AppendScannedProject(projectName string, skipModulesWithDuplicatedNames bool) error { if len(projectName) == 0 { return fmt.Errorf("projectName must not be empty") } if strings.HasSuffix(projectName, s.versionSuffix()) { return fmt.Errorf("projectName is not expected to include the product version already") } - return s.AppendScannedProjectVersion(projectName + s.versionSuffix()) + return s.AppendScannedProjectVersion(projectName+s.versionSuffix(), skipModulesWithDuplicatedNames) } // AppendScannedProjectVersion checks that no Project with the same name is already contained in the list of scanned // projects, and appends a new Project with the given name (which is expected to include the product version). -func (s *Scan) AppendScannedProjectVersion(projectName string) error { +func (s *Scan) AppendScannedProjectVersion(projectName string, skipModulesWithDuplicatedNames bool) error { if !strings.HasSuffix(projectName, s.versionSuffix()) { return fmt.Errorf("projectName is expected to include the product version") } @@ -67,6 +71,10 @@ func (s *Scan) AppendScannedProjectVersion(projectName string) error { if exists { log.Entry().Errorf("A module with the name '%s' was already scanned. "+ "Your project's modules must have unique names.", projectName) + if skipModulesWithDuplicatedNames { + return ErrDuplicatedProjectName + } + return fmt.Errorf("project with name '%s' was already scanned", projectName) } s.scannedProjects[projectName] = Project{Name: projectName} diff --git a/pkg/whitesource/scanMaven.go b/pkg/whitesource/scanMaven.go index 82a2f7c9c4..2c911383ae 100644 --- a/pkg/whitesource/scanMaven.go +++ b/pkg/whitesource/scanMaven.go @@ -117,7 +117,7 @@ func (s *Scan) appendModulesThatWillBeScanned(utils Utils, excludes []string) er return fmt.Errorf("artifactId missing from '%s'", info.PomXMLPath) } - err := s.AppendScannedProject(project.ArtifactID) + err := s.AppendScannedProject(project.ArtifactID, false) if err != nil { return err } diff --git a/pkg/whitesource/scanNPM.go b/pkg/whitesource/scanNPM.go index 44b072dfd4..6c84f008f4 100644 --- a/pkg/whitesource/scanNPM.go +++ b/pkg/whitesource/scanNPM.go @@ -136,7 +136,7 @@ func (s *Scan) executeNpmScanForModule(modulePath string, config *ScanOptions, u return err } - if err := s.AppendScannedProject(projectName); err != nil { + if err := s.AppendScannedProject(projectName, false); err != nil { return err } diff --git a/pkg/whitesource/scanOptions.go b/pkg/whitesource/scanOptions.go index 0a7a948bad..d42d1ab577 100644 --- a/pkg/whitesource/scanOptions.go +++ b/pkg/whitesource/scanOptions.go @@ -46,7 +46,8 @@ type ScanOptions struct { InstallCommand string - SkipParentProjectResolution bool + SkipParentProjectResolution bool + SkipModulesWithDuplicatedNames bool Verbose bool } diff --git a/pkg/whitesource/scanReports_test.go b/pkg/whitesource/scanReports_test.go index aecfabc1b2..04ab01ba3b 100644 --- a/pkg/whitesource/scanReports_test.go +++ b/pkg/whitesource/scanReports_test.go @@ -23,7 +23,7 @@ func TestDownloadReports(t *testing.T) { utils := &mock.FilesMock{} system := NewSystemMock("2010-05-30 00:15:00 +0100") scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("mock-project") + _ = scan.AppendScannedProject("mock-project", false) _ = scan.UpdateProjects("mock-product-token", system) // test paths, err := scan.DownloadReports(options, utils, system) @@ -76,7 +76,7 @@ func TestDownloadReports(t *testing.T) { utils := &mock.FilesMock{} system := NewSystemMock("2010-05-30 00:15:00 +0100") scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("no-such-project") + _ = scan.AppendScannedProject("no-such-project", false) _ = scan.UpdateProjects("mock-product-token", system) // test paths, err := scan.DownloadReports(options, utils, system) @@ -93,7 +93,7 @@ func TestDownloadReports(t *testing.T) { utils := &mock.FilesMock{} system := NewSystemMock("2010-05-30 00:15:00 +0100") scan := &Scan{ProductVersion: "1"} - err := scan.AppendScannedProjectVersion("mock-project - 1") + err := scan.AppendScannedProjectVersion("mock-project - 1", false) require.NoError(t, err) _ = scan.UpdateProjects("mock-product-token", system) // test diff --git a/pkg/whitesource/scanUA.go b/pkg/whitesource/scanUA.go index e7b591e9d8..97edab39c7 100644 --- a/pkg/whitesource/scanUA.go +++ b/pkg/whitesource/scanUA.go @@ -99,7 +99,11 @@ func (s *Scan) ExecuteUAScanInPath(config *ScanOptions, utils Utils, scanPath st // ToDo: check if this is required if !config.SkipParentProjectResolution { - if err := s.AppendScannedProject(s.AggregateProjectName); err != nil { + if err := s.AppendScannedProject(s.AggregateProjectName, config.SkipModulesWithDuplicatedNames); err != nil { + if config.SkipModulesWithDuplicatedNames && errors.Is(err, ErrDuplicatedProjectName) { + return nil + } + return err } } diff --git a/pkg/whitesource/scan_test.go b/pkg/whitesource/scan_test.go index 15eda7d5c8..c81af4658f 100644 --- a/pkg/whitesource/scan_test.go +++ b/pkg/whitesource/scan_test.go @@ -17,7 +17,7 @@ func TestAppendScannedProjectVersion(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err := scan.AppendScannedProjectVersion("module-a - 1") + err := scan.AppendScannedProjectVersion("module-a - 1", false) // assert assert.NoError(t, err) expected := make(map[string]Project) @@ -30,8 +30,8 @@ func TestAppendScannedProjectVersion(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err1 := scan.AppendScannedProjectVersion("module-a - 1") - err2 := scan.AppendScannedProjectVersion("module-b - 1") + err1 := scan.AppendScannedProjectVersion("module-a - 1", false) + err2 := scan.AppendScannedProjectVersion("module-b - 1", false) // assert assert.NoError(t, err1) assert.NoError(t, err2) @@ -46,7 +46,7 @@ func TestAppendScannedProjectVersion(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err := scan.AppendScannedProjectVersion("module-a") + err := scan.AppendScannedProjectVersion("module-a", false) // assert assert.EqualError(t, err, "projectName is expected to include the product version") assert.Len(t, scan.scannedProjects, 0) @@ -55,8 +55,8 @@ func TestAppendScannedProjectVersion(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err1 := scan.AppendScannedProjectVersion("module-a - 1") - err2 := scan.AppendScannedProjectVersion("module-a - 1") + err1 := scan.AppendScannedProjectVersion("module-a - 1", false) + err2 := scan.AppendScannedProjectVersion("module-a - 1", false) // assert assert.NoError(t, err1) assert.EqualError(t, err2, "project with name 'module-a - 1' was already scanned") @@ -69,7 +69,7 @@ func TestAppendScannedProjectVersion(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err := scan.AppendScannedProject("") + err := scan.AppendScannedProject("", false) // assert assert.EqualError(t, err, "projectName must not be empty") assert.Len(t, scan.scannedProjects, 0) @@ -79,7 +79,7 @@ func TestAppendScannedProjectVersion(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err := scan.AppendScannedProject("name - 1") + err := scan.AppendScannedProject("name - 1", false) // assert assert.EqualError(t, err, "projectName is not expected to include the product version already") assert.Len(t, scan.scannedProjects, 0) @@ -89,7 +89,7 @@ func TestAppendScannedProjectVersion(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err := scan.AppendScannedProjectVersion(" - 1") + err := scan.AppendScannedProjectVersion(" - 1", false) // assert assert.EqualError(t, err, "projectName consists only of the product version") assert.Len(t, scan.scannedProjects, 0) @@ -103,7 +103,7 @@ func TestAppendScannedProject(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} // test - err := scan.AppendScannedProject("module-a") + err := scan.AppendScannedProject("module-a", false) // assert assert.NoError(t, err) expected := make(map[string]Project) @@ -126,7 +126,7 @@ func TestProjectByName(t *testing.T) { t.Run("happy path", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - err := scan.AppendScannedProject("module-a") + err := scan.AppendScannedProject("module-a", false) require.NoError(t, err) // test project, exists := scan.ProjectByName("module-a - 1") @@ -137,7 +137,7 @@ func TestProjectByName(t *testing.T) { t.Run("no such project", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - err := scan.AppendScannedProject("module-a") + err := scan.AppendScannedProject("module-a", false) require.NoError(t, err) // test project, exists := scan.ProjectByName("not there") @@ -160,7 +160,7 @@ func TestScannedProjects(t *testing.T) { t.Run("single module", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("module-a") + _ = scan.AppendScannedProject("module-a", false) // test projects := scan.ScannedProjects() // assert @@ -170,8 +170,8 @@ func TestScannedProjects(t *testing.T) { t.Run("two modules", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("module-a") - _ = scan.AppendScannedProject("module-b") + _ = scan.AppendScannedProject("module-a", false) + _ = scan.AppendScannedProject("module-b", false) // test projects := scan.ScannedProjects() // assert @@ -191,24 +191,24 @@ func TestScannedProjectNames(t *testing.T) { t.Run("one project", func(t *testing.T) { scan := &Scan{ProductVersion: "1"} - scan.AppendScannedProject("testProject1") + scan.AppendScannedProject("testProject1", false) assert.Equal(t, []string{"testProject1 - 1"}, scan.ScannedProjectNames()) }) t.Run("multiple sorted", func(t *testing.T) { scan := &Scan{ProductVersion: "1"} - scan.AppendScannedProject("testProject1") - scan.AppendScannedProject("testProject2") - scan.AppendScannedProject("testProject3") + scan.AppendScannedProject("testProject1", false) + scan.AppendScannedProject("testProject2", false) + scan.AppendScannedProject("testProject3", false) assert.Equal(t, []string{"testProject1 - 1", "testProject2 - 1", "testProject3 - 1"}, scan.ScannedProjectNames()) }) t.Run("multiple mixed", func(t *testing.T) { scan := &Scan{ProductVersion: "1"} - scan.AppendScannedProject("testProject3") - scan.AppendScannedProject("testProject1") - scan.AppendScannedProject("testProject2") + scan.AppendScannedProject("testProject3", false) + scan.AppendScannedProject("testProject1", false) + scan.AppendScannedProject("testProject2", false) assert.Equal(t, []string{"testProject1 - 1", "testProject2 - 1", "testProject3 - 1"}, scan.ScannedProjectNames()) }) @@ -227,7 +227,7 @@ func TestScanTime(t *testing.T) { t.Run("happy path", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("module-a") + _ = scan.AppendScannedProject("module-a", false) // test timeStamp := scan.ScanTime("module-a - 1") // assert @@ -236,7 +236,7 @@ func TestScanTime(t *testing.T) { t.Run("project not scanned", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("module-a") + _ = scan.AppendScannedProject("module-a", false) // test timeStamp := scan.ScanTime("module-b - 1") // assert @@ -249,7 +249,7 @@ func TestScanUpdateProjects(t *testing.T) { t.Run("update single project which exists", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("mock-project") + _ = scan.AppendScannedProject("mock-project", false) mockSystem := NewSystemMock("just-now") // test err := scan.UpdateProjects("mock-product-token", mockSystem) @@ -270,8 +270,8 @@ func TestScanUpdateProjects(t *testing.T) { t.Run("update two projects, one of which exist", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("mock-project") - _ = scan.AppendScannedProject("unknown-project") + _ = scan.AppendScannedProject("mock-project", false) + _ = scan.AppendScannedProject("unknown-project", false) mockSystem := NewSystemMock("just-now") // test err := scan.UpdateProjects("mock-product-token", mockSystem) @@ -295,7 +295,7 @@ func TestScanUpdateProjects(t *testing.T) { t.Run("update single project which does not exist", func(t *testing.T) { // init scan := &Scan{ProductVersion: "1"} - _ = scan.AppendScannedProject("mock-project") + _ = scan.AppendScannedProject("mock-project", false) mockSystem := &SystemMock{} // empty mock with no products // test err := scan.UpdateProjects("mock-product-token", mockSystem) diff --git a/resources/metadata/whitesourceExecuteScan.yaml b/resources/metadata/whitesourceExecuteScan.yaml index eed85bd972..d4ac16d079 100644 --- a/resources/metadata/whitesourceExecuteScan.yaml +++ b/resources/metadata/whitesourceExecuteScan.yaml @@ -662,6 +662,15 @@ spec: - STEPS type: bool default: false + - name: skipModulesWithDuplicatedNames + type: bool + description: "This parameter was added only for testing purposes. It should be removed in the future." + scope: + - GENERAL + - PARAMETERS + - STAGES + - STEPS + default: false resources: - name: buildDescriptor type: stash