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_test.go b/metropolis/node/kubernetes/feature_gates_test.go
new file mode 100644
index 0000000..3cccd14
--- /dev/null
+++ b/metropolis/node/kubernetes/feature_gates_test.go
@@ -0,0 +1,35 @@
+package kubernetes
+
+import (
+	"testing"
+
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+	"k8s.io/component-base/featuregate"
+)
+
+func TestFeatureGateDefaults(t *testing.T) {
+	for f, en := range extraFeatureGates {
+		if utilfeature.DefaultFeatureGate.Enabled(f) == en {
+			t.Errorf("Feature gate %q is already %v by default, remove it from extraFeatureGates", string(f), en)
+		}
+	}
+}
+
+func TestAsFlags(t *testing.T) {
+	for _, c := range []struct {
+		name     string
+		fg       featureGates
+		expected string
+	}{
+		{"None", featureGates{}, "--feature-gates="},
+		{"Single", featureGates{featuregate.Feature("Test"): true}, "--feature-gates=Test=true"},
+		{"Multiple", featureGates{featuregate.Feature("Test"): true, featuregate.Feature("Test2"): false}, "--feature-gates=Test=true,Test2=false"},
+	} {
+		t.Run(c.name, func(t *testing.T) {
+			got := c.fg.AsFlag()
+			if got != c.expected {
+				t.Errorf("Expected %q, got %q", c.expected, got)
+			}
+		})
+	}
+}