ensure work with given replicas
Signed-off-by: junqian <junqian@tencent.com>
This commit is contained in:
parent
ed2f9fc25f
commit
ffe285ea2a
|
@ -92,7 +92,7 @@ func (c *ResourceBindingController) syncBinding(binding *workv1alpha1.ResourceBi
|
|||
return controllerruntime.Result{Requeue: true}, err
|
||||
}
|
||||
|
||||
err = helper.EnsureWork(c.Client, workload, clusterNames, c.OverrideManager, binding, apiextensionsv1.NamespaceScoped)
|
||||
err = helper.EnsureWork(c.Client, workload, clusterNames, binding.Spec.Clusters, c.OverrideManager, binding, apiextensionsv1.NamespaceScoped)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to transform resourceBinding(%s/%s) to works. Error: %v.",
|
||||
binding.GetNamespace(), binding.GetName(), err)
|
||||
|
|
|
@ -88,7 +88,7 @@ func (c *ClusterResourceBindingController) syncBinding(binding *workv1alpha1.Clu
|
|||
return controllerruntime.Result{Requeue: true}, err
|
||||
}
|
||||
|
||||
err = helper.EnsureWork(c.Client, workload, clusterNames, c.OverrideManager, binding, apiextensionsv1.ClusterScoped)
|
||||
err = helper.EnsureWork(c.Client, workload, clusterNames, binding.Spec.Clusters, c.OverrideManager, binding, apiextensionsv1.ClusterScoped)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to transform clusterResourceBinding(%s) to works. Error: %v.", binding.GetName(), err)
|
||||
return controllerruntime.Result{Requeue: true}, err
|
||||
|
|
|
@ -69,6 +69,16 @@ func IsBindingReady(targetClusters []workv1alpha1.TargetCluster) bool {
|
|||
return len(targetClusters) != 0
|
||||
}
|
||||
|
||||
// HasScheduledReplica checks if the scheduler has assigned replicas for each cluster.
|
||||
func HasScheduledReplica(scheduleResult []workv1alpha1.TargetCluster) bool {
|
||||
for _, clusterResult := range scheduleResult {
|
||||
if clusterResult.Replicas > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// GetBindingClusterNames will get clusterName list from bind clusters field
|
||||
func GetBindingClusterNames(targetClusters []workv1alpha1.TargetCluster) []string {
|
||||
var clusterNames []string
|
||||
|
@ -153,12 +163,20 @@ func FetchWorkload(dynamicClient dynamic.Interface, restMapper meta.RESTMapper,
|
|||
// EnsureWork ensure Work to be created or updated.
|
||||
//nolint:gocyclo
|
||||
// Note: ignore the cyclomatic complexity issue to get gocyclo on board. Tracked by: https://github.com/karmada-io/karmada/issues/460
|
||||
func EnsureWork(c client.Client, workload *unstructured.Unstructured, clusterNames []string, overrideManager overridemanager.OverrideManager,
|
||||
binding metav1.Object, scope apiextensionsv1.ResourceScope) error {
|
||||
referenceRSP, desireReplicaInfos, err := calculateReplicasIfNeeded(c, workload, clusterNames)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to get ReplicaSchedulingPolicy for %s/%s/%s, err is: %v", workload.GetKind(), workload.GetNamespace(), workload.GetName(), err)
|
||||
return err
|
||||
func EnsureWork(c client.Client, workload *unstructured.Unstructured, clusterNames []string, scheduleResult []workv1alpha1.TargetCluster,
|
||||
overrideManager overridemanager.OverrideManager, binding metav1.Object, scope apiextensionsv1.ResourceScope) error {
|
||||
var desireReplicaInfos map[string]int64
|
||||
var referenceRSP *v1alpha1.ReplicaSchedulingPolicy
|
||||
var err error
|
||||
hasScheduledReplica := HasScheduledReplica(scheduleResult)
|
||||
if hasScheduledReplica {
|
||||
desireReplicaInfos = transScheduleResultToMap(scheduleResult)
|
||||
} else {
|
||||
referenceRSP, desireReplicaInfos, err = calculateReplicasIfNeeded(c, workload, clusterNames)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to get ReplicaSchedulingPolicy for %s/%s/%s, err is: %v", workload.GetKind(), workload.GetNamespace(), workload.GetName(), err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var workLabel = make(map[string]string)
|
||||
|
@ -192,7 +210,7 @@ func EnsureWork(c client.Client, workload *unstructured.Unstructured, clusterNam
|
|||
workLabel[util.ClusterResourceBindingLabel] = binding.GetName()
|
||||
}
|
||||
|
||||
if clonedWorkload.GetKind() == util.DeploymentKind && referenceRSP != nil {
|
||||
if clonedWorkload.GetKind() == util.DeploymentKind && (referenceRSP != nil || hasScheduledReplica) {
|
||||
err = applyReplicaSchedulingPolicy(clonedWorkload, desireReplicaInfos[clusterName])
|
||||
if err != nil {
|
||||
klog.Errorf("failed to apply ReplicaSchedulingPolicy for %s/%s/%s in cluster %s, err is: %v",
|
||||
|
@ -279,6 +297,14 @@ func EnsureWork(c client.Client, workload *unstructured.Unstructured, clusterNam
|
|||
return nil
|
||||
}
|
||||
|
||||
func transScheduleResultToMap(scheduleResult []workv1alpha1.TargetCluster) map[string]int64 {
|
||||
var desireReplicaInfos = make(map[string]int64)
|
||||
for _, clusterInfo := range scheduleResult {
|
||||
desireReplicaInfos[clusterInfo.Name] = int64(clusterInfo.Replicas)
|
||||
}
|
||||
return desireReplicaInfos
|
||||
}
|
||||
|
||||
func calculateReplicasIfNeeded(c client.Client, workload *unstructured.Unstructured, clusterNames []string) (*v1alpha1.ReplicaSchedulingPolicy, map[string]int64, error) {
|
||||
var err error
|
||||
var referenceRSP *v1alpha1.ReplicaSchedulingPolicy
|
||||
|
|
Loading…
Reference in New Issue