reschedule when propagationPolicies changed (#190)
Signed-off-by: lihanbo <lihanbo2@huawei.com>
This commit is contained in:
parent
48e7782d4f
commit
7a8eca1bfb
|
@ -2,11 +2,14 @@ package scheduler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/api/equality"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
|
@ -23,6 +26,7 @@ import (
|
||||||
schedulercache "github.com/karmada-io/karmada/pkg/scheduler/cache"
|
schedulercache "github.com/karmada-io/karmada/pkg/scheduler/cache"
|
||||||
"github.com/karmada-io/karmada/pkg/scheduler/core"
|
"github.com/karmada-io/karmada/pkg/scheduler/core"
|
||||||
"github.com/karmada-io/karmada/pkg/scheduler/framework/plugins/clusteraffinity"
|
"github.com/karmada-io/karmada/pkg/scheduler/framework/plugins/clusteraffinity"
|
||||||
|
"github.com/karmada-io/karmada/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -82,6 +86,10 @@ func NewScheduler(dynamicClient dynamic.Interface, karmadaClient karmadaclientse
|
||||||
UpdateFunc: sched.onPropagationBindingUpdate,
|
UpdateFunc: sched.onPropagationBindingUpdate,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
policyInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
|
UpdateFunc: sched.onPropagationPolicyUpdate,
|
||||||
|
})
|
||||||
|
|
||||||
memclusterInformer := factory.Cluster().V1alpha1().Clusters().Informer()
|
memclusterInformer := factory.Cluster().V1alpha1().Clusters().Informer()
|
||||||
memclusterInformer.AddEventHandler(
|
memclusterInformer.AddEventHandler(
|
||||||
cache.ResourceEventHandlerFuncs{
|
cache.ResourceEventHandlerFuncs{
|
||||||
|
@ -127,6 +135,36 @@ func (s *Scheduler) onPropagationBindingUpdate(old, cur interface{}) {
|
||||||
s.onPropagationBindingAdd(cur)
|
s.onPropagationBindingAdd(cur)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Scheduler) onPropagationPolicyUpdate(old, cur interface{}) {
|
||||||
|
oldPropagationPolicy := old.(*v1alpha1.PropagationPolicy)
|
||||||
|
curPropagationPolicy := cur.(*v1alpha1.PropagationPolicy)
|
||||||
|
if equality.Semantic.DeepEqual(oldPropagationPolicy.Spec.Placement, curPropagationPolicy.Spec.Placement) {
|
||||||
|
klog.V(2).Infof("Ignore PropagationPolicy(%s/%s) which placement unchanged.", oldPropagationPolicy.Namespace, oldPropagationPolicy.Name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
selector := labels.SelectorFromSet(labels.Set{
|
||||||
|
util.PropagationPolicyNamespaceLabel: oldPropagationPolicy.Namespace,
|
||||||
|
util.PropagationPolicyNameLabel: oldPropagationPolicy.Name,
|
||||||
|
})
|
||||||
|
|
||||||
|
referenceBindings, err := s.bindingLister.List(selector)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("Failed to list PropagationBindings by selector: %s, error: %v", selector.String(), err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, binding := range referenceBindings {
|
||||||
|
key, err := cache.MetaNamespaceKeyFunc(binding)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("couldn't get key for object %#v: %v", binding, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
klog.Infof("Requeue PropagationBinding(%s/%s) as placement changed.", binding.Namespace, binding.Name)
|
||||||
|
s.queue.Add(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Scheduler) worker() {
|
func (s *Scheduler) worker() {
|
||||||
for s.scheduleNext() {
|
for s.scheduleNext() {
|
||||||
}
|
}
|
||||||
|
@ -171,6 +209,25 @@ func (s *Scheduler) scheduleOne(key string) (err error) {
|
||||||
targetClusters[i] = v1alpha1.TargetCluster{Name: cluster}
|
targetClusters[i] = v1alpha1.TargetCluster{Name: cluster}
|
||||||
}
|
}
|
||||||
binding.Spec.Clusters = targetClusters
|
binding.Spec.Clusters = targetClusters
|
||||||
|
|
||||||
|
policyNamespace := util.GetLabelValue(binding.Labels, util.PropagationPolicyNamespaceLabel)
|
||||||
|
policyName := util.GetLabelValue(binding.Labels, util.PropagationPolicyNameLabel)
|
||||||
|
|
||||||
|
policy, err := s.policyLister.PropagationPolicies(policyNamespace).Get(policyName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
placement, err := json.Marshal(policy.Spec.Placement)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("Failed to marshal placement of propagationPolicy %s/%s, error: %v", policyNamespace, policyName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if binding.Annotations == nil {
|
||||||
|
binding.Annotations = make(map[string]string)
|
||||||
|
}
|
||||||
|
binding.Annotations[util.PolicyPlacementAnnotation] = string(placement)
|
||||||
|
|
||||||
_, err = s.KarmadaClient.PolicyV1alpha1().PropagationBindings(ns).Update(context.TODO(), binding, metav1.UpdateOptions{})
|
_, err = s.KarmadaClient.PolicyV1alpha1().PropagationBindings(ns).Update(context.TODO(), binding, metav1.UpdateOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in New Issue