From f7050a04ce5dee118c5558d2d77806d173307a7d Mon Sep 17 00:00:00 2001 From: Cheng Pan Date: Fri, 22 Feb 2019 18:32:25 +0000 Subject: [PATCH] Implement CSI migration logic for block volume --- .../operationexecutor/operation_generator.go | 79 +++++++++++++++---- 1 file changed, 64 insertions(+), 15 deletions(-) diff --git a/pkg/volume/util/operationexecutor/operation_generator.go b/pkg/volume/util/operationexecutor/operation_generator.go index 91e4825329..f6525d6897 100644 --- a/pkg/volume/util/operationexecutor/operation_generator.go +++ b/pkg/volume/util/operationexecutor/operation_generator.go @@ -542,7 +542,7 @@ func (og *operationGenerator) GenerateMountVolumeFunc( return volumeToMount.GenerateError("MountVolume.FindPluginBySpec failed", err) } - affinityErr := checkNodeAffinity(og, volumeToMount, volumePlugin) + affinityErr := checkNodeAffinity(og, volumeToMount) if affinityErr != nil { return volumeToMount.GenerateError("MountVolume.NodeAffinity check failed", affinityErr) } @@ -945,17 +945,29 @@ func (og *operationGenerator) GenerateMapVolumeFunc( volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) { + originalSpec := volumeToMount.VolumeSpec + // Translate to CSI spec if migration enabled + if useCSIPlugin(og.volumePluginMgr, originalSpec) { + csiSpec, err := translateSpec(originalSpec) + if err != nil { + return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.TranslateSpec failed", err) + } + + volumeToMount.VolumeSpec = csiSpec + } + // Get block volume mapper plugin - var blockVolumeMapper volume.BlockVolumeMapper blockVolumePlugin, err := og.volumePluginMgr.FindMapperPluginBySpec(volumeToMount.VolumeSpec) if err != nil { return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed", err) } + if blockVolumePlugin == nil { return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) } - affinityErr := checkNodeAffinity(og, volumeToMount, blockVolumePlugin) + + affinityErr := checkNodeAffinity(og, volumeToMount) if affinityErr != nil { eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.NodeAffinity check failed", affinityErr) og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error()) @@ -1074,7 +1086,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc( blockVolumeMapper, volumeToMount.OuterVolumeSpecName, volumeToMount.VolumeGidValue, - volumeToMount.VolumeSpec) + originalSpec) if markVolMountedErr != nil { // On failure, return error. Caller will log and retry. return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed", markVolMountedErr) @@ -1104,13 +1116,32 @@ func (og *operationGenerator) GenerateUnmapVolumeFunc( volumeToUnmount MountedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) { - // Get block volume unmapper plugin - var blockVolumeUnmapper volume.BlockVolumeUnmapper - blockVolumePlugin, err := - og.volumePluginMgr.FindMapperPluginByName(volumeToUnmount.PluginName) - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err) + var blockVolumePlugin volume.BlockVolumePlugin + var err error + // Translate to CSI spec if migration enabled + // And get block volume unmapper plugin + if volumeToUnmount.VolumeSpec != nil && useCSIPlugin(og.volumePluginMgr, volumeToUnmount.VolumeSpec) { + csiSpec, err := translateSpec(volumeToUnmount.VolumeSpec) + if err != nil { + return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.TranslateSpec failed", err) + } + + volumeToUnmount.VolumeSpec = csiSpec + + blockVolumePlugin, err = + og.volumePluginMgr.FindMapperPluginByName(csi.CSIPluginName) + if err != nil { + return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err) + } + } else { + blockVolumePlugin, err = + og.volumePluginMgr.FindMapperPluginByName(volumeToUnmount.PluginName) + if err != nil { + return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err) + } } + + var blockVolumeUnmapper volume.BlockVolumeUnmapper if blockVolumePlugin == nil { return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) } @@ -1181,11 +1212,29 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc( actualStateOfWorld ActualStateOfWorldMounterUpdater, mounter mount.Interface) (volumetypes.GeneratedOperations, error) { - blockVolumePlugin, err := - og.volumePluginMgr.FindMapperPluginByName(deviceToDetach.PluginName) - if err != nil { - return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err) + var blockVolumePlugin volume.BlockVolumePlugin + var err error + // Translate to CSI spec if migration enabled + if useCSIPlugin(og.volumePluginMgr, deviceToDetach.VolumeSpec) { + csiSpec, err := translateSpec(deviceToDetach.VolumeSpec) + if err != nil { + return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.TranslateSpec failed", err) + } + + deviceToDetach.VolumeSpec = csiSpec + blockVolumePlugin, err = + og.volumePluginMgr.FindMapperPluginByName(csi.CSIPluginName) + if err != nil { + return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err) + } + } else { + blockVolumePlugin, err = + og.volumePluginMgr.FindMapperPluginByName(deviceToDetach.PluginName) + if err != nil { + return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err) + } } + if blockVolumePlugin == nil { return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) } @@ -1578,7 +1627,7 @@ func checkMountOptionSupport(og *operationGenerator, volumeToMount VolumeToMount // checkNodeAffinity looks at the PV node affinity, and checks if the node has the same corresponding labels // This ensures that we don't mount a volume that doesn't belong to this node -func checkNodeAffinity(og *operationGenerator, volumeToMount VolumeToMount, plugin volume.VolumePlugin) error { +func checkNodeAffinity(og *operationGenerator, volumeToMount VolumeToMount) error { if !utilfeature.DefaultFeatureGate.Enabled(features.PersistentLocalVolumes) { return nil }