github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/orbiter/kinds/providers/gce/cloudnat.go (about)

     1  package gce
     2  
     3  import (
     4  	"github.com/caos/orbos/internal/helpers"
     5  	uuid "github.com/satori/go.uuid"
     6  	"google.golang.org/api/compute/v1"
     7  	"google.golang.org/api/googleapi"
     8  )
     9  
    10  func destroyNetwork(c *context, deleteFirewalls []func() error) error {
    11  	svc, err := compute.NewService(c.ctx, *c.auth)
    12  	if err != nil {
    13  		return err
    14  	}
    15  
    16  	monitor := c.monitor.WithField("id", c.networkName)
    17  
    18  	if err := helpers.Fanout(append(deleteFirewalls, func() error {
    19  		return pruneErr(operateFunc(
    20  			func() { monitor.Debug("Deleting Cloud NAT Router") },
    21  			computeOpCall(svc.Routers.Delete(c.projectID, c.desired.Region, c.networkName).RequestId(uuid.NewV1().String()).Do),
    22  			func() error { monitor.Info("Cloud NAT Router deleted"); return nil },
    23  		)(), 404)
    24  	}))(); err != nil {
    25  		return err
    26  	}
    27  
    28  	return pruneErr(operateFunc(
    29  		func() { monitor.Debug("Deleting virtual private cloud network") },
    30  		computeOpCall(svc.Networks.Delete(c.projectID, c.networkName).RequestId(uuid.NewV1().String()).Do),
    31  		func() error { monitor.Info("Virtual private cloud network deleted"); return nil },
    32  	)(), 404)
    33  }
    34  
    35  func ensureNetwork(c *context, createFirewalls []func() error, deleteFirewalls []func() error) error {
    36  	svc, err := compute.NewService(c.ctx, *c.auth)
    37  	if err != nil {
    38  		return err
    39  	}
    40  
    41  	monitor := c.monitor.WithField("id", c.networkName)
    42  
    43  	if err := pruneErr(operateFunc(
    44  		func() { monitor.Debug("Creating virtual private cloud network") },
    45  		computeOpCall(svc.Networks.Insert(c.projectID, &compute.Network{
    46  			Name:                  c.networkName,
    47  			AutoCreateSubnetworks: true,
    48  		}).RequestId(uuid.NewV1().String()).Do),
    49  		func() error { monitor.Info("Virtual private cloud created"); return nil },
    50  	)(), 409); err != nil {
    51  		return err
    52  	}
    53  
    54  	return helpers.Fanout(append(createFirewalls, append(deleteFirewalls, func() error {
    55  		return pruneErr(operateFunc(
    56  			func() { monitor.Debug("Creating Cloud NAT Router") },
    57  			computeOpCall(svc.Routers.Insert(c.projectID, c.desired.Region, &compute.Router{
    58  				Name:    c.networkName,
    59  				Network: c.networkURL,
    60  				Nats: []*compute.RouterNat{{
    61  					Name:                          c.networkName,
    62  					NatIpAllocateOption:           "AUTO_ONLY",
    63  					SourceSubnetworkIpRangesToNat: "ALL_SUBNETWORKS_ALL_IP_RANGES",
    64  				}},
    65  			}).RequestId(uuid.NewV1().String()).Do),
    66  			func() error { monitor.Info("Cloud NAT Router created"); return nil },
    67  		)(), 409)
    68  	})...))()
    69  }
    70  
    71  func pruneErr(err error, okCode int) error {
    72  	e, ok := err.(*googleapi.Error)
    73  	if !ok || e.Code != okCode {
    74  		return err
    75  	}
    76  	return nil
    77  }