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
}