Skip to content

Commit 58f128a

Browse files
committed
Update pb.MaxAvailableComponentSetsRequest to hold namespace under root
Signed-off-by: RainbowMango <[email protected]>
1 parent 9da6343 commit 58f128a

File tree

12 files changed

+635
-172
lines changed

12 files changed

+635
-172
lines changed

pkg/estimator/client/accurate.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,7 @@ func (se *SchedulerEstimator) GetUnschedulableReplicas(
8989
})
9090
}
9191

92-
func (se *SchedulerEstimator) maxAvailableComponentSets(
93-
ctx context.Context,
94-
cluster string,
95-
namespace string,
96-
components []workv1alpha2.Component,
97-
) (int32, error) {
92+
func (se *SchedulerEstimator) maxAvailableComponentSets(ctx context.Context, cluster string, namespace string, components []workv1alpha2.Component) (int32, error) {
9893
client, err := se.cache.GetClient(cluster)
9994
if err != nil {
10095
return 0, err
@@ -103,6 +98,7 @@ func (se *SchedulerEstimator) maxAvailableComponentSets(
10398
pbReq := &pb.MaxAvailableComponentSetsRequest{
10499
Cluster: cluster,
105100
Components: make([]pb.Component, 0, len(components)),
101+
Namespace: namespace,
106102
}
107103

108104
for _, comp := range components {
@@ -115,7 +111,7 @@ func (se *SchedulerEstimator) maxAvailableComponentSets(
115111
pbReq.Components = append(pbReq.Components, pb.Component{
116112
Name: comp.Name,
117113
Replicas: comp.Replicas,
118-
ReplicaRequirements: toPBReplicaRequirements(cr, namespace),
114+
ReplicaRequirements: toPBReplicaRequirements(cr),
119115
})
120116
}
121117

@@ -126,10 +122,9 @@ func (se *SchedulerEstimator) maxAvailableComponentSets(
126122
return res.MaxSets, nil
127123
}
128124

129-
// toPBReplicaRequirements converts the API ComponentReplicaRequirements to the pb.ReplicaRequirements value.
130-
func toPBReplicaRequirements(cr *workv1alpha2.ComponentReplicaRequirements, namespace string) pb.ReplicaRequirements {
131-
var out pb.ReplicaRequirements
132-
out.Namespace = namespace
125+
// toPBReplicaRequirements converts the API ComponentReplicaRequirements to the pb.ComponentReplicaRequirements value.
126+
func toPBReplicaRequirements(cr *workv1alpha2.ComponentReplicaRequirements) pb.ComponentReplicaRequirements {
127+
var out pb.ComponentReplicaRequirements
133128
if cr == nil {
134129
return out
135130
}

pkg/estimator/pb/generated.pb.go

Lines changed: 506 additions & 71 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/estimator/pb/generated.proto

Lines changed: 24 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/estimator/pb/types.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,16 @@ type MaxAvailableComponentSetsRequest struct {
124124
// Cluster is the target cluster where the scheduling estimation is performed.
125125
// +required
126126
Cluster string `json:"cluster" protobuf:"bytes,1,opt,name=cluster"`
127+
127128
// Components lists the component types that form one full workload set,
128129
// along with their resource and replica requirements.
129130
// +required
130131
Components []Component `json:"components" protobuf:"bytes,2,rep,name=components"`
132+
133+
// Namespace is the namespace of the workload being estimated.
134+
// It is used by the accurate estimator to check the quota configurations
135+
// in the target member cluster.
136+
Namespace string `json:"namespace" protobuf:"bytes,3,opt,name=namespace"`
131137
}
132138

133139
// Component defines the scheduling and resource requirements for a single
@@ -136,15 +142,35 @@ type Component struct {
136142
// Name is the identifier of the component within the workload set.
137143
// +required
138144
Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
145+
139146
// ReplicaRequirements specifies the per-replica resource requirements
140147
// (CPU, memory, etc.) and scheduling constraints.
141148
// +required
142-
ReplicaRequirements ReplicaRequirements `json:"replicaRequirements" protobuf:"bytes,2,opt,name=replicaRequirements"`
149+
ReplicaRequirements ComponentReplicaRequirements `json:"replicaRequirements" protobuf:"bytes,2,opt,name=replicaRequirements"`
150+
143151
// Replicas is the number of replicas of this component required in a single workload set.
144152
// +required
145153
Replicas int32 `json:"replicas" protobuf:"varint,3,opt,name=replicas"`
146154
}
147155

156+
// ComponentReplicaRequirements represents the requirements required by each replica.
157+
type ComponentReplicaRequirements struct {
158+
// NodeClaim represents the NodeAffinity, NodeSelector and Tolerations required by each replica.
159+
// +optional
160+
NodeClaim *NodeClaim `json:"nodeClaim,omitempty" protobuf:"bytes,1,opt,name=nodeClaim"`
161+
162+
// ResourceRequest represents the resources required by each replica.
163+
// +optional
164+
ResourceRequest corev1.ResourceList `json:"resourceRequest,omitempty" protobuf:"bytes,2,rep,name=resourceRequest,casttype=k8s.io/api/core/v1.ResourceList,castkey=k8s.io/api/core/v1.ResourceName"`
165+
166+
// PriorityClassName represents the priority class name for a given ResourceRequest
167+
// Resource quotas are introduced for multi tenants sharing a cluster
168+
// Besides estimate the replica based on nodes' resources, we need to consider the resource quota of a ResourceRequest
169+
// ResourceQuota have an associated set of scopes, one of them is priority class
170+
// +optional
171+
PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,3,opt,name=priorityClassName"`
172+
}
173+
148174
// MaxAvailableComponentSetsResponse is the gRPC response message containing the
149175
// maximum number of complete component sets that can be scheduled.
150176
type MaxAvailableComponentSetsResponse struct {

pkg/estimator/server/estimate.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (es *AccurateSchedulerEstimatorServer) EstimateComponents(ctx context.Conte
8181
return 0, nil
8282
}
8383

84-
maxAvailableComponentSets, err := es.estimateComponents(ctx, snapShot, request.Components)
84+
maxAvailableComponentSets, err := es.estimateComponents(ctx, snapShot, request.Components, request.Namespace)
8585
if err != nil {
8686
return 0, err
8787
}
@@ -90,12 +90,8 @@ func (es *AccurateSchedulerEstimatorServer) EstimateComponents(ctx context.Conte
9090
return maxAvailableComponentSets, nil
9191
}
9292

93-
func (es *AccurateSchedulerEstimatorServer) estimateComponents(
94-
ctx context.Context,
95-
snapshot *schedcache.Snapshot,
96-
components []pb.Component,
97-
) (int32, error) {
98-
maxSets, ret := es.estimateFramework.RunEstimateComponentsPlugins(ctx, snapshot, components)
93+
func (es *AccurateSchedulerEstimatorServer) estimateComponents(ctx context.Context, snapshot *schedcache.Snapshot, components []pb.Component, namespace string) (int32, error) {
94+
maxSets, ret := es.estimateFramework.RunEstimateComponentsPlugins(ctx, snapshot, components, namespace)
9995

10096
// No replicas can be scheduled on the cluster, skip further checks and return 0
10197
if ret.IsUnschedulable() {

pkg/estimator/server/framework/interface.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ type Framework interface {
4444
// The integer represents the minimum calculated value of estimated component sets from each EstimateComponentsPlugin.
4545
// The Result contains code, reasons and error.
4646
// It is merged from all plugins' returned result codes.
47-
RunEstimateComponentsPlugins(ctx context.Context, snapshot *schedcache.Snapshot, components []pb.Component) (int32, *Result)
47+
RunEstimateComponentsPlugins(ctx context.Context, snapshot *schedcache.Snapshot, components []pb.Component, namespace string) (int32, *Result)
4848
// TODO(wengyao04): we can add filter and score plugin extension points if needed in the future
4949
}
5050

@@ -75,7 +75,7 @@ type EstimateComponentsPlugin interface {
7575
// The integer represents the estimated number of complete component sets that can be scheduled.
7676
// The Result contains code, reasons and error.
7777
// It is merged from all plugins' returned result codes.
78-
EstimateComponents(ctx context.Context, snapshot *schedcache.Snapshot, components []pb.Component) (int32, *Result)
78+
EstimateComponents(ctx context.Context, snapshot *schedcache.Snapshot, components []pb.Component, namespace string) (int32, *Result)
7979
}
8080

8181
// Handle provides data and some tools that plugins can use. It is

pkg/estimator/server/framework/plugins/noderesource/noderesource.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (pl *nodeResourceEstimator) nodeMaxAvailableReplica(node *schedulerframewor
112112

113113
// EstimateComponents estimates the maximum number of complete component sets that can be scheduled.
114114
// It returns the number of sets that can fit on the available node resources.
115-
func (pl *nodeResourceEstimator) EstimateComponents(_ context.Context, snapshot *schedcache.Snapshot, components []pb.Component) (int32, *framework.Result) {
115+
func (pl *nodeResourceEstimator) EstimateComponents(_ context.Context, snapshot *schedcache.Snapshot, components []pb.Component, _ string) (int32, *framework.Result) {
116116
if !pl.enabled {
117117
klog.V(5).Info("Estimator Plugin", "name", Name, "enabled", pl.enabled)
118118
return noNodeConstraint, framework.NewResult(framework.Noopperation, fmt.Sprintf("%s is disabled", pl.Name()))

pkg/estimator/server/framework/plugins/noderesource/noderesource_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
5252
},
5353
components: []pb.Component{
5454
{
55-
ReplicaRequirements: pb.ReplicaRequirements{
55+
ReplicaRequirements: pb.ComponentReplicaRequirements{
5656
ResourceRequest: corev1.ResourceList{
5757
corev1.ResourceCPU: resource.MustParse("1"),
5858
corev1.ResourceMemory: resource.MustParse("1Gi"),
@@ -76,7 +76,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
7676
},
7777
components: []pb.Component{
7878
{
79-
ReplicaRequirements: pb.ReplicaRequirements{
79+
ReplicaRequirements: pb.ComponentReplicaRequirements{
8080
ResourceRequest: corev1.ResourceList{
8181
corev1.ResourceCPU: resource.MustParse("1"),
8282
corev1.ResourceMemory: resource.MustParse("1Gi"),
@@ -100,7 +100,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
100100
},
101101
components: []pb.Component{
102102
{
103-
ReplicaRequirements: pb.ReplicaRequirements{
103+
ReplicaRequirements: pb.ComponentReplicaRequirements{
104104
ResourceRequest: corev1.ResourceList{
105105
corev1.ResourceCPU: resource.MustParse("1"),
106106
corev1.ResourceMemory: resource.MustParse("1Gi"),
@@ -124,7 +124,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
124124
},
125125
components: []pb.Component{
126126
{
127-
ReplicaRequirements: pb.ReplicaRequirements{
127+
ReplicaRequirements: pb.ComponentReplicaRequirements{
128128
ResourceRequest: corev1.ResourceList{
129129
corev1.ResourceCPU: resource.MustParse("2"),
130130
corev1.ResourceMemory: resource.MustParse("2Gi"),
@@ -133,7 +133,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
133133
Replicas: 1,
134134
},
135135
{
136-
ReplicaRequirements: pb.ReplicaRequirements{
136+
ReplicaRequirements: pb.ComponentReplicaRequirements{
137137
ResourceRequest: corev1.ResourceList{
138138
corev1.ResourceCPU: resource.MustParse("3"),
139139
corev1.ResourceMemory: resource.MustParse("3Gi"),
@@ -162,7 +162,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
162162
},
163163
components: []pb.Component{
164164
{
165-
ReplicaRequirements: pb.ReplicaRequirements{
165+
ReplicaRequirements: pb.ComponentReplicaRequirements{
166166
ResourceRequest: corev1.ResourceList{
167167
corev1.ResourceCPU: resource.MustParse("3"),
168168
corev1.ResourceMemory: resource.MustParse("3Gi"),
@@ -171,7 +171,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
171171
Replicas: 2,
172172
},
173173
{
174-
ReplicaRequirements: pb.ReplicaRequirements{
174+
ReplicaRequirements: pb.ComponentReplicaRequirements{
175175
ResourceRequest: corev1.ResourceList{
176176
corev1.ResourceCPU: resource.MustParse("2"),
177177
corev1.ResourceMemory: resource.MustParse("2Gi"),
@@ -195,7 +195,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
195195
},
196196
components: []pb.Component{
197197
{
198-
ReplicaRequirements: pb.ReplicaRequirements{
198+
ReplicaRequirements: pb.ComponentReplicaRequirements{
199199
ResourceRequest: corev1.ResourceList{
200200
corev1.ResourceCPU: resource.MustParse("3"),
201201
corev1.ResourceMemory: resource.MustParse("3Gi"),
@@ -225,7 +225,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
225225
},
226226
components: []pb.Component{
227227
{
228-
ReplicaRequirements: pb.ReplicaRequirements{
228+
ReplicaRequirements: pb.ComponentReplicaRequirements{
229229
ResourceRequest: corev1.ResourceList{
230230
corev1.ResourceCPU: resource.MustParse("1"),
231231
corev1.ResourceMemory: resource.MustParse("2Gi"),
@@ -254,7 +254,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
254254
},
255255
components: []pb.Component{
256256
{
257-
ReplicaRequirements: pb.ReplicaRequirements{
257+
ReplicaRequirements: pb.ComponentReplicaRequirements{
258258
ResourceRequest: corev1.ResourceList{
259259
corev1.ResourceCPU: resource.MustParse("1"),
260260
corev1.ResourceMemory: resource.MustParse("1Gi"),
@@ -298,7 +298,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
298298
},
299299
components: []pb.Component{
300300
{
301-
ReplicaRequirements: pb.ReplicaRequirements{
301+
ReplicaRequirements: pb.ComponentReplicaRequirements{
302302
ResourceRequest: corev1.ResourceList{
303303
corev1.ResourceCPU: resource.MustParse("1"),
304304
corev1.ResourceMemory: resource.MustParse("1Gi"),
@@ -352,7 +352,7 @@ func TestNodeResourceEstimator_EstimateComponents(t *testing.T) {
352352
}
353353

354354
// Execute test
355-
result, status := pl.EstimateComponents(context.Background(), snapshot, tt.components)
355+
result, status := pl.EstimateComponents(context.Background(), snapshot, tt.components, "")
356356

357357
// Verify results
358358
if result != tt.expected {

pkg/estimator/server/framework/plugins/resourcequota/resourcequota.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,7 @@ func (pl *resourceQuotaEstimator) Estimate(_ context.Context,
136136
// selectors (e.g., priorityClassName), aggregates their resource requirements, and calculates how
137137
// many complete component sets can fit within the quota. The function returns the minimum allowed
138138
// sets across all ResourceQuotas to ensure all quota constraints are satisfied.
139-
func (pl *resourceQuotaEstimator) EstimateComponents(_ context.Context,
140-
_ *schedcache.Snapshot,
141-
components []pb.Component) (int32, *framework.Result) {
139+
func (pl *resourceQuotaEstimator) EstimateComponents(_ context.Context, _ *schedcache.Snapshot, components []pb.Component, namespace string) (int32, *framework.Result) {
142140
if !pl.enabled {
143141
klog.V(5).Info("Estimator Plugin", "name", Name, "enabled", pl.enabled)
144142
return noQuotaConstraint, framework.NewResult(framework.Noopperation, fmt.Sprintf("%s is disabled", pl.Name()))
@@ -149,8 +147,6 @@ func (pl *resourceQuotaEstimator) EstimateComponents(_ context.Context,
149147
return noQuotaConstraint, framework.NewResult(framework.Noopperation, fmt.Sprintf("%s received empty components list", pl.Name()))
150148
}
151149

152-
namespace := components[0].ReplicaRequirements.Namespace
153-
154150
rqList, err := pl.rqLister.ResourceQuotas(namespace).List(labels.Everything())
155151
if err != nil {
156152
klog.Error(err, "failed to list resource quota", "namespace", namespace)

0 commit comments

Comments
 (0)