Add a feature gate for alpha dynamic volume provisioning

Enabled by default to avoid breaking people, since this was
turned on in 1.3.
pull/6/head
Jeff Lowdermilk 2016-08-22 15:05:29 -07:00
parent 49ff2e8831
commit 991b07e60d
2 changed files with 20 additions and 6 deletions

View File

@ -34,6 +34,7 @@ import (
"k8s.io/kubernetes/pkg/cloudprovider/providers/gce" "k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
"k8s.io/kubernetes/pkg/cloudprovider/providers/openstack" "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack"
"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
utilconfig "k8s.io/kubernetes/pkg/util/config"
"k8s.io/kubernetes/pkg/util/io" "k8s.io/kubernetes/pkg/util/io"
"k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume"
"k8s.io/kubernetes/pkg/volume/aws_ebs" "k8s.io/kubernetes/pkg/volume/aws_ebs"
@ -125,6 +126,8 @@ func ProbeControllerVolumePlugins(cloud cloudprovider.Interface, config componen
// TODO: remove in Kubernetes 1.5 // TODO: remove in Kubernetes 1.5
func NewAlphaVolumeProvisioner(cloud cloudprovider.Interface, config componentconfig.VolumeConfiguration) (volume.ProvisionableVolumePlugin, error) { func NewAlphaVolumeProvisioner(cloud cloudprovider.Interface, config componentconfig.VolumeConfiguration) (volume.ProvisionableVolumePlugin, error) {
switch { switch {
case !utilconfig.DefaultFeatureGate.DynamicVolumeProvisioning():
return nil, nil
case cloud == nil && config.EnableHostPathProvisioning: case cloud == nil && config.EnableHostPathProvisioning:
return getProvisionablePluginFromVolumePlugins(host_path.ProbeVolumePlugins( return getProvisionablePluginFromVolumePlugins(host_path.ProbeVolumePlugins(
volume.VolumeConfig{ volume.VolumeConfig{

View File

@ -38,18 +38,20 @@ const (
// specification of gates. Examples: // specification of gates. Examples:
// AllAlpha=false,NewFeature=true will result in newFeature=true // AllAlpha=false,NewFeature=true will result in newFeature=true
// AllAlpha=true,NewFeature=false will result in newFeature=false // AllAlpha=true,NewFeature=false will result in newFeature=false
allAlphaGate = "AllAlpha" allAlphaGate = "AllAlpha"
externalTrafficLocalOnly = "AllowExtTrafficLocalEndpoints" externalTrafficLocalOnly = "AllowExtTrafficLocalEndpoints"
dynamicKubeletConfig = "DynamicKubeletConfig" dynamicKubeletConfig = "DynamicKubeletConfig"
dynamicVolumeProvisioning = "DynamicVolumeProvisioning"
) )
var ( var (
// Default values for recorded features. Every new feature gate should be // Default values for recorded features. Every new feature gate should be
// represented here. // represented here.
knownFeatures = map[string]featureSpec{ knownFeatures = map[string]featureSpec{
allAlphaGate: {false, alpha}, allAlphaGate: {false, alpha},
externalTrafficLocalOnly: {false, alpha}, externalTrafficLocalOnly: {false, alpha},
dynamicKubeletConfig: {false, alpha}, dynamicKubeletConfig: {false, alpha},
dynamicVolumeProvisioning: {true, alpha},
} }
// Special handling for a few gates. // Special handling for a few gates.
@ -93,6 +95,10 @@ type FeatureGate interface {
// alpha: v1.4 // alpha: v1.4
ExternalTrafficLocalOnly() bool ExternalTrafficLocalOnly() bool
// owner: @saad-ali
// alpha: v1.3
DynamicVolumeProvisioning() bool
// TODO: Define accessors for each non-API alpha feature. // TODO: Define accessors for each non-API alpha feature.
DynamicKubeletConfig() bool DynamicKubeletConfig() bool
} }
@ -173,6 +179,11 @@ func (f *featureGate) DynamicKubeletConfig() bool {
return f.lookup(dynamicKubeletConfig) return f.lookup(dynamicKubeletConfig)
} }
// DynamicVolumeProvisioning returns value for dynamicVolumeProvisioning
func (f *featureGate) DynamicVolumeProvisioning() bool {
return f.lookup(dynamicVolumeProvisioning)
}
func (f *featureGate) lookup(key string) bool { func (f *featureGate) lookup(key string) bool {
defaultValue := f.known[key].enabled defaultValue := f.known[key].enabled
if f.enabled != nil { if f.enabled != nil {