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) {