...

Source file src/edge-infra.dev/pkg/f8n/ipranger/subnetsvc.go

Documentation: edge-infra.dev/pkg/f8n/ipranger

     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  	// create the subnet
    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  	// get the newly created subnet
    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