Skip to content

Commit 36d8a44

Browse files
committed
DRA: Update controller for Prioritized Alternatives in Device Requests
1 parent 2229a78 commit 36d8a44

File tree

4 files changed

+60
-29
lines changed

4 files changed

+60
-29
lines changed

cmd/kube-controller-manager/app/core.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,10 @@ func newResourceClaimControllerDescriptor() *ControllerDescriptor {
408408
func startResourceClaimController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {
409409
ephemeralController, err := resourceclaim.NewController(
410410
klog.FromContext(ctx),
411-
utilfeature.DefaultFeatureGate.Enabled(features.DRAAdminAccess),
411+
resourceclaim.Features{
412+
AdminAccess: utilfeature.DefaultFeatureGate.Enabled(features.DRAAdminAccess),
413+
PrioritizedList: utilfeature.DefaultFeatureGate.Enabled(features.DRAPrioritizedList),
414+
},
412415
controllerContext.ClientBuilder.ClientOrDie("resource-claim-controller"),
413416
controllerContext.InformerFactory.Core().V1().Pods(),
414417
controllerContext.InformerFactory.Resource().V1beta1().ResourceClaims(),

pkg/controller/resourceclaim/controller.go

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ const (
7171

7272
// Controller creates ResourceClaims for ResourceClaimTemplates in a pod spec.
7373
type Controller struct {
74-
// adminAccessEnabled matches the DRAAdminAccess feature gate state.
75-
adminAccessEnabled bool
74+
// features defines the feature gates that are enabled.
75+
features Features
7676

7777
// kubeClient is the kube API client used to communicate with the API
7878
// server.
@@ -118,25 +118,31 @@ const (
118118
podKeyPrefix = "pod:"
119119
)
120120

121+
// Features defines which features should be enabled in the controller.
122+
type Features struct {
123+
AdminAccess bool
124+
PrioritizedList bool
125+
}
126+
121127
// NewController creates a ResourceClaim controller.
122128
func NewController(
123129
logger klog.Logger,
124-
adminAccessEnabled bool,
130+
features Features,
125131
kubeClient clientset.Interface,
126132
podInformer v1informers.PodInformer,
127133
claimInformer resourceinformers.ResourceClaimInformer,
128134
templateInformer resourceinformers.ResourceClaimTemplateInformer) (*Controller, error) {
129135

130136
ec := &Controller{
131-
adminAccessEnabled: adminAccessEnabled,
132-
kubeClient: kubeClient,
133-
podLister: podInformer.Lister(),
134-
podIndexer: podInformer.Informer().GetIndexer(),
135-
podSynced: podInformer.Informer().HasSynced,
136-
claimLister: claimInformer.Lister(),
137-
claimsSynced: claimInformer.Informer().HasSynced,
138-
templateLister: templateInformer.Lister(),
139-
templatesSynced: templateInformer.Informer().HasSynced,
137+
features: features,
138+
kubeClient: kubeClient,
139+
podLister: podInformer.Lister(),
140+
podIndexer: podInformer.Informer().GetIndexer(),
141+
podSynced: podInformer.Informer().HasSynced,
142+
claimLister: claimInformer.Lister(),
143+
claimsSynced: claimInformer.Informer().HasSynced,
144+
templateLister: templateInformer.Lister(),
145+
templatesSynced: templateInformer.Informer().HasSynced,
140146
queue: workqueue.NewTypedRateLimitingQueueWithConfig(
141147
workqueue.DefaultTypedControllerRateLimiter[string](),
142148
workqueue.TypedRateLimitingQueueConfig[string]{Name: "resource_claim"},
@@ -617,10 +623,14 @@ func (ec *Controller) handleClaim(ctx context.Context, pod *v1.Pod, podClaim v1.
617623
return fmt.Errorf("resource claim template %q: %v", *templateName, err)
618624
}
619625

620-
if !ec.adminAccessEnabled && needsAdminAccess(template) {
626+
if !ec.features.AdminAccess && needsAdminAccess(template) {
621627
return errors.New("admin access is requested, but the feature is disabled")
622628
}
623629

630+
if !ec.features.PrioritizedList && hasPrioritizedList(template) {
631+
return errors.New("template includes a prioritized list of subrequests, but the feature is disabled")
632+
}
633+
624634
// Create the ResourceClaim with pod as owner, with a generated name that uses
625635
// <pod>-<claim name> as base.
626636
isTrue := true
@@ -688,6 +698,15 @@ func needsAdminAccess(claimTemplate *resourceapi.ResourceClaimTemplate) bool {
688698
return false
689699
}
690700

701+
func hasPrioritizedList(claimTemplate *resourceapi.ResourceClaimTemplate) bool {
702+
for _, request := range claimTemplate.Spec.Spec.Devices.Requests {
703+
if len(request.FirstAvailable) > 0 {
704+
return true
705+
}
706+
}
707+
return false
708+
}
709+
691710
// findPodResourceClaim looks for an existing ResourceClaim with the right
692711
// annotation (ties it to the pod claim) and the right ownership (ties it to
693712
// the pod).

pkg/controller/resourceclaim/controller_test.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,19 @@ var (
8282

8383
func TestSyncHandler(t *testing.T) {
8484
tests := []struct {
85-
name string
86-
key string
87-
adminAccessEnabled bool
88-
claims []*resourceapi.ResourceClaim
89-
claimsInCache []*resourceapi.ResourceClaim
90-
pods []*v1.Pod
91-
podsLater []*v1.Pod
92-
templates []*resourceapi.ResourceClaimTemplate
93-
expectedClaims []resourceapi.ResourceClaim
94-
expectedStatuses map[string][]v1.PodResourceClaimStatus
95-
expectedError bool
96-
expectedMetrics expectedMetrics
85+
name string
86+
key string
87+
adminAccessEnabled bool
88+
prioritizedListEnabled bool
89+
claims []*resourceapi.ResourceClaim
90+
claimsInCache []*resourceapi.ResourceClaim
91+
pods []*v1.Pod
92+
podsLater []*v1.Pod
93+
templates []*resourceapi.ResourceClaimTemplate
94+
expectedClaims []resourceapi.ResourceClaim
95+
expectedStatuses map[string][]v1.PodResourceClaimStatus
96+
expectedError bool
97+
expectedMetrics expectedMetrics
9798
}{
9899
{
99100
name: "create",
@@ -390,7 +391,11 @@ func TestSyncHandler(t *testing.T) {
390391
claimInformer := informerFactory.Resource().V1beta1().ResourceClaims()
391392
templateInformer := informerFactory.Resource().V1beta1().ResourceClaimTemplates()
392393

393-
ec, err := NewController(tCtx.Logger(), tc.adminAccessEnabled, fakeKubeClient, podInformer, claimInformer, templateInformer)
394+
features := Features{
395+
AdminAccess: tc.adminAccessEnabled,
396+
PrioritizedList: tc.prioritizedListEnabled,
397+
}
398+
ec, err := NewController(tCtx.Logger(), features, fakeKubeClient, podInformer, claimInformer, templateInformer)
394399
if err != nil {
395400
t.Fatalf("error creating ephemeral controller : %v", err)
396401
}
@@ -465,7 +470,7 @@ func TestResourceClaimEventHandler(t *testing.T) {
465470
templateInformer := informerFactory.Resource().V1beta1().ResourceClaimTemplates()
466471
claimClient := fakeKubeClient.ResourceV1beta1().ResourceClaims(testNamespace)
467472

468-
_, err := NewController(tCtx.Logger(), false /* admin access */, fakeKubeClient, podInformer, claimInformer, templateInformer)
473+
_, err := NewController(tCtx.Logger(), Features{}, fakeKubeClient, podInformer, claimInformer, templateInformer)
469474
tCtx.ExpectNoError(err, "creating ephemeral controller")
470475

471476
informerFactory.Start(tCtx.Done())

test/integration/util/util.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,11 @@ func CreateResourceClaimController(ctx context.Context, tb ktesting.TB, clientSe
132132
podInformer := informerFactory.Core().V1().Pods()
133133
claimInformer := informerFactory.Resource().V1beta1().ResourceClaims()
134134
claimTemplateInformer := informerFactory.Resource().V1beta1().ResourceClaimTemplates()
135-
claimController, err := resourceclaim.NewController(klog.FromContext(ctx), true /* admin access */, clientSet, podInformer, claimInformer, claimTemplateInformer)
135+
features := resourceclaim.Features{
136+
AdminAccess: true,
137+
PrioritizedList: true,
138+
}
139+
claimController, err := resourceclaim.NewController(klog.FromContext(ctx), features, clientSet, podInformer, claimInformer, claimTemplateInformer)
136140
if err != nil {
137141
tb.Fatalf("Error creating claim controller: %v", err)
138142
}

0 commit comments

Comments
 (0)