From 538b7abda123ac719fa6f795d1e074ada4adc460 Mon Sep 17 00:00:00 2001 From: Kevin Klues Date: Sat, 9 Mar 2024 00:26:33 +0100 Subject: [PATCH] dra scheduler: create default claim/class parameters instead of nil Without this, the scheduler was crashing in newClaimController() in pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go The code in newClaimController() assumes that the parameters are not nil. Furthermore it assumes that there is at least one DriverRequest populated in order to allocate any resources to a claim. This PR adds logic to define default claim/class parameters that will allow allocation to proceed even if an end user doesn't provide any class or claim parameters themselves. Signed-off-by: Kevin Klues --- .../dynamicresources/dynamicresources.go | 32 ++++++++++++++++--- .../dynamicresources/structuredparameters.go | 10 +++--- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources.go b/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources.go index 9fce37fdabedc..449b24b5f56e5 100644 --- a/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources.go +++ b/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources.go @@ -963,13 +963,15 @@ func (pl *dynamicResources) lookupParameters(logger klog.Logger, class *resource if status != nil { return } - claimParameters, status = pl.lookupClaimParameters(logger, claim) + claimParameters, status = pl.lookupClaimParameters(logger, class, claim) return } func (pl *dynamicResources) lookupClassParameters(logger klog.Logger, class *resourcev1alpha2.ResourceClass) (*resourcev1alpha2.ResourceClassParameters, *framework.Status) { + defaultClassParameters := resourcev1alpha2.ResourceClassParameters{} + if class.ParametersRef == nil { - return nil, nil + return &defaultClassParameters, nil } if class.ParametersRef.APIGroup == resourcev1alpha2.SchemeGroupVersion.Group && @@ -1004,9 +1006,31 @@ func (pl *dynamicResources) lookupClassParameters(logger klog.Logger, class *res return nil, statusUnschedulable(logger, fmt.Sprintf("generated class parameters for %s.%s %s not found", class.ParametersRef.Kind, class.ParametersRef.APIGroup, klog.KRef(class.Namespace, class.ParametersRef.Name))) } -func (pl *dynamicResources) lookupClaimParameters(logger klog.Logger, claim *resourcev1alpha2.ResourceClaim) (*resourcev1alpha2.ResourceClaimParameters, *framework.Status) { +func (pl *dynamicResources) lookupClaimParameters(logger klog.Logger, class *resourcev1alpha2.ResourceClass, claim *resourcev1alpha2.ResourceClaim) (*resourcev1alpha2.ResourceClaimParameters, *framework.Status) { + defaultClaimParameters := resourcev1alpha2.ResourceClaimParameters{ + Shareable: true, + DriverRequests: []resourcev1alpha2.DriverRequests{ + { + DriverName: class.DriverName, + Requests: []resourcev1alpha2.ResourceRequest{ + { + ResourceRequestModel: resourcev1alpha2.ResourceRequestModel{ + // TODO: This only works because NamedResources is + // the only model currently implemented. We need to + // match the default to how the resources of this + // class are being advertized in a ResourceSlice. + NamedResources: &resourcev1alpha2.NamedResourcesRequest{ + Selector: "true", + }, + }, + }, + }, + }, + }, + } + if claim.Spec.ParametersRef == nil { - return nil, nil + return &defaultClaimParameters, nil } if claim.Spec.ParametersRef.APIGroup == resourcev1alpha2.SchemeGroupVersion.Group && claim.Spec.ParametersRef.Kind == "ResourceClaimParameters" { diff --git a/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go b/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go index 44b9aee85b9b0..d9b5a222369d9 100644 --- a/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go +++ b/pkg/scheduler/framework/plugins/dynamicresources/structuredparameters.go @@ -128,12 +128,10 @@ func newClaimController(logger klog.Logger, class *resourcev1alpha2.ResourceClas } for driverName, perDriver := range namedresourcesRequests { var filter *resourcev1alpha2.NamedResourcesFilter - if classParameters != nil { - for _, f := range classParameters.Filters { - if f.DriverName == driverName && f.ResourceFilterModel.NamedResources != nil { - filter = f.ResourceFilterModel.NamedResources - break - } + for _, f := range classParameters.Filters { + if f.DriverName == driverName && f.ResourceFilterModel.NamedResources != nil { + filter = f.ResourceFilterModel.NamedResources + break } } controller, err := namedresourcesmodel.NewClaimController(filter, perDriver.requests)