From 8de0f1194634f2851d4a126967c139017fbd49f6 Mon Sep 17 00:00:00 2001 From: Jiawei Wang Date: Wed, 25 Aug 2021 16:30:45 -0700 Subject: [PATCH] Add GA AnnStorageProvisioner annotation to PVC This PR adds GA AnnStorageProvisioner annotation to a PVC if the PVC requires dynamic provisioning. This also deprecates the beta AnnStorageProvisioner annotation and it will be removed in a later release. --- .../volume/persistentvolume/framework_test.go | 2 +- .../volume/persistentvolume/provision_test.go | 60 ++++++++++--------- .../persistentvolume/pv_controller_base.go | 40 +++++++++---- .../persistentvolume/pv_controller_test.go | 20 ++++++- .../volume/persistentvolume/util/util.go | 4 +- 5 files changed, 84 insertions(+), 42 deletions(-) diff --git a/pkg/controller/volume/persistentvolume/framework_test.go b/pkg/controller/volume/persistentvolume/framework_test.go index e71aeb24a9c..4a38e6bfc63 100644 --- a/pkg/controller/volume/persistentvolume/framework_test.go +++ b/pkg/controller/volume/persistentvolume/framework_test.go @@ -401,7 +401,7 @@ func newClaim(name, claimUID, capacity, boundToVolume string, phase v1.Persisten claim.Annotations = make(map[string]string) for _, a := range annotations { switch a { - case pvutil.AnnStorageProvisioner: + case pvutil.AnnBetaStorageProvisioner, pvutil.AnnStorageProvisioner: claim.Annotations[a] = mockPluginName default: claim.Annotations[a] = "yes" diff --git a/pkg/controller/volume/persistentvolume/provision_test.go b/pkg/controller/volume/persistentvolume/provision_test.go index fba0628cc74..edfb668bd7b 100644 --- a/pkg/controller/volume/persistentvolume/provision_test.go +++ b/pkg/controller/volume/persistentvolume/provision_test.go @@ -174,7 +174,7 @@ func TestProvisionSync(t *testing.T) { newVolumeArray("pvc-uid11-1", "1Gi", "uid11-1", "claim11-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, pvutil.AnnBoundByController, pvutil.AnnDynamicallyProvisioned), newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, &classGold), // Binding will be completed in the next syncClaim - newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-1", "uid11-1", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Normal ProvisioningSucceeded"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), }, { @@ -193,7 +193,7 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-3", "uid11-3", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Warning ProvisioningFailed"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), }, @@ -203,7 +203,7 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-4", "uid11-4", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Warning ProvisioningFailed"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Error}, testSyncClaim), }, @@ -227,7 +227,7 @@ func TestProvisionSync(t *testing.T) { newVolumeArray("pvc-uid11-7", "1Gi", "uid11-7", "claim11-7", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, pvutil.AnnBoundByController, pvutil.AnnDynamicallyProvisioned), newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, &classGold), // The claim would be bound in next syncClaim - newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-7", "uid11-7", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), noevents, noerrors, wrapTestWithInjectedOperation(wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), func(ctrl *PersistentVolumeController, reactor *pvtesting.VolumeReactor) { // Create a volume before provisionClaimOperation starts. @@ -244,7 +244,7 @@ func TestProvisionSync(t *testing.T) { newVolumeArray("pvc-uid11-8", "1Gi", "uid11-8", "claim11-8", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, pvutil.AnnBoundByController, pvutil.AnnDynamicallyProvisioned), newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, &classGold), // Binding will be completed in the next syncClaim - newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-8", "uid11-8", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Normal ProvisioningSucceeded"}, []pvtesting.ReactorError{ // Inject error to the first @@ -261,7 +261,7 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-9", "uid11-9", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Warning ProvisioningFailed"}, []pvtesting.ReactorError{ // Inject error to five kubeclient.PersistentVolumes.Create() @@ -286,7 +286,7 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-10", "uid11-10", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"}, []pvtesting.ReactorError{ // Inject error to five kubeclient.PersistentVolumes.Create() @@ -307,7 +307,7 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-11", "uid11-11", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Warning ProvisioningFailed", "Warning ProvisioningCleanupFailed"}, []pvtesting.ReactorError{ // Inject error to five kubeclient.PersistentVolumes.Create() @@ -337,7 +337,7 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-12", "uid11-12", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Warning ProvisioningFailed"}, []pvtesting.ReactorError{ // Inject error to five kubeclient.PersistentVolumes.Create() @@ -365,7 +365,7 @@ func TestProvisionSync(t *testing.T) { newVolumeArray("pvc-uid11-13", "1Gi", "uid11-13", "claim11-13", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classSilver, pvutil.AnnBoundByController, pvutil.AnnDynamicallyProvisioned), newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending, &classSilver), // Binding will be completed in the next syncClaim - newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending, &classSilver, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-13", "uid11-13", "1Gi", "", v1.ClaimPending, &classSilver, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), []string{"Normal ProvisioningSucceeded"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision2Success}, testSyncClaim), }, { @@ -401,8 +401,9 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending, &classExternal), - claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", - newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending, &classExternal)), + claimWithAnnotation(pvutil.AnnBetaStorageProvisioner, "vendor.com/my-volume", + claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", + newClaimArray("claim11-17", "uid11-17", "1Gi", "", v1.ClaimPending, &classExternal))), []string{"Normal ExternalProvisioning"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), }, @@ -431,7 +432,7 @@ func TestProvisionSync(t *testing.T) { // end of the test is empty. novolumes, newClaimArray("claim11-19", "uid11-19", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim11-19", "uid11-19", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-19", "uid11-19", "1Gi", "", v1.ClaimPending, &classGold, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), noevents, []pvtesting.ReactorError{ // Inject errors to simulate crashed API server during @@ -452,7 +453,7 @@ func TestProvisionSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim11-20", "uid11-20", "1Gi", "", v1.ClaimPending, &classUnsupportedMountOptions), - newClaimArray("claim11-20", "uid11-20", "1Gi", "", v1.ClaimPending, &classUnsupportedMountOptions, pvutil.AnnStorageProvisioner), + newClaimArray("claim11-20", "uid11-20", "1Gi", "", v1.ClaimPending, &classUnsupportedMountOptions, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), // Expect event to be prefixed with "Mount options" because saving PV will fail anyway []string{"Warning ProvisioningFailed Mount options"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), @@ -467,8 +468,9 @@ func TestProvisionSync(t *testing.T) { annotateClaim( newClaim("claim11-21", "uid11-21", "1Gi", "", v1.ClaimPending, &classGold), map[string]string{ - pvutil.AnnStorageProvisioner: "vendor.com/MockCSIDriver", - pvutil.AnnMigratedTo: "vendor.com/MockCSIDriver", + pvutil.AnnStorageProvisioner: "vendor.com/MockCSIDriver", + pvutil.AnnBetaStorageProvisioner: "vendor.com/MockCSIDriver", + pvutil.AnnMigratedTo: "vendor.com/MockCSIDriver", }), }, []string{"Normal ExternalProvisioning"}, @@ -496,7 +498,7 @@ func TestProvisionSync(t *testing.T) { claimWithAnnotation(pvutil.AnnSelectedNode, "node1", newClaimArray("claim11-23", "uid11-23", "1Gi", "", v1.ClaimPending, &classCopper)), claimWithAnnotation(pvutil.AnnSelectedNode, "node1", - newClaimArray("claim11-23", "uid11-23", "1Gi", "", v1.ClaimPending, &classCopper, pvutil.AnnStorageProvisioner)), + newClaimArray("claim11-23", "uid11-23", "1Gi", "", v1.ClaimPending, &classCopper, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner)), []string{"Normal ProvisioningSucceeded"}, noerrors, wrapTestWithInjectedOperation(wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), @@ -514,9 +516,10 @@ func TestProvisionSync(t *testing.T) { newVolumeArray("volume11-24", "1Gi", "", "", v1.VolumeAvailable, v1.PersistentVolumeReclaimDelete, classExternalWait), claimWithAnnotation(pvutil.AnnSelectedNode, "node1", newClaimArray("claim11-24", "uid11-24", "1Gi", "", v1.ClaimPending, &classExternalWait)), - claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume-wait", - claimWithAnnotation(pvutil.AnnSelectedNode, "node1", - newClaimArray("claim11-24", "uid11-24", "1Gi", "", v1.ClaimPending, &classExternalWait))), + claimWithAnnotation(pvutil.AnnBetaStorageProvisioner, "vendor.com/my-volume-wait", + claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume-wait", + claimWithAnnotation(pvutil.AnnSelectedNode, "node1", + newClaimArray("claim11-24", "uid11-24", "1Gi", "", v1.ClaimPending, &classExternalWait)))), []string{"Normal ExternalProvisioning"}, noerrors, testSyncClaim, }, @@ -570,7 +573,7 @@ func TestProvisionMultiSync(t *testing.T) { novolumes, newVolumeArray("pvc-uid12-1", "1Gi", "uid12-1", "claim12-1", v1.VolumeBound, v1.PersistentVolumeReclaimDelete, classGold, pvutil.AnnBoundByController, pvutil.AnnDynamicallyProvisioned), newClaimArray("claim12-1", "uid12-1", "1Gi", "", v1.ClaimPending, &classGold), - newClaimArray("claim12-1", "uid12-1", "1Gi", "pvc-uid12-1", v1.ClaimBound, &classGold, pvutil.AnnBoundByController, pvutil.AnnBindCompleted, pvutil.AnnStorageProvisioner), + newClaimArray("claim12-1", "uid12-1", "1Gi", "pvc-uid12-1", v1.ClaimBound, &classGold, pvutil.AnnBoundByController, pvutil.AnnBindCompleted, pvutil.AnnStorageProvisioner, pvutil.AnnBetaStorageProvisioner), noevents, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), }, { @@ -579,8 +582,9 @@ func TestProvisionMultiSync(t *testing.T) { novolumes, newVolumeArray("pvc-uid12-2", "1Gi", "uid12-2", "claim12-2", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classExternal, pvutil.AnnBoundByController), newClaimArray("claim12-2", "uid12-2", "1Gi", "", v1.ClaimPending, &classExternal), - claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", - newClaimArray("claim12-2", "uid12-2", "1Gi", "pvc-uid12-2", v1.ClaimBound, &classExternal, pvutil.AnnBoundByController, pvutil.AnnBindCompleted)), + claimWithAnnotation(pvutil.AnnBetaStorageProvisioner, "vendor.com/my-volume", + claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", + newClaimArray("claim12-2", "uid12-2", "1Gi", "pvc-uid12-2", v1.ClaimBound, &classExternal, pvutil.AnnBoundByController, pvutil.AnnBindCompleted))), []string{"Normal ExternalProvisioning"}, noerrors, wrapTestWithInjectedOperation(wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), func(ctrl *PersistentVolumeController, reactor *pvtesting.VolumeReactor) { @@ -604,8 +608,9 @@ func TestProvisionMultiSync(t *testing.T) { novolumes, novolumes, newClaimArray("claim12-3", "uid12-3", "1Gi", "", v1.ClaimPending, &classExternal), - claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", - newClaimArray("claim12-3", "uid12-3", "1Gi", "", v1.ClaimPending, &classExternal)), + claimWithAnnotation(pvutil.AnnBetaStorageProvisioner, "vendor.com/my-volume", + claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", + newClaimArray("claim12-3", "uid12-3", "1Gi", "", v1.ClaimPending, &classExternal))), []string{"Normal ExternalProvisioning"}, noerrors, wrapTestWithProvisionCalls([]provisionCall{provision1Success}, testSyncClaim), @@ -616,8 +621,9 @@ func TestProvisionMultiSync(t *testing.T) { novolumes, newVolumeArray("pvc-uid12-4", "1Gi", "uid12-4", "claim12-4", v1.VolumeBound, v1.PersistentVolumeReclaimRetain, classExternal, pvutil.AnnBoundByController), newClaimArray("claim12-4", "uid12-4", "1Gi", "", v1.ClaimPending, &classExternal), - claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", - newClaimArray("claim12-4", "uid12-4", "1Gi", "pvc-uid12-4", v1.ClaimBound, &classExternal, pvutil.AnnBoundByController, pvutil.AnnBindCompleted)), + claimWithAnnotation(pvutil.AnnBetaStorageProvisioner, "vendor.com/my-volume", + claimWithAnnotation(pvutil.AnnStorageProvisioner, "vendor.com/my-volume", + newClaimArray("claim12-4", "uid12-4", "1Gi", "pvc-uid12-4", v1.ClaimBound, &classExternal, pvutil.AnnBoundByController, pvutil.AnnBindCompleted))), []string{"Normal ExternalProvisioning"}, noerrors, wrapTestWithInjectedOperation(wrapTestWithProvisionCalls([]provisionCall{}, testSyncClaim), func(ctrl *PersistentVolumeController, reactor *pvtesting.VolumeReactor) { diff --git a/pkg/controller/volume/persistentvolume/pv_controller_base.go b/pkg/controller/volume/persistentvolume/pv_controller_base.go index ad7a93d073a..57b90a0b518 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_base.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_base.go @@ -331,7 +331,7 @@ func (ctrl *PersistentVolumeController) updateClaimMigrationAnnotations(claim *v // when no modifications are required this function could sometimes return a // copy of the volume and sometimes return a ref to the original claimClone := claim.DeepCopy() - modified := updateMigrationAnnotations(ctrl.csiMigratedPluginManager, ctrl.translator, claimClone.Annotations, pvutil.AnnStorageProvisioner) + modified := updateMigrationAnnotations(ctrl.csiMigratedPluginManager, ctrl.translator, claimClone.Annotations, true) if !modified { return claimClone, nil } @@ -348,7 +348,7 @@ func (ctrl *PersistentVolumeController) updateClaimMigrationAnnotations(claim *v func (ctrl *PersistentVolumeController) updateVolumeMigrationAnnotations(volume *v1.PersistentVolume) (*v1.PersistentVolume, error) { volumeClone := volume.DeepCopy() - modified := updateMigrationAnnotations(ctrl.csiMigratedPluginManager, ctrl.translator, volumeClone.Annotations, pvutil.AnnDynamicallyProvisioned) + modified := updateMigrationAnnotations(ctrl.csiMigratedPluginManager, ctrl.translator, volumeClone.Annotations, false) if !modified { return volumeClone, nil } @@ -365,12 +365,14 @@ func (ctrl *PersistentVolumeController) updateVolumeMigrationAnnotations(volume } // updateMigrationAnnotations takes an Annotations map and checks for a -// provisioner name using the provisionerKey. It will then add a -// "pv.kubernetes.io/migrated-to" annotation if migration with the CSI -// driver name for that provisioner is "on" based on feature flags, it will also -// remove the annotation is migration is "off" for that provisioner in rollback +// provisioner name depending if the annotation came from a PVC or not. +// It will then add a "pv.kubernetes.io/migrated-to" annotation if migration with +// the CSI driver name for that provisioner is "on" based on feature flags, it will also +// remove the annotation if migration is "off" for that provisioner in rollback // scenarios. Returns true if the annotations map was modified and false otherwise. -func updateMigrationAnnotations(cmpm CSIMigratedPluginManager, translator CSINameTranslator, ann map[string]string, provisionerKey string) bool { +// Parameters: +// - claim: true means the ann came from a PVC, false means the ann came from a PV +func updateMigrationAnnotations(cmpm CSIMigratedPluginManager, translator CSINameTranslator, ann map[string]string, claim bool) bool { var csiDriverName string var err error @@ -379,10 +381,24 @@ func updateMigrationAnnotations(cmpm CSIMigratedPluginManager, translator CSINam // this is migrated - no change return false } + var provisionerKey string + if claim { + provisionerKey = pvutil.AnnStorageProvisioner + } else { + provisionerKey = pvutil.AnnDynamicallyProvisioned + } provisioner, ok := ann[provisionerKey] if !ok { - // Volume not dynamically provisioned. Ignore - return false + if claim { + // Also check beta AnnStorageProvisioner annontation to make sure + provisioner, ok = ann[pvutil.AnnBetaStorageProvisioner] + if !ok { + return false + } + } else { + // Volume not dynamically provisioned. Ignore + return false + } } migratedToDriver := ann[pvutil.AnnMigratedTo] @@ -547,7 +563,7 @@ func (ctrl *PersistentVolumeController) resync() { } // setClaimProvisioner saves -// claim.Annotations[pvutil.AnnStorageProvisioner] = class.Provisioner +// claim.Annotations["volume.kubernetes.io/storage-provisioner"] = class.Provisioner func (ctrl *PersistentVolumeController) setClaimProvisioner(claim *v1.PersistentVolumeClaim, provisionerName string) (*v1.PersistentVolumeClaim, error) { if val, ok := claim.Annotations[pvutil.AnnStorageProvisioner]; ok && val == provisionerName { // annotation is already set, nothing to do @@ -557,8 +573,10 @@ func (ctrl *PersistentVolumeController) setClaimProvisioner(claim *v1.Persistent // The volume from method args can be pointing to watcher cache. We must not // modify these, therefore create a copy. claimClone := claim.DeepCopy() + // TODO: remove the beta storage provisioner anno after the deprecation period + metav1.SetMetaDataAnnotation(&claimClone.ObjectMeta, pvutil.AnnBetaStorageProvisioner, provisionerName) metav1.SetMetaDataAnnotation(&claimClone.ObjectMeta, pvutil.AnnStorageProvisioner, provisionerName) - updateMigrationAnnotations(ctrl.csiMigratedPluginManager, ctrl.translator, claimClone.Annotations, pvutil.AnnStorageProvisioner) + updateMigrationAnnotations(ctrl.csiMigratedPluginManager, ctrl.translator, claimClone.Annotations, true) newClaim, err := ctrl.kubeClient.CoreV1().PersistentVolumeClaims(claim.Namespace).Update(context.TODO(), claimClone, metav1.UpdateOptions{}) if err != nil { return newClaim, err diff --git a/pkg/controller/volume/persistentvolume/pv_controller_test.go b/pkg/controller/volume/persistentvolume/pv_controller_test.go index 3dc26277710..6ec04e0ac3d 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_test.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_test.go @@ -557,6 +557,14 @@ func TestAnnealMigrationAnnotations(t *testing.T) { expClaimAnnotations: map[string]string{pvutil.AnnStorageProvisioner: gcePlugin, pvutil.AnnMigratedTo: gceDriver}, migratedDriverGates: []featuregate.Feature{features.CSIMigrationGCE}, }, + { + name: "migration on for GCE with Beta storage provisioner annontation", + volumeAnnotations: map[string]string{pvutil.AnnDynamicallyProvisioned: gcePlugin}, + expVolumeAnnotations: map[string]string{pvutil.AnnDynamicallyProvisioned: gcePlugin, pvutil.AnnMigratedTo: gceDriver}, + claimAnnotations: map[string]string{pvutil.AnnBetaStorageProvisioner: gcePlugin}, + expClaimAnnotations: map[string]string{pvutil.AnnBetaStorageProvisioner: gcePlugin, pvutil.AnnMigratedTo: gceDriver}, + migratedDriverGates: []featuregate.Feature{features.CSIMigrationGCE}, + }, { name: "migration off for GCE", volumeAnnotations: map[string]string{pvutil.AnnDynamicallyProvisioned: gcePlugin}, @@ -573,6 +581,14 @@ func TestAnnealMigrationAnnotations(t *testing.T) { expClaimAnnotations: map[string]string{pvutil.AnnStorageProvisioner: gcePlugin}, migratedDriverGates: []featuregate.Feature{}, }, + { + name: "migration off for GCE removes migrated to (rollback) with Beta storage provisioner annontation", + volumeAnnotations: map[string]string{pvutil.AnnDynamicallyProvisioned: gcePlugin, pvutil.AnnMigratedTo: gceDriver}, + expVolumeAnnotations: map[string]string{pvutil.AnnDynamicallyProvisioned: gcePlugin}, + claimAnnotations: map[string]string{pvutil.AnnBetaStorageProvisioner: gcePlugin, pvutil.AnnMigratedTo: gceDriver}, + expClaimAnnotations: map[string]string{pvutil.AnnBetaStorageProvisioner: gcePlugin}, + migratedDriverGates: []featuregate.Feature{}, + }, { name: "migration on for GCE other plugin not affected", volumeAnnotations: map[string]string{pvutil.AnnDynamicallyProvisioned: testPlugin}, @@ -625,14 +641,14 @@ func TestAnnealMigrationAnnotations(t *testing.T) { } if tc.volumeAnnotations != nil { ann := tc.volumeAnnotations - updateMigrationAnnotations(cmpm, translator, ann, pvutil.AnnDynamicallyProvisioned) + updateMigrationAnnotations(cmpm, translator, ann, false) if !reflect.DeepEqual(tc.expVolumeAnnotations, ann) { t.Errorf("got volume annoations: %v, but expected: %v", ann, tc.expVolumeAnnotations) } } if tc.claimAnnotations != nil { ann := tc.claimAnnotations - updateMigrationAnnotations(cmpm, translator, ann, pvutil.AnnStorageProvisioner) + updateMigrationAnnotations(cmpm, translator, ann, true) if !reflect.DeepEqual(tc.expClaimAnnotations, ann) { t.Errorf("got volume annoations: %v, but expected: %v", ann, tc.expVolumeAnnotations) } diff --git a/pkg/controller/volume/persistentvolume/util/util.go b/pkg/controller/volume/persistentvolume/util/util.go index 4f9390de4ad..bb314134974 100644 --- a/pkg/controller/volume/persistentvolume/util/util.go +++ b/pkg/controller/volume/persistentvolume/util/util.go @@ -74,7 +74,9 @@ const ( // AnnStorageProvisioner annotation is added to a PVC that is supposed to be dynamically // provisioned. Its value is name of volume plugin that is supposed to provision // a volume for this PVC. - AnnStorageProvisioner = "volume.beta.kubernetes.io/storage-provisioner" + // TODO: remove beta anno once deprecation period ends + AnnStorageProvisioner = "volume.kubernetes.io/storage-provisioner" + AnnBetaStorageProvisioner = "volume.beta.kubernetes.io/storage-provisioner" ) // IsDelayBindingProvisioning checks if claim provisioning with selected-node annotation