Skip to content

Commit efc2757

Browse files
committed
Expose assignReplicas and selectClusters function in scheduler
Signed-off-by: chaosi-zju <[email protected]>
1 parent bf1098b commit efc2757

File tree

2 files changed

+61
-37
lines changed

2 files changed

+61
-37
lines changed

pkg/scheduler/core/common.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package core
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
8+
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
9+
workv1alpha2 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha2"
10+
"github.com/karmada-io/karmada/pkg/scheduler/core/spreadconstraint"
11+
"github.com/karmada-io/karmada/pkg/scheduler/framework"
12+
"github.com/karmada-io/karmada/pkg/scheduler/metrics"
13+
)
14+
15+
func SelectClusters(clustersScore framework.ClusterScoreList,
16+
placement *policyv1alpha1.Placement, spec *workv1alpha2.ResourceBindingSpec) ([]*clusterv1alpha1.Cluster, error) {
17+
startTime := time.Now()
18+
defer metrics.ScheduleStep(metrics.ScheduleStepSelect, startTime)
19+
20+
groupClustersInfo := spreadconstraint.GroupClustersWithScore(clustersScore, placement, spec, calAvailableReplicas)
21+
return spreadconstraint.SelectBestClusters(placement, groupClustersInfo, spec.Replicas)
22+
}
23+
24+
func AssignReplicas(
25+
clusters []*clusterv1alpha1.Cluster,
26+
placement *policyv1alpha1.Placement,
27+
object *workv1alpha2.ResourceBindingSpec,
28+
) ([]workv1alpha2.TargetCluster, error) {
29+
startTime := time.Now()
30+
defer metrics.ScheduleStep(metrics.ScheduleStepAssignReplicas, startTime)
31+
32+
if len(clusters) == 0 {
33+
return nil, fmt.Errorf("no clusters available to schedule")
34+
}
35+
36+
if object.Replicas > 0 {
37+
state := newAssignState(clusters, placement, object)
38+
assignFunc, ok := assignFuncMap[state.strategyType]
39+
if !ok {
40+
// should never happen at present
41+
return nil, fmt.Errorf("unsupported replica scheduling strategy, replicaSchedulingType: %s, replicaDivisionPreference: %s, "+
42+
"please try another scheduling strategy", placement.ReplicaSchedulingType(), placement.ReplicaScheduling.ReplicaDivisionPreference)
43+
}
44+
assignResults, err := assignFunc(state)
45+
if err != nil {
46+
return nil, err
47+
}
48+
return removeZeroReplicasCluster(assignResults), nil
49+
}
50+
51+
// If not workload, assign all clusters without considering replicas.
52+
targetClusters := make([]workv1alpha2.TargetCluster, len(clusters))
53+
for i, cluster := range clusters {
54+
targetClusters[i] = workv1alpha2.TargetCluster{Name: cluster.Name}
55+
}
56+
return targetClusters, nil
57+
}

pkg/scheduler/core/generic_scheduler.go

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
1212
workv1alpha2 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha2"
1313
"github.com/karmada-io/karmada/pkg/scheduler/cache"
14-
"github.com/karmada-io/karmada/pkg/scheduler/core/spreadconstraint"
1514
"github.com/karmada-io/karmada/pkg/scheduler/framework"
1615
"github.com/karmada-io/karmada/pkg/scheduler/framework/runtime"
1716
"github.com/karmada-io/karmada/pkg/scheduler/metrics"
@@ -159,44 +158,12 @@ func (g *genericScheduler) prioritizeClusters(
159158

160159
func (g *genericScheduler) selectClusters(clustersScore framework.ClusterScoreList,
161160
placement *policyv1alpha1.Placement, spec *workv1alpha2.ResourceBindingSpec) ([]*clusterv1alpha1.Cluster, error) {
162-
startTime := time.Now()
163-
defer metrics.ScheduleStep(metrics.ScheduleStepSelect, startTime)
164161

165-
groupClustersInfo := spreadconstraint.GroupClustersWithScore(clustersScore, placement, spec, calAvailableReplicas)
166-
return spreadconstraint.SelectBestClusters(placement, groupClustersInfo, spec.Replicas)
162+
return SelectClusters(clustersScore, placement, spec)
167163
}
168164

169-
func (g *genericScheduler) assignReplicas(
170-
clusters []*clusterv1alpha1.Cluster,
171-
placement *policyv1alpha1.Placement,
172-
object *workv1alpha2.ResourceBindingSpec,
173-
) ([]workv1alpha2.TargetCluster, error) {
174-
startTime := time.Now()
175-
defer metrics.ScheduleStep(metrics.ScheduleStepAssignReplicas, startTime)
165+
func (g *genericScheduler) assignReplicas(clusters []*clusterv1alpha1.Cluster, placement *policyv1alpha1.Placement,
166+
object *workv1alpha2.ResourceBindingSpec) ([]workv1alpha2.TargetCluster, error) {
176167

177-
if len(clusters) == 0 {
178-
return nil, fmt.Errorf("no clusters available to schedule")
179-
}
180-
181-
if object.Replicas > 0 {
182-
state := newAssignState(clusters, placement, object)
183-
assignFunc, ok := assignFuncMap[state.strategyType]
184-
if !ok {
185-
// should never happen at present
186-
return nil, fmt.Errorf("unsupported replica scheduling strategy, replicaSchedulingType: %s, replicaDivisionPreference: %s, "+
187-
"please try another scheduling strategy", placement.ReplicaSchedulingType(), placement.ReplicaScheduling.ReplicaDivisionPreference)
188-
}
189-
assignResults, err := assignFunc(state)
190-
if err != nil {
191-
return nil, err
192-
}
193-
return removeZeroReplicasCluster(assignResults), nil
194-
}
195-
196-
// If not workload, assign all clusters without considering replicas.
197-
targetClusters := make([]workv1alpha2.TargetCluster, len(clusters))
198-
for i, cluster := range clusters {
199-
targetClusters[i] = workv1alpha2.TargetCluster{Name: cluster.Name}
200-
}
201-
return targetClusters, nil
168+
return AssignReplicas(clusters, placement, object)
202169
}

0 commit comments

Comments
 (0)