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

     1  package gce
     2  
     3  import (
     4  	"fmt"
     5  
     6  	uuid "github.com/satori/go.uuid"
     7  )
     8  
     9  var _ ensureLBFunc = queryAddresses
    10  
    11  func queryAddresses(context *context, loadbalancing []*normalizedLoadbalancer) ([]func() error, []func() error, error) {
    12  
    13  	addresses := normalizedLoadbalancing(loadbalancing).uniqueAddresses()
    14  
    15  	gceAddresses, err := context.client.Addresses.
    16  		List(context.projectID, context.desired.Region).
    17  		Filter(fmt.Sprintf(`description : "orb=%s;provider=%s*"`, context.orbID, context.providerID)).
    18  		Fields("items(address,name,description)").
    19  		Do()
    20  	if err != nil {
    21  		return nil, nil, err
    22  	}
    23  
    24  	var ensure []func() error
    25  
    26  createLoop:
    27  	for _, addr := range addresses {
    28  		for _, gceAddress := range gceAddresses.Items {
    29  			if gceAddress.Description == addr.gce.Description {
    30  				addr.gce.Address = gceAddress.Address
    31  				continue createLoop
    32  			}
    33  		}
    34  
    35  		addr.gce.Name = newName()
    36  		ensure = append(ensure, operateFunc(
    37  			addr.log("Creating external address", true),
    38  			computeOpCall(context.client.Addresses.
    39  				Insert(context.projectID, context.desired.Region, addr.gce).
    40  				RequestId(uuid.NewV1().String()).
    41  				Do),
    42  			func(a *address) func() error {
    43  				return func() error {
    44  					newAddr, newAddrErr := context.client.Addresses.Get(context.projectID, context.desired.Region, a.gce.Name).
    45  						Fields("address").
    46  						Do()
    47  					if newAddrErr != nil {
    48  						return newAddrErr
    49  					}
    50  					a.gce.Address = newAddr.Address
    51  					a.log("External address created", false)()
    52  					return nil
    53  				}
    54  			}(addr)))
    55  	}
    56  
    57  	var remove []func() error
    58  removeLoop:
    59  	for _, gceAddress := range gceAddresses.Items {
    60  		for _, address := range addresses {
    61  			if gceAddress.Description == address.gce.Description {
    62  				continue removeLoop
    63  			}
    64  		}
    65  		remove = append(remove, removeResourceFunc(context.monitor, "external address", gceAddress.Name, context.client.Addresses.
    66  			Delete(context.projectID, context.desired.Region, gceAddress.Name).
    67  			RequestId(uuid.NewV1().String()).
    68  			Do))
    69  	}
    70  	return ensure, remove, nil
    71  }