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 }