From 731e1cd5c76d87f430574207cf75a444881e61f7 Mon Sep 17 00:00:00 2001 From: Jiawei Wang Date: Wed, 25 Aug 2021 15:11:11 -0700 Subject: [PATCH] Support accepting GA annStorageProvisioner anno --- pkg/controller/controller.go | 21 +++++++++++++++------ pkg/controller/controller_test.go | 26 +++++++++++++++++++------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index afc80efe75..2948e1c47b 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -126,9 +126,11 @@ const ( deleteVolumeRetryCount = 5 - annMigratedTo = "pv.kubernetes.io/migrated-to" - annStorageProvisioner = "volume.beta.kubernetes.io/storage-provisioner" - annSelectedNode = "volume.kubernetes.io/selected-node" + annMigratedTo = "pv.kubernetes.io/migrated-to" + // TODO: Beta will be deprecated and removed in a later release + annBetaStorageProvisioner = "volume.beta.kubernetes.io/storage-provisioner" + annStorageProvisioner = "volume.kubernetes.io/storage-provisioner" + annSelectedNode = "volume.kubernetes.io/selected-node" snapshotNotBound = "snapshot %s not bound" @@ -698,13 +700,17 @@ func (p *csiProvisioner) prepareProvision(ctx context.Context, claim *v1.Persist func (p *csiProvisioner) Provision(ctx context.Context, options controller.ProvisionOptions) (*v1.PersistentVolume, controller.ProvisioningState, error) { claim := options.PVC - if claim.Annotations[annStorageProvisioner] != p.driverName && claim.Annotations[annMigratedTo] != p.driverName { + provisioner, ok := claim.Annotations[annStorageProvisioner] + if !ok { + provisioner = claim.Annotations[annBetaStorageProvisioner] + } + if provisioner != p.driverName && claim.Annotations[annMigratedTo] != p.driverName { // The storage provisioner annotation may not equal driver name but the // PVC could have annotation "migrated-to" which is the new way to // signal a PVC is migrated (k8s v1.17+) return nil, controller.ProvisioningFinished, &controller.IgnoredError{ Reason: fmt.Sprintf("PVC annotated with external-provisioner name %s does not match provisioner driver name %s. This could mean the PVC is not migrated", - claim.Annotations[annStorageProvisioner], + provisioner, p.driverName), } @@ -1229,7 +1235,10 @@ func (p *csiProvisioner) SupportsBlock(ctx context.Context) bool { } func (p *csiProvisioner) ShouldProvision(ctx context.Context, claim *v1.PersistentVolumeClaim) bool { - provisioner := claim.Annotations[annStorageProvisioner] + provisioner, ok := claim.Annotations[annStorageProvisioner] + if !ok { + provisioner = claim.Annotations[annBetaStorageProvisioner] + } migratedTo := claim.Annotations[annMigratedTo] if provisioner != p.driverName && migratedTo != p.driverName { // Non-migrated in-tree volume is requested. diff --git a/pkg/controller/controller_test.go b/pkg/controller/controller_test.go index a76e67b20e..f5668f59e4 100644 --- a/pkg/controller/controller_test.go +++ b/pkg/controller/controller_test.go @@ -73,7 +73,7 @@ var ( volumeModeFileSystem = v1.PersistentVolumeFilesystem volumeModeBlock = v1.PersistentVolumeBlock - driverNameAnnotation = map[string]string{annStorageProvisioner: driverName} + driverNameAnnotation = map[string]string{annBetaStorageProvisioner: driverName} translatedKey = "translated" defaultfsType = "ext4" ) @@ -503,7 +503,7 @@ func provisionFromPVCCapabilities() (rpc.PluginCapabilitySet, rpc.ControllerCapa var fakeSCName = "fake-test-sc" func createFakeNamedPVC(requestBytes int64, name string, userAnnotations map[string]string) *v1.PersistentVolumeClaim { - annotations := map[string]string{annStorageProvisioner: driverName} + annotations := map[string]string{annBetaStorageProvisioner: driverName} for k, v := range userAnnotations { annotations[k] = v } @@ -4503,43 +4503,55 @@ func TestProvisionWithMigration(t *testing.T) { { name: "provision with migration on", scProvisioner: inTreePluginName, + annotation: map[string]string{annBetaStorageProvisioner: driverName}, + expectTranslation: true, + }, + { + name: "provision with migration on with GA annStorageProvisioner annontation", + scProvisioner: inTreePluginName, annotation: map[string]string{annStorageProvisioner: driverName}, expectTranslation: true, }, { name: "provision without migration for native CSI", scProvisioner: driverName, + annotation: map[string]string{annBetaStorageProvisioner: driverName}, + expectTranslation: false, + }, + { + name: "provision without migration for native CSI with GA annStorageProvisioner annontation", + scProvisioner: driverName, annotation: map[string]string{annStorageProvisioner: driverName}, expectTranslation: false, }, { name: "provision with migration for migrated-to CSI", scProvisioner: inTreePluginName, - annotation: map[string]string{annStorageProvisioner: inTreePluginName, annMigratedTo: driverName}, + annotation: map[string]string{annBetaStorageProvisioner: inTreePluginName, annMigratedTo: driverName}, expectTranslation: true, }, { name: "provision with migration-to some random driver", scProvisioner: inTreePluginName, - annotation: map[string]string{annStorageProvisioner: inTreePluginName, annMigratedTo: "foo"}, + annotation: map[string]string{annBetaStorageProvisioner: inTreePluginName, annMigratedTo: "foo"}, expectErr: true, }, { name: "provision with migration-to some random driver with random storageProvisioner", scProvisioner: inTreePluginName, - annotation: map[string]string{annStorageProvisioner: "foo", annMigratedTo: "foo"}, + annotation: map[string]string{annBetaStorageProvisioner: "foo", annMigratedTo: "foo"}, expectErr: true, }, { name: "provision with migration for migrated-to CSI with CSI Provisioner", scProvisioner: inTreePluginName, - annotation: map[string]string{annStorageProvisioner: driverName, annMigratedTo: driverName}, + annotation: map[string]string{annBetaStorageProvisioner: driverName, annMigratedTo: driverName}, expectTranslation: true, }, { name: "ignore in-tree PVC when provisioned by in-tree", scProvisioner: inTreePluginName, - annotation: map[string]string{annStorageProvisioner: inTreePluginName}, + annotation: map[string]string{annBetaStorageProvisioner: inTreePluginName}, expectErr: true, }, }