@@ -208,23 +208,6 @@ func CreateProgressBar(discoveredAssets *DiscoveredAssets, disableProgressBar bo
208
208
func (s * LocalScanner ) distributeJob (job * Job , ctx context.Context , upstream * upstream.UpstreamConfig ) (* explorer.ReportCollection , error ) {
209
209
log .Info ().Msgf ("discover related assets for %d asset(s)" , len (job .Inventory .Spec .Assets ))
210
210
211
- discoveredAssets , err := DiscoverAssets (ctx , job .Inventory , upstream , s .recording )
212
- if err != nil {
213
- return nil , err
214
- }
215
-
216
- // For each discovered asset, we initialize a new runtime and connect to it.
217
- // Within this process, we set up a catch-all deferred function, that shuts
218
- // down all runtimes, in case we exit early.
219
- defer func () {
220
- for _ , asset := range discoveredAssets .Assets {
221
- // we can call close multiple times and it will only execute once
222
- if asset .Runtime != nil {
223
- asset .Runtime .Close ()
224
- }
225
- }
226
- }()
227
-
228
211
// plan scan jobs
229
212
reporter := NewAggregateReporter ()
230
213
if job .Bundle == nil && upstream != nil && upstream .Creds != nil {
@@ -246,18 +229,79 @@ func (s *LocalScanner) distributeJob(job *Job, ctx context.Context, upstream *up
246
229
reporter .AddBundle (bundle )
247
230
}
248
231
232
+ processedAssets := map [string ]struct {}{}
233
+ if err := s .loopyLoop (ctx , job , processedAssets , reporter , upstream ); err != nil {
234
+ return nil , err
235
+ }
236
+
237
+ return reporter .Reports (), nil
238
+ }
239
+
240
+ func (s * LocalScanner ) loopyLoop (ctx context.Context , job * Job , processedAssets map [string ]struct {}, reporter * AggregateReporter , upstream * upstream.UpstreamConfig ) error {
241
+ discoveryReq := & AssetDiscoveryRequest {
242
+ Inv : job .Inventory ,
243
+ Upstream : upstream ,
244
+ Recording : s .recording ,
245
+ }
246
+ discoveredAssets , err := DiscoverAssets (ctx , discoveryReq )
247
+ if err != nil {
248
+ return err
249
+ }
250
+
251
+ newAssets := & DiscoveredAssets {platformIds : processedAssets }
252
+ for _ , asset := range discoveredAssets .Assets {
253
+ newAssets .Add (asset .Asset , asset .Runtime )
254
+ }
255
+
256
+ if len (newAssets .Assets ) == 0 {
257
+ return nil
258
+ }
259
+
260
+ if err := s .scanAssets (ctx , newAssets , job , reporter , upstream ); err != nil {
261
+ return err
262
+ }
263
+ for pid := range discoveredAssets .platformIds {
264
+ processedAssets [pid ] = struct {}{}
265
+ }
266
+
267
+ for _ , asset := range newAssets .Assets {
268
+ err := s .loopyLoop (ctx , & Job {
269
+ Inventory : & inventory.Inventory {
270
+ Spec : & inventory.InventorySpec {
271
+ Assets : []* inventory.Asset {asset .Asset },
272
+ },
273
+ },
274
+ Bundle : job .Bundle ,
275
+ DoRecord : job .DoRecord ,
276
+ QueryPackFilters : job .QueryPackFilters ,
277
+ Props : job .Props ,
278
+ }, processedAssets , reporter , upstream )
279
+
280
+ // Close the runtime for the asset once we are done with it
281
+ if asset .Runtime != nil {
282
+ asset .Runtime .Close ()
283
+ }
284
+ if err != nil {
285
+ return err
286
+ }
287
+ }
288
+
289
+ return nil
290
+ }
291
+
292
+ func (s * LocalScanner ) scanAssets (ctx context.Context , discoveredAssets * DiscoveredAssets , job * Job , reporter * AggregateReporter , upstream * upstream.UpstreamConfig ) error {
249
293
// if we had asset errors we want to place them into the reporter
250
294
for i := range discoveredAssets .Errors {
251
295
reporter .AddScanError (discoveredAssets .Errors [i ].Asset , discoveredAssets .Errors [i ].Err )
252
296
}
253
297
254
298
if len (discoveredAssets .Assets ) == 0 {
255
- return reporter . Reports (), nil
299
+ return nil
256
300
}
257
301
258
302
multiprogress , err := CreateProgressBar (discoveredAssets , s .disableProgressBar )
259
303
if err != nil {
260
- return nil , err
304
+ return err
261
305
}
262
306
// start the progress bar
263
307
scanGroups := sync.WaitGroup {}
@@ -274,13 +318,13 @@ func (s *LocalScanner) distributeJob(job *Job, ctx context.Context, upstream *up
274
318
if upstream != nil && upstream .ApiEndpoint != "" && ! upstream .Incognito {
275
319
client , err := upstream .InitClient (ctx )
276
320
if err != nil {
277
- return nil , err
321
+ return err
278
322
}
279
323
spaceMrn = client .SpaceMrn
280
324
281
325
services , err = explorer .NewRemoteServices (client .ApiEndpoint , client .Plugins , client .HttpClient )
282
326
if err != nil {
283
- return nil , err
327
+ return err
284
328
}
285
329
}
286
330
@@ -305,7 +349,7 @@ func (s *LocalScanner) distributeJob(job *Job, ctx context.Context, upstream *up
305
349
List : assetsToSync ,
306
350
})
307
351
if err != nil {
308
- return nil , err
352
+ return err
309
353
}
310
354
log .Debug ().Int ("assets" , len (resp .Details )).Msg ("got assets details" )
311
355
platformAssetMapping := make (map [string ]* explorer.SynchronizeAssetsRespAssetDetail )
@@ -332,7 +376,7 @@ func (s *LocalScanner) distributeJob(job *Job, ctx context.Context, upstream *up
332
376
randID := "//" + explorer .SERVICE_NAME + "/" + explorer .MRN_RESOURCE_ASSET + "/" + ksuid .New ().String ()
333
377
x , err := mrn .NewMRN (randID )
334
378
if err != nil {
335
- return nil , multierr .Wrap (err , "failed to generate a random asset MRN" )
379
+ return multierr .Wrap (err , "failed to generate a random asset MRN" )
336
380
}
337
381
asset .Mrn = x .String ()
338
382
}
@@ -342,7 +386,7 @@ func (s *LocalScanner) distributeJob(job *Job, ctx context.Context, upstream *up
342
386
// if a bundle was provided check that it matches the filter, bundles can also be downloaded
343
387
// later therefore we do not want to stop execution here
344
388
if job .Bundle != nil && job .Bundle .FilterQueryPacks (job .QueryPackFilters ) {
345
- return nil , errors .New ("all available packs filtered out. nothing to do" )
389
+ return errors .New ("all available packs filtered out. nothing to do" )
346
390
}
347
391
348
392
wg := sync.WaitGroup {}
@@ -395,7 +439,7 @@ func (s *LocalScanner) distributeJob(job *Job, ctx context.Context, upstream *up
395
439
wg .Wait ()
396
440
}
397
441
scanGroups .Wait ()
398
- return reporter . Reports (), nil
442
+ return nil
399
443
}
400
444
401
445
func HandleDelayedDiscovery (ctx context.Context , asset * inventory.Asset , runtime * providers.Runtime , services * explorer.Services , spaceMrn string ) (* inventory.Asset , error ) {
0 commit comments