Skip to content

Commit bee4e27

Browse files
fix sbom (#555)
* fix sbom
1 parent 67cd378 commit bee4e27

File tree

4 files changed

+42
-14
lines changed

4 files changed

+42
-14
lines changed

internal/commands/result.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/MakeNowJust/heredoc"
1616
"github.com/checkmarx/ast-cli/internal/commands/util"
1717
"github.com/checkmarx/ast-cli/internal/commands/util/printer"
18+
"github.com/checkmarx/ast-cli/internal/logger"
1819

1920
commonParams "github.com/checkmarx/ast-cli/internal/params"
2021

@@ -73,6 +74,7 @@ const (
7374
scaLastScanTimeFlagDescription = "SCA last scan time. Available options: integer above 1"
7475
projectPrivatePackageFlagDescription = "Enable or disable project private package. Available options: true,false"
7576
scaPrivatePackageVersionFlagDescription = "SCA project private package version. Example: 0.1.1"
77+
reportSbomMaxRetries = 10
7678
)
7779

7880
var filterResultsListFlagUsage = fmt.Sprintf(
@@ -752,8 +754,13 @@ func createReport(
752754
convertNotAvailableNumberToZero(summary)
753755

754756
if !contains(summary.EnginesEnabled, scaType) {
755-
return fmt.Errorf("to generate %s report, SCA engine must be enabled on scan summary", printer.FormatSbom)
757+
return fmt.Errorf("unable to generate %s report - SCA engine must be enabled on scan summary", printer.FormatSbom)
756758
}
759+
760+
if summary.ScaIssues == notAvailableNumber {
761+
return fmt.Errorf("unable to generate %s report - SCA engine did not complete successfully", printer.FormatSbom)
762+
}
763+
757764
return exportSbomResults(resultsSbomWrapper, summaryRpt, summary, formatSbomOptions, useSCALocalFlow)
758765
}
759766
return fmt.Errorf("bad report format %s", format)
@@ -946,10 +953,26 @@ func exportSbomResults(sbomWrapper wrappers.ResultsSbomWrapper, targetFile strin
946953
}
947954

948955
log.Println("Generating SBOM report with " + payload.FileFormat + " file format using SCA proxy...")
956+
i := uint64(0)
957+
958+
for i < reportSbomMaxRetries {
959+
completed, err := sbomWrapper.GenerateSbomReportWithProxy(payload, targetFile)
960+
if err != nil {
961+
return err
962+
}
963+
964+
if completed {
965+
return nil
966+
}
967+
i++
968+
time.Sleep(delayValueForReport * time.Millisecond)
969+
logger.PrintIfVerbose(
970+
fmt.Sprintf(
971+
"Retry SBOM report: --%d retry",
972+
i,
973+
),
974+
)
949975

950-
err := sbomWrapper.GenerateSbomReportWithProxy(payload, targetFile)
951-
if err != nil {
952-
return err
953976
}
954977

955978
return nil

internal/wrappers/mock/results-sbom-mock.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
type ResultsSbomWrapper struct{}
1111

12-
func (w *ResultsSbomWrapper) GenerateSbomReportWithProxy(payload *wrappers.SbomReportsPayload, targetFile string) error {
12+
func (w *ResultsSbomWrapper) GenerateSbomReportWithProxy(payload *wrappers.SbomReportsPayload, targetFile string) (bool, error) {
1313
file, err := os.Create(targetFile)
1414
defer func() {
1515
err = file.Close()
@@ -18,9 +18,10 @@ func (w *ResultsSbomWrapper) GenerateSbomReportWithProxy(payload *wrappers.SbomR
1818
}
1919
}()
2020
if err != nil {
21-
return errors.Wrapf(err, "Failed to create file %s", targetFile)
21+
return true, errors.Wrapf(err, "Failed to create file %s", targetFile)
2222
}
23-
return nil
23+
24+
return true, nil
2425
}
2526

2627
// GenerateSbomReport mock for tests

internal/wrappers/results-sbom-http.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,35 +72,39 @@ func (r *SbomHTTPWrapper) GenerateSbomReport(payload *SbomReportsPayload) (*Sbom
7272
}
7373
}
7474

75-
func (r *SbomHTTPWrapper) GenerateSbomReportWithProxy(payload *SbomReportsPayload, targetFile string) error {
75+
func (r *SbomHTTPWrapper) GenerateSbomReportWithProxy(payload *SbomReportsPayload, targetFile string) (bool, error) {
7676
clientTimeout := viper.GetUint(commonParams.ClientTimeoutKey)
7777
path := fmt.Sprintf("%s/%s/%s", r.proxyPath, payload.ScanID, "export")
7878
params := map[string]string{"format": payload.FileFormat}
7979
resp, err := SendPrivateHTTPRequestWithQueryParams(http.MethodGet, path, params, nil, clientTimeout)
8080
if err != nil {
81-
return err
81+
return true, err
8282
}
8383

8484
defer func() {
8585
_ = resp.Body.Close()
8686
}()
8787

88+
if resp.StatusCode == http.StatusCreated || resp.StatusCode == http.StatusAccepted {
89+
return false, nil
90+
}
91+
8892
if resp.StatusCode != http.StatusOK {
89-
return errors.Errorf("response status code %d", resp.StatusCode)
93+
return true, errors.Errorf("response status code %d", resp.StatusCode)
9094
}
9195

9296
file, err := os.Create(targetFile)
9397
if err != nil {
94-
return errors.Wrapf(err, "Failed to create file %s", targetFile)
98+
return true, errors.Wrapf(err, "Failed to create file %s", targetFile)
9599
}
96100
defer file.Close()
97101
size, err := io.Copy(file, resp.Body)
98102
if err != nil {
99-
return errors.Wrapf(err, "Failed to write file %s", targetFile)
103+
return true, errors.Wrapf(err, "Failed to write file %s", targetFile)
100104
}
101105

102106
log.Printf("Downloaded file: %s - %d bytes\n", targetFile, size)
103-
return nil
107+
return true, nil
104108
}
105109

106110
func (r *SbomHTTPWrapper) GetSbomReportStatus(reportID string) (*SbomPollingResponse, error) {

internal/wrappers/results-sbom.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package wrappers
22

33
type ResultsSbomWrapper interface {
44
GenerateSbomReport(payload *SbomReportsPayload) (*SbomReportsResponse, error)
5-
GenerateSbomReportWithProxy(payload *SbomReportsPayload, targetFile string) error
5+
GenerateSbomReportWithProxy(payload *SbomReportsPayload, targetFile string) (bool, error)
66
GetSbomReportStatus(reportID string) (*SbomPollingResponse, error)
77
DownloadSbomReport(reportID, targetFile string) error
88
}

0 commit comments

Comments
 (0)