diff --git a/staging/src/k8s.io/csi-translation-lib/BUILD b/staging/src/k8s.io/csi-translation-lib/BUILD index cf7e98cc4c5..cd93d78f9f5 100644 --- a/staging/src/k8s.io/csi-translation-lib/BUILD +++ b/staging/src/k8s.io/csi-translation-lib/BUILD @@ -20,6 +20,7 @@ go_test( deps = [ "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", ], ) diff --git a/staging/src/k8s.io/csi-translation-lib/go.sum b/staging/src/k8s.io/csi-translation-lib/go.sum index 0a503b3657f..9802884aceb 100644 --- a/staging/src/k8s.io/csi-translation-lib/go.sum +++ b/staging/src/k8s.io/csi-translation-lib/go.sum @@ -48,6 +48,7 @@ github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= diff --git a/staging/src/k8s.io/csi-translation-lib/plugins/aws_ebs.go b/staging/src/k8s.io/csi-translation-lib/plugins/aws_ebs.go index 5390cbedd5d..7f66f39808c 100644 --- a/staging/src/k8s.io/csi-translation-lib/plugins/aws_ebs.go +++ b/staging/src/k8s.io/csi-translation-lib/plugins/aws_ebs.go @@ -78,8 +78,9 @@ func (t *awsElasticBlockStoreCSITranslator) TranslateInTreeInlineVolumeToCSI(vol } pv := &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ - // A.K.A InnerVolumeSpecName required to match for Unmount - Name: volume.Name, + // Must be unique per disk as it is used as the unique part of the + // staging path + Name: fmt.Sprintf("%s-%s", AWSEBSDriverName, ebsSource.VolumeID), }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ diff --git a/staging/src/k8s.io/csi-translation-lib/plugins/azure_disk.go b/staging/src/k8s.io/csi-translation-lib/plugins/azure_disk.go index 93013ba357c..c9e8472c856 100644 --- a/staging/src/k8s.io/csi-translation-lib/plugins/azure_disk.go +++ b/staging/src/k8s.io/csi-translation-lib/plugins/azure_disk.go @@ -70,8 +70,9 @@ func (t *azureDiskCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Vol azureSource := volume.AzureDisk pv := &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ - // A.K.A InnerVolumeSpecName required to match for Unmount - Name: volume.Name, + // Must be unique per disk as it is used as the unique part of the + // staging path + Name: fmt.Sprintf("%s-%s", AzureDiskDriverName, azureSource.DiskName), }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ diff --git a/staging/src/k8s.io/csi-translation-lib/plugins/azure_file.go b/staging/src/k8s.io/csi-translation-lib/plugins/azure_file.go index c449c25599d..79045421451 100644 --- a/staging/src/k8s.io/csi-translation-lib/plugins/azure_file.go +++ b/staging/src/k8s.io/csi-translation-lib/plugins/azure_file.go @@ -65,8 +65,9 @@ func (t *azureFileCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Vol pv := &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ - // A.K.A InnerVolumeSpecName required to match for Unmount - Name: volume.Name, + // Must be unique per disk as it is used as the unique part of the + // staging path + Name: fmt.Sprintf("%s-%s", AzureFileDriverName, azureSource.ShareName), }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ diff --git a/staging/src/k8s.io/csi-translation-lib/plugins/gce_pd.go b/staging/src/k8s.io/csi-translation-lib/plugins/gce_pd.go index 7728ff47b58..3340a53cdda 100644 --- a/staging/src/k8s.io/csi-translation-lib/plugins/gce_pd.go +++ b/staging/src/k8s.io/csi-translation-lib/plugins/gce_pd.go @@ -212,8 +212,9 @@ func (g *gcePersistentDiskCSITranslator) TranslateInTreeInlineVolumeToCSI(volume fsMode := v1.PersistentVolumeFilesystem return &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ - // A.K.A InnerVolumeSpecName required to match for Unmount - Name: volume.Name, + // Must be unique per disk as it is used as the unique part of the + // staging path + Name: fmt.Sprintf("%s-%s", GCEPDDriverName, pdSource.PDName), }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ diff --git a/staging/src/k8s.io/csi-translation-lib/plugins/openstack_cinder.go b/staging/src/k8s.io/csi-translation-lib/plugins/openstack_cinder.go index 33252bad340..f3e21bc760a 100644 --- a/staging/src/k8s.io/csi-translation-lib/plugins/openstack_cinder.go +++ b/staging/src/k8s.io/csi-translation-lib/plugins/openstack_cinder.go @@ -58,8 +58,9 @@ func (t *osCinderCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volu cinderSource := volume.Cinder pv := &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ - // A.K.A InnerVolumeSpecName required to match for Unmount - Name: volume.Name, + // Must be unique per disk as it is used as the unique part of the + // staging path + Name: fmt.Sprintf("%s-%s", CinderDriverName, cinderSource.VolumeID), }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ diff --git a/staging/src/k8s.io/csi-translation-lib/translate_test.go b/staging/src/k8s.io/csi-translation-lib/translate_test.go index 83e6a125cf4..91c59d54afe 100644 --- a/staging/src/k8s.io/csi-translation-lib/translate_test.go +++ b/staging/src/k8s.io/csi-translation-lib/translate_test.go @@ -17,11 +17,13 @@ limitations under the License. package csitranslation import ( + "fmt" "reflect" "testing" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/csi-translation-lib/plugins" ) @@ -312,6 +314,81 @@ func makeTopology(key string, values ...string) *v1.NodeSelectorRequirement { } } +func TestTranslateInTreeInlineVolumeToCSINameUniqueness(t *testing.T) { + for driverName := range inTreePlugins { + t.Run(driverName, func(t *testing.T) { + ctl := New() + vs1, err := generateUniqueVolumeSource(driverName) + if err != nil { + t.Fatalf("Couldn't generate random source: %v", err) + } + pv1, err := ctl.TranslateInTreeInlineVolumeToCSI(&v1.Volume{ + VolumeSource: vs1, + }) + if err != nil { + t.Fatalf("Error when translating to CSI: %v", err) + } + vs2, err := generateUniqueVolumeSource(driverName) + if err != nil { + t.Fatalf("Couldn't generate random source: %v", err) + } + pv2, err := ctl.TranslateInTreeInlineVolumeToCSI(&v1.Volume{ + VolumeSource: vs2, + }) + if err != nil { + t.Fatalf("Error when translating to CSI: %v", err) + } + if pv1 == nil || pv2 == nil { + t.Fatalf("Did not expect either pv1: %v or pv2: %v to be nil", pv1, pv2) + } + if pv1.Name == pv2.Name { + t.Errorf("PV name %s not sufficiently unique for different volumes", pv1.Name) + } + }) + + } +} + +func generateUniqueVolumeSource(driverName string) (v1.VolumeSource, error) { + switch driverName { + case plugins.GCEPDDriverName: + return v1.VolumeSource{ + GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{ + PDName: string(uuid.NewUUID()), + }, + }, nil + case plugins.AWSEBSDriverName: + return v1.VolumeSource{ + AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{ + VolumeID: string(uuid.NewUUID()), + }, + }, nil + + case plugins.CinderDriverName: + return v1.VolumeSource{ + Cinder: &v1.CinderVolumeSource{ + VolumeID: string(uuid.NewUUID()), + }, + }, nil + case plugins.AzureDiskDriverName: + return v1.VolumeSource{ + AzureDisk: &v1.AzureDiskVolumeSource{ + DiskName: string(uuid.NewUUID()), + DataDiskURI: string(uuid.NewUUID()), + }, + }, nil + case plugins.AzureFileDriverName: + return v1.VolumeSource{ + AzureFile: &v1.AzureFileVolumeSource{ + SecretName: string(uuid.NewUUID()), + ShareName: string(uuid.NewUUID()), + }, + }, nil + default: + return v1.VolumeSource{}, fmt.Errorf("couldn't find logic for driver: %v", driverName) + } +} + func TestPluginNameMappings(t *testing.T) { testCases := []struct { name string