From ca276336e1de07883907775b5de4f317fe60bf71 Mon Sep 17 00:00:00 2001 From: wenlxie Date: Thu, 31 May 2018 20:40:37 +0800 Subject: [PATCH] 1. fix rbd device works at block mode not get mapped to container when docker restart 2. Add unit test case for rbd --- pkg/volume/rbd/rbd.go | 7 +++-- pkg/volume/rbd/rbd_test.go | 54 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/pkg/volume/rbd/rbd.go b/pkg/volume/rbd/rbd.go index 615b89554ab..bee95f0a44b 100644 --- a/pkg/volume/rbd/rbd.go +++ b/pkg/volume/rbd/rbd.go @@ -410,10 +410,10 @@ func (plugin *rbdPlugin) ConstructBlockVolumeSpec(podUID types.UID, volumeName, if len(globalMapPath) == 1 { return nil, fmt.Errorf("failed to retrieve volume plugin information from globalMapPathUUID: %v", globalMapPathUUID) } - return getVolumeSpecFromGlobalMapPath(globalMapPath) + return getVolumeSpecFromGlobalMapPath(globalMapPath, volumeName) } -func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error) { +func getVolumeSpecFromGlobalMapPath(globalMapPath, volumeName string) (*volume.Spec, error) { // Retrieve volume spec information from globalMapPath // globalMapPath example: // plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumePluginDependentPath} @@ -423,6 +423,9 @@ func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error) } block := v1.PersistentVolumeBlock rbdVolume := &v1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: volumeName, + }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ RBD: &v1.RBDPersistentVolumeSource{ diff --git a/pkg/volume/rbd/rbd_test.go b/pkg/volume/rbd/rbd_test.go index 4ab32f6b5cf..0b757967680 100644 --- a/pkg/volume/rbd/rbd_test.go +++ b/pkg/volume/rbd/rbd_test.go @@ -39,6 +39,60 @@ import ( volumetest "k8s.io/kubernetes/pkg/volume/testing" ) +const ( + testVolName = "vol-1234" + testRBDImage = "volume-a4b47414-a675-47dc-a9cc-c223f13439b0" + testRBDPool = "volumes" + testGlobalPath = "plugins/kubernetes.io/rbd/volumeDevices/volumes-image-volume-a4b47414-a675-47dc-a9cc-c223f13439b0" +) + +func TestGetVolumeSpecFromGlobalMapPath(t *testing.T) { + // make our test path for fake GlobalMapPath + // /tmp symbolized our pluginDir + // /tmp/testGlobalPathXXXXX/plugins/kubernetes.io/rbd/volumeDevices/pdVol1 + tmpVDir, err := utiltesting.MkTmpdir("rbdBlockTest") + if err != nil { + t.Fatalf("can't make a temp dir: %v", err) + } + //deferred clean up + defer os.RemoveAll(tmpVDir) + + expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath) + + //Bad Path + badspec, err := getVolumeSpecFromGlobalMapPath("", testVolName) + if badspec != nil || err == nil { + t.Fatalf("Expected not to get spec from GlobalMapPath but did") + } + + // Good Path + spec, err := getVolumeSpecFromGlobalMapPath(expectedGlobalPath, testVolName) + if spec == nil || err != nil { + t.Fatalf("Failed to get spec from GlobalMapPath: %v", err) + } + + if spec.PersistentVolume.Name != testVolName { + t.Errorf("Invalid spec name for GlobalMapPath spec: %s", spec.PersistentVolume.Name) + } + + if spec.PersistentVolume.Spec.RBD.RBDPool != testRBDPool { + t.Errorf("Invalid RBDPool from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.RBD.RBDPool) + } + + if spec.PersistentVolume.Spec.RBD.RBDImage != testRBDImage { + t.Errorf("Invalid RBDImage from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.RBD.RBDImage) + } + + block := v1.PersistentVolumeBlock + specMode := spec.PersistentVolume.Spec.VolumeMode + if &specMode == nil { + t.Errorf("Invalid volumeMode from GlobalMapPath spec: %v - %v", &specMode, block) + } + if *specMode != block { + t.Errorf("Invalid volumeMode from GlobalMapPath spec: %v - %v", *specMode, block) + } +} + func TestCanSupport(t *testing.T) { tmpDir, err := utiltesting.MkTmpdir("rbd_test") if err != nil {