Skip to content

Commit 5ba890d

Browse files
authored
fix error handling on certifier to fail on network error when graphQL server is not up but keep running when a service issue is encountered (#2151)
Signed-off-by: pxp928 <[email protected]>
1 parent 821e685 commit 5ba890d

File tree

5 files changed

+27
-33
lines changed

5 files changed

+27
-33
lines changed

cmd/guaccollect/cmd/osv.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,9 @@ func initializeNATsandCertifier(ctx context.Context, blobAddr, pubsubAddr string
222222
if err == nil {
223223
return true
224224
}
225-
logger.Errorf("certifier ended with error: %v", err)
226-
// exit the loop but drain the channel first
227-
return false
225+
logger.Errorf("certifier encountered an error: %v, continuing...", err)
226+
// log the error but continue forward with the rest of the package processing
227+
return true
228228
}
229229

230230
ctx, cf := context.WithCancel(ctx)

pkg/certifier/certify/certify.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func Certify(ctx context.Context, query certifier.QueryComponents, emitter certi
9090
return fmt.Errorf("generate certifier documents error: %w", err)
9191
}
9292
case err := <-errChan:
93-
if !handleErr(err) {
93+
if err != nil {
9494
// drain channel before exiting
9595
drainComponentChannel(compChan, ctx, emitter, handleErr)
9696
return err
@@ -119,14 +119,14 @@ func Certify(ctx context.Context, query certifier.QueryComponents, emitter certi
119119
select {
120120
case <-ticker.C:
121121
// add logging to determine when the certifier run is started
122-
logger.Infof("Starting polling certifier run: %v", time.Now().UTC())
122+
logger.Infof("Starting certifier run: %v", time.Now().UTC())
123123
err := runCertifier()
124124
if err != nil {
125125
return fmt.Errorf("certifier failed with an error: %w", err)
126126
}
127127
// reset the interval timer and log completion of the current certifier run
128128
ticker.Reset(interval)
129-
logger.Infof("Certifier polling run completed: %v", time.Now().UTC())
129+
logger.Infof("Certifier run completed: %v", time.Now().UTC())
130130
// if the context has been canceled return the err.
131131
case <-ctx.Done():
132132
return ctx.Err() // nolint:wrapcheck

pkg/certifier/clearlydefined/clearlydefined.go

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,6 @@ func getDefinitions(ctx context.Context, client *http.Client, purls []string, co
112112
return nil, fmt.Errorf("error unmarshalling JSON: %v", err)
113113
}
114114

115-
if len(purls) != len(definitions) {
116-
return nil, fmt.Errorf("failed to get expected responses back! Purl count: %d, returned definition count %d", len(purls), len(definitions))
117-
}
118-
119115
for coordinate, definition := range definitions {
120116
definitionMap[coordinateToPurl[coordinate]] = definition
121117
}
@@ -124,7 +120,7 @@ func getDefinitions(ctx context.Context, client *http.Client, purls []string, co
124120
}
125121

126122
// EvaluateClearlyDefinedDefinition converts the purls into coordinates to query clearly defined
127-
func EvaluateClearlyDefinedDefinition(ctx context.Context, client *http.Client, purls []string) ([]*processor.Document, error) {
123+
func EvaluateClearlyDefinedDefinition(ctx context.Context, client *http.Client, purls []string, docChannel chan<- *processor.Document) ([]*processor.Document, error) {
128124
logger := logging.FromContext(ctx)
129125
var batchCoordinates []string
130126
var queryPurls []string
@@ -147,7 +143,7 @@ func EvaluateClearlyDefinedDefinition(ctx context.Context, client *http.Client,
147143
batchCoordinates = append(batchCoordinates, coordinate.ToString())
148144
}
149145
}
150-
if genCDDocs, err := generateDefinitions(ctx, client, batchCoordinates, queryPurls); err != nil {
146+
if genCDDocs, err := generateDefinitions(ctx, client, batchCoordinates, queryPurls, docChannel); err != nil {
151147
return nil, fmt.Errorf("generateDefinitions failed with error: %w", err)
152148
} else {
153149
generatedCDDocs = append(generatedCDDocs, genCDDocs...)
@@ -158,21 +154,21 @@ func EvaluateClearlyDefinedDefinition(ctx context.Context, client *http.Client,
158154

159155
// generateDefinitions takes in the batched coordinated to retrieve the definition. It uses the definition to check if source
160156
// information can be queried in clearly defined.
161-
func generateDefinitions(ctx context.Context, client *http.Client, batchCoordinates, queryPurls []string) ([]*processor.Document, error) {
157+
func generateDefinitions(ctx context.Context, client *http.Client, batchCoordinates, queryPurls []string, docChannel chan<- *processor.Document) ([]*processor.Document, error) {
162158
var generatedCDDocs []*processor.Document
163159
if len(batchCoordinates) > 0 {
164160
definitionMap, err := getDefinitions(ctx, client, queryPurls, batchCoordinates)
165161
if err != nil {
166162
return nil, fmt.Errorf("failed get package definition from clearly defined with error: %w", err)
167163
}
168164

169-
if genCDPkgDocs, err := generateDocument(definitionMap); err != nil {
165+
if genCDPkgDocs, err := generateDocument(definitionMap, docChannel); err != nil {
170166
return nil, fmt.Errorf("evaluateDefinitionForSource failed with error: %w", err)
171167
} else {
172168
generatedCDDocs = append(generatedCDDocs, genCDPkgDocs...)
173169
}
174170

175-
if genCDSrcDocs, err := evaluateDefinitionForSource(ctx, client, definitionMap); err != nil {
171+
if genCDSrcDocs, err := evaluateDefinitionForSource(ctx, client, definitionMap, docChannel); err != nil {
176172
return nil, fmt.Errorf("evaluateDefinitionForSource failed with error: %w", err)
177173
} else {
178174
generatedCDDocs = append(generatedCDDocs, genCDSrcDocs...)
@@ -194,20 +190,16 @@ func (c *cdCertifier) CertifyComponent(ctx context.Context, rootComponent interf
194190
purls = append(purls, node.Purl)
195191
}
196192

197-
if genCDDocs, err := EvaluateClearlyDefinedDefinition(ctx, c.cdHTTPClient, purls); err != nil {
193+
if _, err := EvaluateClearlyDefinedDefinition(ctx, c.cdHTTPClient, purls, docChannel); err != nil {
198194
return fmt.Errorf("could not generate document from Clearly Defined results: %w", err)
199-
} else {
200-
for _, doc := range genCDDocs {
201-
docChannel <- doc
202-
}
203195
}
204196

205197
return nil
206198
}
207199

208200
// evaluateDefinitionForSource takes in the returned definitions from package coordinates to determine if
209201
// source information can be obtained to re-query clearly defined for source related license information
210-
func evaluateDefinitionForSource(ctx context.Context, client *http.Client, definitionMap map[string]*attestation.Definition) ([]*processor.Document, error) {
202+
func evaluateDefinitionForSource(ctx context.Context, client *http.Client, definitionMap map[string]*attestation.Definition, docChannel chan<- *processor.Document) ([]*processor.Document, error) {
211203
sourceMap := map[string]bool{}
212204
var batchCoordinates []string
213205
var sourceInputs []string
@@ -238,13 +230,13 @@ func evaluateDefinitionForSource(ctx context.Context, client *http.Client, defin
238230
if err != nil {
239231
return nil, fmt.Errorf("failed get source definition from clearly defined with error: %w", err)
240232
}
241-
return generateDocument(definitionMap)
233+
return generateDocument(definitionMap, docChannel)
242234
}
243235
return nil, nil
244236
}
245237

246238
// generateDocument generates the processor document for ingestion
247-
func generateDocument(definitionMap map[string]*attestation.Definition) ([]*processor.Document, error) {
239+
func generateDocument(definitionMap map[string]*attestation.Definition, docChannel chan<- *processor.Document) ([]*processor.Document, error) {
248240
var generatedCDDocs []*processor.Document
249241
for purl, definition := range definitionMap {
250242
if definition.Described.ReleaseDate == "" {
@@ -265,6 +257,9 @@ func generateDocument(definitionMap map[string]*attestation.Definition) ([]*proc
265257
DocumentRef: events.GetDocRef(payload),
266258
},
267259
}
260+
if docChannel != nil {
261+
docChannel <- doc
262+
}
268263
generatedCDDocs = append(generatedCDDocs, doc)
269264
}
270265
return generatedCDDocs, nil

pkg/certifier/osv/osv.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,18 +78,14 @@ func (o *osvCertifier) CertifyComponent(ctx context.Context, rootComponent inter
7878
purls = append(purls, node.Purl)
7979
}
8080

81-
if genOSVDocs, err := EvaluateOSVResponse(ctx, o.osvHTTPClient, purls); err != nil {
81+
if _, err := EvaluateOSVResponse(ctx, o.osvHTTPClient, purls, docChannel); err != nil {
8282
return fmt.Errorf("could not generate document from OSV results: %w", err)
83-
} else {
84-
for _, doc := range genOSVDocs {
85-
docChannel <- doc
86-
}
8783
}
8884
return nil
8985
}
9086

9187
// EvaluateOSVResponse takes a list of purls and batch queries OSV for vulnerability information
92-
func EvaluateOSVResponse(ctx context.Context, client *http.Client, purls []string) ([]*processor.Document, error) {
88+
func EvaluateOSVResponse(ctx context.Context, client *http.Client, purls []string, docChannel chan<- *processor.Document) ([]*processor.Document, error) {
9389
var query osv_scanner.BatchedQuery
9490
packMap := map[string]bool{}
9591

@@ -117,11 +113,11 @@ func EvaluateOSVResponse(ctx context.Context, client *http.Client, purls []strin
117113

118114
responseMap[purl] = &response
119115
}
120-
return generateDocument(responseMap)
116+
return generateDocument(responseMap, docChannel)
121117
}
122118

123119
// generateDocument generated the processor document for ingestion
124-
func generateDocument(responseMap map[string]*osv_scanner.MinimalResponse) ([]*processor.Document, error) {
120+
func generateDocument(responseMap map[string]*osv_scanner.MinimalResponse, docChannel chan<- *processor.Document) ([]*processor.Document, error) {
125121
var generatedOSVDocs []*processor.Document
126122
for purl, response := range responseMap {
127123
currentTime := time.Now()
@@ -139,6 +135,9 @@ func generateDocument(responseMap map[string]*osv_scanner.MinimalResponse) ([]*p
139135
DocumentRef: events.GetDocRef(payload),
140136
},
141137
}
138+
if docChannel != nil {
139+
docChannel <- doc
140+
}
142141
generatedOSVDocs = append(generatedOSVDocs, doc)
143142
}
144143
return generatedOSVDocs, nil

pkg/ingestor/parser/common/scanner/scanner.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func PurlsVulnScan(ctx context.Context, purls []string) ([]assembler.VulnEqualIn
3939

4040
if osvProcessorDocs, err := osv_certifier.EvaluateOSVResponse(ctx, &http.Client{
4141
Transport: version.UATransport,
42-
}, purls); err != nil {
42+
}, purls, nil); err != nil {
4343
return nil, nil, fmt.Errorf("failed get response from OSV with error: %w", err)
4444
} else {
4545
for _, doc := range osvProcessorDocs {
@@ -109,7 +109,7 @@ func runQueryOnBatchedPurls(ctx context.Context, cdParser common.DocumentParser,
109109
var hasSourceAtIngest []assembler.HasSourceAtIngest
110110
if cdProcessorDocs, err := cd_certifier.EvaluateClearlyDefinedDefinition(ctx, &http.Client{
111111
Transport: version.UATransport,
112-
}, batchPurls); err != nil {
112+
}, batchPurls, nil); err != nil {
113113
return nil, nil, fmt.Errorf("failed get definition from clearly defined with error: %w", err)
114114
} else {
115115
for _, doc := range cdProcessorDocs {

0 commit comments

Comments
 (0)