From 0122d36d820b07c52f1a87b27da8ff8f27eca212 Mon Sep 17 00:00:00 2001 From: Hanbo Li Date: Fri, 28 May 2021 09:32:07 +0800 Subject: [PATCH] reschedule resource bindings when reference cluster propagation policy update (#381) Signed-off-by: lihanbo --- .../example/policy_with_labelSelector.yaml | 4 +- pkg/scheduler/scheduler.go | 70 +++++++++++++------ 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/artifacts/example/policy_with_labelSelector.yaml b/artifacts/example/policy_with_labelSelector.yaml index ebdc84549..66707e64f 100644 --- a/artifacts/example/policy_with_labelSelector.yaml +++ b/artifacts/example/policy_with_labelSelector.yaml @@ -21,6 +21,6 @@ spec: - cluster1 spreadConstraints: - spreadByLabel: failuredomain.kubernetes.io/zone - maximum: 3 - minimum: 3 + maxGroups: 3 + minGroups: 3 schedulerName: default diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index 9110bd656..c33f0d56e 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -199,21 +199,11 @@ func (s *Scheduler) onPropagationPolicyUpdate(old, cur interface{}) { util.PropagationPolicyNameLabel: oldPropagationPolicy.Name, }) - referenceBindings, err := s.bindingLister.List(selector) + err := s.requeueResourceBindings(selector) if err != nil { - klog.Errorf("Failed to list ResourceBinding by selector: %s, error: %v", selector.String(), err) + klog.Errorf("Failed to requeue ResourceBinding, error: %v", 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) - continue - } - klog.Infof("Requeue ResourceBinding(%s/%s) as placement changed.", binding.Namespace, binding.Name) - s.queue.Add(key) - } } func (s *Scheduler) onClusterPropagationPolicyUpdate(old, cur interface{}) { @@ -228,20 +218,14 @@ func (s *Scheduler) onClusterPropagationPolicyUpdate(old, cur interface{}) { util.ClusterPropagationPolicyLabel: oldClusterPropagationPolicy.Name, }) - referenceClusterResourceBindings, err := s.clusterBindingLister.List(selector) + err := s.requeueClusterResourceBindings(selector) if err != nil { - klog.Errorf("Failed to list ClusterResourceBinding by selector: %s, error: %v", selector.String(), err) - return + klog.Errorf("Failed to requeue ClusterResourceBinding, error: %v", err) } - for _, clusterResourceBinding := range referenceClusterResourceBindings { - key, err := cache.MetaNamespaceKeyFunc(clusterResourceBinding) - if err != nil { - klog.Errorf("couldn't get key for object %#v: %v", clusterResourceBinding, err) - continue - } - klog.Infof("Requeue ClusterResourceBinding(%s) as placement changed.", clusterResourceBinding.Name) - s.queue.Add(key) + err = s.requeueResourceBindings(selector) + if err != nil { + klog.Errorf("Failed to requeue ResourceBinding, error: %v", err) } } @@ -250,6 +234,46 @@ func (s *Scheduler) worker() { } } +// requeueResourceBindings will retrieve all ResourceBinding objects by the label selector and put them to queue. +func (s *Scheduler) requeueResourceBindings(selector labels.Selector) error { + referenceBindings, err := s.bindingLister.List(selector) + if err != nil { + klog.Errorf("Failed to list ResourceBinding by selector: %s, error: %v", selector.String(), err) + return err + } + + for _, binding := range referenceBindings { + key, err := cache.MetaNamespaceKeyFunc(binding) + if err != nil { + klog.Errorf("couldn't get key for ResourceBinding(%s/%s): %v", binding.Namespace, binding.Name, err) + continue + } + klog.Infof("Requeue ResourceBinding(%s/%s) as placement changed.", binding.Namespace, binding.Name) + s.queue.Add(key) + } + return nil +} + +// requeueClusterResourceBindings will retrieve all ClusterResourceBinding objects by the label selector and put them to queue. +func (s *Scheduler) requeueClusterResourceBindings(selector labels.Selector) error { + referenceClusterResourceBindings, err := s.clusterBindingLister.List(selector) + if err != nil { + klog.Errorf("Failed to list ClusterResourceBinding by selector: %s, error: %v", selector.String(), err) + return err + } + + for _, clusterResourceBinding := range referenceClusterResourceBindings { + key, err := cache.MetaNamespaceKeyFunc(clusterResourceBinding) + if err != nil { + klog.Errorf("couldn't get key for ClusterResourceBinding(%s): %v", clusterResourceBinding.Name, err) + continue + } + klog.Infof("Requeue ClusterResourceBinding(%s) as placement changed.", clusterResourceBinding.Name) + s.queue.Add(key) + } + return nil +} + func (s *Scheduler) getPlacement(resourceBinding *workv1alpha1.ResourceBinding) (policyv1alpha1.Placement, string, error) { var placement policyv1alpha1.Placement var clusterPolicyName string