func()

in internal/resources/providers/gcplib/inventory/provider.go [125:180]


func (p *ProviderInitializer) Init(ctx context.Context, log *clog.Logger, gcpConfig auth.GcpFactoryConfig) (ServiceAPI, error) {
	limiter := NewAssetsInventoryRateLimiter(log)
	// initialize GCP assets inventory client
	client, err := asset.NewClient(ctx, append(gcpConfig.ClientOpts, option.WithGRPCDialOption(limiter.GetInterceptorDialOption()))...)
	if err != nil {
		return nil, err
	}
	// wrap the assets inventory client for mocking
	assetsInventoryWrapper := &AssetsInventoryWrapper{
		Close: client.Close,
		ListAssets: func(ctx context.Context, req *assetpb.ListAssetsRequest, opts ...gax.CallOption) Iterator {
			return client.ListAssets(ctx, req, append(opts, RetryOnResourceExhausted)...)
		},
	}

	// initialize GCP resource manager client
	var gcpClientOpt []option.ClientOption
	gcpClientOpt = append(append(gcpClientOpt, option.WithScopes(cloudresourcemanager.CloudPlatformReadOnlyScope)), gcpConfig.ClientOpts...)
	crmService, err := cloudresourcemanager.NewService(ctx, gcpClientOpt...)
	if err != nil {
		return nil, err
	}

	displayNamesCache := NewMapCache[string]()
	// wrap the resource manager client for mocking
	crmServiceWrapper := &ResourceManagerWrapper{
		getProjectDisplayName: func(ctx context.Context, parent string) string {
			return displayNamesCache.Get(func() string {
				prj, err := crmService.Projects.Get(parent).Context(ctx).Do()
				if err != nil {
					log.Errorf("error fetching GCP Project: %s, error: %s", parent, err)
					return ""
				}
				return prj.DisplayName
			}, parent)
		},
		getOrganizationDisplayName: func(ctx context.Context, parent string) string {
			return displayNamesCache.Get(func() string {
				org, err := crmService.Organizations.Get(parent).Context(ctx).Do()
				if err != nil {
					log.Errorf("error fetching GCP Org: %s, error: %s", parent, err)
					return ""
				}
				return org.DisplayName
			}, parent)
		},
	}

	return &Provider{
		config:                    gcpConfig,
		log:                       log,
		inventory:                 assetsInventoryWrapper,
		crm:                       crmServiceWrapper,
		cloudAccountMetadataCache: NewMapCache[*fetching.CloudAccountMetadata](),
	}, nil
}