@@ -6,11 +6,6 @@ import (
66 "fmt"
77 "reflect"
88
9- "github.com/api7/api7-ingress-controller/api/v1alpha1"
10- "github.com/api7/api7-ingress-controller/internal/controller/config"
11- "github.com/api7/api7-ingress-controller/internal/controller/indexer"
12- "github.com/api7/api7-ingress-controller/internal/provider"
13- "github.com/api7/gopkg/pkg/log"
149 "github.com/go-logr/logr"
1510 "go.uber.org/zap"
1611 corev1 "k8s.io/api/core/v1"
@@ -22,9 +17,17 @@ import (
2217 ctrl "sigs.k8s.io/controller-runtime"
2318 "sigs.k8s.io/controller-runtime/pkg/builder"
2419 "sigs.k8s.io/controller-runtime/pkg/client"
20+ "sigs.k8s.io/controller-runtime/pkg/event"
2521 "sigs.k8s.io/controller-runtime/pkg/handler"
2622 "sigs.k8s.io/controller-runtime/pkg/predicate"
2723 "sigs.k8s.io/controller-runtime/pkg/reconcile"
24+ "sigs.k8s.io/controller-runtime/pkg/source"
25+
26+ "github.com/api7/api7-ingress-controller/api/v1alpha1"
27+ "github.com/api7/api7-ingress-controller/internal/controller/config"
28+ "github.com/api7/api7-ingress-controller/internal/controller/indexer"
29+ "github.com/api7/api7-ingress-controller/internal/provider"
30+ "github.com/api7/gopkg/pkg/log"
2831)
2932
3033// IngressReconciler reconciles a Ingress object.
@@ -34,10 +37,14 @@ type IngressReconciler struct { //nolint:revive
3437 Log logr.Logger
3538
3639 Provider provider.Provider
40+
41+ genericEvent chan event.GenericEvent
3742}
3843
3944// SetupWithManager sets up the controller with the Manager.
4045func (r * IngressReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
46+ r .genericEvent = make (chan event.GenericEvent , 100 )
47+
4148 return ctrl .NewControllerManagedBy (mgr ).
4249 For (& networkingv1.Ingress {},
4350 builder .WithPredicates (
@@ -65,6 +72,29 @@ func (r *IngressReconciler) SetupWithManager(mgr ctrl.Manager) error {
6572 & corev1.Secret {},
6673 handler .EnqueueRequestsFromMapFunc (r .listIngressesBySecret ),
6774 ).
75+ Watches (& v1alpha1.HTTPRoutePolicy {},
76+ handler .EnqueueRequestsFromMapFunc (r .listIngressesByHTTPRoutePolicy ),
77+ builder .WithPredicates (
78+ predicate.Funcs {
79+ CreateFunc : func (e event.CreateEvent ) bool {
80+ return true
81+ },
82+ DeleteFunc : func (e event.DeleteEvent ) bool {
83+ return true
84+ },
85+ UpdateFunc : httpRoutePolicyPredicateOnUpdate (r .genericEvent , "Ingress" ),
86+ GenericFunc : func (e event.GenericEvent ) bool {
87+ return false
88+ },
89+ },
90+ ),
91+ ).
92+ WatchesRawSource (
93+ source .Channel (
94+ r .genericEvent ,
95+ handler .EnqueueRequestsFromMapFunc (r .listIngressesForGenericEvent ),
96+ ),
97+ ).
6898 Complete (r )
6999}
70100
@@ -121,6 +151,12 @@ func (r *IngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
121151 return ctrl.Result {}, err
122152 }
123153
154+ // process HTTPRoutePolicy
155+ if err := r .processHTTPRoutePolicies (tctx , ingress ); err != nil {
156+ r .Log .Error (err , "failed to process HTTPRoutePolicy" , "ingress" , ingress .Name )
157+ return ctrl.Result {}, err
158+ }
159+
124160 // update the ingress resources
125161 if err := r .Provider .Update (ctx , tctx , ingress ); err != nil {
126162 r .Log .Error (err , "failed to update ingress resources" , "ingress" , ingress .Name )
@@ -341,6 +377,60 @@ func (r *IngressReconciler) listIngressesBySecret(ctx context.Context, obj clien
341377 return requests
342378}
343379
380+ func (r * IngressReconciler ) listIngressesByHTTPRoutePolicy (ctx context.Context , obj client.Object ) (requests []reconcile.Request ) {
381+ httpRoutePolicy , ok := obj .(* v1alpha1.HTTPRoutePolicy )
382+ if ! ok {
383+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to HTTPRoutePolicy" )
384+ return nil
385+ }
386+
387+ var keys = make (map [types.NamespacedName ]struct {})
388+ for _ , ref := range httpRoutePolicy .Spec .TargetRefs {
389+ if ref .Kind != "Ingress" {
390+ continue
391+ }
392+ key := types.NamespacedName {
393+ Namespace : obj .GetNamespace (),
394+ Name : string (ref .Name ),
395+ }
396+ if _ , ok := keys [key ]; ok {
397+ continue
398+ }
399+
400+ var ingress networkingv1.Ingress
401+ if err := r .Get (ctx , key , & ingress ); err != nil {
402+ r .Log .Error (err , "failed to get Ingress By HTTPRoutePolicy targetRef" , "namespace" , key .Namespace , "name" , key .Name )
403+ continue
404+ }
405+ keys [key ] = struct {}{}
406+ requests = append (requests , reconcile.Request {NamespacedName : key })
407+ }
408+ return
409+ }
410+
411+ func (r * IngressReconciler ) listIngressesForGenericEvent (ctx context.Context , obj client.Object ) (requests []reconcile.Request ) {
412+ var namespacedNameMap = make (map [types.NamespacedName ]struct {})
413+
414+ switch v := obj .(type ) {
415+ case * v1alpha1.HTTPRoutePolicy :
416+ for _ , ref := range v .Spec .TargetRefs {
417+ namespacedName := types.NamespacedName {Namespace : v .GetNamespace (), Name : string (ref .Name )}
418+ if _ , ok := namespacedNameMap [namespacedName ]; ! ok {
419+ namespacedNameMap [namespacedName ] = struct {}{}
420+ if err := r .Get (ctx , namespacedName , new (networkingv1.Ingress )); err != nil {
421+ r .Log .Error (err , "failed to Get Ingress" , "namespace" , namespacedName .Namespace , "name" , namespacedName .Name )
422+ continue
423+ }
424+ requests = append (requests , reconcile.Request {NamespacedName : namespacedName })
425+ }
426+ }
427+ default :
428+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to HTTPRoutePolicy" )
429+ }
430+
431+ return
432+ }
433+
344434// processTLS process the TLS configuration of the ingress
345435func (r * IngressReconciler ) processTLS (tctx * provider.TranslateContext , ingress * networkingv1.Ingress ) error {
346436 for _ , tls := range ingress .Spec .TLS {
0 commit comments