@@ -364,32 +364,51 @@ func (gcp *GCPProvider) validateEnabled() error {
364364 return errEnabled
365365 }
366366
367- wrapped := func (name string ) string {
368- return fmt .Sprintf ("projects/%s/services/%s" , proj .ProjectId , name )
369- }
367+ services := algorithms .Map ([]string {
368+ "serviceusage.googleapis.com" ,
369+ "cloudresourcemanager.googleapis.com" ,
370+ "container.googleapis.com" ,
371+ }, func (name string ) string { return fmt .Sprintf ("projects/%s/services/%s" , proj .ProjectId , name ) })
372+ parent := fmt .Sprintf ("projects/%s" , proj .ProjectId )
370373 req := & serviceusagepb.BatchGetServicesRequest {
371- Parent : fmt .Sprintf ("projects/%s" , proj .ProjectId ),
372- Names : []string {
373- wrapped ("serviceusage.googleapis.com" ),
374- wrapped ("cloudresourcemanager.googleapis.com" ),
375- wrapped ("container.googleapis.com" ),
376- },
374+ Parent : parent ,
375+ Names : services ,
377376 }
378377 resp , err := c .BatchGetServices (ctx , req )
379378 if err != nil {
380379 utils .LogError ().Println (err )
381380 return errEnabled
382381 }
383382
384- for _ , svc := range resp .Services {
385- if svc .State != serviceusagepb .State_ENABLED {
386- utils .LogError ().Printf ("the service state %v != %v" , svc .State , serviceusagepb .State_ENABLED )
383+ missing := algorithms .Filter (resp .Services , func (svc * serviceusagepb.Service ) bool {
384+ return svc .State != serviceusagepb .State_ENABLED
385+ })
386+
387+ if len (missing ) > 0 {
388+ services := algorithms .Map (missing , func (svc * serviceusagepb.Service ) string { return svc .Name })
389+ enableReq := & serviceusagepb.BatchEnableServicesRequest {
390+ Parent : parent ,
391+ ServiceIds : services ,
392+ }
393+ utils .LogError ().Printf ("Attempting to enable services %v" , services )
394+ if err := tryToEnableServices (ctx , c , enableReq ); err != nil {
387395 return errEnabled
388396 }
389397 }
398+
390399 return nil
391400}
392401
402+ func tryToEnableServices (ctx context.Context , client * serviceusage.Client , req * serviceusagepb.BatchEnableServicesRequest ) (err error ) {
403+ op , err := client .BatchEnableServices (ctx , req )
404+ if err != nil {
405+ return
406+ }
407+
408+ _ , err = op .Wait (ctx )
409+ return
410+ }
411+
393412func (gcp * GCPProvider ) Permissions () (permissions.Checker , error ) {
394413 proj , err := gcp .getProject ()
395414 if err != nil {
0 commit comments