diff --git a/pkg/daemon/ceph/client/pool.go b/pkg/daemon/ceph/client/pool.go index b7089f94b..7d26c3239 100644 --- a/pkg/daemon/ceph/client/pool.go +++ b/pkg/daemon/ceph/client/pool.go @@ -529,7 +529,15 @@ func extractPoolDetails(rule ruleSpec) (string, string) { failureDomain = step.Type } if step.ItemName != "" { - deviceClass = step.ItemName + // we are not using crushRoot currently, remove it + // from crush rule + if strings.Contains(step.ItemName, "~") { + crushRootAndDeviceClass := step.ItemName + parts := strings.SplitN(crushRootAndDeviceClass, "~", 2) + deviceClass = parts[1] + } else { + deviceClass = step.ItemName + } } // We expect the rule to be found by the second step, or else it is a more // complex rule that would not be supported for updating the failure domain diff --git a/pkg/daemon/ceph/client/pool_test.go b/pkg/daemon/ceph/client/pool_test.go index b2fa1add2..929e8b832 100644 --- a/pkg/daemon/ceph/client/pool_test.go +++ b/pkg/daemon/ceph/client/pool_test.go @@ -339,6 +339,16 @@ func TestExtractPoolDetails(t *testing.T) { assert.Equal(t, "zone", failureDomain) assert.Equal(t, "ssd", deviceClass) }) + + t.Run("valid crush rule with crushroot combined", func(t *testing.T) { + rule := ruleSpec{Steps: []stepSpec{ + {Type: ""}, + {Type: "zone", ItemName: "default~ssd"}, + }} + failureDomain, deviceClass := extractPoolDetails(rule) + assert.Equal(t, "zone", failureDomain) + assert.Equal(t, "ssd", deviceClass) + }) } func TestGetPoolStatistics(t *testing.T) {