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

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