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

     1  package gce
     2  
     3  import (
     4  	"fmt"
     5  
     6  	uuid "github.com/satori/go.uuid"
     7  
     8  	"google.golang.org/api/compute/v1"
     9  )
    10  
    11  var _ ensureLBFunc = queryTargetPools
    12  
    13  func queryTargetPools(context *context, loadbalancing []*normalizedLoadbalancer) ([]func() error, []func() error, error) {
    14  	gcePools, err := context.client.TargetPools.
    15  		List(context.projectID, context.desired.Region).
    16  		Filter(fmt.Sprintf(`description : "orb=%s;provider=%s*"`, context.orbID, context.providerID)).
    17  		Fields("items(description,name,instances,selfLink,name)").
    18  		Do()
    19  	if err != nil {
    20  		return nil, nil, err
    21  	}
    22  
    23  	assignRefs := func(lb *normalizedLoadbalancer) {
    24  		lb.targetPool.gce.HealthChecks = []string{lb.healthcheck.gce.SelfLink}
    25  	}
    26  
    27  	var ensure []func() error
    28  
    29  createLoop:
    30  	for _, lb := range loadbalancing {
    31  		for _, gceTp := range gcePools.Items {
    32  			if gceTp.Description == lb.targetPool.gce.Description {
    33  				lb.targetPool.gce.SelfLink = gceTp.SelfLink
    34  				lb.targetPool.gce.Name = gceTp.Name
    35  				lb.targetPool.gce.Instances = gceTp.Instances
    36  				assignRefs(lb)
    37  				if len(gceTp.HealthChecks) > 0 && gceTp.HealthChecks[0] != lb.targetPool.gce.HealthChecks[0] {
    38  					ensure = append(ensure, operateFunc(
    39  						lb.targetPool.log("Removing healthcheck", true, nil),
    40  						computeOpCall(context.client.TargetPools.RemoveHealthCheck(
    41  							context.projectID,
    42  							context.desired.Region,
    43  							gceTp.Name,
    44  							&compute.TargetPoolsRemoveHealthCheckRequest{HealthChecks: []*compute.HealthCheckReference{{HealthCheck: gceTp.HealthChecks[0]}}},
    45  						).
    46  							RequestId(uuid.NewV1().String()).
    47  							Do),
    48  						toErrFunc(lb.targetPool.log("Healthcheck removed", false, nil)),
    49  					))
    50  
    51  					ensure = append(ensure, operateFunc(
    52  						lb.targetPool.log("Adding healthcheck", true, nil),
    53  						computeOpCall(context.client.TargetPools.AddHealthCheck(
    54  							context.projectID,
    55  							context.desired.Region,
    56  							gceTp.Name,
    57  							&compute.TargetPoolsAddHealthCheckRequest{HealthChecks: []*compute.HealthCheckReference{{HealthCheck: lb.healthcheck.gce.SelfLink}}},
    58  						).
    59  							RequestId(uuid.NewV1().String()).
    60  							Do),
    61  						toErrFunc(lb.targetPool.log("Healthcheck added", false, nil)),
    62  					))
    63  				}
    64  				continue createLoop
    65  			}
    66  		}
    67  
    68  		lb.targetPool.gce.Name = newName()
    69  
    70  		ensure = append(ensure, operateFunc(
    71  			func(l *normalizedLoadbalancer) func() {
    72  				return func() {
    73  					assignRefs(l)
    74  					lb.targetPool.log("Creating target pool", true, nil)()
    75  				}
    76  			}(lb),
    77  			computeOpCall(context.client.TargetPools.
    78  				Insert(context.projectID, context.desired.Region, lb.targetPool.gce).
    79  				RequestId(uuid.NewV1().String()).
    80  				Do),
    81  			func(pool *targetPool) func() error {
    82  				return func() error {
    83  					newTP, err := context.client.TargetPools.Get(context.projectID, context.desired.Region, pool.gce.Name).
    84  						Fields("selfLink").
    85  						Do()
    86  					if err != nil {
    87  						return err
    88  					}
    89  
    90  					pool.gce.SelfLink = newTP.SelfLink
    91  					pool.log("Target pool created", false, nil)()
    92  					return nil
    93  				}
    94  			}(lb.targetPool),
    95  		))
    96  	}
    97  
    98  	var remove []func() error
    99  removeLoop:
   100  	for _, gceTp := range gcePools.Items {
   101  		for _, lb := range loadbalancing {
   102  			if gceTp.Description == lb.targetPool.gce.Description {
   103  				continue removeLoop
   104  			}
   105  		}
   106  		remove = append(remove, removeResourceFunc(context.monitor, "target pool", gceTp.Name, context.client.TargetPools.
   107  			Delete(context.projectID, context.desired.Region, gceTp.Name).
   108  			RequestId(uuid.NewV1().String()).
   109  			Do))
   110  	}
   111  	return ensure, remove, nil
   112  }