func()

in internal/resources/fetching/fetchers/azure/assets_fetcher.go [86:125]


func (f *AzureAssetsFetcher) Fetch(ctx context.Context, cycleMetadata cycle.Metadata) error {
	f.log.Info("Starting AzureAssetsFetcher.Fetch")
	var errAgg error
	// This might be relevant if we'd like to fetch assets in parallel in order to evaluate a rule that uses multiple resources
	var assets []inventory.AzureAsset
	for _, assetGroup := range AzureAssetGroups {
		// Fetching all types even if non-existent in asset group for simplicity
		r, err := f.provider.ListAllAssetTypesByName(ctx, assetGroup, slices.Collect(maps.Keys(AzureAssetTypeToTypePair)))
		if err != nil {
			f.log.Errorf("AzureAssetsFetcher.Fetch failed to fetch asset group %s: %s", assetGroup, err.Error())
			errAgg = errors.Join(errAgg, err)
			continue
		}
		assets = append(assets, r...)
	}

	subscriptions, err := f.provider.GetSubscriptions(ctx, cycleMetadata)
	if err != nil {
		f.log.Errorf("Error fetching subscription information: %v", err)
	}

	for _, e := range f.enrichers {
		if err := e.Enrich(ctx, cycleMetadata, assets); err != nil {
			errAgg = errors.Join(errAgg, fmt.Errorf("error while enriching assets: %w", err))
		}
	}

	for _, asset := range assets {
		select {
		case <-ctx.Done():
			err := ctx.Err()
			f.log.Infof("AzureAssetsFetcher.Fetch context err: %s", err.Error())
			errAgg = errors.Join(errAgg, err)
			return errAgg
		case f.resourceCh <- resourceFromAsset(asset, cycleMetadata, subscriptions):
		}
	}

	return errAgg
}