mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Remove alpha provisioning
This commit is contained in:
parent
96cfe7b938
commit
587eb199e0
@ -65,7 +65,6 @@ go_library(
|
|||||||
"//pkg/controller/statefulset:go_default_library",
|
"//pkg/controller/statefulset:go_default_library",
|
||||||
"//pkg/controller/volume/attachdetach:go_default_library",
|
"//pkg/controller/volume/attachdetach:go_default_library",
|
||||||
"//pkg/controller/volume/persistentvolume:go_default_library",
|
"//pkg/controller/volume/persistentvolume:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
|
||||||
"//pkg/quota/install:go_default_library",
|
"//pkg/quota/install:go_default_library",
|
||||||
"//pkg/serviceaccount:go_default_library",
|
"//pkg/serviceaccount:go_default_library",
|
||||||
"//pkg/util/configz:go_default_library",
|
"//pkg/util/configz:go_default_library",
|
||||||
@ -94,7 +93,6 @@ go_library(
|
|||||||
"//vendor:k8s.io/apimachinery/pkg/util/sets",
|
"//vendor:k8s.io/apimachinery/pkg/util/sets",
|
||||||
"//vendor:k8s.io/apimachinery/pkg/util/wait",
|
"//vendor:k8s.io/apimachinery/pkg/util/wait",
|
||||||
"//vendor:k8s.io/apiserver/pkg/server/healthz",
|
"//vendor:k8s.io/apiserver/pkg/server/healthz",
|
||||||
"//vendor:k8s.io/apiserver/pkg/util/feature",
|
|
||||||
"//vendor:k8s.io/client-go/discovery",
|
"//vendor:k8s.io/client-go/discovery",
|
||||||
"//vendor:k8s.io/client-go/dynamic",
|
"//vendor:k8s.io/client-go/dynamic",
|
||||||
"//vendor:k8s.io/client-go/kubernetes/typed/core/v1",
|
"//vendor:k8s.io/client-go/kubernetes/typed/core/v1",
|
||||||
|
@ -439,14 +439,9 @@ func StartControllers(controllers map[string]InitFunc, s *options.CMServer, root
|
|||||||
glog.Infof("Will not configure cloud provider routes for allocate-node-cidrs: %v, configure-cloud-routes: %v.", s.AllocateNodeCIDRs, s.ConfigureCloudRoutes)
|
glog.Infof("Will not configure cloud provider routes for allocate-node-cidrs: %v, configure-cloud-routes: %v.", s.AllocateNodeCIDRs, s.ConfigureCloudRoutes)
|
||||||
}
|
}
|
||||||
|
|
||||||
alphaProvisioner, err := NewAlphaVolumeProvisioner(cloud, s.VolumeConfiguration)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("an backward-compatible provisioner could not be created: %v, but one was expected. Provisioning will not work. This functionality is considered an early Alpha version.", err)
|
|
||||||
}
|
|
||||||
params := persistentvolumecontroller.ControllerParameters{
|
params := persistentvolumecontroller.ControllerParameters{
|
||||||
KubeClient: clientBuilder.ClientOrDie("persistent-volume-binder"),
|
KubeClient: clientBuilder.ClientOrDie("persistent-volume-binder"),
|
||||||
SyncPeriod: s.PVClaimBinderSyncPeriod.Duration,
|
SyncPeriod: s.PVClaimBinderSyncPeriod.Duration,
|
||||||
AlphaProvisioner: alphaProvisioner,
|
|
||||||
VolumePlugins: ProbeControllerVolumePlugins(cloud, s.VolumeConfiguration),
|
VolumePlugins: ProbeControllerVolumePlugins(cloud, s.VolumeConfiguration),
|
||||||
Cloud: cloud,
|
Cloud: cloud,
|
||||||
ClusterName: s.ClusterName,
|
ClusterName: s.ClusterName,
|
||||||
|
@ -29,7 +29,6 @@ import (
|
|||||||
|
|
||||||
// Volume plugins
|
// Volume plugins
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider"
|
"k8s.io/kubernetes/pkg/cloudprovider"
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider/providers/aws"
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/aws"
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider/providers/azure"
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/azure"
|
||||||
@ -37,7 +36,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/cloudprovider/providers/openstack"
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/openstack"
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider/providers/photon"
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/photon"
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
"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"
|
||||||
@ -136,36 +134,6 @@ func ProbeControllerVolumePlugins(cloud cloudprovider.Interface, config componen
|
|||||||
return allPlugins
|
return allPlugins
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAlphaVolumeProvisioner returns a volume provisioner to use when running in
|
|
||||||
// a cloud or development environment. The alpha implementation of provisioning
|
|
||||||
// allows 1 implied provisioner per cloud and is here only for compatibility
|
|
||||||
// with Kubernetes 1.3
|
|
||||||
// TODO: remove in Kubernetes 1.5
|
|
||||||
func NewAlphaVolumeProvisioner(cloud cloudprovider.Interface, config componentconfig.VolumeConfiguration) (volume.ProvisionableVolumePlugin, error) {
|
|
||||||
switch {
|
|
||||||
case !utilfeature.DefaultFeatureGate.Enabled(features.DynamicVolumeProvisioning):
|
|
||||||
return nil, nil
|
|
||||||
case cloud == nil && config.EnableHostPathProvisioning:
|
|
||||||
return getProvisionablePluginFromVolumePlugins(host_path.ProbeVolumePlugins(
|
|
||||||
volume.VolumeConfig{
|
|
||||||
ProvisioningEnabled: true,
|
|
||||||
}))
|
|
||||||
case cloud != nil && aws.ProviderName == cloud.ProviderName():
|
|
||||||
return getProvisionablePluginFromVolumePlugins(aws_ebs.ProbeVolumePlugins())
|
|
||||||
case cloud != nil && gce.ProviderName == cloud.ProviderName():
|
|
||||||
return getProvisionablePluginFromVolumePlugins(gce_pd.ProbeVolumePlugins())
|
|
||||||
case cloud != nil && openstack.ProviderName == cloud.ProviderName():
|
|
||||||
return getProvisionablePluginFromVolumePlugins(cinder.ProbeVolumePlugins())
|
|
||||||
case cloud != nil && vsphere.ProviderName == cloud.ProviderName():
|
|
||||||
return getProvisionablePluginFromVolumePlugins(vsphere_volume.ProbeVolumePlugins())
|
|
||||||
case cloud != nil && azure.CloudProviderName == cloud.ProviderName():
|
|
||||||
return getProvisionablePluginFromVolumePlugins(azure_dd.ProbeVolumePlugins())
|
|
||||||
case cloud != nil && photon.ProviderName == cloud.ProviderName():
|
|
||||||
return getProvisionablePluginFromVolumePlugins(photon_pd.ProbeVolumePlugins())
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getProvisionablePluginFromVolumePlugins(plugins []volume.VolumePlugin) (volume.ProvisionableVolumePlugin, error) {
|
func getProvisionablePluginFromVolumePlugins(plugins []volume.VolumePlugin) (volume.ProvisionableVolumePlugin, error) {
|
||||||
for _, plugin := range plugins {
|
for _, plugin := range plugins {
|
||||||
if provisonablePlugin, ok := plugin.(volume.ProvisionableVolumePlugin); ok {
|
if provisonablePlugin, ok := plugin.(volume.ProvisionableVolumePlugin); ok {
|
||||||
|
@ -193,8 +193,6 @@ spec:
|
|||||||
volumeClaimTemplates:
|
volumeClaimTemplates:
|
||||||
- metadata:
|
- metadata:
|
||||||
name: datadir
|
name: datadir
|
||||||
annotations:
|
|
||||||
volume.alpha.kubernetes.io/storage-class: anything
|
|
||||||
spec:
|
spec:
|
||||||
accessModes:
|
accessModes:
|
||||||
- "ReadWriteOnce"
|
- "ReadWriteOnce"
|
||||||
|
@ -254,8 +254,6 @@ spec:
|
|||||||
volumeClaimTemplates:
|
volumeClaimTemplates:
|
||||||
- metadata:
|
- metadata:
|
||||||
name: cassandra-data
|
name: cassandra-data
|
||||||
annotations:
|
|
||||||
volume.alpha.kubernetes.io/storage-class: anything
|
|
||||||
spec:
|
spec:
|
||||||
accessModes: [ "ReadWriteOnce" ]
|
accessModes: [ "ReadWriteOnce" ]
|
||||||
resources:
|
resources:
|
||||||
|
@ -77,8 +77,6 @@ spec:
|
|||||||
volumeClaimTemplates:
|
volumeClaimTemplates:
|
||||||
- metadata:
|
- metadata:
|
||||||
name: cassandra-data
|
name: cassandra-data
|
||||||
annotations:
|
|
||||||
volume.alpha.kubernetes.io/storage-class: anything
|
|
||||||
spec:
|
spec:
|
||||||
accessModes: [ "ReadWriteOnce" ]
|
accessModes: [ "ReadWriteOnce" ]
|
||||||
resources:
|
resources:
|
||||||
|
@ -4,8 +4,6 @@ metadata:
|
|||||||
name: nfs-pv-provisioning-demo
|
name: nfs-pv-provisioning-demo
|
||||||
labels:
|
labels:
|
||||||
demo: nfs-pv-provisioning
|
demo: nfs-pv-provisioning
|
||||||
annotations:
|
|
||||||
volume.alpha.kubernetes.io/storage-class: any
|
|
||||||
spec:
|
spec:
|
||||||
accessModes: [ "ReadWriteOnce" ]
|
accessModes: [ "ReadWriteOnce" ]
|
||||||
resources:
|
resources:
|
||||||
|
@ -27,10 +27,6 @@ import (
|
|||||||
const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
||||||
const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
||||||
|
|
||||||
// AlphaStorageClassAnnotation represents the previous alpha storage class
|
|
||||||
// annotation. it's no longer used and held here for posterity.
|
|
||||||
const AlphaStorageClassAnnotation = "volume.alpha.kubernetes.io/storage-class"
|
|
||||||
|
|
||||||
// BetaStorageClassAnnotation represents the beta/previous StorageClass annotation.
|
// BetaStorageClassAnnotation represents the beta/previous StorageClass annotation.
|
||||||
// It's currently still used and will be held for backwards compatibility
|
// It's currently still used and will be held for backwards compatibility
|
||||||
const BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class"
|
const BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class"
|
||||||
@ -75,7 +71,7 @@ func GetClaimStorageClass(claim *api.PersistentVolumeClaim) string {
|
|||||||
|
|
||||||
// GetStorageClassAnnotation returns the StorageClass value
|
// GetStorageClassAnnotation returns the StorageClass value
|
||||||
// if the annotation is set, empty string if not
|
// if the annotation is set, empty string if not
|
||||||
// TODO: remove Alpha and Beta when no longer used or needed
|
// TODO: remove Beta when no longer used or needed
|
||||||
func GetStorageClassAnnotation(obj metav1.ObjectMeta) string {
|
func GetStorageClassAnnotation(obj metav1.ObjectMeta) string {
|
||||||
if class, ok := obj.Annotations[StorageClassAnnotation]; ok {
|
if class, ok := obj.Annotations[StorageClassAnnotation]; ok {
|
||||||
return class
|
return class
|
||||||
@ -83,16 +79,13 @@ func GetStorageClassAnnotation(obj metav1.ObjectMeta) string {
|
|||||||
if class, ok := obj.Annotations[BetaStorageClassAnnotation]; ok {
|
if class, ok := obj.Annotations[BetaStorageClassAnnotation]; ok {
|
||||||
return class
|
return class
|
||||||
}
|
}
|
||||||
if class, ok := obj.Annotations[AlphaStorageClassAnnotation]; ok {
|
|
||||||
return class
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasStorageClassAnnotation returns a boolean
|
// HasStorageClassAnnotation returns a boolean
|
||||||
// if the annotation is set
|
// if the annotation is set
|
||||||
// TODO: remove Alpha and Beta when no longer used or needed
|
// TODO: remove Beta when no longer used or needed
|
||||||
func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool {
|
func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool {
|
||||||
if _, found := obj.Annotations[StorageClassAnnotation]; found {
|
if _, found := obj.Annotations[StorageClassAnnotation]; found {
|
||||||
return found
|
return found
|
||||||
@ -100,9 +93,6 @@ func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool {
|
|||||||
if _, found := obj.Annotations[BetaStorageClassAnnotation]; found {
|
if _, found := obj.Annotations[BetaStorageClassAnnotation]; found {
|
||||||
return found
|
return found
|
||||||
}
|
}
|
||||||
if _, found := obj.Annotations[AlphaStorageClassAnnotation]; found {
|
|
||||||
return found
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
@ -27,10 +27,6 @@ import (
|
|||||||
const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
const IsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
||||||
const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
||||||
|
|
||||||
// AlphaStorageClassAnnotation represents the previous alpha storage class
|
|
||||||
// annotation. it's no longer used and held here for posterity.
|
|
||||||
const AlphaStorageClassAnnotation = "volume.alpha.kubernetes.io/storage-class"
|
|
||||||
|
|
||||||
// BetaStorageClassAnnotation represents the beta/previous StorageClass annotation.
|
// BetaStorageClassAnnotation represents the beta/previous StorageClass annotation.
|
||||||
// It's currently still used and will be held for backwards compatibility
|
// It's currently still used and will be held for backwards compatibility
|
||||||
const BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class"
|
const BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class"
|
||||||
@ -75,7 +71,7 @@ func GetClaimStorageClass(claim *v1.PersistentVolumeClaim) string {
|
|||||||
|
|
||||||
// GetStorageClassAnnotation returns the StorageClass value
|
// GetStorageClassAnnotation returns the StorageClass value
|
||||||
// if the annotation is set, empty string if not
|
// if the annotation is set, empty string if not
|
||||||
// TODO: remove Alpha and Beta when no longer used or needed
|
// TODO: remove Beta when no longer used or needed
|
||||||
func GetStorageClassAnnotation(obj metav1.ObjectMeta) string {
|
func GetStorageClassAnnotation(obj metav1.ObjectMeta) string {
|
||||||
if class, ok := obj.Annotations[StorageClassAnnotation]; ok {
|
if class, ok := obj.Annotations[StorageClassAnnotation]; ok {
|
||||||
return class
|
return class
|
||||||
@ -83,16 +79,12 @@ func GetStorageClassAnnotation(obj metav1.ObjectMeta) string {
|
|||||||
if class, ok := obj.Annotations[BetaStorageClassAnnotation]; ok {
|
if class, ok := obj.Annotations[BetaStorageClassAnnotation]; ok {
|
||||||
return class
|
return class
|
||||||
}
|
}
|
||||||
if class, ok := obj.Annotations[AlphaStorageClassAnnotation]; ok {
|
|
||||||
return class
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasStorageClassAnnotation returns a boolean
|
// HasStorageClassAnnotation returns a boolean
|
||||||
// if the annotation is set
|
// if the annotation is set
|
||||||
// TODO: remove Alpha and Beta when no longer used or needed
|
// TODO: remove Beta when no longer used or needed
|
||||||
func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool {
|
func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool {
|
||||||
if _, found := obj.Annotations[StorageClassAnnotation]; found {
|
if _, found := obj.Annotations[StorageClassAnnotation]; found {
|
||||||
return found
|
return found
|
||||||
@ -100,12 +92,7 @@ func HasStorageClassAnnotation(obj metav1.ObjectMeta) bool {
|
|||||||
if _, found := obj.Annotations[BetaStorageClassAnnotation]; found {
|
if _, found := obj.Annotations[BetaStorageClassAnnotation]; found {
|
||||||
return found
|
return found
|
||||||
}
|
}
|
||||||
if _, found := obj.Annotations[AlphaStorageClassAnnotation]; found {
|
|
||||||
return found
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDefaultAnnotationText returns a pretty Yes/No String if
|
// IsDefaultAnnotationText returns a pretty Yes/No String if
|
||||||
|
@ -834,9 +834,6 @@ func wrapTestWithPluginCalls(expectedRecycleCalls, expectedDeleteCalls []error,
|
|||||||
provisionCalls: expectedProvisionCalls,
|
provisionCalls: expectedProvisionCalls,
|
||||||
}
|
}
|
||||||
ctrl.volumePluginMgr.InitPlugins([]vol.VolumePlugin{plugin}, ctrl)
|
ctrl.volumePluginMgr.InitPlugins([]vol.VolumePlugin{plugin}, ctrl)
|
||||||
if expectedProvisionCalls != nil {
|
|
||||||
ctrl.alphaProvisioner = plugin
|
|
||||||
}
|
|
||||||
return toWrap(ctrl, reactor, test)
|
return toWrap(ctrl, reactor, test)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,14 +130,6 @@ func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *v1.PersistentVol
|
|||||||
return volume, nil
|
return volume, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// In Alpha dynamic provisioning, we do now want not match claims
|
|
||||||
// with existing PVs, findByClaim must find only PVs that are
|
|
||||||
// pre-bound to the claim (by dynamic provisioning). TODO: remove in
|
|
||||||
// 1.5
|
|
||||||
if metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// filter out:
|
// filter out:
|
||||||
// - volumes bound to another claim
|
// - volumes bound to another claim
|
||||||
// - volumes whose labels don't match the claim's selector, if specified
|
// - volumes whose labels don't match the claim's selector, if specified
|
||||||
|
@ -95,10 +95,6 @@ var provision2Success = provisionCall{
|
|||||||
expectedParameters: class2Parameters,
|
expectedParameters: class2Parameters,
|
||||||
}
|
}
|
||||||
|
|
||||||
var provisionAlphaSuccess = provisionCall{
|
|
||||||
ret: nil,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test single call to syncVolume, expecting provisioning to happen.
|
// Test single call to syncVolume, expecting provisioning to happen.
|
||||||
// 1. Fill in the controller with initial data
|
// 1. Fill in the controller with initial data
|
||||||
// 2. Call the syncVolume *once*.
|
// 2. Call the syncVolume *once*.
|
||||||
@ -360,36 +356,6 @@ func TestProvisionSync(t *testing.T) {
|
|||||||
runSyncTests(t, tests, storageClasses)
|
runSyncTests(t, tests, storageClasses)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAlphaProvisionSync(t *testing.T) {
|
|
||||||
tests := []controllerTest{
|
|
||||||
{
|
|
||||||
// Provision a volume with alpha annotation
|
|
||||||
"14-1 - successful alpha provisioning",
|
|
||||||
novolumes,
|
|
||||||
newVolumeArray("pvc-uid14-1", "1Gi", "uid14-1", "claim14-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned),
|
|
||||||
newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation),
|
|
||||||
// Binding will be completed in the next syncClaim
|
|
||||||
newClaimArray("claim14-1", "uid14-1", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation, annStorageProvisioner),
|
|
||||||
noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provisionAlphaSuccess}, testSyncClaim),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Provision success - there is already a volume available, still
|
|
||||||
// we provision a new one when requested.
|
|
||||||
"14-2 - no alpha provisioning when there is a volume available",
|
|
||||||
newVolumeArray("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
|
|
||||||
[]*v1.PersistentVolume{
|
|
||||||
newVolume("volume14-2", "1Gi", "", "", v1.VolumePending, v1.PersistentVolumeReclaimRetain),
|
|
||||||
newVolume("pvc-uid14-2", "1Gi", "uid14-2", "claim14-2", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, annBoundByController, annDynamicallyProvisioned),
|
|
||||||
},
|
|
||||||
newClaimArray("claim14-2", "uid14-2", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation),
|
|
||||||
// Binding will be completed in the next syncClaim
|
|
||||||
newClaimArray("claim14-2", "uid14-2", "1Gi", "", v1.ClaimPending, storageutil.AlphaStorageClassAnnotation, annStorageProvisioner),
|
|
||||||
noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provisionAlphaSuccess}, testSyncClaim),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
runSyncTests(t, tests, []*storage.StorageClass{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test multiple calls to syncClaim/syncVolume and periodic sync of all
|
// Test multiple calls to syncClaim/syncVolume and periodic sync of all
|
||||||
// volume/claims. The test follows this pattern:
|
// volume/claims. The test follows this pattern:
|
||||||
// 0. Load the controller with initial data.
|
// 0. Load the controller with initial data.
|
||||||
|
@ -203,10 +203,6 @@ type PersistentVolumeController struct {
|
|||||||
|
|
||||||
createProvisionedPVRetryCount int
|
createProvisionedPVRetryCount int
|
||||||
createProvisionedPVInterval time.Duration
|
createProvisionedPVInterval time.Duration
|
||||||
|
|
||||||
// Provisioner for annAlphaClass.
|
|
||||||
// TODO: remove in 1.5
|
|
||||||
alphaProvisioner vol.ProvisionableVolumePlugin
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// syncClaim is the main controller method to decide what to do with a claim.
|
// syncClaim is the main controller method to decide what to do with a claim.
|
||||||
@ -243,7 +239,7 @@ func (ctrl *PersistentVolumeController) syncUnboundClaim(claim *v1.PersistentVol
|
|||||||
glog.V(4).Infof("synchronizing unbound PersistentVolumeClaim[%s]: no volume found", claimToClaimKey(claim))
|
glog.V(4).Infof("synchronizing unbound PersistentVolumeClaim[%s]: no volume found", claimToClaimKey(claim))
|
||||||
// No PV could be found
|
// No PV could be found
|
||||||
// OBSERVATION: pvc is "Pending", will retry
|
// OBSERVATION: pvc is "Pending", will retry
|
||||||
if storageutil.GetClaimStorageClass(claim) != "" || metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation) {
|
if storageutil.GetClaimStorageClass(claim) != "" {
|
||||||
if err = ctrl.provisionClaim(claim); err != nil {
|
if err = ctrl.provisionClaim(claim); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -1337,12 +1333,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claimObj interfa
|
|||||||
// Add annBoundByController (used in deleting the volume)
|
// Add annBoundByController (used in deleting the volume)
|
||||||
metav1.SetMetaDataAnnotation(&volume.ObjectMeta, annBoundByController, "yes")
|
metav1.SetMetaDataAnnotation(&volume.ObjectMeta, annBoundByController, "yes")
|
||||||
metav1.SetMetaDataAnnotation(&volume.ObjectMeta, annDynamicallyProvisioned, plugin.GetPluginName())
|
metav1.SetMetaDataAnnotation(&volume.ObjectMeta, annDynamicallyProvisioned, plugin.GetPluginName())
|
||||||
// For Alpha provisioning behavior, do not add storage.BetaStorageClassAnnotations for volumes created
|
metav1.SetMetaDataAnnotation(&volume.ObjectMeta, storageutil.StorageClassAnnotation, claimClass)
|
||||||
// by storage.AlphaStorageClassAnnotation
|
|
||||||
// TODO: remove this check in 1.5, storage.StorageClassAnnotation will be always non-empty there.
|
|
||||||
if claimClass != "" {
|
|
||||||
metav1.SetMetaDataAnnotation(&volume.ObjectMeta, storageutil.StorageClassAnnotation, claimClass)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to create the PV object several times
|
// Try to create the PV object several times
|
||||||
for i := 0; i < ctrl.createProvisionedPVRetryCount; i++ {
|
for i := 0; i < ctrl.createProvisionedPVRetryCount; i++ {
|
||||||
@ -1444,20 +1435,6 @@ func (ctrl *PersistentVolumeController) newRecyclerEventRecorder(volume *v1.Pers
|
|||||||
// It returns either the provisioning plugin or nil when an external
|
// It returns either the provisioning plugin or nil when an external
|
||||||
// provisioner is requested.
|
// provisioner is requested.
|
||||||
func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.PersistentVolumeClaim) (vol.ProvisionableVolumePlugin, *storage.StorageClass, error) {
|
func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.PersistentVolumeClaim) (vol.ProvisionableVolumePlugin, *storage.StorageClass, error) {
|
||||||
// TODO: remove this alpha behavior in 1.5
|
|
||||||
alpha := metav1.HasAnnotation(claim.ObjectMeta, storageutil.AlphaStorageClassAnnotation)
|
|
||||||
beta := metav1.HasAnnotation(claim.ObjectMeta, storageutil.BetaStorageClassAnnotation)
|
|
||||||
if alpha && beta {
|
|
||||||
// Both Alpha and Beta annotations are set. Do beta.
|
|
||||||
alpha = false
|
|
||||||
msg := fmt.Sprintf("both %q and %q annotations are present, using %q", storageutil.AlphaStorageClassAnnotation, storageutil.BetaStorageClassAnnotation, storageutil.BetaStorageClassAnnotation)
|
|
||||||
ctrl.eventRecorder.Event(claim, v1.EventTypeNormal, "ProvisioningIgnoreAlpha", msg)
|
|
||||||
}
|
|
||||||
if alpha {
|
|
||||||
// Fall back to fixed list of provisioner plugins
|
|
||||||
return ctrl.findAlphaProvisionablePlugin()
|
|
||||||
}
|
|
||||||
|
|
||||||
// provisionClaim() which leads here is never called with claimClass=="", we
|
// provisionClaim() which leads here is never called with claimClass=="", we
|
||||||
// can save some checks.
|
// can save some checks.
|
||||||
claimClass := storageutil.GetClaimStorageClass(claim)
|
claimClass := storageutil.GetClaimStorageClass(claim)
|
||||||
@ -1485,28 +1462,6 @@ func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.Persis
|
|||||||
return plugin, class, nil
|
return plugin, class, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// findAlphaProvisionablePlugin returns a volume plugin compatible with
|
|
||||||
// Kubernetes 1.3.
|
|
||||||
// TODO: remove in Kubernetes 1.5
|
|
||||||
func (ctrl *PersistentVolumeController) findAlphaProvisionablePlugin() (vol.ProvisionableVolumePlugin, *storage.StorageClass, error) {
|
|
||||||
if ctrl.alphaProvisioner == nil {
|
|
||||||
return nil, nil, fmt.Errorf("cannot find volume plugin for alpha provisioning")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return a dummy StorageClass instance with no parameters
|
|
||||||
storageClass := &storage.StorageClass{
|
|
||||||
TypeMeta: metav1.TypeMeta{
|
|
||||||
Kind: "StorageClass",
|
|
||||||
},
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: "",
|
|
||||||
},
|
|
||||||
Provisioner: ctrl.alphaProvisioner.GetPluginName(),
|
|
||||||
}
|
|
||||||
glog.V(4).Infof("using alpha provisioner %s", ctrl.alphaProvisioner.GetPluginName())
|
|
||||||
return ctrl.alphaProvisioner, storageClass, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// findDeletablePlugin finds a deleter plugin for a given volume. It returns
|
// findDeletablePlugin finds a deleter plugin for a given volume. It returns
|
||||||
// either the deleter plugin or nil when an external deleter is requested.
|
// either the deleter plugin or nil when an external deleter is requested.
|
||||||
func (ctrl *PersistentVolumeController) findDeletablePlugin(volume *v1.PersistentVolume) (vol.DeletableVolumePlugin, error) {
|
func (ctrl *PersistentVolumeController) findDeletablePlugin(volume *v1.PersistentVolume) (vol.DeletableVolumePlugin, error) {
|
||||||
|
@ -53,7 +53,6 @@ import (
|
|||||||
type ControllerParameters struct {
|
type ControllerParameters struct {
|
||||||
KubeClient clientset.Interface
|
KubeClient clientset.Interface
|
||||||
SyncPeriod time.Duration
|
SyncPeriod time.Duration
|
||||||
AlphaProvisioner vol.ProvisionableVolumePlugin
|
|
||||||
VolumePlugins []vol.VolumePlugin
|
VolumePlugins []vol.VolumePlugin
|
||||||
Cloud cloudprovider.Interface
|
Cloud cloudprovider.Interface
|
||||||
ClusterName string
|
ClusterName string
|
||||||
@ -82,17 +81,11 @@ func NewController(p ControllerParameters) *PersistentVolumeController {
|
|||||||
clusterName: p.ClusterName,
|
clusterName: p.ClusterName,
|
||||||
createProvisionedPVRetryCount: createProvisionedPVRetryCount,
|
createProvisionedPVRetryCount: createProvisionedPVRetryCount,
|
||||||
createProvisionedPVInterval: createProvisionedPVInterval,
|
createProvisionedPVInterval: createProvisionedPVInterval,
|
||||||
alphaProvisioner: p.AlphaProvisioner,
|
|
||||||
claimQueue: workqueue.NewNamed("claims"),
|
claimQueue: workqueue.NewNamed("claims"),
|
||||||
volumeQueue: workqueue.NewNamed("volumes"),
|
volumeQueue: workqueue.NewNamed("volumes"),
|
||||||
}
|
}
|
||||||
|
|
||||||
controller.volumePluginMgr.InitPlugins(p.VolumePlugins, controller)
|
controller.volumePluginMgr.InitPlugins(p.VolumePlugins, controller)
|
||||||
if controller.alphaProvisioner != nil {
|
|
||||||
if err := controller.alphaProvisioner.Init(controller); err != nil {
|
|
||||||
glog.Errorf("PersistentVolumeController: error initializing alpha provisioner plugin: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
volumeSource := p.VolumeSource
|
volumeSource := p.VolumeSource
|
||||||
if volumeSource == nil {
|
if volumeSource == nil {
|
||||||
|
@ -127,12 +127,26 @@ var _ = framework.KubeDescribe("Dynamic provisioning", func() {
|
|||||||
It("should create and delete alpha persistent volumes [Slow] [Volume]", func() {
|
It("should create and delete alpha persistent volumes [Slow] [Volume]", func() {
|
||||||
framework.SkipUnlessProviderIs("openstack", "gce", "aws", "gke")
|
framework.SkipUnlessProviderIs("openstack", "gce", "aws", "gke")
|
||||||
|
|
||||||
|
// Check there is a default storage class
|
||||||
|
classes, err := c.Storage().StorageClasses().List(metav1.ListOptions{})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
found := false
|
||||||
|
for _, class := range classes.Items {
|
||||||
|
if storageutil.IsDefaultAnnotation(class.ObjectMeta) {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
Skip("No default class found")
|
||||||
|
}
|
||||||
|
|
||||||
By("creating a claim with an alpha dynamic provisioning annotation")
|
By("creating a claim with an alpha dynamic provisioning annotation")
|
||||||
claim := newClaim(ns, true)
|
claim := newClaim(ns, true)
|
||||||
defer func() {
|
defer func() {
|
||||||
c.Core().PersistentVolumeClaims(ns).Delete(claim.Name, nil)
|
c.Core().PersistentVolumeClaims(ns).Delete(claim.Name, nil)
|
||||||
}()
|
}()
|
||||||
claim, err := c.Core().PersistentVolumeClaims(ns).Create(claim)
|
claim, err = c.Core().PersistentVolumeClaims(ns).Create(claim)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
testDynamicProvisioning(c, claim)
|
testDynamicProvisioning(c, claim)
|
||||||
@ -160,7 +174,7 @@ func newClaim(ns string, alpha bool) *v1.PersistentVolumeClaim {
|
|||||||
|
|
||||||
if alpha {
|
if alpha {
|
||||||
claim.Annotations = map[string]string{
|
claim.Annotations = map[string]string{
|
||||||
storageutil.AlphaStorageClassAnnotation: "",
|
"volume.alpha.kubernetes.io/storage-class": "anything",
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
claim.Annotations = map[string]string{
|
claim.Annotations = map[string]string{
|
||||||
|
Loading…
Reference in New Issue
Block a user