From bea414888c032545f2ec3263f9fc97f66abdab00 Mon Sep 17 00:00:00 2001 From: Yao Le Date: Fri, 5 Jun 2020 00:13:27 +0800 Subject: [PATCH] Add watch for CR and CNF Watch the CNF status and push the related CR requests to queue. Signed-off-by: Yao Le Change-Id: Id3adaf68b860efefdb00ffe5620aef11b9aa787f --- .../crd-ctrlr/src/controllers/base_controller.go | 55 ++++++++++++++++++++++ .../src/controllers/mwan3policy_controller.go | 8 ++++ 2 files changed, 63 insertions(+) diff --git a/platform/crd-ctrlr/src/controllers/base_controller.go b/platform/crd-ctrlr/src/controllers/base_controller.go index 4b7f282..1babebd 100644 --- a/platform/crd-ctrlr/src/controllers/base_controller.go +++ b/platform/crd-ctrlr/src/controllers/base_controller.go @@ -9,9 +9,15 @@ import ( errs "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" "reflect" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/reconcile" "time" appsv1 "k8s.io/api/apps/v1" @@ -21,6 +27,55 @@ import ( "sdewan.akraino.org/sdewan/openwrt" ) +// A global filter to catch the CNF deployments. +var Filter = builder.WithPredicates(predicate.Funcs{ + CreateFunc: func(e event.CreateEvent) bool { + if _, ok := e.Meta.GetLabels()["sdewanPurpose"]; !ok { + return false + } + return true + }, + UpdateFunc: func(e event.UpdateEvent) bool { + if _, ok := e.MetaOld.GetLabels()["sdewanPurpose"]; !ok { + return false + } + pre_status := reflect.ValueOf(e.ObjectOld).Interface().(*appsv1.Deployment).Status + post_status := reflect.ValueOf(e.ObjectNew).Interface().(*appsv1.Deployment).Status + // Catch the available and unavailable pods of the Deployment + if pre_status.AvailableReplicas != post_status.AvailableReplicas { + return true + } + if pre_status.UnavailableReplicas != post_status.UnavailableReplicas { + return true + } + return false + }, +}) + +// List the needed CR to specific events and return the reconcile Requests +func GetToRequestsFunc(r client.Client, crliststruct runtime.Object) func(h handler.MapObject) []reconcile.Request { + + return func(h handler.MapObject) []reconcile.Request { + var enqueueRequest []reconcile.Request + cnfName := h.Meta.GetLabels()["sdewanPurpose"] + ctx := context.Background() + r.List(ctx, crliststruct, client.MatchingLabels{"sdewanPurpose": cnfName}) + value := reflect.ValueOf(crliststruct) + items := reflect.Indirect(value).FieldByName("Items") + for i := 0; i < items.Len(); i++ { + meta := items.Index(i).Field(1).Interface().(metav1.ObjectMeta) + req := reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: meta.GetName(), + Namespace: meta.GetNamespace(), + }} + enqueueRequest = append(enqueueRequest, req) + + } + return enqueueRequest + } +} + // Helper functions to check and remove string from a slice of strings. func containsString(slice []string, s string) bool { for _, item := range slice { diff --git a/platform/crd-ctrlr/src/controllers/mwan3policy_controller.go b/platform/crd-ctrlr/src/controllers/mwan3policy_controller.go index 531e942..3b7213c 100644 --- a/platform/crd-ctrlr/src/controllers/mwan3policy_controller.go +++ b/platform/crd-ctrlr/src/controllers/mwan3policy_controller.go @@ -26,7 +26,9 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/source" batchv1alpha1 "sdewan.akraino.org/sdewan/api/v1alpha1" "sdewan.akraino.org/sdewan/openwrt" @@ -130,5 +132,11 @@ func (r *Mwan3PolicyReconciler) SetupWithManager(mgr ctrl.Manager) error { ps := builder.WithPredicates(predicate.GenerationChangedPredicate{}) return ctrl.NewControllerManagedBy(mgr). For(&batchv1alpha1.Mwan3Policy{}, ps). + Watches( + &source.Kind{Type: &appsv1.Deployment{}}, + &handler.EnqueueRequestsFromMapFunc{ + ToRequests: handler.ToRequestsFunc(GetToRequestsFunc(r, &batchv1alpha1.Mwan3PolicyList{})), + }, + Filter). Complete(r) } -- 2.16.6