Skip to content

Commit 8548a25

Browse files
authored
Merge pull request kubernetes#84754 from davidz627/fix/uniqueName
Update inline volume translated PV Name to be unique per disk so that staging paths are unique
2 parents d9be37e + df7a3f9 commit 8548a25

File tree

8 files changed

+94
-10
lines changed

8 files changed

+94
-10
lines changed

staging/src/k8s.io/csi-translation-lib/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ go_test(
2020
deps = [
2121
"//staging/src/k8s.io/api/core/v1:go_default_library",
2222
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
23+
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
2324
"//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library",
2425
],
2526
)

staging/src/k8s.io/csi-translation-lib/go.sum

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

staging/src/k8s.io/csi-translation-lib/plugins/aws_ebs.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ func (t *awsElasticBlockStoreCSITranslator) TranslateInTreeInlineVolumeToCSI(vol
7878
}
7979
pv := &v1.PersistentVolume{
8080
ObjectMeta: metav1.ObjectMeta{
81-
// A.K.A InnerVolumeSpecName required to match for Unmount
82-
Name: volume.Name,
81+
// Must be unique per disk as it is used as the unique part of the
82+
// staging path
83+
Name: fmt.Sprintf("%s-%s", AWSEBSDriverName, ebsSource.VolumeID),
8384
},
8485
Spec: v1.PersistentVolumeSpec{
8586
PersistentVolumeSource: v1.PersistentVolumeSource{

staging/src/k8s.io/csi-translation-lib/plugins/azure_disk.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ func (t *azureDiskCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Vol
7070
azureSource := volume.AzureDisk
7171
pv := &v1.PersistentVolume{
7272
ObjectMeta: metav1.ObjectMeta{
73-
// A.K.A InnerVolumeSpecName required to match for Unmount
74-
Name: volume.Name,
73+
// Must be unique per disk as it is used as the unique part of the
74+
// staging path
75+
Name: fmt.Sprintf("%s-%s", AzureDiskDriverName, azureSource.DiskName),
7576
},
7677
Spec: v1.PersistentVolumeSpec{
7778
PersistentVolumeSource: v1.PersistentVolumeSource{

staging/src/k8s.io/csi-translation-lib/plugins/azure_file.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ func (t *azureFileCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Vol
6565

6666
pv := &v1.PersistentVolume{
6767
ObjectMeta: metav1.ObjectMeta{
68-
// A.K.A InnerVolumeSpecName required to match for Unmount
69-
Name: volume.Name,
68+
// Must be unique per disk as it is used as the unique part of the
69+
// staging path
70+
Name: fmt.Sprintf("%s-%s", AzureFileDriverName, azureSource.ShareName),
7071
},
7172
Spec: v1.PersistentVolumeSpec{
7273
PersistentVolumeSource: v1.PersistentVolumeSource{

staging/src/k8s.io/csi-translation-lib/plugins/gce_pd.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,9 @@ func (g *gcePersistentDiskCSITranslator) TranslateInTreeInlineVolumeToCSI(volume
212212
fsMode := v1.PersistentVolumeFilesystem
213213
return &v1.PersistentVolume{
214214
ObjectMeta: metav1.ObjectMeta{
215-
// A.K.A InnerVolumeSpecName required to match for Unmount
216-
Name: volume.Name,
215+
// Must be unique per disk as it is used as the unique part of the
216+
// staging path
217+
Name: fmt.Sprintf("%s-%s", GCEPDDriverName, pdSource.PDName),
217218
},
218219
Spec: v1.PersistentVolumeSpec{
219220
PersistentVolumeSource: v1.PersistentVolumeSource{

staging/src/k8s.io/csi-translation-lib/plugins/openstack_cinder.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ func (t *osCinderCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volu
5858
cinderSource := volume.Cinder
5959
pv := &v1.PersistentVolume{
6060
ObjectMeta: metav1.ObjectMeta{
61-
// A.K.A InnerVolumeSpecName required to match for Unmount
62-
Name: volume.Name,
61+
// Must be unique per disk as it is used as the unique part of the
62+
// staging path
63+
Name: fmt.Sprintf("%s-%s", CinderDriverName, cinderSource.VolumeID),
6364
},
6465
Spec: v1.PersistentVolumeSpec{
6566
PersistentVolumeSource: v1.PersistentVolumeSource{

staging/src/k8s.io/csi-translation-lib/translate_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ limitations under the License.
1717
package csitranslation
1818

1919
import (
20+
"fmt"
2021
"reflect"
2122
"testing"
2223

2324
v1 "k8s.io/api/core/v1"
2425
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+
"k8s.io/apimachinery/pkg/util/uuid"
2527
"k8s.io/csi-translation-lib/plugins"
2628
)
2729

@@ -312,6 +314,81 @@ func makeTopology(key string, values ...string) *v1.NodeSelectorRequirement {
312314
}
313315
}
314316

317+
func TestTranslateInTreeInlineVolumeToCSINameUniqueness(t *testing.T) {
318+
for driverName := range inTreePlugins {
319+
t.Run(driverName, func(t *testing.T) {
320+
ctl := New()
321+
vs1, err := generateUniqueVolumeSource(driverName)
322+
if err != nil {
323+
t.Fatalf("Couldn't generate random source: %v", err)
324+
}
325+
pv1, err := ctl.TranslateInTreeInlineVolumeToCSI(&v1.Volume{
326+
VolumeSource: vs1,
327+
})
328+
if err != nil {
329+
t.Fatalf("Error when translating to CSI: %v", err)
330+
}
331+
vs2, err := generateUniqueVolumeSource(driverName)
332+
if err != nil {
333+
t.Fatalf("Couldn't generate random source: %v", err)
334+
}
335+
pv2, err := ctl.TranslateInTreeInlineVolumeToCSI(&v1.Volume{
336+
VolumeSource: vs2,
337+
})
338+
if err != nil {
339+
t.Fatalf("Error when translating to CSI: %v", err)
340+
}
341+
if pv1 == nil || pv2 == nil {
342+
t.Fatalf("Did not expect either pv1: %v or pv2: %v to be nil", pv1, pv2)
343+
}
344+
if pv1.Name == pv2.Name {
345+
t.Errorf("PV name %s not sufficiently unique for different volumes", pv1.Name)
346+
}
347+
})
348+
349+
}
350+
}
351+
352+
func generateUniqueVolumeSource(driverName string) (v1.VolumeSource, error) {
353+
switch driverName {
354+
case plugins.GCEPDDriverName:
355+
return v1.VolumeSource{
356+
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{
357+
PDName: string(uuid.NewUUID()),
358+
},
359+
}, nil
360+
case plugins.AWSEBSDriverName:
361+
return v1.VolumeSource{
362+
AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{
363+
VolumeID: string(uuid.NewUUID()),
364+
},
365+
}, nil
366+
367+
case plugins.CinderDriverName:
368+
return v1.VolumeSource{
369+
Cinder: &v1.CinderVolumeSource{
370+
VolumeID: string(uuid.NewUUID()),
371+
},
372+
}, nil
373+
case plugins.AzureDiskDriverName:
374+
return v1.VolumeSource{
375+
AzureDisk: &v1.AzureDiskVolumeSource{
376+
DiskName: string(uuid.NewUUID()),
377+
DataDiskURI: string(uuid.NewUUID()),
378+
},
379+
}, nil
380+
case plugins.AzureFileDriverName:
381+
return v1.VolumeSource{
382+
AzureFile: &v1.AzureFileVolumeSource{
383+
SecretName: string(uuid.NewUUID()),
384+
ShareName: string(uuid.NewUUID()),
385+
},
386+
}, nil
387+
default:
388+
return v1.VolumeSource{}, fmt.Errorf("couldn't find logic for driver: %v", driverName)
389+
}
390+
}
391+
315392
func TestPluginNameMappings(t *testing.T) {
316393
testCases := []struct {
317394
name string

0 commit comments

Comments
 (0)