m/n/kubernetes: introduce feature gate infra

This introduces centralized infrastructure to control feature gates in K8s.

It includes a test to make sure that we do not keep outdated flags in there.

Change-Id: Ife251cbd5210bc8b3757bb3829e91bcdb2e6fdfb
Reviewed-on: https://review.monogon.dev/c/monogon/+/3664
Reviewed-by: Tim Windelschmidt <tim@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/node/kubernetes/feature_gates.go b/metropolis/node/kubernetes/feature_gates.go
new file mode 100644
index 0000000..06d970f
--- /dev/null
+++ b/metropolis/node/kubernetes/feature_gates.go
@@ -0,0 +1,35 @@
+package kubernetes
+
+import (
+	"fmt"
+	"strings"
+
+	"k8s.io/component-base/featuregate"
+)
+
+type featureGates map[featuregate.Feature]bool
+
+// AsFlag returns the feature gates as a --feature-gate flag.
+func (fgs featureGates) AsFlag() string {
+	var strb strings.Builder
+	strb.WriteString("--feature-gates=")
+	i := 0
+	for f, en := range fgs {
+		fmt.Fprintf(&strb, "%s=%v", string(f), en)
+		if i++; i != len(fgs) {
+			strb.WriteByte(',')
+		}
+	}
+	return strb.String()
+}
+
+// AsConfigObject returns the feature gates as a plain map for K8s configs.
+func (fgs featureGates) AsMap() map[string]bool {
+	out := make(map[string]bool)
+	for f, en := range fgs {
+		out[string(f)] = en
+	}
+	return out
+}
+
+var extraFeatureGates = featureGates{}