Skip to content

Commit 5b49481

Browse files
authored
feat(gcp)!: Make Listing Enabled Services failures not block the sync (#10699)
#### Summary We currently require a successful `ListServices` for all projects in the org. If a user cannot make the call for a single project then the entire sync will fail. This PR changes the listing to be a best effort, which means that if CQ is not able to make the `ListServices` call it will just assume that all services are enabled
1 parent 9122f84 commit 5b49481

2 files changed

Lines changed: 26 additions & 11 deletions

File tree

plugins/source/gcp/client/client.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ func New(ctx context.Context, logger zerolog.Logger, s specs.Source, opts source
276276
c.ProjectId = projects[0]
277277
}
278278
if gcpSpec.EnabledServicesOnly {
279-
if err := c.configureEnabledServices(ctx, s.Concurrency); err != nil {
279+
if err := c.configureEnabledServices(ctx, int(s.Concurrency)); err != nil {
280280
return nil, err
281281
}
282282
}
@@ -482,24 +482,31 @@ func setUnion(a []string, b []string) []string {
482482
return union
483483
}
484484

485-
func (c *Client) configureEnabledServices(ctx context.Context, concurrency uint64) error {
485+
func (c *Client) configureEnabledServices(ctx context.Context, concurrency int) error {
486486
var esLock sync.Mutex
487487
g, ctx := errgroup.WithContext(ctx)
488-
g.SetLimit(int(concurrency))
489-
488+
g.SetLimit(concurrency)
490489
for _, p := range c.projects {
491490
project := p
492491
g.Go(func() error {
493492
cl := c.withProject(project)
494493
svc, err := cl.fetchEnabledServices(ctx)
494+
if err != nil {
495+
switch status.Code(err) {
496+
case codes.ResourceExhausted:
497+
c.logger.Warn().Err(err).Msgf("failed to list enabled services because of rate limiting. Sync will continue without filtering out disabled services for this project: %s. Consider setting larger values for `backoff_retries` and `backoff_delay`", project)
498+
case codes.PermissionDenied:
499+
c.logger.Warn().Err(err).Msgf("failed to list enabled services because of insufficient permissions. Sync will continue without filtering out disabled services for this project: %s", project)
500+
default:
501+
c.logger.Err(err).Msg("failed to list enabled services")
502+
return err
503+
}
504+
return nil
505+
}
506+
// Only update the enabled services if we were able to list all services successfully
495507
esLock.Lock()
496508
c.EnabledServices[project] = svc
497509
esLock.Unlock()
498-
if status.Code(err) == codes.ResourceExhausted {
499-
c.logger.Err(err).Msg("failed to list enabled services because of rate limiting. Consider setting larger values for `backoff_retries` and `backoff_delay`")
500-
} else {
501-
c.logger.Err(err).Msg("failed to list enabled services")
502-
}
503510
return err
504511
})
505512
}

plugins/source/gcp/client/multiplex.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,18 @@ func ProjectMultiplexEnabledServices(enabledService string) func(schema.ClientMe
2424
// preallocate all clients just in case
2525
l := make([]schema.ClientMeta, 0, len(cl.projects))
2626
for _, projectId := range cl.projects {
27-
// This map can only be empty if user has not opted into `EnabledServicesOnly` via the spec
27+
// When EnabledServicesOnly is empty, we can assume that all services should be synced
2828
if len(cl.EnabledServices) == 0 {
2929
l = append(l, cl.withProject(projectId))
30-
} else if cl.EnabledServices[projectId] != nil && cl.EnabledServices[projectId][enabledService] != nil {
30+
continue
31+
}
32+
// When EnabledServices[projectId] is nil then we can assume that all services should be synced as the Listing of Enabled Services must have failed
33+
if cl.EnabledServices[projectId] == nil {
34+
l = append(l, cl.withProject(projectId))
35+
continue
36+
}
37+
// When `projectId` key is set then we can assume listing was completed successfully and only if the enabledService is set should we sync
38+
if cl.EnabledServices[projectId] != nil && cl.EnabledServices[projectId][enabledService] != nil {
3139
l = append(l, cl.withProject(projectId))
3240
}
3341
}

0 commit comments

Comments
 (0)