blob: a09796aa16fece08ae037f4fec51ac9e9f191e07 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Serge Bazanski6fdca3f2023-03-20 17:47:07 +01004package kubernetes
5
6import (
7 "context"
Serge Bazanski6fdca3f2023-03-20 17:47:07 +01008 "net"
9
10 "source.monogon.dev/go/net/tinylb"
Jan Schär0f8ce4c2025-09-04 13:27:50 +020011 "source.monogon.dev/metropolis/node/allocs"
Serge Bazanski6fdca3f2023-03-20 17:47:07 +010012 ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
Serge Bazanski60461b22023-10-26 19:16:59 +020013 "source.monogon.dev/metropolis/node/core/curator/watcher"
Tim Windelschmidt9f21f532024-05-07 15:14:20 +020014 "source.monogon.dev/osbase/event/memory"
Serge Bazanski6fdca3f2023-03-20 17:47:07 +010015)
16
17// updateLoadBalancerAPIServers provides a tinylb BackendSet memory value with
18// the currently known nodes running a Kubernetes apiserver as retrieved from the
19// given curator client.
20func updateLoadbalancerAPIServers(ctx context.Context, val *memory.Value[tinylb.BackendSet], cur ipb.CuratorClient) error {
Serge Bazanski6fdca3f2023-03-20 17:47:07 +010021 set := &tinylb.BackendSet{}
22 val.Set(set.Clone())
Serge Bazanski6fdca3f2023-03-20 17:47:07 +010023
Serge Bazanski60461b22023-10-26 19:16:59 +020024 return watcher.WatchNodes(ctx, cur, watcher.SimpleFollower{
25 FilterFn: func(a *ipb.Node) bool {
26 if a.Status == nil {
27 return false
Serge Bazanski6fdca3f2023-03-20 17:47:07 +010028 }
Serge Bazanski60461b22023-10-26 19:16:59 +020029 if a.Status.ExternalAddress == "" {
30 return false
Serge Bazanski6fdca3f2023-03-20 17:47:07 +010031 }
Serge Bazanski60461b22023-10-26 19:16:59 +020032 if a.Roles.KubernetesController == nil {
33 return false
34 }
35 return true
36 },
37 EqualsFn: func(a *ipb.Node, b *ipb.Node) bool {
38 return a.Status.ExternalAddress == b.Status.ExternalAddress
39 },
40 OnNewUpdated: func(new *ipb.Node) error {
41 set.Insert(new.Id, &tinylb.SimpleTCPBackend{
Jan Schär0f8ce4c2025-09-04 13:27:50 +020042 Remote: net.JoinHostPort(new.Status.ExternalAddress, allocs.PortKubernetesAPI.PortString()),
Serge Bazanski60461b22023-10-26 19:16:59 +020043 })
44 val.Set(set.Clone())
45 return nil
46 },
47 OnDeleted: func(prev *ipb.Node) error {
48 set.Delete(prev.Id)
49 val.Set(set.Clone())
50 return nil
51 },
52 })
Serge Bazanski6fdca3f2023-03-20 17:47:07 +010053}