Skip to content

Commit 8d755e8

Browse files
committed
1 parent be0801b commit 8d755e8

File tree

8 files changed

+125
-41
lines changed

8 files changed

+125
-41
lines changed

cluster-autoscaler/simulator/clustersnapshot/store/basic.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -314,30 +314,35 @@ type basicSnapshotStoreNodeLister BasicSnapshotStore
314314
type basicSnapshotStoreStorageLister BasicSnapshotStore
315315

316316
// NodeInfos exposes snapshot as NodeInfoLister.
317-
func (snapshot *BasicSnapshotStore) NodeInfos() schedulerframework.NodeInfoLister {
317+
func (snapshot *BasicSnapshotStore) NodeInfos() fwk.NodeInfoLister {
318318
return (*basicSnapshotStoreNodeLister)(snapshot)
319319
}
320320

321321
// StorageInfos exposes snapshot as StorageInfoLister.
322-
func (snapshot *BasicSnapshotStore) StorageInfos() schedulerframework.StorageInfoLister {
322+
func (snapshot *BasicSnapshotStore) StorageInfos() fwk.StorageInfoLister {
323323
return (*basicSnapshotStoreStorageLister)(snapshot)
324324
}
325325

326326
// ResourceClaims exposes snapshot as ResourceClaimTracker
327-
func (snapshot *BasicSnapshotStore) ResourceClaims() schedulerframework.ResourceClaimTracker {
327+
func (snapshot *BasicSnapshotStore) ResourceClaims() fwk.ResourceClaimTracker {
328328
return snapshot.DraSnapshot().ResourceClaims()
329329
}
330330

331331
// ResourceSlices exposes snapshot as ResourceSliceLister.
332-
func (snapshot *BasicSnapshotStore) ResourceSlices() schedulerframework.ResourceSliceLister {
332+
func (snapshot *BasicSnapshotStore) ResourceSlices() fwk.ResourceSliceLister {
333333
return snapshot.DraSnapshot().ResourceSlices()
334334
}
335335

336336
// DeviceClasses exposes the snapshot as DeviceClassLister.
337-
func (snapshot *BasicSnapshotStore) DeviceClasses() schedulerframework.DeviceClassLister {
337+
func (snapshot *BasicSnapshotStore) DeviceClasses() fwk.DeviceClassLister {
338338
return snapshot.DraSnapshot().DeviceClasses()
339339
}
340340

341+
// DeviceClassResolver exposes the snapshot as DeviceClassResolver.
342+
func (snapshot *BasicSnapshotStore) DeviceClassResolver() fwk.DeviceClassResolver {
343+
return snapshot.DraSnapshot().DeviceClassResolver()
344+
}
345+
341346
// List returns the list of nodes in the snapshot.
342347
func (snapshot *basicSnapshotStoreNodeLister) List() ([]fwk.NodeInfo, error) {
343348
return (*BasicSnapshotStore)(snapshot).getInternalData().listNodeInfos(), nil

cluster-autoscaler/simulator/clustersnapshot/store/delta.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -394,30 +394,35 @@ func (snapshot *DeltaSnapshotStore) getNodeInfo(nodeName string) (fwk.NodeInfo,
394394
}
395395

396396
// NodeInfos returns node lister.
397-
func (snapshot *DeltaSnapshotStore) NodeInfos() schedulerframework.NodeInfoLister {
397+
func (snapshot *DeltaSnapshotStore) NodeInfos() fwk.NodeInfoLister {
398398
return (*deltaSnapshotStoreNodeLister)(snapshot)
399399
}
400400

401401
// StorageInfos returns storage lister
402-
func (snapshot *DeltaSnapshotStore) StorageInfos() schedulerframework.StorageInfoLister {
402+
func (snapshot *DeltaSnapshotStore) StorageInfos() fwk.StorageInfoLister {
403403
return (*deltaSnapshotStoreStorageLister)(snapshot)
404404
}
405405

406406
// ResourceClaims exposes snapshot as ResourceClaimTracker
407-
func (snapshot *DeltaSnapshotStore) ResourceClaims() schedulerframework.ResourceClaimTracker {
407+
func (snapshot *DeltaSnapshotStore) ResourceClaims() fwk.ResourceClaimTracker {
408408
return snapshot.DraSnapshot().ResourceClaims()
409409
}
410410

411411
// ResourceSlices exposes snapshot as ResourceSliceLister.
412-
func (snapshot *DeltaSnapshotStore) ResourceSlices() schedulerframework.ResourceSliceLister {
412+
func (snapshot *DeltaSnapshotStore) ResourceSlices() fwk.ResourceSliceLister {
413413
return snapshot.DraSnapshot().ResourceSlices()
414414
}
415415

416416
// DeviceClasses exposes the snapshot as DeviceClassLister.
417-
func (snapshot *DeltaSnapshotStore) DeviceClasses() schedulerframework.DeviceClassLister {
417+
func (snapshot *DeltaSnapshotStore) DeviceClasses() fwk.DeviceClassLister {
418418
return snapshot.DraSnapshot().DeviceClasses()
419419
}
420420

421+
// DeviceClassResolver exposes the snapshot as DeviceClassResolver.
422+
func (snapshot *DeltaSnapshotStore) DeviceClassResolver() fwk.DeviceClassResolver {
423+
return snapshot.DraSnapshot().DeviceClassResolver()
424+
}
425+
421426
// NewDeltaSnapshotStore creates instances of DeltaSnapshotStore.
422427
func NewDeltaSnapshotStore(parallelism int) *DeltaSnapshotStore {
423428
snapshot := &DeltaSnapshotStore{

cluster-autoscaler/simulator/dynamicresources/snapshot/snapshot.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
resourceclaim "k8s.io/dynamic-resource-allocation/resourceclaim"
3030
"k8s.io/klog/v2"
3131
fwk "k8s.io/kube-scheduler/framework"
32-
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework"
3332
)
3433

3534
// ResourceClaimId is a unique identifier for a ResourceClaim.
@@ -85,24 +84,30 @@ func NewEmptySnapshot() *Snapshot {
8584
}
8685
}
8786

88-
// ResourceClaims exposes the Snapshot as schedulerframework.ResourceClaimTracker, in order to interact with
87+
// ResourceClaims exposes the Snapshot as fwk.ResourceClaimTracker, in order to interact with
8988
// the scheduler framework.
90-
func (s *Snapshot) ResourceClaims() schedulerframework.ResourceClaimTracker {
89+
func (s *Snapshot) ResourceClaims() fwk.ResourceClaimTracker {
9190
return snapshotClaimTracker{snapshot: s}
9291
}
9392

94-
// ResourceSlices exposes the Snapshot as schedulerframework.ResourceSliceLister, in order to interact with
93+
// ResourceSlices exposes the Snapshot as fwk.ResourceSliceLister, in order to interact with
9594
// the scheduler framework.
96-
func (s *Snapshot) ResourceSlices() schedulerframework.ResourceSliceLister {
95+
func (s *Snapshot) ResourceSlices() fwk.ResourceSliceLister {
9796
return snapshotSliceLister{snapshot: s}
9897
}
9998

100-
// DeviceClasses exposes the Snapshot as schedulerframework.DeviceClassLister, in order to interact with
99+
// DeviceClasses exposes the Snapshot as fwk.DeviceClassLister, in order to interact with
101100
// the scheduler framework.
102-
func (s *Snapshot) DeviceClasses() schedulerframework.DeviceClassLister {
101+
func (s *Snapshot) DeviceClasses() fwk.DeviceClassLister {
103102
return snapshotClassLister{snapshot: s}
104103
}
105104

105+
// DeviceClassResolver exposes the Snapshot as fwk.DeviceClassResolver, in order to interact with
106+
// the scheduler framework.
107+
func (s *Snapshot) DeviceClassResolver() fwk.DeviceClassResolver {
108+
return newSnapshotDeviceClassResolver(s)
109+
}
110+
106111
// WrapSchedulerNodeInfo wraps the provided fwk.NodeInfo into an internal *framework.NodeInfo, adding
107112
// dra information. Node-local ResourceSlices are added to the NodeInfo, and all ResourceClaims referenced by each Pod
108113
// are added to each PodInfo. Returns an error if any of the Pods is missing a ResourceClaim.

cluster-autoscaler/simulator/dynamicresources/snapshot/snapshot_claim_tracker_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
"k8s.io/apimachinery/pkg/util/sets"
2929
"k8s.io/autoscaler/cluster-autoscaler/utils/test"
3030
"k8s.io/dynamic-resource-allocation/structured"
31-
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework"
31+
fwk "k8s.io/kube-scheduler/framework"
3232
)
3333

3434
var (
@@ -86,7 +86,7 @@ func TestSnapshotClaimTrackerList(t *testing.T) {
8686
} {
8787
t.Run(tc.testName, func(t *testing.T) {
8888
snapshot := NewSnapshot(tc.claims, nil, nil, nil)
89-
var resourceClaimTracker schedulerframework.ResourceClaimTracker = snapshot.ResourceClaims()
89+
var resourceClaimTracker fwk.ResourceClaimTracker = snapshot.ResourceClaims()
9090
claims, err := resourceClaimTracker.List()
9191
if err != nil {
9292
t.Fatalf("snapshotClaimTracker.List(): got unexpected error: %v", err)
@@ -132,7 +132,7 @@ func TestSnapshotClaimTrackerGet(t *testing.T) {
132132
GetClaimId(claim3): claim3,
133133
}
134134
snapshot := NewSnapshot(claims, nil, nil, nil)
135-
var resourceClaimTracker schedulerframework.ResourceClaimTracker = snapshot.ResourceClaims()
135+
var resourceClaimTracker fwk.ResourceClaimTracker = snapshot.ResourceClaims()
136136
claim, err := resourceClaimTracker.Get(tc.claimNamespace, tc.claimName)
137137
if diff := cmp.Diff(tc.wantErr, err, cmpopts.EquateErrors()); diff != "" {
138138
t.Fatalf("snapshotClaimTracker.Get(): unexpected error (-want +got): %s", diff)
@@ -180,7 +180,7 @@ func TestSnapshotClaimTrackerListAllAllocatedDevices(t *testing.T) {
180180
} {
181181
t.Run(tc.testName, func(t *testing.T) {
182182
snapshot := NewSnapshot(tc.claims, nil, nil, nil)
183-
var resourceClaimTracker schedulerframework.ResourceClaimTracker = snapshot.ResourceClaims()
183+
var resourceClaimTracker fwk.ResourceClaimTracker = snapshot.ResourceClaims()
184184
devices, err := resourceClaimTracker.ListAllAllocatedDevices()
185185
if err != nil {
186186
t.Fatalf("snapshotClaimTracker.ListAllAllocatedDevices(): got unexpected error: %v", err)
@@ -224,7 +224,7 @@ func TestSnapshotClaimTrackerSignalClaimPendingAllocation(t *testing.T) {
224224
GetClaimId(claim3): claim3,
225225
}
226226
snapshot := NewSnapshot(claims, nil, nil, nil)
227-
var resourceClaimTracker schedulerframework.ResourceClaimTracker = snapshot.ResourceClaims()
227+
var resourceClaimTracker fwk.ResourceClaimTracker = snapshot.ResourceClaims()
228228

229229
err := resourceClaimTracker.SignalClaimPendingAllocation(tc.claimUid, tc.allocatedClaim)
230230
if diff := cmp.Diff(tc.wantErr, err, cmpopts.EquateErrors()); diff != "" {

cluster-autoscaler/simulator/dynamicresources/snapshot/snapshot_class_lister_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
resourceapi "k8s.io/api/resource/v1"
2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727
"k8s.io/autoscaler/cluster-autoscaler/utils/test"
28-
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework"
28+
fwk "k8s.io/kube-scheduler/framework"
2929
)
3030

3131
var (
@@ -52,7 +52,7 @@ func TestSnapshotClassListerList(t *testing.T) {
5252
} {
5353
t.Run(tc.testName, func(t *testing.T) {
5454
snapshot := NewSnapshot(nil, nil, nil, tc.classes)
55-
var deviceClassLister schedulerframework.DeviceClassLister = snapshot.DeviceClasses()
55+
var deviceClassLister fwk.DeviceClassLister = snapshot.DeviceClasses()
5656
classes, err := deviceClassLister.List()
5757
if err != nil {
5858
t.Fatalf("snapshotClassLister.List(): got unexpected error: %v", err)
@@ -86,7 +86,7 @@ func TestSnapshotClassListerGet(t *testing.T) {
8686
t.Run(tc.testName, func(t *testing.T) {
8787
classes := map[string]*resourceapi.DeviceClass{"class-1": class1, "class-2": class2, "class-3": class3}
8888
snapshot := NewSnapshot(nil, nil, nil, classes)
89-
var deviceClassLister schedulerframework.DeviceClassLister = snapshot.DeviceClasses()
89+
var deviceClassLister fwk.DeviceClassLister = snapshot.DeviceClasses()
9090
class, err := deviceClassLister.Get(tc.className)
9191
if diff := cmp.Diff(tc.wantErr, err, cmpopts.EquateErrors()); diff != "" {
9292
t.Fatalf("snapshotClassLister.Get(): unexpected error (-want +got): %s", diff)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
Copyright 2025 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package snapshot
18+
19+
import (
20+
v1 "k8s.io/api/core/v1"
21+
resourceapi "k8s.io/api/resource/v1"
22+
fwk "k8s.io/kube-scheduler/framework"
23+
)
24+
25+
type snapshotDeviceClassResolver struct {
26+
// deviceClassMap maps extended resource name to device class
27+
deviceClassMap map[v1.ResourceName]*resourceapi.DeviceClass
28+
}
29+
30+
var _ fwk.DeviceClassResolver = &snapshotDeviceClassResolver{}
31+
32+
// newSnapshotDeviceClassResolver implements DeviceClassResolver for a snapshot
33+
func newSnapshotDeviceClassResolver(snapshot *Snapshot) fwk.DeviceClassResolver {
34+
deviceClassMap := make(map[v1.ResourceName]*resourceapi.DeviceClass)
35+
for _, class := range snapshot.listDeviceClasses() {
36+
if class != nil {
37+
deviceClassMap[v1.ResourceName(resourceapi.ResourceDeviceClassPrefix+class.Name)] = class
38+
extendedResourceName := class.Spec.ExtendedResourceName
39+
if extendedResourceName != nil {
40+
deviceClassMap[v1.ResourceName(*extendedResourceName)] = class
41+
}
42+
}
43+
}
44+
return snapshotDeviceClassResolver{deviceClassMap: deviceClassMap}
45+
}
46+
47+
// GetDeviceClass returns the device class name for the given extended resource name
48+
func (s snapshotDeviceClassResolver) GetDeviceClass(resourceName v1.ResourceName) string {
49+
class, ok := s.deviceClassMap[resourceName]
50+
if !ok {
51+
return ""
52+
}
53+
return class.Name
54+
}

cluster-autoscaler/simulator/dynamicresources/snapshot/snapshot_slice_lister_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
resourceapi "k8s.io/api/resource/v1"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"k8s.io/autoscaler/cluster-autoscaler/utils/test"
29-
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework"
29+
fwk "k8s.io/kube-scheduler/framework"
3030
)
3131

3232
func TestSnapshotSliceListerList(t *testing.T) {
@@ -78,7 +78,7 @@ func TestSnapshotSliceListerList(t *testing.T) {
7878
} {
7979
t.Run(tc.testName, func(t *testing.T) {
8080
snapshot := NewSnapshot(nil, tc.localSlices, tc.globalSlices, nil)
81-
var resourceSliceLister schedulerframework.ResourceSliceLister = snapshot.ResourceSlices()
81+
var resourceSliceLister fwk.ResourceSliceLister = snapshot.ResourceSlices()
8282
slices, err := resourceSliceLister.ListWithDeviceTaintRules()
8383
if err != nil {
8484
t.Fatalf("snapshotSliceLister.List(): got unexpected error: %v", err)

cluster-autoscaler/simulator/framework/delegating_shared_lister.go

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,22 @@ package framework
1919
import (
2020
"fmt"
2121

22+
corev1 "k8s.io/api/core/v1"
2223
resourceapi "k8s.io/api/resource/v1"
2324
"k8s.io/apimachinery/pkg/types"
2425
"k8s.io/apimachinery/pkg/util/sets"
2526
"k8s.io/dynamic-resource-allocation/structured"
2627
"k8s.io/klog/v2"
2728
fwk "k8s.io/kube-scheduler/framework"
28-
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework"
2929
)
3030

3131
// SharedLister groups all interfaces that Cluster Autoscaler needs to implement for integrating with kube-scheduler.
3232
type SharedLister interface {
33-
schedulerframework.SharedLister
34-
schedulerframework.SharedDRAManager
33+
fwk.SharedLister
34+
fwk.SharedDRAManager
3535
}
3636

37-
// DelegatingSchedulerSharedLister implements schedulerframework interfaces by passing the logic to a delegate. Delegate can be updated.
37+
// DelegatingSchedulerSharedLister implements fwk interfaces by passing the logic to a delegate. Delegate can be updated.
3838
type DelegatingSchedulerSharedLister struct {
3939
delegate SharedLister
4040
}
@@ -47,27 +47,27 @@ func NewDelegatingSchedulerSharedLister() *DelegatingSchedulerSharedLister {
4747
}
4848

4949
// NodeInfos returns a NodeInfoLister.
50-
func (lister *DelegatingSchedulerSharedLister) NodeInfos() schedulerframework.NodeInfoLister {
50+
func (lister *DelegatingSchedulerSharedLister) NodeInfos() fwk.NodeInfoLister {
5151
return lister.delegate.NodeInfos()
5252
}
5353

5454
// StorageInfos returns a StorageInfoLister
55-
func (lister *DelegatingSchedulerSharedLister) StorageInfos() schedulerframework.StorageInfoLister {
55+
func (lister *DelegatingSchedulerSharedLister) StorageInfos() fwk.StorageInfoLister {
5656
return lister.delegate.StorageInfos()
5757
}
5858

5959
// ResourceClaims returns a ResourceClaimTracker.
60-
func (lister *DelegatingSchedulerSharedLister) ResourceClaims() schedulerframework.ResourceClaimTracker {
60+
func (lister *DelegatingSchedulerSharedLister) ResourceClaims() fwk.ResourceClaimTracker {
6161
return lister.delegate.ResourceClaims()
6262
}
6363

6464
// ResourceSlices returns a ResourceSliceLister.
65-
func (lister *DelegatingSchedulerSharedLister) ResourceSlices() schedulerframework.ResourceSliceLister {
65+
func (lister *DelegatingSchedulerSharedLister) ResourceSlices() fwk.ResourceSliceLister {
6666
return lister.delegate.ResourceSlices()
6767
}
6868

6969
// DeviceClasses returns a DeviceClassLister.
70-
func (lister *DelegatingSchedulerSharedLister) DeviceClasses() schedulerframework.DeviceClassLister {
70+
func (lister *DelegatingSchedulerSharedLister) DeviceClasses() fwk.DeviceClassLister {
7171
return lister.delegate.DeviceClasses()
7272
}
7373

@@ -81,12 +81,18 @@ func (lister *DelegatingSchedulerSharedLister) ResetDelegate() {
8181
lister.delegate = unsetSharedListerSingleton
8282
}
8383

84+
// DeviceClassResolver returns a DeviceClassResolver.
85+
func (lister *DelegatingSchedulerSharedLister) DeviceClassResolver() fwk.DeviceClassResolver {
86+
return lister.delegate.DeviceClassResolver()
87+
}
88+
8489
type unsetSharedLister struct{}
8590
type unsetNodeInfoLister unsetSharedLister
8691
type unsetStorageInfoLister unsetSharedLister
8792
type unsetResourceClaimTracker unsetSharedLister
8893
type unsetResourceSliceLister unsetSharedLister
8994
type unsetDeviceClassLister unsetSharedLister
95+
type unsetDeviceClassResolver unsetSharedLister
9096

9197
// List always returns an error
9298
func (lister *unsetNodeInfoLister) List() ([]fwk.NodeInfo, error) {
@@ -162,26 +168,35 @@ func (u unsetDeviceClassLister) Get(className string) (*resourceapi.DeviceClass,
162168
return nil, fmt.Errorf("lister not set in delegate")
163169
}
164170

171+
func (u unsetDeviceClassResolver) GetDeviceClass(resourceName corev1.ResourceName) string {
172+
klog.Errorf("lister not set in delegate")
173+
return ""
174+
}
175+
165176
// NodeInfos returns a fake NodeInfoLister which always returns an error
166-
func (lister *unsetSharedLister) NodeInfos() schedulerframework.NodeInfoLister {
177+
func (lister *unsetSharedLister) NodeInfos() fwk.NodeInfoLister {
167178
return (*unsetNodeInfoLister)(lister)
168179
}
169180

170181
// StorageInfos returns a fake StorageInfoLister which always returns an error
171-
func (lister *unsetSharedLister) StorageInfos() schedulerframework.StorageInfoLister {
182+
func (lister *unsetSharedLister) StorageInfos() fwk.StorageInfoLister {
172183
return (*unsetStorageInfoLister)(lister)
173184
}
174185

175-
func (lister *unsetSharedLister) ResourceClaims() schedulerframework.ResourceClaimTracker {
186+
func (lister *unsetSharedLister) ResourceClaims() fwk.ResourceClaimTracker {
176187
return (*unsetResourceClaimTracker)(lister)
177188
}
178189

179-
func (lister *unsetSharedLister) ResourceSlices() schedulerframework.ResourceSliceLister {
190+
func (lister *unsetSharedLister) ResourceSlices() fwk.ResourceSliceLister {
180191
return (*unsetResourceSliceLister)(lister)
181192
}
182193

183-
func (lister *unsetSharedLister) DeviceClasses() schedulerframework.DeviceClassLister {
194+
func (lister *unsetSharedLister) DeviceClasses() fwk.DeviceClassLister {
184195
return (*unsetDeviceClassLister)(lister)
185196
}
186197

198+
func (lister *unsetSharedLister) DeviceClassResolver() fwk.DeviceClassResolver {
199+
return (*unsetDeviceClassResolver)(lister)
200+
}
201+
187202
var unsetSharedListerSingleton *unsetSharedLister

0 commit comments

Comments
 (0)