diff --git a/cmd/cloud-controller-manager/app/options/options.go b/cmd/cloud-controller-manager/app/options/options.go index 27c60157a2..5e2a597949 100644 --- a/cmd/cloud-controller-manager/app/options/options.go +++ b/cmd/cloud-controller-manager/app/options/options.go @@ -143,7 +143,7 @@ func (o *CloudControllerManagerOptions) Flags() apiserverflag.NamedFlagSets { fs.StringVar(&o.Kubeconfig, "kubeconfig", o.Kubeconfig, "Path to kubeconfig file with authorization and master location information.") fs.DurationVar(&o.NodeStatusUpdateFrequency.Duration, "node-status-update-frequency", o.NodeStatusUpdateFrequency.Duration, "Specifies how often the controller updates nodes' status.") - utilfeature.DefaultFeatureGate.AddFlag(fss.FlagSet("generic")) + utilfeature.DefaultMutableFeatureGate.AddFlag(fss.FlagSet("generic")) return fss } diff --git a/cmd/kube-controller-manager/app/options/options.go b/cmd/kube-controller-manager/app/options/options.go index a93d3fd8fa..e4146bf618 100644 --- a/cmd/kube-controller-manager/app/options/options.go +++ b/cmd/kube-controller-manager/app/options/options.go @@ -261,7 +261,7 @@ func (s *KubeControllerManagerOptions) Flags(allControllers []string, disabledBy fs := fss.FlagSet("misc") fs.StringVar(&s.Master, "master", s.Master, "The address of the Kubernetes API server (overrides any value in kubeconfig).") fs.StringVar(&s.Kubeconfig, "kubeconfig", s.Kubeconfig, "Path to kubeconfig file with authorization and master location information.") - utilfeature.DefaultFeatureGate.AddFlag(fss.FlagSet("generic")) + utilfeature.DefaultMutableFeatureGate.AddFlag(fss.FlagSet("generic")) return fss } diff --git a/cmd/kube-proxy/app/server.go b/cmd/kube-proxy/app/server.go index 04189b98d3..e177449965 100644 --- a/cmd/kube-proxy/app/server.go +++ b/cmd/kube-proxy/app/server.go @@ -208,7 +208,7 @@ func (o *Options) Complete() error { return err } - if err := utilfeature.DefaultFeatureGate.SetFromMap(o.config.FeatureGates); err != nil { + if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(o.config.FeatureGates); err != nil { return err } diff --git a/cmd/kube-scheduler/app/options/options.go b/cmd/kube-scheduler/app/options/options.go index 15c79acd7c..86f698bff6 100644 --- a/cmd/kube-scheduler/app/options/options.go +++ b/cmd/kube-scheduler/app/options/options.go @@ -152,7 +152,7 @@ func (o *Options) Flags() (nfs apiserverflag.NamedFlagSets) { o.Deprecated.AddFlags(nfs.FlagSet("deprecated"), &o.ComponentConfig) leaderelectionconfig.BindFlags(&o.ComponentConfig.LeaderElection.LeaderElectionConfiguration, nfs.FlagSet("leader election")) - utilfeature.DefaultFeatureGate.AddFlag(nfs.FlagSet("feature gate")) + utilfeature.DefaultMutableFeatureGate.AddFlag(nfs.FlagSet("feature gate")) return nfs } diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 04422bb899..6aae8e0286 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -169,7 +169,7 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API utilflag.PrintFlags(cleanFlagSet) // set feature gates from initial flags-based config - if err := utilfeature.DefaultFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { + if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { klog.Fatal(err) } @@ -195,7 +195,7 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API klog.Fatal(err) } // update feature gates based on new config - if err := utilfeature.DefaultFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { + if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { klog.Fatal(err) } } @@ -226,7 +226,7 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API kubeletConfig = dynamicKubeletConfig // Note: flag precedence was already enforced in the controller, prior to validation, // by our above transform function. Now we simply update feature gates from the new config. - if err := utilfeature.DefaultFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { + if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { klog.Fatal(err) } } @@ -467,7 +467,7 @@ func makeEventRecorder(kubeDeps *kubelet.Dependencies, nodeName types.NodeName) func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies, stopCh <-chan struct{}) (err error) { // Set global feature gates based on the value on the initial KubeletServer - err = utilfeature.DefaultFeatureGate.SetFromMap(s.KubeletConfiguration.FeatureGates) + err = utilfeature.DefaultMutableFeatureGate.SetFromMap(s.KubeletConfiguration.FeatureGates) if err != nil { return err } diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index cd35ecb704..265aae36c9 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -396,7 +396,7 @@ const ( ) func init() { - utilfeature.DefaultFeatureGate.Add(defaultKubernetesFeatureGates) + utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates) } // defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys. diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go index 8af73d2e19..0ed34211ea 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go @@ -49,7 +49,7 @@ const ( ) func init() { - utilfeature.DefaultFeatureGate.Add(defaultKubernetesFeatureGates) + utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates) } // defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys. diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/initialization/initialization.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/initialization/initialization.go index d4d184a574..8219b797f5 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/initialization/initialization.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/initialization/initialization.go @@ -85,7 +85,7 @@ func (i *initializer) ValidateInitialization() error { } if !utilfeature.DefaultFeatureGate.Enabled(features.Initializers) { - if err := utilfeature.DefaultFeatureGate.Set(string(features.Initializers) + "=true"); err != nil { + if err := utilfeature.DefaultMutableFeatureGate.Set(string(features.Initializers) + "=true"); err != nil { klog.Errorf("error enabling Initializers feature as part of admission plugin setup: %v", err) } else { klog.Infof("enabled Initializers feature as part of admission plugin setup") diff --git a/staging/src/k8s.io/apiserver/pkg/features/kube_features.go b/staging/src/k8s.io/apiserver/pkg/features/kube_features.go index 9241825681..88d949c4df 100644 --- a/staging/src/k8s.io/apiserver/pkg/features/kube_features.go +++ b/staging/src/k8s.io/apiserver/pkg/features/kube_features.go @@ -91,7 +91,7 @@ const ( ) func init() { - utilfeature.DefaultFeatureGate.Add(defaultKubernetesFeatureGates) + utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates) } // defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys. diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go b/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go index fccb24e03a..2884f853ff 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go @@ -154,5 +154,5 @@ func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) { "handler, which picks a randomized value above this number as the connection timeout, "+ "to spread out load.") - utilfeature.DefaultFeatureGate.AddFlag(fs) + utilfeature.DefaultMutableFeatureGate.AddFlag(fs) } diff --git a/test/e2e_node/services/kubelet.go b/test/e2e_node/services/kubelet.go index 276dfbe36f..71487e753d 100644 --- a/test/e2e_node/services/kubelet.go +++ b/test/e2e_node/services/kubelet.go @@ -108,7 +108,7 @@ func (e *E2EServices) startKubelet() (*server, error) { klog.Info("Starting kubelet") // set feature gates so we can check which features are enabled and pass the appropriate flags - utilfeature.DefaultFeatureGate.SetFromMap(framework.TestContext.FeatureGates) + utilfeature.DefaultMutableFeatureGate.SetFromMap(framework.TestContext.FeatureGates) // Build kubeconfig kubeconfigPath, err := createKubeconfigCWD() diff --git a/test/e2e_node/services/services.go b/test/e2e_node/services/services.go index 58ac3534ad..51cccdaa39 100644 --- a/test/e2e_node/services/services.go +++ b/test/e2e_node/services/services.go @@ -109,7 +109,7 @@ func (e *E2EServices) Stop() { func RunE2EServices(t *testing.T) { // 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.SetFromMap(framework.TestContext.FeatureGates) + utilfeature.DefaultMutableFeatureGate.SetFromMap(framework.TestContext.FeatureGates) e := newE2EServices() if err := e.run(t); err != nil { klog.Fatalf("Failed to run e2e services: %v", err)