Skip to content

Commit b1829df

Browse files
authored
Merge pull request kubernetes#74844 from leakingtapan/migration-raw-block
Implement CSI migration logic for block volume
2 parents 91f40ae + f7050a0 commit b1829df

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
}
@@ -948,17 +948,29 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
948948
volumeToMount VolumeToMount,
949949
actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) {
950950

951+
originalSpec := volumeToMount.VolumeSpec
952+
// Translate to CSI spec if migration enabled
953+
if useCSIPlugin(og.volumePluginMgr, originalSpec) {
954+
csiSpec, err := translateSpec(originalSpec)
955+
if err != nil {
956+
return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.TranslateSpec failed", err)
957+
}
958+
959+
volumeToMount.VolumeSpec = csiSpec
960+
}
961+
951962
// Get block volume mapper plugin
952-
var blockVolumeMapper volume.BlockVolumeMapper
953963
blockVolumePlugin, err :=
954964
og.volumePluginMgr.FindMapperPluginBySpec(volumeToMount.VolumeSpec)
955965
if err != nil {
956966
return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed", err)
957967
}
968+
958969
if blockVolumePlugin == nil {
959970
return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil)
960971
}
961-
affinityErr := checkNodeAffinity(og, volumeToMount, blockVolumePlugin)
972+
973+
affinityErr := checkNodeAffinity(og, volumeToMount)
962974
if affinityErr != nil {
963975
eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.NodeAffinity check failed", affinityErr)
964976
og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error())
@@ -1077,7 +1089,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
10771089
blockVolumeMapper,
10781090
volumeToMount.OuterVolumeSpecName,
10791091
volumeToMount.VolumeGidValue,
1080-
volumeToMount.VolumeSpec)
1092+
originalSpec)
10811093
if markVolMountedErr != nil {
10821094
// On failure, return error. Caller will log and retry.
10831095
return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed", markVolMountedErr)
@@ -1107,13 +1119,32 @@ func (og *operationGenerator) GenerateUnmapVolumeFunc(
11071119
volumeToUnmount MountedVolume,
11081120
actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) {
11091121

1110-
// Get block volume unmapper plugin
1111-
var blockVolumeUnmapper volume.BlockVolumeUnmapper
1112-
blockVolumePlugin, err :=
1113-
og.volumePluginMgr.FindMapperPluginByName(volumeToUnmount.PluginName)
1114-
if err != nil {
1115-
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err)
1122+
var blockVolumePlugin volume.BlockVolumePlugin
1123+
var err error
1124+
// Translate to CSI spec if migration enabled
1125+
// And get block volume unmapper plugin
1126+
if volumeToUnmount.VolumeSpec != nil && useCSIPlugin(og.volumePluginMgr, volumeToUnmount.VolumeSpec) {
1127+
csiSpec, err := translateSpec(volumeToUnmount.VolumeSpec)
1128+
if err != nil {
1129+
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.TranslateSpec failed", err)
1130+
}
1131+
1132+
volumeToUnmount.VolumeSpec = csiSpec
1133+
1134+
blockVolumePlugin, err =
1135+
og.volumePluginMgr.FindMapperPluginByName(csi.CSIPluginName)
1136+
if err != nil {
1137+
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err)
1138+
}
1139+
} else {
1140+
blockVolumePlugin, err =
1141+
og.volumePluginMgr.FindMapperPluginByName(volumeToUnmount.PluginName)
1142+
if err != nil {
1143+
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err)
1144+
}
11161145
}
1146+
1147+
var blockVolumeUnmapper volume.BlockVolumeUnmapper
11171148
if blockVolumePlugin == nil {
11181149
return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil)
11191150
}
@@ -1184,11 +1215,29 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc(
11841215
actualStateOfWorld ActualStateOfWorldMounterUpdater,
11851216
mounter mount.Interface) (volumetypes.GeneratedOperations, error) {
11861217

1187-
blockVolumePlugin, err :=
1188-
og.volumePluginMgr.FindMapperPluginByName(deviceToDetach.PluginName)
1189-
if err != nil {
1190-
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err)
1218+
var blockVolumePlugin volume.BlockVolumePlugin
1219+
var err error
1220+
// Translate to CSI spec if migration enabled
1221+
if useCSIPlugin(og.volumePluginMgr, deviceToDetach.VolumeSpec) {
1222+
csiSpec, err := translateSpec(deviceToDetach.VolumeSpec)
1223+
if err != nil {
1224+
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.TranslateSpec failed", err)
1225+
}
1226+
1227+
deviceToDetach.VolumeSpec = csiSpec
1228+
blockVolumePlugin, err =
1229+
og.volumePluginMgr.FindMapperPluginByName(csi.CSIPluginName)
1230+
if err != nil {
1231+
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err)
1232+
}
1233+
} else {
1234+
blockVolumePlugin, err =
1235+
og.volumePluginMgr.FindMapperPluginByName(deviceToDetach.PluginName)
1236+
if err != nil {
1237+
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err)
1238+
}
11911239
}
1240+
11921241
if blockVolumePlugin == nil {
11931242
return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil)
11941243
}
@@ -1581,7 +1630,7 @@ func checkMountOptionSupport(og *operationGenerator, volumeToMount VolumeToMount
15811630

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

0 commit comments

Comments
 (0)