From eea22fa5e531d8423130bd734c01174f7d02603a Mon Sep 17 00:00:00 2001 From: Santosh Date: Wed, 29 Apr 2026 19:18:05 +0530 Subject: [PATCH] osd: detect encryption label from dmcrypt path Detect OSD encryption from the dmcrypt block path in `getOSDInfo` as a fallback when the `encrypted` label is missing on pre-label deployments. Include `osd.Encrypted` in the label check in `makeDeployment` so the label reflects the actual OSD state on upgrade. Fixes a bug where upgrading to a Rook version with the `encrypted` label would set the label to `false` on already-encrypted OSDs, because the label didn't exist yet and `getOSDInfo` defaulted to `false`. Signed-off-by: Santosh (cherry picked from commit fc9e3b54f3e804fa1ced48040a7fc6d87bcac90a) --- pkg/operator/ceph/cluster/osd/osd.go | 5 ++- pkg/operator/ceph/cluster/osd/osd_test.go | 48 +++++++++++++++++++++++ pkg/operator/ceph/cluster/osd/spec.go | 2 +- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/pkg/operator/ceph/cluster/osd/osd.go b/pkg/operator/ceph/cluster/osd/osd.go index cbfdbec11..de44a3257 100644 --- a/pkg/operator/ceph/cluster/osd/osd.go +++ b/pkg/operator/ceph/cluster/osd/osd.go @@ -797,8 +797,11 @@ func (c *Cluster) getOSDInfo(d *appsv1.Deployment) (OSDInfo, error) { osd.Store = d.Labels[osdStore] osd.DeviceType = d.Labels[deviceType] + // Detect encryption from the block path as a fallback for deployments that predate the + // "encrypted" label. On upgrade, the label won't exist yet, but the dmcrypt block path + // is always present on encrypted OSDs regardless of the Rook version that created them. osd.Encrypted = false - if d.Labels[encrypted] == "true" { + if d.Labels[encrypted] == "true" || strings.Contains(osd.BlockPath, "-dmcrypt") { osd.Encrypted = true } diff --git a/pkg/operator/ceph/cluster/osd/osd_test.go b/pkg/operator/ceph/cluster/osd/osd_test.go index 844c24035..efd27b277 100644 --- a/pkg/operator/ceph/cluster/osd/osd_test.go +++ b/pkg/operator/ceph/cluster/osd/osd_test.go @@ -839,6 +839,54 @@ func TestGetOSDInfo(t *testing.T) { assert.Equal(t, pvcName, updatedOSDInfo.PVCName) }) + t.Run("detect encryption from dmcrypt block path when encrypted label is missing", func(t *testing.T) { + osdInfo := &OSDInfo{ + UUID: "osd-uuid", + BlockPath: "/dev/mapper/set1-data-0-abc-block-dmcrypt", + CVMode: "raw", + } + osdProp := osdProperties{ + crushHostname: node, + pvc: corev1.PersistentVolumeClaimVolumeSource{ClaimName: "pvc"}, + selection: cephv1.Selection{}, + resources: corev1.ResourceRequirements{}, + storeConfig: config.StoreConfig{}, + } + + d, err := c.makeDeployment(osdProp, osdInfo, dataPathMap) + assert.NoError(t, err) + + // simulate a pre-label upgrade by removing the encrypted label + delete(d.Labels, encrypted) + delete(d.Spec.Template.Labels, encrypted) + + updatedOSDInfo, err := c.getOSDInfo(d) + assert.NoError(t, err) + assert.True(t, updatedOSDInfo.Encrypted) + }) + + t.Run("encrypted label is set from OSDInfo when osdProps does not indicate encryption", func(t *testing.T) { + osdInfo := &OSDInfo{ + UUID: "osd-uuid", + BlockPath: "/dev/mapper/set1-data-0-abc-block-dmcrypt", + CVMode: "raw", + Encrypted: true, + } + osdProp := osdProperties{ + crushHostname: node, + pvc: corev1.PersistentVolumeClaimVolumeSource{ClaimName: "pvc"}, + selection: cephv1.Selection{}, + resources: corev1.ResourceRequirements{}, + storeConfig: config.StoreConfig{}, + encrypted: false, + } + + d, err := c.makeDeployment(osdProp, osdInfo, dataPathMap) + assert.NoError(t, err) + assert.Equal(t, "true", d.Labels[encrypted]) + assert.Equal(t, "true", d.Spec.Template.Labels[encrypted]) + }) + t.Run("verify the non-existence of labels if the corresponding fields are not set on OSDInfo and OSDProperties", func(t *testing.T) { useAllDevices := true osdInfo := &OSDInfo{ diff --git a/pkg/operator/ceph/cluster/osd/spec.go b/pkg/operator/ceph/cluster/osd/spec.go index 4938d0ce1..ffc939063 100644 --- a/pkg/operator/ceph/cluster/osd/spec.go +++ b/pkg/operator/ceph/cluster/osd/spec.go @@ -548,7 +548,7 @@ func (c *Cluster) makeDeployment(osdProps osdProperties, osd *OSDInfo, provision osdLabels := c.getOSDLabels(*osd, failureDomainValue, osdProps.portable) // update encryption label on the OSD deployment - if osdProps.storeConfig.EncryptedDevice || osdProps.encrypted { + if osdProps.storeConfig.EncryptedDevice || osdProps.encrypted || osd.Encrypted { osdLabels[encrypted] = "true" } else { osdLabels[encrypted] = "false"