mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 22:17:14 +00:00
various corrections in pkg/volume
Signed-off-by: Humble Chirammal <hchiramm@redhat.com>
This commit is contained in:
parent
0f582f7c3f
commit
f22a74aa6a
@ -357,7 +357,7 @@ func TestPlugin(t *testing.T) {
|
|||||||
t.Errorf("Failed to GetVolumeName: %v", err)
|
t.Errorf("Failed to GetVolumeName: %v", err)
|
||||||
}
|
}
|
||||||
if vName != "test_volume_name/test_configmap_name" {
|
if vName != "test_volume_name/test_configmap_name" {
|
||||||
t.Errorf("Got unexpect VolumeName %v", vName)
|
t.Errorf("Got unexpected VolumeName %v", vName)
|
||||||
}
|
}
|
||||||
|
|
||||||
volumePath := mounter.GetPath()
|
volumePath := mounter.GetPath()
|
||||||
@ -481,7 +481,7 @@ func TestPluginOptional(t *testing.T) {
|
|||||||
t.Errorf("Failed to GetVolumeName: %v", err)
|
t.Errorf("Failed to GetVolumeName: %v", err)
|
||||||
}
|
}
|
||||||
if vName != "test_volume_name/test_configmap_name" {
|
if vName != "test_volume_name/test_configmap_name" {
|
||||||
t.Errorf("Got unexpect VolumeName %v", vName)
|
t.Errorf("Got unexpected VolumeName %v", vName)
|
||||||
}
|
}
|
||||||
|
|
||||||
volumePath := mounter.GetPath()
|
volumePath := mounter.GetPath()
|
||||||
@ -580,7 +580,7 @@ func TestPluginKeysOptional(t *testing.T) {
|
|||||||
t.Errorf("Failed to GetVolumeName: %v", err)
|
t.Errorf("Failed to GetVolumeName: %v", err)
|
||||||
}
|
}
|
||||||
if vName != "test_volume_name/test_configmap_name" {
|
if vName != "test_volume_name/test_configmap_name" {
|
||||||
t.Errorf("Got unexpect VolumeName %v", vName)
|
t.Errorf("Got unexpected VolumeName %v", vName)
|
||||||
}
|
}
|
||||||
|
|
||||||
volumePath := mounter.GetPath()
|
volumePath := mounter.GetPath()
|
||||||
@ -660,7 +660,7 @@ func TestInvalidConfigMapSetup(t *testing.T) {
|
|||||||
t.Errorf("Failed to GetVolumeName: %v", err)
|
t.Errorf("Failed to GetVolumeName: %v", err)
|
||||||
}
|
}
|
||||||
if vName != "test_volume_name/test_configmap_name" {
|
if vName != "test_volume_name/test_configmap_name" {
|
||||||
t.Errorf("Got unexpect VolumeName %v", vName)
|
t.Errorf("Got unexpected VolumeName %v", vName)
|
||||||
}
|
}
|
||||||
|
|
||||||
volumePath := mounter.GetPath()
|
volumePath := mounter.GetPath()
|
||||||
|
@ -219,7 +219,7 @@ func TestBlockMapperSetupDevice(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
||||||
}
|
}
|
||||||
t.Log("created attachement ", attachID)
|
t.Log("created attachment ", attachID)
|
||||||
|
|
||||||
stagingPath, err := csiMapper.SetUpDevice()
|
stagingPath, err := csiMapper.SetUpDevice()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -260,7 +260,7 @@ func TestBlockMapperSetupDeviceError(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
||||||
}
|
}
|
||||||
t.Log("created attachement ", attachID)
|
t.Log("created attachment ", attachID)
|
||||||
|
|
||||||
stagingPath, err := csiMapper.SetUpDevice()
|
stagingPath, err := csiMapper.SetUpDevice()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -304,7 +304,7 @@ func TestBlockMapperMapPodDevice(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
||||||
}
|
}
|
||||||
t.Log("created attachement ", attachID)
|
t.Log("created attachment ", attachID)
|
||||||
|
|
||||||
// Map device to global and pod device map path
|
// Map device to global and pod device map path
|
||||||
path, err := csiMapper.MapPodDevice()
|
path, err := csiMapper.MapPodDevice()
|
||||||
@ -495,7 +495,7 @@ func TestVolumeSetupTeardown(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
t.Fatalf("failed to setup VolumeAttachment: %v", err)
|
||||||
}
|
}
|
||||||
t.Log("created attachement ", attachID)
|
t.Log("created attachment ", attachID)
|
||||||
|
|
||||||
stagingPath, err := csiMapper.SetUpDevice()
|
stagingPath, err := csiMapper.SetUpDevice()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
utilversion "k8s.io/apimachinery/pkg/util/version"
|
utilversion "k8s.io/apimachinery/pkg/util/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Driver is a description of a CSI Driver, defined by an enpoint and the
|
// Driver is a description of a CSI Driver, defined by an endpoint and the
|
||||||
// highest CSI version supported
|
// highest CSI version supported
|
||||||
type Driver struct {
|
type Driver struct {
|
||||||
endpoint string
|
endpoint string
|
||||||
|
@ -86,7 +86,7 @@ func (mc *metricsCsi) GetMetrics() (*volume.Metrics, error) {
|
|||||||
return metrics, nil
|
return metrics, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MetricsManager defines the metrics mananger for CSI operation
|
// MetricsManager defines the metrics manager for CSI operation
|
||||||
type MetricsManager struct {
|
type MetricsManager struct {
|
||||||
driverName string
|
driverName string
|
||||||
}
|
}
|
||||||
|
@ -987,7 +987,7 @@ func TestPluginCanAttach(t *testing.T) {
|
|||||||
|
|
||||||
pluginCanAttach, err := plug.CanAttach(test.spec)
|
pluginCanAttach, err := plug.CanAttach(test.spec)
|
||||||
if err != nil && !test.shouldFail {
|
if err != nil && !test.shouldFail {
|
||||||
t.Fatalf("unexected plugin.CanAttach error: %s", err)
|
t.Fatalf("unexpected plugin.CanAttach error: %s", err)
|
||||||
}
|
}
|
||||||
if pluginCanAttach != test.canAttach {
|
if pluginCanAttach != test.canAttach {
|
||||||
t.Fatalf("expecting plugin.CanAttach %t got %t", test.canAttach, pluginCanAttach)
|
t.Fatalf("expecting plugin.CanAttach %t got %t", test.canAttach, pluginCanAttach)
|
||||||
@ -1062,7 +1062,7 @@ func TestPluginFindAttachablePlugin(t *testing.T) {
|
|||||||
|
|
||||||
plugin, err := plugMgr.FindAttachablePluginBySpec(test.spec)
|
plugin, err := plugMgr.FindAttachablePluginBySpec(test.spec)
|
||||||
if err != nil && !test.shouldFail {
|
if err != nil && !test.shouldFail {
|
||||||
t.Fatalf("unexected error calling pluginMgr.FindAttachablePluginBySpec: %s", err)
|
t.Fatalf("unexpected error calling pluginMgr.FindAttachablePluginBySpec: %s", err)
|
||||||
}
|
}
|
||||||
if (plugin != nil) != test.canAttach {
|
if (plugin != nil) != test.canAttach {
|
||||||
t.Fatal("expecting attachable plugin, but got nil")
|
t.Fatal("expecting attachable plugin, but got nil")
|
||||||
|
@ -203,7 +203,7 @@ func TestCSI_VolumeAll(t *testing.T) {
|
|||||||
shouldFail: true,
|
shouldFail: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "incompete spec",
|
name: "incomplete spec",
|
||||||
specName: "pv2",
|
specName: "pv2",
|
||||||
driver: "simple-driver",
|
driver: "simple-driver",
|
||||||
volName: "vol2",
|
volName: "vol2",
|
||||||
@ -434,7 +434,7 @@ func TestCSI_VolumeAll(t *testing.T) {
|
|||||||
|
|
||||||
dataFile := filepath.Join(filepath.Dir(mounter.GetPath()), volDataFileName)
|
dataFile := filepath.Join(filepath.Dir(mounter.GetPath()), volDataFileName)
|
||||||
if _, err := os.Stat(dataFile); err != nil {
|
if _, err := os.Stat(dataFile); err != nil {
|
||||||
t.Fatalf("csiTest.VolumeAll meatadata JSON file not found: %s", dataFile)
|
t.Fatalf("csiTest.VolumeAll metadata JSON file not found: %s", dataFile)
|
||||||
}
|
}
|
||||||
t.Log("csiTest.VolumeAll JSON datafile generated OK:", dataFile)
|
t.Log("csiTest.VolumeAll JSON datafile generated OK:", dataFile)
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ func TestNodeExpand(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify device staging targer path
|
// verify device staging target path
|
||||||
stagingTargetPath := fakeNodeClient.FakeNodeExpansionRequest.GetStagingTargetPath()
|
stagingTargetPath := fakeNodeClient.FakeNodeExpansionRequest.GetStagingTargetPath()
|
||||||
if tc.deviceStagePath != "" && tc.deviceStagePath != stagingTargetPath {
|
if tc.deviceStagePath != "" && tc.deviceStagePath != stagingTargetPath {
|
||||||
t.Errorf("For %s: expected staging path %s got %s", tc.name, tc.deviceStagePath, stagingTargetPath)
|
t.Errorf("For %s: expected staging path %s got %s", tc.name, tc.deviceStagePath, stagingTargetPath)
|
||||||
|
@ -288,7 +288,7 @@ func (plugin *fcPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volu
|
|||||||
|
|
||||||
// ConstructBlockVolumeSpec creates a new volume.Spec with following steps.
|
// ConstructBlockVolumeSpec creates a new volume.Spec with following steps.
|
||||||
// - Searches a file whose name is {pod uuid} under volume plugin directory.
|
// - Searches a file whose name is {pod uuid} under volume plugin directory.
|
||||||
// - If a file is found, then retreives volumePluginDependentPath from globalMapPathUUID.
|
// - If a file is found, then retrieves volumePluginDependentPath from globalMapPathUUID.
|
||||||
// - Once volumePluginDependentPath is obtained, store volume information to VolumeSource
|
// - Once volumePluginDependentPath is obtained, store volume information to VolumeSource
|
||||||
//
|
//
|
||||||
// examples:
|
// examples:
|
||||||
|
@ -211,7 +211,7 @@ func searchDisk(b fcDiskMounter) (string, error) {
|
|||||||
diskIDs = wwids
|
diskIDs = wwids
|
||||||
}
|
}
|
||||||
|
|
||||||
rescaned := false
|
rescanned := false
|
||||||
// two-phase search:
|
// two-phase search:
|
||||||
// first phase, search existing device path, if a multipath dm is found, exit loop
|
// first phase, search existing device path, if a multipath dm is found, exit loop
|
||||||
// otherwise, in second phase, rescan scsi bus and search again, return with any findings
|
// otherwise, in second phase, rescan scsi bus and search again, return with any findings
|
||||||
@ -228,13 +228,13 @@ func searchDisk(b fcDiskMounter) (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if a dm is found, exit loop
|
// if a dm is found, exit loop
|
||||||
if rescaned || dm != "" {
|
if rescanned || dm != "" {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
// rescan and search again
|
// rescan and search again
|
||||||
// rescan scsi bus
|
// rescan scsi bus
|
||||||
scsiHostRescan(io)
|
scsiHostRescan(io)
|
||||||
rescaned = true
|
rescanned = true
|
||||||
}
|
}
|
||||||
// if no disk matches input wwn and lun, exit
|
// if no disk matches input wwn and lun, exit
|
||||||
if disk == "" && dm == "" {
|
if disk == "" && dm == "" {
|
||||||
|
@ -38,7 +38,7 @@ func NewCachedMetrics(provider MetricsProvider) MetricsProvider {
|
|||||||
return &cachedMetrics{wrapped: provider}
|
return &cachedMetrics{wrapped: provider}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMetrics runs the wrapped metrics provider's GetMetrics methd once and
|
// GetMetrics runs the wrapped metrics provider's GetMetrics method once and
|
||||||
// caches the result. Will not cache result if there is an error.
|
// caches the result. Will not cache result if there is an error.
|
||||||
// See MetricsProvider.GetMetrics
|
// See MetricsProvider.GetMetrics
|
||||||
func (md *cachedMetrics) GetMetrics() (*Metrics, error) {
|
func (md *cachedMetrics) GetMetrics() (*Metrics, error) {
|
||||||
|
@ -284,7 +284,7 @@ func createDriverClient(hostname string, port int32) (*osdclient.Client, error)
|
|||||||
// getPortworxDriver returns a Portworx volume driver which can be used for cluster wide operations.
|
// getPortworxDriver returns a Portworx volume driver which can be used for cluster wide operations.
|
||||||
//
|
//
|
||||||
// Operations like create and delete volume don't need to be restricted to local volume host since
|
// Operations like create and delete volume don't need to be restricted to local volume host since
|
||||||
// any node in the Portworx cluster can co-ordinate the create/delete request and forward the operations to
|
// any node in the Portworx cluster can coordinate the create/delete request and forward the operations to
|
||||||
// the Portworx node that will own/owns the data.
|
// the Portworx node that will own/owns the data.
|
||||||
func (util *portworxVolumeUtil) getPortworxDriver(volumeHost volume.VolumeHost) (volumeapi.VolumeDriver, error) {
|
func (util *portworxVolumeUtil) getPortworxDriver(volumeHost volume.VolumeHost) (volumeapi.VolumeDriver, error) {
|
||||||
// check if existing saved client is valid
|
// check if existing saved client is valid
|
||||||
|
@ -770,7 +770,7 @@ func (r *rbdVolumeDeleter) Delete() error {
|
|||||||
return r.manager.DeleteImage(r)
|
return r.manager.DeleteImage(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// rbd implmenets volume.Volume interface.
|
// rbd implements volume.Volume interface.
|
||||||
// It's embedded in Mounter/Unmounter/Deleter.
|
// It's embedded in Mounter/Unmounter/Deleter.
|
||||||
type rbd struct {
|
type rbd struct {
|
||||||
volName string
|
volName string
|
||||||
|
@ -52,7 +52,7 @@ func (handler *deviceHandler) FindMultipathDeviceForDevice(device string) string
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// findDeviceForPath Find the underlaying disk for a linked path such as /dev/disk/by-path/XXXX or /dev/mapper/XXXX
|
// findDeviceForPath Find the underlying disk for a linked path such as /dev/disk/by-path/XXXX or /dev/mapper/XXXX
|
||||||
// will return sdX or hdX etc, if /dev/sdX is passed in then sdX will be returned
|
// will return sdX or hdX etc, if /dev/sdX is passed in then sdX will be returned
|
||||||
func findDeviceForPath(path string, io IoUtil) (string, error) {
|
func findDeviceForPath(path string, io IoUtil) (string, error) {
|
||||||
devicePath, err := io.EvalSymlinks(path)
|
devicePath, err := io.EvalSymlinks(path)
|
||||||
|
@ -737,7 +737,7 @@ func (og *operationGenerator) GenerateMountVolumeFunc(
|
|||||||
// At this point, MountVolume.Setup already succeeded, we should add volume into actual state
|
// At this point, MountVolume.Setup already succeeded, we should add volume into actual state
|
||||||
// so that reconciler can clean up volume when needed. However, volume resize failed,
|
// so that reconciler can clean up volume when needed. However, volume resize failed,
|
||||||
// we should not mark the volume as mounted to avoid pod starts using it.
|
// we should not mark the volume as mounted to avoid pod starts using it.
|
||||||
// Considering the above situations, we mark volume as uncertain here so that reconciler will tigger
|
// Considering the above situations, we mark volume as uncertain here so that reconciler will trigger
|
||||||
// volume tear down when pod is deleted, and also makes sure pod will not start using it.
|
// volume tear down when pod is deleted, and also makes sure pod will not start using it.
|
||||||
if err := actualStateOfWorld.MarkVolumeMountAsUncertain(markOpts); err != nil {
|
if err := actualStateOfWorld.MarkVolumeMountAsUncertain(markOpts); err != nil {
|
||||||
klog.Errorf(volumeToMount.GenerateErrorDetailed("MountVolume.MarkVolumeMountAsUncertain failed", err).Error())
|
klog.Errorf(volumeToMount.GenerateErrorDetailed("MountVolume.MarkVolumeMountAsUncertain failed", err).Error())
|
||||||
@ -1237,7 +1237,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
|
|||||||
// At this point, MountVolume.Setup already succeeded, we should add volume into actual state
|
// At this point, MountVolume.Setup already succeeded, we should add volume into actual state
|
||||||
// so that reconciler can clean up volume when needed. However, if nodeExpandVolume failed,
|
// so that reconciler can clean up volume when needed. However, if nodeExpandVolume failed,
|
||||||
// we should not mark the volume as mounted to avoid pod starts using it.
|
// we should not mark the volume as mounted to avoid pod starts using it.
|
||||||
// Considering the above situations, we mark volume as uncertain here so that reconciler will tigger
|
// Considering the above situations, we mark volume as uncertain here so that reconciler will trigger
|
||||||
// volume tear down when pod is deleted, and also makes sure pod will not start using it.
|
// volume tear down when pod is deleted, and also makes sure pod will not start using it.
|
||||||
if err := actualStateOfWorld.MarkVolumeMountAsUncertain(markVolumeOpts); err != nil {
|
if err := actualStateOfWorld.MarkVolumeMountAsUncertain(markVolumeOpts); err != nil {
|
||||||
klog.Errorf(volumeToMount.GenerateErrorDetailed("MountVolume.MarkVolumeMountAsUncertain failed", err).Error())
|
klog.Errorf(volumeToMount.GenerateErrorDetailed("MountVolume.MarkVolumeMountAsUncertain failed", err).Error())
|
||||||
|
@ -125,7 +125,7 @@ func evalSymlink(path string) (string, error) {
|
|||||||
klog.V(4).Infof("Path '%s' has a target %s. Return its original form.", path, linkedPath)
|
klog.V(4).Infof("Path '%s' has a target %s. Return its original form.", path, linkedPath)
|
||||||
return path, nil
|
return path, nil
|
||||||
}
|
}
|
||||||
// If the target is not an absoluate path, join iit with the current upperpath
|
// If the target is not an absolute path, join iit with the current upperpath
|
||||||
if !filepath.IsAbs(linkedPath) {
|
if !filepath.IsAbs(linkedPath) {
|
||||||
linkedPath = filepath.Join(getUpperPath(upperpath), linkedPath)
|
linkedPath = filepath.Join(getUpperPath(upperpath), linkedPath)
|
||||||
}
|
}
|
||||||
|
@ -42,9 +42,9 @@ type BlockVolumePathHandler interface {
|
|||||||
UnmapDevice(mapPath string, linkName string, bindMount bool) error
|
UnmapDevice(mapPath string, linkName string, bindMount bool) error
|
||||||
// RemovePath removes a file or directory on specified map path
|
// RemovePath removes a file or directory on specified map path
|
||||||
RemoveMapPath(mapPath string) error
|
RemoveMapPath(mapPath string) error
|
||||||
// IsSymlinkExist retruns true if specified symbolic link exists
|
// IsSymlinkExist returns true if specified symbolic link exists
|
||||||
IsSymlinkExist(mapPath string) (bool, error)
|
IsSymlinkExist(mapPath string) (bool, error)
|
||||||
// IsDeviceBindMountExist retruns true if specified bind mount exists
|
// IsDeviceBindMountExist returns true if specified bind mount exists
|
||||||
IsDeviceBindMountExist(mapPath string) (bool, error)
|
IsDeviceBindMountExist(mapPath string) (bool, error)
|
||||||
// GetDeviceBindMountRefs searches bind mounts under global map path
|
// GetDeviceBindMountRefs searches bind mounts under global map path
|
||||||
GetDeviceBindMountRefs(devPath string, mapPath string) ([]string, error)
|
GetDeviceBindMountRefs(devPath string, mapPath string) ([]string, error)
|
||||||
|
@ -103,7 +103,7 @@ func TestValidatePathNoBacksteps(t *testing.T) {
|
|||||||
err := ValidatePathNoBacksteps(tc.path)
|
err := ValidatePathNoBacksteps(tc.path)
|
||||||
|
|
||||||
if err == nil && tc.expectedErr {
|
if err == nil && tc.expectedErr {
|
||||||
t.Fatalf("expected test `%s` to return an error but it didnt", name)
|
t.Fatalf("expected test `%s` to return an error but it didn't", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil && !tc.expectedErr {
|
if err != nil && !tc.expectedErr {
|
||||||
|
@ -189,7 +189,7 @@ type CustomBlockVolumeMapper interface {
|
|||||||
// MapPodDevice maps the block device to a path and return the path.
|
// MapPodDevice maps the block device to a path and return the path.
|
||||||
// Unique device path across kubelet node reboot is required to avoid
|
// Unique device path across kubelet node reboot is required to avoid
|
||||||
// unexpected block volume destruction.
|
// unexpected block volume destruction.
|
||||||
// If empty string is returned, the path retuned by attacher.Attach() and
|
// If empty string is returned, the path returned by attacher.Attach() and
|
||||||
// attacher.WaitForAttach() will be used.
|
// attacher.WaitForAttach() will be used.
|
||||||
MapPodDevice() (publishPath string, err error)
|
MapPodDevice() (publishPath string, err error)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user