Skip to content

Commit f7050a0

Browse files
author
Cheng Pan
committed
Implement CSI migration logic for block volume
1 parent 6f9bf5f commit f7050a0

File tree

1 file changed

+64
-15
lines changed

1 file changed

+64
-15
lines changed

pkg/volume/util/operationexecutor/operation_generator.go

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ func (og *operationGenerator) GenerateMountVolumeFunc(
542542
return volumeToMount.GenerateError("MountVolume.FindPluginBySpec failed", err)
543543
}
544544

545-
affinityErr := checkNodeAffinity(og, volumeToMount, volumePlugin)
545+
affinityErr := checkNodeAffinity(og, volumeToMount)
546546
if affinityErr != nil {
547547
return volumeToMount.GenerateError("MountVolume.NodeAffinity check failed", affinityErr)
548548
}
@@ -945,17 +945,29 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
945945
volumeToMount VolumeToMount,
946946
actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) {
947947

948+
originalSpec := volumeToMount.VolumeSpec
949+
// Translate to CSI spec if migration enabled
950+
if useCSIPlugin(og.volumePluginMgr, originalSpec) {
951+
csiSpec, err := translateSpec(originalSpec)
952+
if err != nil {
953+
return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.TranslateSpec failed", err)
954+
}
955+
956+
volumeToMount.VolumeSpec = csiSpec
957+
}
958+
948959
// Get block volume mapper plugin
949-
var blockVolumeMapper volume.BlockVolumeMapper
950960
blockVolumePlugin, err :=
951961
og.volumePluginMgr.FindMapperPluginBySpec(volumeToMount.VolumeSpec)
952962
if err != nil {
953963
return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed", err)
954964
}
965+
955966
if blockVolumePlugin == nil {
956967
return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil)
957968
}
958-
affinityErr := checkNodeAffinity(og, volumeToMount, blockVolumePlugin)
969+
970+
affinityErr := checkNodeAffinity(og, volumeToMount)
959971
if affinityErr != nil {
960972
eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.NodeAffinity check failed", affinityErr)
961973
og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error())
@@ -1074,7 +1086,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
10741086
blockVolumeMapper,
10751087
volumeToMount.OuterVolumeSpecName,
10761088
volumeToMount.VolumeGidValue,
1077-
volumeToMount.VolumeSpec)
1089+
originalSpec)
10781090
if markVolMountedErr != nil {
10791091
// On failure, return error. Caller will log and retry.
10801092
return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed", markVolMountedErr)
@@ -1104,13 +1116,32 @@ func (og *operationGenerator) GenerateUnmapVolumeFunc(
11041116
volumeToUnmount MountedVolume,
11051117
actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) {
11061118

1107-
// Get block volume unmapper plugin
1108-
var blockVolumeUnmapper volume.BlockVolumeUnmapper
1109-
blockVolumePlugin, err :=
1110-
og.volumePluginMgr.FindMapperPluginByName(volumeToUnmount.PluginName)
1111-
if err != nil {
1112-
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err)
1119+
var blockVolumePlugin volume.BlockVolumePlugin
1120+
var err error
1121+
// Translate to CSI spec if migration enabled
1122+
// And get block volume unmapper plugin
1123+
if volumeToUnmount.VolumeSpec != nil && useCSIPlugin(og.volumePluginMgr, volumeToUnmount.VolumeSpec) {
1124+
csiSpec, err := translateSpec(volumeToUnmount.VolumeSpec)
1125+
if err != nil {
1126+
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.TranslateSpec failed", err)
1127+
}
1128+
1129+
volumeToUnmount.VolumeSpec = csiSpec
1130+
1131+
blockVolumePlugin, err =
1132+
og.volumePluginMgr.FindMapperPluginByName(csi.CSIPluginName)
1133+
if err != nil {
1134+
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err)
1135+
}
1136+
} else {
1137+
blockVolumePlugin, err =
1138+
og.volumePluginMgr.FindMapperPluginByName(volumeToUnmount.PluginName)
1139+
if err != nil {
1140+
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err)
1141+
}
11131142
}
1143+
1144+
var blockVolumeUnmapper volume.BlockVolumeUnmapper
11141145
if blockVolumePlugin == nil {
11151146
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil)
11161147
}
@@ -1181,11 +1212,29 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc(
11811212
actualStateOfWorld ActualStateOfWorldMounterUpdater,
11821213
mounter mount.Interface) (volumetypes.GeneratedOperations, error) {
11831214

1184-
blockVolumePlugin, err :=
1185-
og.volumePluginMgr.FindMapperPluginByName(deviceToDetach.PluginName)
1186-
if err != nil {
1187-
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err)
1215+
var blockVolumePlugin volume.BlockVolumePlugin
1216+
var err error
1217+
// Translate to CSI spec if migration enabled
1218+
if useCSIPlugin(og.volumePluginMgr, deviceToDetach.VolumeSpec) {
1219+
csiSpec, err := translateSpec(deviceToDetach.VolumeSpec)
1220+
if err != nil {
1221+
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.TranslateSpec failed", err)
1222+
}
1223+
1224+
deviceToDetach.VolumeSpec = csiSpec
1225+
blockVolumePlugin, err =
1226+
og.volumePluginMgr.FindMapperPluginByName(csi.CSIPluginName)
1227+
if err != nil {
1228+
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err)
1229+
}
1230+
} else {
1231+
blockVolumePlugin, err =
1232+
og.volumePluginMgr.FindMapperPluginByName(deviceToDetach.PluginName)
1233+
if err != nil {
1234+
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err)
1235+
}
11881236
}
1237+
11891238
if blockVolumePlugin == nil {
11901239
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil)
11911240
}
@@ -1578,7 +1627,7 @@ func checkMountOptionSupport(og *operationGenerator, volumeToMount VolumeToMount
15781627

15791628
// checkNodeAffinity looks at the PV node affinity, and checks if the node has the same corresponding labels
15801629
// This ensures that we don't mount a volume that doesn't belong to this node
1581-
func checkNodeAffinity(og *operationGenerator, volumeToMount VolumeToMount, plugin volume.VolumePlugin) error {
1630+
func checkNodeAffinity(og *operationGenerator, volumeToMount VolumeToMount) error {
15821631
if !utilfeature.DefaultFeatureGate.Enabled(features.PersistentLocalVolumes) {
15831632
return nil
15841633
}

0 commit comments

Comments
 (0)