metropolis/node/kubernetes: update labels based on node roles
This implements the labelmaker, a reconciling loop running on Kubernetes
controller nodes which updates Kubernetes node labels based on cluster
data.
Currently it only updates role labels based on cluster roles, but this
can be extended in the future to also replicate Metropolis node labels
into Kubernetes node labels.
Change-Id: I9c5ba92bb46f064aa03836720d4a80adc6061ab9
Reviewed-on: https://review.monogon.dev/c/monogon/+/3464
Tested-by: Jenkins CI
Reviewed-by: Jan Schär <jan@monogon.tech>
diff --git a/metropolis/node/labels.go b/metropolis/node/labels.go
index 3e51aae..f26e5bd 100644
--- a/metropolis/node/labels.go
+++ b/metropolis/node/labels.go
@@ -75,3 +75,33 @@
}
return ""
}
+
+// Labels on a node, a map from label key to value.
+type Labels map[string]string
+
+// Equals returns true if these Labels are equal to some others. Equality is
+// defined by having the same set of keys and corresponding values.
+func (l Labels) Equals(others Labels) bool {
+ for k, v := range l {
+ if v2, ok := others[k]; !ok || v != v2 {
+ return false
+ }
+ }
+ for k, v := range others {
+ if v2, ok := l[k]; !ok || v != v2 {
+ return false
+ }
+ }
+ return true
+}
+
+// Filter returns a subset of labels for which pred returns true.
+func (l Labels) Filter(pred func(k, v string) bool) Labels {
+ res := make(Labels)
+ for k, v := range l {
+ if pred(k, v) {
+ res[k] = v
+ }
+ }
+ return res
+}