...
1 package ipranger
2
3 import (
4 "context"
5 "fmt"
6 "time"
7
8 "google.golang.org/api/compute/v1"
9 )
10
11 type gcpSubnetSvc struct {
12 compute *compute.Service
13 svc *compute.SubnetworksService
14 }
15
16 func newGCPSubnetService(ctx context.Context) (*gcpSubnetSvc, error) {
17 computeSvc, err := compute.NewService(ctx)
18 if err != nil {
19 return nil, err
20 }
21 return &gcpSubnetSvc{
22 compute: computeSvc,
23 svc: compute.NewSubnetworksService(computeSvc),
24 }, nil
25 }
26
27 func (g *gcpSubnetSvc) List(project string) (computeSubnetAggregatedList, error) {
28 list, err := g.svc.AggregatedList(project).Do()
29 if err != nil {
30 return nil, err
31 }
32 return list.Items, nil
33 }
34
35 func (g *gcpSubnetSvc) Create(project, ipRange, region, name string) (*compute.Subnetwork, error) {
36 toCreate := &compute.Subnetwork{
37 IpCidrRange: ipRange,
38 Name: name,
39 Network: defaultNetwork(project),
40 }
41
42
43 op, err := g.svc.Insert(project, region, toCreate).Do()
44 if err != nil {
45 return nil, err
46 }
47 ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
48 defer cancel()
49 for {
50 if op.Status == "DONE" {
51 break
52 }
53 op, err = g.compute.RegionOperations.Get(project, region, op.Name).Do()
54 if err != nil {
55 return nil, err
56 }
57 select {
58 case <-ctx.Done():
59 if err := ctx.Err(); err != nil {
60 return nil, err
61 }
62 break
63 case <-time.After(5 * time.Second):
64 continue
65 }
66 }
67
68
69 newSubnet, err := g.svc.Get(project, region, name).Do()
70 if err != nil {
71 return nil, err
72 }
73 return newSubnet, nil
74 }
75
76 func defaultNetwork(project string) string {
77 return fmt.Sprintf("projects/%s/global/networks/default", project)
78 }
79
View as plain text