From a3ebc74cdedd536853668ae862af32a7f93a1076 Mon Sep 17 00:00:00 2001 From: Hanbo Li Date: Fri, 2 Apr 2021 17:34:04 +0800 Subject: [PATCH] trigger resync for override policy changes (#250) Signed-off-by: lihanbo --- artifacts/example/clusteroverridepolicy.yaml | 18 +++++++ pkg/controllers/binding/binding_controller.go | 49 +++++++++++++++++-- .../cluster_resource_binding_controller.go | 46 ++++++++++++++++- pkg/util/overridemanager/overridemanager.go | 2 +- 4 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 artifacts/example/clusteroverridepolicy.yaml diff --git a/artifacts/example/clusteroverridepolicy.yaml b/artifacts/example/clusteroverridepolicy.yaml new file mode 100644 index 000000000..856449697 --- /dev/null +++ b/artifacts/example/clusteroverridepolicy.yaml @@ -0,0 +1,18 @@ +apiVersion: policy.karmada.io/v1alpha1 +kind: ClusterOverridePolicy +metadata: + name: example-cluster-override +spec: + resourceSelectors: + - apiVersion: apps/v1 + kind: Deployment + name: nginx + namespace: default + targetCluster: + clusterNames: + - member1 + overriders: + plaintext: + - operator: replace + path: /spec/replicas + value: 1 diff --git a/pkg/controllers/binding/binding_controller.go b/pkg/controllers/binding/binding_controller.go index c892826d9..c962c3908 100644 --- a/pkg/controllers/binding/binding_controller.go +++ b/pkg/controllers/binding/binding_controller.go @@ -16,6 +16,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" + policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1" workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1" "github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util/helper" @@ -113,14 +114,14 @@ func (c *ResourceBindingController) SetupWithManager(mgr controllerruntime.Manag var requests []reconcile.Request labels := a.Meta.GetLabels() - _, namespaceExist := labels[util.ResourceBindingNamespaceLabel] - _, nameExist := labels[util.ResourceBindingNameLabel] + resourcebindingNamespace, namespaceExist := labels[util.ResourceBindingNamespaceLabel] + resourcebindingName, nameExist := labels[util.ResourceBindingNameLabel] if !namespaceExist || !nameExist { return nil } namespacesName := types.NamespacedName{ - Namespace: labels[util.ResourceBindingNamespaceLabel], - Name: labels[util.ResourceBindingNameLabel], + Namespace: resourcebindingNamespace, + Name: resourcebindingName, } requests = append(requests, reconcile.Request{NamespacedName: namespacesName}) @@ -129,5 +130,45 @@ func (c *ResourceBindingController) SetupWithManager(mgr controllerruntime.Manag return controllerruntime.NewControllerManagedBy(mgr).For(&workv1alpha1.ResourceBinding{}). Watches(&source.Kind{Type: &workv1alpha1.Work{}}, &handler.EnqueueRequestsFromMapFunc{ToRequests: workFn}, workPredicateFn). + Watches(&source.Kind{Type: &policyv1alpha1.OverridePolicy{}}, &handler.EnqueueRequestsFromMapFunc{ToRequests: c.newOverridePolicyFunc()}). + Watches(&source.Kind{Type: &policyv1alpha1.ClusterOverridePolicy{}}, &handler.EnqueueRequestsFromMapFunc{ToRequests: c.newOverridePolicyFunc()}). Complete(c) } + +func (c *ResourceBindingController) newOverridePolicyFunc() handler.ToRequestsFunc { + return func(a handler.MapObject) []reconcile.Request { + var overrideRS []policyv1alpha1.ResourceSelector + switch t := a.Object.(type) { + case *policyv1alpha1.ClusterOverridePolicy: + overrideRS = t.Spec.ResourceSelectors + case *policyv1alpha1.OverridePolicy: + overrideRS = t.Spec.ResourceSelectors + default: + return nil + } + + bindingList := &workv1alpha1.ResourceBindingList{} + if err := c.Client.List(context.TODO(), bindingList); err != nil { + klog.Errorf("Failed to list resourceBindings, error: %v", err) + return nil + } + + var requests []reconcile.Request + for _, binding := range bindingList.Items { + workload, err := helper.FetchWorkload(c.DynamicClient, c.RESTMapper, binding.Spec.Resource) + if err != nil { + klog.Errorf("Failed to fetch workload for resourceBinding(%s/%s). Error: %v.", binding.Namespace, binding.Name, err) + return nil + } + + for _, rs := range overrideRS { + if util.ResourceMatches(workload, rs) { + klog.V(2).Infof("Enqueue ResourceBinding(%s/%s) as override policy(%s/%s) changes.", binding.Namespace, binding.Name, a.Meta.GetNamespace(), a.Meta.GetName()) + requests = append(requests, reconcile.Request{NamespacedName: types.NamespacedName{Namespace: binding.Namespace, Name: binding.Name}}) + break + } + } + } + return requests + } +} diff --git a/pkg/controllers/binding/cluster_resource_binding_controller.go b/pkg/controllers/binding/cluster_resource_binding_controller.go index e2e7f5bb6..7fc4793b4 100644 --- a/pkg/controllers/binding/cluster_resource_binding_controller.go +++ b/pkg/controllers/binding/cluster_resource_binding_controller.go @@ -16,6 +16,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" + policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1" workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1" "github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util/helper" @@ -108,12 +109,12 @@ func (c *ClusterResourceBindingController) SetupWithManager(mgr controllerruntim var requests []reconcile.Request labels := a.Meta.GetLabels() - _, nameExist := labels[util.ClusterResourceBindingLabel] + clusterResourcebindingName, nameExist := labels[util.ClusterResourceBindingLabel] if !nameExist { return nil } namespacesName := types.NamespacedName{ - Name: labels[util.ClusterResourceBindingLabel], + Name: clusterResourcebindingName, } requests = append(requests, reconcile.Request{NamespacedName: namespacesName}) @@ -122,5 +123,46 @@ func (c *ClusterResourceBindingController) SetupWithManager(mgr controllerruntim return controllerruntime.NewControllerManagedBy(mgr).For(&workv1alpha1.ClusterResourceBinding{}). Watches(&source.Kind{Type: &workv1alpha1.Work{}}, &handler.EnqueueRequestsFromMapFunc{ToRequests: workFn}, workPredicateFn). + Watches(&source.Kind{Type: &policyv1alpha1.OverridePolicy{}}, &handler.EnqueueRequestsFromMapFunc{ToRequests: c.newOverridePolicyFunc()}). + Watches(&source.Kind{Type: &policyv1alpha1.ClusterOverridePolicy{}}, &handler.EnqueueRequestsFromMapFunc{ToRequests: c.newOverridePolicyFunc()}). Complete(c) } + +func (c *ClusterResourceBindingController) newOverridePolicyFunc() handler.ToRequestsFunc { + return func(a handler.MapObject) []reconcile.Request { + var overrideRS []policyv1alpha1.ResourceSelector + switch t := a.Object.(type) { + case *policyv1alpha1.ClusterOverridePolicy: + overrideRS = t.Spec.ResourceSelectors + case *policyv1alpha1.OverridePolicy: + overrideRS = t.Spec.ResourceSelectors + default: + return nil + } + + bindingList := &workv1alpha1.ClusterResourceBindingList{} + if err := c.Client.List(context.TODO(), bindingList); err != nil { + klog.Errorf("Failed to list clusterResourceBindings, error: %v", err) + return nil + } + + var requests []reconcile.Request + for _, binding := range bindingList.Items { + workload, err := helper.FetchWorkload(c.DynamicClient, c.RESTMapper, binding.Spec.Resource) + if err != nil { + klog.Errorf("Failed to fetch workload for clusterResourceBinding(%s). Error: %v.", binding.Name, err) + return nil + } + + for _, rs := range overrideRS { + if util.ResourceMatches(workload, rs) { + klog.V(2).Infof("Enqueue ClusterResourceBinding(%s) as override policy(%s/%s) changes.", binding.Name, a.Meta.GetNamespace(), a.Meta.GetName()) + requests = append(requests, reconcile.Request{NamespacedName: types.NamespacedName{Name: binding.Name}}) + break + } + } + + } + return requests + } +} diff --git a/pkg/util/overridemanager/overridemanager.go b/pkg/util/overridemanager/overridemanager.go index 0651c59b5..309631f66 100644 --- a/pkg/util/overridemanager/overridemanager.go +++ b/pkg/util/overridemanager/overridemanager.go @@ -89,7 +89,7 @@ func (o *overrideManagerImpl) applyClusterOverrides(rawObj *unstructured.Unstruc matchedPolicies := o.getMatchedClusterOverridePolicy(policyList.Items, rawObj, cluster) if len(matchedPolicies) == 0 { - klog.V(2).Infof("No cluster override policy for resource: %s", rawObj.GetName()) + klog.V(2).Infof("No cluster override policy for resource: %s/%s", rawObj.GetNamespace(), rawObj.GetName()) return nil, nil }