package ipranger import ( "context" "fmt" "time" "google.golang.org/api/compute/v1" ) type gcpSubnetSvc struct { compute *compute.Service svc *compute.SubnetworksService } func newGCPSubnetService(ctx context.Context) (*gcpSubnetSvc, error) { computeSvc, err := compute.NewService(ctx) if err != nil { return nil, err } return &gcpSubnetSvc{ compute: computeSvc, svc: compute.NewSubnetworksService(computeSvc), }, nil } func (g *gcpSubnetSvc) List(project string) (computeSubnetAggregatedList, error) { list, err := g.svc.AggregatedList(project).Do() if err != nil { return nil, err } return list.Items, nil } func (g *gcpSubnetSvc) Create(project, ipRange, region, name string) (*compute.Subnetwork, error) { toCreate := &compute.Subnetwork{ IpCidrRange: ipRange, Name: name, Network: defaultNetwork(project), } // create the subnet op, err := g.svc.Insert(project, region, toCreate).Do() if err != nil { return nil, err } ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() for { if op.Status == "DONE" { break } op, err = g.compute.RegionOperations.Get(project, region, op.Name).Do() if err != nil { return nil, err } select { case <-ctx.Done(): if err := ctx.Err(); err != nil { return nil, err } break case <-time.After(5 * time.Second): continue } } // get the newly created subnet newSubnet, err := g.svc.Get(project, region, name).Do() if err != nil { return nil, err } return newSubnet, nil } func defaultNetwork(project string) string { return fmt.Sprintf("projects/%s/global/networks/default", project) }