| package kubernetes | 
 |  | 
 | import ( | 
 | 	"context" | 
 | 	"net" | 
 |  | 
 | 	"source.monogon.dev/go/net/tinylb" | 
 | 	"source.monogon.dev/metropolis/node" | 
 | 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api" | 
 | 	"source.monogon.dev/metropolis/node/core/curator/watcher" | 
 | 	"source.monogon.dev/metropolis/pkg/event/memory" | 
 | ) | 
 |  | 
 | // updateLoadBalancerAPIServers provides a tinylb BackendSet memory value with | 
 | // the currently known nodes running a Kubernetes apiserver as retrieved from the | 
 | // given curator client. | 
 | func updateLoadbalancerAPIServers(ctx context.Context, val *memory.Value[tinylb.BackendSet], cur ipb.CuratorClient) error { | 
 | 	set := &tinylb.BackendSet{} | 
 | 	val.Set(set.Clone()) | 
 |  | 
 | 	return watcher.WatchNodes(ctx, cur, watcher.SimpleFollower{ | 
 | 		FilterFn: func(a *ipb.Node) bool { | 
 | 			if a.Status == nil { | 
 | 				return false | 
 | 			} | 
 | 			if a.Status.ExternalAddress == "" { | 
 | 				return false | 
 | 			} | 
 | 			if a.Roles.KubernetesController == nil { | 
 | 				return false | 
 | 			} | 
 | 			return true | 
 | 		}, | 
 | 		EqualsFn: func(a *ipb.Node, b *ipb.Node) bool { | 
 | 			return a.Status.ExternalAddress == b.Status.ExternalAddress | 
 | 		}, | 
 | 		OnNewUpdated: func(new *ipb.Node) error { | 
 | 			set.Insert(new.Id, &tinylb.SimpleTCPBackend{ | 
 | 				Remote: net.JoinHostPort(new.Status.ExternalAddress, node.KubernetesAPIPort.PortString()), | 
 | 			}) | 
 | 			val.Set(set.Clone()) | 
 | 			return nil | 
 | 		}, | 
 | 		OnDeleted: func(prev *ipb.Node) error { | 
 | 			set.Delete(prev.Id) | 
 | 			val.Set(set.Clone()) | 
 | 			return nil | 
 | 		}, | 
 | 	}) | 
 | } |