Add watch for CR and CNF 44/3544/3
authorYao Le <le.yao@intel.com>
Thu, 4 Jun 2020 16:13:27 +0000 (00:13 +0800)
committerYao Le <le.yao@intel.com>
Tue, 16 Jun 2020 16:37:15 +0000 (00:37 +0800)
Watch the CNF status and push the related CR requests to queue.

Signed-off-by: Yao Le <le.yao@intel.com>
Change-Id: Id3adaf68b860efefdb00ffe5620aef11b9aa787f

platform/crd-ctrlr/src/controllers/base_controller.go
platform/crd-ctrlr/src/controllers/mwan3policy_controller.go

index 4b7f282..1babebd 100644 (file)
@@ -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 {
index 531e942..3b7213c 100644 (file)
@@ -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)
 }