Reconstruct block PV name in all volume plugins

The PV name is often necessary to build correct symlink paths
/var/lib/kubelet/pods/{podUid}}/{DefaultKubeletVolumeDevicesDirName}/{escapeQualifiedPluginName}/{PV name}
This commit is contained in:
Jan Safranek 2019-10-04 14:03:35 +02:00
parent 44a006e0d0
commit 1c8c861009
8 changed files with 48 additions and 20 deletions

View File

@ -25,6 +25,7 @@ import (
"strings" "strings"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/mount"
@ -51,10 +52,10 @@ func (plugin *awsElasticBlockStorePlugin) ConstructBlockVolumeSpec(podUID types.
return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID) return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID)
} }
return getVolumeSpecFromGlobalMapPath(globalMapPath) return getVolumeSpecFromGlobalMapPath(volumeName, globalMapPath)
} }
func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error) { func getVolumeSpecFromGlobalMapPath(volumeName string, globalMapPath string) (*volume.Spec, error) {
// Get volume spec information from globalMapPath // Get volume spec information from globalMapPath
// globalMapPath example: // globalMapPath example:
// plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID} // plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID}
@ -68,6 +69,9 @@ func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error)
} }
block := v1.PersistentVolumeBlock block := v1.PersistentVolumeBlock
awsVolume := &v1.PersistentVolume{ awsVolume := &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
Name: volumeName,
},
Spec: v1.PersistentVolumeSpec{ Spec: v1.PersistentVolumeSpec{
PersistentVolumeSource: v1.PersistentVolumeSource{ PersistentVolumeSource: v1.PersistentVolumeSource{
AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{ AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{

View File

@ -52,16 +52,19 @@ func TestGetVolumeSpecFromGlobalMapPath(t *testing.T) {
expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath) expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath)
//Bad Path //Bad Path
badspec, err := getVolumeSpecFromGlobalMapPath("") badspec, err := getVolumeSpecFromGlobalMapPath("", "")
if badspec != nil || err == nil { if badspec != nil || err == nil {
t.Fatalf("Expected not to get spec from GlobalMapPath but did") t.Fatalf("Expected not to get spec from GlobalMapPath but did")
} }
// Good Path // Good Path
spec, err := getVolumeSpecFromGlobalMapPath(expectedGlobalPath) spec, err := getVolumeSpecFromGlobalMapPath("myVolume", expectedGlobalPath)
if spec == nil || err != nil { if spec == nil || err != nil {
t.Fatalf("Failed to get spec from GlobalMapPath: %v", err) t.Fatalf("Failed to get spec from GlobalMapPath: %v", err)
} }
if spec.PersistentVolume.Name != "myVolume" {
t.Errorf("Invalid PV name from GlobalMapPath spec: %s", spec.PersistentVolume.Name)
}
if spec.PersistentVolume.Spec.AWSElasticBlockStore.VolumeID != testVolName { if spec.PersistentVolume.Spec.AWSElasticBlockStore.VolumeID != testVolName {
t.Errorf("Invalid volumeID from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.AWSElasticBlockStore.VolumeID) t.Errorf("Invalid volumeID from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.AWSElasticBlockStore.VolumeID)
} }

View File

@ -22,7 +22,8 @@ import (
"fmt" "fmt"
"path/filepath" "path/filepath"
"k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/mount"
@ -53,10 +54,10 @@ func (plugin *cinderPlugin) ConstructBlockVolumeSpec(podUID types.UID, volumeNam
return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID) return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID)
} }
return getVolumeSpecFromGlobalMapPath(globalMapPath) return getVolumeSpecFromGlobalMapPath(volumeName, globalMapPath)
} }
func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error) { func getVolumeSpecFromGlobalMapPath(volumeName, globalMapPath string) (*volume.Spec, error) {
// Get volume spec information from globalMapPath // Get volume spec information from globalMapPath
// globalMapPath example: // globalMapPath example:
// plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID} // plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID}
@ -67,6 +68,9 @@ func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error)
} }
block := v1.PersistentVolumeBlock block := v1.PersistentVolumeBlock
cinderVolume := &v1.PersistentVolume{ cinderVolume := &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
Name: volumeName,
},
Spec: v1.PersistentVolumeSpec{ Spec: v1.PersistentVolumeSpec{
PersistentVolumeSource: v1.PersistentVolumeSource{ PersistentVolumeSource: v1.PersistentVolumeSource{
Cinder: &v1.CinderPersistentVolumeSource{ Cinder: &v1.CinderPersistentVolumeSource{

View File

@ -23,7 +23,7 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utiltesting "k8s.io/client-go/util/testing" utiltesting "k8s.io/client-go/util/testing"
@ -52,16 +52,19 @@ func TestGetVolumeSpecFromGlobalMapPath(t *testing.T) {
expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath) expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath)
//Bad Path //Bad Path
badspec, err := getVolumeSpecFromGlobalMapPath("") badspec, err := getVolumeSpecFromGlobalMapPath("", "")
if badspec != nil || err == nil { if badspec != nil || err == nil {
t.Errorf("Expected not to get spec from GlobalMapPath but did") t.Errorf("Expected not to get spec from GlobalMapPath but did")
} }
// Good Path // Good Path
spec, err := getVolumeSpecFromGlobalMapPath(expectedGlobalPath) spec, err := getVolumeSpecFromGlobalMapPath("myVolume", expectedGlobalPath)
if spec == nil || err != nil { if spec == nil || err != nil {
t.Fatalf("Failed to get spec from GlobalMapPath: %v", err) t.Fatalf("Failed to get spec from GlobalMapPath: %v", err)
} }
if spec.PersistentVolume.Name != "myVolume" {
t.Errorf("Invalid PV name from GlobalMapPath spec: %s", spec.PersistentVolume.Name)
}
if spec.PersistentVolume.Spec.Cinder.VolumeID != testVolName { if spec.PersistentVolume.Spec.Cinder.VolumeID != testVolName {
t.Errorf("Invalid volumeID from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.Cinder.VolumeID) t.Errorf("Invalid volumeID from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.Cinder.VolumeID)
} }

View File

@ -24,6 +24,7 @@ import (
"strconv" "strconv"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/mount"
@ -54,10 +55,10 @@ func (plugin *gcePersistentDiskPlugin) ConstructBlockVolumeSpec(podUID types.UID
return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID) return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID)
} }
return getVolumeSpecFromGlobalMapPath(globalMapPath) return getVolumeSpecFromGlobalMapPath(volumeName, globalMapPath)
} }
func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error) { func getVolumeSpecFromGlobalMapPath(volumeName, globalMapPath string) (*volume.Spec, error) {
// Get volume spec information from globalMapPath // Get volume spec information from globalMapPath
// globalMapPath example: // globalMapPath example:
// plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID} // plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID}
@ -68,6 +69,9 @@ func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error)
} }
block := v1.PersistentVolumeBlock block := v1.PersistentVolumeBlock
gceVolume := &v1.PersistentVolume{ gceVolume := &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
Name: volumeName,
},
Spec: v1.PersistentVolumeSpec{ Spec: v1.PersistentVolumeSpec{
PersistentVolumeSource: v1.PersistentVolumeSource{ PersistentVolumeSource: v1.PersistentVolumeSource{
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{ GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{

View File

@ -52,16 +52,19 @@ func TestGetVolumeSpecFromGlobalMapPath(t *testing.T) {
expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath) expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath)
//Bad Path //Bad Path
badspec, err := getVolumeSpecFromGlobalMapPath("") badspec, err := getVolumeSpecFromGlobalMapPath("", "")
if badspec != nil || err == nil { if badspec != nil || err == nil {
t.Errorf("Expected not to get spec from GlobalMapPath but did") t.Errorf("Expected not to get spec from GlobalMapPath but did")
} }
// Good Path // Good Path
spec, err := getVolumeSpecFromGlobalMapPath(expectedGlobalPath) spec, err := getVolumeSpecFromGlobalMapPath("myVolume", expectedGlobalPath)
if spec == nil || err != nil { if spec == nil || err != nil {
t.Fatalf("Failed to get spec from GlobalMapPath: %v", err) t.Fatalf("Failed to get spec from GlobalMapPath: %v", err)
} }
if spec.PersistentVolume.Name != "myVolume" {
t.Errorf("Invalid PV name from GlobalMapPath spec: %s", spec.PersistentVolume.Name)
}
if spec.PersistentVolume.Spec.GCEPersistentDisk.PDName != testPdName { if spec.PersistentVolume.Spec.GCEPersistentDisk.PDName != testPdName {
t.Errorf("Invalid pdName from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.GCEPersistentDisk.PDName) t.Errorf("Invalid pdName from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.GCEPersistentDisk.PDName)
} }

View File

@ -23,7 +23,8 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/mount"
@ -49,10 +50,10 @@ func (plugin *vsphereVolumePlugin) ConstructBlockVolumeSpec(podUID types.UID, vo
if len(globalMapPath) <= 1 { if len(globalMapPath) <= 1 {
return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID) return nil, fmt.Errorf("failed to get volume plugin information from globalMapPathUUID: %v", globalMapPathUUID)
} }
return getVolumeSpecFromGlobalMapPath(globalMapPath) return getVolumeSpecFromGlobalMapPath(volumeName, globalMapPath)
} }
func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error) { func getVolumeSpecFromGlobalMapPath(volumeName, globalMapPath string) (*volume.Spec, error) {
// Construct volume spec from globalMapPath // Construct volume spec from globalMapPath
// globalMapPath example: // globalMapPath example:
// plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID} // plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumeID}
@ -64,6 +65,9 @@ func getVolumeSpecFromGlobalMapPath(globalMapPath string) (*volume.Spec, error)
} }
block := v1.PersistentVolumeBlock block := v1.PersistentVolumeBlock
vsphereVolume := &v1.PersistentVolume{ vsphereVolume := &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
Name: volumeName,
},
Spec: v1.PersistentVolumeSpec{ Spec: v1.PersistentVolumeSpec{
PersistentVolumeSource: v1.PersistentVolumeSource{ PersistentVolumeSource: v1.PersistentVolumeSource{
VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{ VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{

View File

@ -23,7 +23,7 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utiltesting "k8s.io/client-go/util/testing" utiltesting "k8s.io/client-go/util/testing"
@ -51,16 +51,19 @@ func TestGetVolumeSpecFromGlobalMapPath(t *testing.T) {
expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath) expectedGlobalPath := filepath.Join(tmpVDir, testGlobalPath)
// Bad Path // Bad Path
badspec, err := getVolumeSpecFromGlobalMapPath("") badspec, err := getVolumeSpecFromGlobalMapPath("", "")
if badspec != nil || err == nil { if badspec != nil || err == nil {
t.Errorf("Expected not to get spec from GlobalMapPath but did") t.Errorf("Expected not to get spec from GlobalMapPath but did")
} }
// Good Path // Good Path
spec, err := getVolumeSpecFromGlobalMapPath(expectedGlobalPath) spec, err := getVolumeSpecFromGlobalMapPath("myVolume", expectedGlobalPath)
if spec == nil || err != nil { if spec == nil || err != nil {
t.Fatalf("Failed to get spec from GlobalMapPath: %s", err) t.Fatalf("Failed to get spec from GlobalMapPath: %s", err)
} }
if spec.PersistentVolume.Name != "myVolume" {
t.Errorf("Invalid PV name from GlobalMapPath spec: %s", spec.PersistentVolume.Name)
}
if spec.PersistentVolume.Spec.VsphereVolume.VolumePath != testVolumePath { if spec.PersistentVolume.Spec.VsphereVolume.VolumePath != testVolumePath {
t.Fatalf("Invalid volumePath from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.VsphereVolume.VolumePath) t.Fatalf("Invalid volumePath from GlobalMapPath spec: %s", spec.PersistentVolume.Spec.VsphereVolume.VolumePath)
} }