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 <osthues.matthias@gmail.com>
Signed-off-by: Travis Nielsen <tnielsen@redhat.com>
(cherry picked from commit d3c0bacd88)
This commit is contained in:
Travis Nielsen authored and Mergify committed 2025-10-23 15:55:38 +00:00
1 parent 95ef325c6e
commit f834612c85
3 files changed
+26 -2

No files matched your search

+10
View File
@@ -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
+5
View File
@@ -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
+11 -2
View File
@@ -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) {