diff --git a/pkg/daemon/ceph/osd/volume.go b/pkg/daemon/ceph/osd/volume.go index f1537f039..e6ff5c37c 100644 --- a/pkg/daemon/ceph/osd/volume.go +++ b/pkg/daemon/ceph/osd/volume.go @@ -33,6 +33,7 @@ import ( "github.com/rook/rook/pkg/clusterd" "github.com/rook/rook/pkg/daemon/ceph/client" oposd "github.com/rook/rook/pkg/operator/ceph/cluster/osd" + "github.com/rook/rook/pkg/operator/ceph/cluster/osd/config" cephver "github.com/rook/rook/pkg/operator/ceph/version" "github.com/rook/rook/pkg/util/display" "github.com/rook/rook/pkg/util/sys" @@ -459,6 +460,19 @@ func isSafeToUseRawMode(device *DeviceOsdIDEntry, cephVersion cephver.CephVersio return true } +func lvmModeAllowed(device *DeviceOsdIDEntry, storeConfig *config.StoreConfig) bool { + if device.DeviceInfo.Type == sys.LVMType { + logger.Infof("skipping device %q for lvm mode since LVM logical volumes don't support `metadataDevice` or `osdsPerDevice` > 1", device.Config.Name) + return false + } + if device.DeviceInfo.Type == sys.PartType && storeConfig.EncryptedDevice { + logger.Infof("skipping partition %q for lvm mode since encryption is not supported on partitions with a `metadataDevice` or `osdsPerDevice > 1`", device.Config.Name) + return false + } + + return true +} + func (a *OsdAgent) initializeDevices(context *clusterd.Context, devices *DeviceOsdMapping) error { // Should we allow ceph-volume raw mode? allowRawMode, err := a.allowRawMode(context) @@ -497,7 +511,9 @@ func (a *OsdAgent) initializeDevices(context *clusterd.Context, devices *DeviceO rawDevices.Entries[name] = device continue } - lvmDevices.Entries[name] = device + if lvmModeAllowed(device, &a.storeConfig) { + lvmDevices.Entries[name] = device + } } err = a.initializeDevicesRawMode(context, rawDevices) diff --git a/pkg/daemon/ceph/osd/volume_test.go b/pkg/daemon/ceph/osd/volume_test.go index 1daaf20f3..2fa3663e8 100644 --- a/pkg/daemon/ceph/osd/volume_test.go +++ b/pkg/daemon/ceph/osd/volume_test.go @@ -1740,3 +1740,31 @@ func TestIsSafeToUseRawMode(t *testing.T) { assert.False(t, isSafeToUseRawMode(device, cephNextMajor)) }) } + +func TestLVMModeAllowed(t *testing.T) { + device := &DeviceOsdIDEntry{ + Config: DesiredDevice{ + Name: "vda", + }, + DeviceInfo: &sys.LocalDisk{ + Type: sys.DiskType, + }, + } + storeConfig := &config.StoreConfig{EncryptedDevice: false} + + // disk + assert.True(t, lvmModeAllowed(device, storeConfig)) + + // lvm + device.DeviceInfo.Type = sys.LVMType + assert.False(t, lvmModeAllowed(device, storeConfig)) + + // non-encrypted part + device.DeviceInfo.Type = sys.PartType + assert.True(t, lvmModeAllowed(device, storeConfig)) + + // encrypted part + storeConfig.EncryptedDevice = true + assert.False(t, lvmModeAllowed(device, storeConfig)) + +}