From f834612c854d4e4db88169ffc75a5346b43e5a2a Mon Sep 17 00:00:00 2001 From: Travis Nielsen Date: Thu, 16 Oct 2025 14:33:48 -0600 Subject: [PATCH] osd: set osd resources for specific device class The OSDs may require different resources based on their device class. The overall osd resources were only being used, rather than properly looking up the specific device class resources. Now the expected resources will take affect per device class. Co-authored-by: Matthias Osthues Signed-off-by: Travis Nielsen (cherry picked from commit d3c0bacd88027c7f93455d411b5cbca5cc8c9e73) --- pkg/apis/ceph.rook.io/v1/resources.go | 10 ++++++++++ pkg/operator/ceph/cluster/osd/spec.go | 5 +++++ pkg/operator/ceph/cluster/osd/spec_test.go | 13 +++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/pkg/apis/ceph.rook.io/v1/resources.go b/pkg/apis/ceph.rook.io/v1/resources.go index daebe4aaf..95baec3c4 100644 --- a/pkg/apis/ceph.rook.io/v1/resources.go +++ b/pkg/apis/ceph.rook.io/v1/resources.go @@ -77,6 +77,16 @@ func GetOSDResources(p ResourceSpec, deviceClass string) v1.ResourceRequirements return p[ResourcesKeyOSD] } +// GetOSDResourcesForDeviceClass returns the resources for a device class, if specified +func GetOSDResourcesForDeviceClass(resourceSpec ResourceSpec, deviceClass string) (v1.ResourceRequirements, bool) { + // if the device class requests specific resources, return them here + if resources, ok := resourceSpec[getOSDResourceKeyForDeviceClass(deviceClass)]; ok { + return resources, true + } + // no resources requested specific to the device class + return v1.ResourceRequirements{}, false +} + // getOSDResourceKeyForDeviceClass returns key name for device class in resources spec func getOSDResourceKeyForDeviceClass(deviceClass string) string { return ResourcesKeyOSD + "-" + deviceClass diff --git a/pkg/operator/ceph/cluster/osd/spec.go b/pkg/operator/ceph/cluster/osd/spec.go index 2a9cee3e4..10153c6c2 100644 --- a/pkg/operator/ceph/cluster/osd/spec.go +++ b/pkg/operator/ceph/cluster/osd/spec.go @@ -354,6 +354,11 @@ func (c *Cluster) makeDeployment(osdProps osdProperties, osd *OSDInfo, provision logger.Infof("The device class for osd %d is changing from %q to %q", osd.ID, osd.DeviceClass, osdProps.storeConfig.DeviceClass) osd.DeviceClass = osdProps.storeConfig.DeviceClass } + // Assign the resources specific to this device class + if resources, ok := cephv1.GetOSDResourcesForDeviceClass(c.spec.Resources, osd.DeviceClass); ok { + logger.Debugf("assigning resources for device class %q to osd %d: %+v", osd.DeviceClass, osd.ID, resources) + osdProps.resources = resources + } dataDir := k8sutil.DataDir // Create volume config for /dev so the pod can access devices on the host diff --git a/pkg/operator/ceph/cluster/osd/spec_test.go b/pkg/operator/ceph/cluster/osd/spec_test.go index eea2d9684..275083ba6 100644 --- a/pkg/operator/ceph/cluster/osd/spec_test.go +++ b/pkg/operator/ceph/cluster/osd/spec_test.go @@ -636,13 +636,21 @@ func TestHostNetwork(t *testing.T) { spec := cephv1.ClusterSpec{ Storage: storageSpec, Network: cephv1.NetworkSpec{HostNetwork: true}, + Resources: cephv1.ResourceSpec{ + "osd-myclass": corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceMemory: *resource.NewQuantity(2345.0, resource.BinarySI), + }, + }, + }, } c := New(context, clusterInfo, spec, "rook/rook:myversion") n := c.spec.Storage.ResolveNode(storageSpec.Nodes[0].Name) osd := &OSDInfo{ - ID: 0, - CVMode: "raw", + ID: 0, + CVMode: "raw", + DeviceClass: "myclass", } osdProp := osdProperties{ @@ -664,6 +672,7 @@ func TestHostNetwork(t *testing.T) { assert.Equal(t, "rook-ceph-osd-0", r.ObjectMeta.Name) assert.Equal(t, true, r.Spec.Template.Spec.HostNetwork) assert.Equal(t, corev1.DNSClusterFirstWithHostNet, r.Spec.Template.Spec.DNSPolicy) + assert.Equal(t, "2345", r.Spec.Template.Spec.Containers[0].Resources.Limits.Memory().String()) } func TestOsdPrepareResources(t *testing.T) {