diff --git a/test/e2e/framework/test_context.go b/test/e2e/framework/test_context.go index b6e87ef444..b6b530ff8a 100644 --- a/test/e2e/framework/test_context.go +++ b/test/e2e/framework/test_context.go @@ -26,6 +26,7 @@ import ( "github.com/golang/glog" "github.com/onsi/ginkgo/config" "github.com/spf13/viper" + utilflag "k8s.io/apiserver/pkg/util/flag" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" @@ -103,8 +104,8 @@ type TestContextType struct { LogexporterGCSPath string // If the garbage collector is enabled in the kube-apiserver and kube-controller-manager. GarbageCollectorEnabled bool - // FeatureGates is a set of key=value pairs that describe feature gates for alpha/experimental features. - FeatureGates string + // featureGates is a map of feature names to bools that enable or disable alpha/experimental features. + FeatureGates map[string]bool // Node e2e specific test context NodeTestContextType // Monitoring solution that is used in current cluster. @@ -202,7 +203,7 @@ func RegisterCommonFlags() { flag.StringVar(&TestContext.Host, "host", "", fmt.Sprintf("The host, or apiserver, to connect to. Will default to %s if this argument and --kubeconfig are not set", defaultHost)) flag.StringVar(&TestContext.ReportPrefix, "report-prefix", "", "Optional prefix for JUnit XML reports. Default is empty, which doesn't prepend anything to the default name.") flag.StringVar(&TestContext.ReportDir, "report-dir", "", "Path to the directory where the JUnit XML reports should be saved. Default is empty, which doesn't generate these reports.") - flag.StringVar(&TestContext.FeatureGates, "feature-gates", "", "A set of key=value pairs that describe feature gates for alpha/experimental features.") + flag.Var(utilflag.NewMapStringBool(&TestContext.FeatureGates), "feature-gates", "A set of key=value pairs that describe feature gates for alpha/experimental features.") flag.StringVar(&TestContext.Viper, "viper-config", "e2e", "The name of the viper config i.e. 'e2e' will read values from 'e2e.json' locally. All e2e parameters are meant to be configurable by viper.") flag.StringVar(&TestContext.ContainerRuntime, "container-runtime", "docker", "The container runtime of cluster VM instances (docker/rkt/remote).") flag.StringVar(&TestContext.ContainerRuntimeEndpoint, "container-runtime-endpoint", "unix:///var/run/dockershim.sock", "The container runtime endpoint of cluster VM instances.") diff --git a/test/e2e_node/services/kubelet.go b/test/e2e_node/services/kubelet.go index e1cd23a36c..d8f0fd667d 100644 --- a/test/e2e_node/services/kubelet.go +++ b/test/e2e_node/services/kubelet.go @@ -115,7 +115,7 @@ func (e *E2EServices) startKubelet() (*server, error) { glog.Info("Starting kubelet") // set feature gates so we can check which features are enabled and pass the appropriate flags - utilfeature.DefaultFeatureGate.Set(framework.TestContext.FeatureGates) + utilfeature.DefaultFeatureGate.SetFromMap(framework.TestContext.FeatureGates) // Build kubeconfig kubeconfigPath, err := createKubeconfigCWD() @@ -265,9 +265,9 @@ func (e *E2EServices) startKubelet() (*server, error) { // Apply test framework feature gates by default. This could also be overridden // by kubelet-flags. - if framework.TestContext.FeatureGates != "" { - cmdArgs = append(cmdArgs, "--feature-gates", framework.TestContext.FeatureGates) - utilflag.NewMapStringBool(&kc.FeatureGates).Set(framework.TestContext.FeatureGates) + if len(framework.TestContext.FeatureGates) > 0 { + cmdArgs = append(cmdArgs, "--feature-gates", utilflag.NewMapStringBool(&framework.TestContext.FeatureGates).String()) + kc.FeatureGates = framework.TestContext.FeatureGates } if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { diff --git a/test/e2e_node/services/services.go b/test/e2e_node/services/services.go index fab133693c..7a442d38e6 100644 --- a/test/e2e_node/services/services.go +++ b/test/e2e_node/services/services.go @@ -108,7 +108,7 @@ func (e *E2EServices) Stop() { func RunE2EServices() { // Populate global DefaultFeatureGate with value from TestContext.FeatureGates. // This way, statically-linked components see the same feature gate config as the test context. - utilfeature.DefaultFeatureGate.Set(framework.TestContext.FeatureGates) + utilfeature.DefaultFeatureGate.SetFromMap(framework.TestContext.FeatureGates) e := newE2EServices() if err := e.run(); err != nil { glog.Fatalf("Failed to run e2e services: %v", err)