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"
"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 {
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"
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)
}