66 "strings"
77
88 "github.com/go-logr/logr"
9- "go.uber.org/zap"
109 corev1 "k8s.io/api/core/v1"
1110 discoveryv1 "k8s.io/api/discovery/v1"
1211 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -19,12 +18,12 @@ import (
1918 "sigs.k8s.io/controller-runtime/pkg/handler"
2019 "sigs.k8s.io/controller-runtime/pkg/predicate"
2120 "sigs.k8s.io/controller-runtime/pkg/reconcile"
21+ "sigs.k8s.io/controller-runtime/pkg/source"
2222 gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
2323
2424 "github.com/api7/api7-ingress-controller/api/v1alpha1"
2525 "github.com/api7/api7-ingress-controller/internal/controller/indexer"
2626 "github.com/api7/api7-ingress-controller/internal/provider"
27- "github.com/api7/gopkg/pkg/log"
2827)
2928
3029// HTTPRouteReconciler reconciles a GatewayClass object.
@@ -35,10 +34,14 @@ type HTTPRouteReconciler struct { //nolint:revive
3534 Log logr.Logger
3635
3736 Provider provider.Provider
37+
38+ genericEvent chan event.GenericEvent
3839}
3940
4041// SetupWithManager sets up the controller with the Manager.
4142func (r * HTTPRouteReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
43+ r .genericEvent = make (chan event.GenericEvent , 100 )
44+
4245 return ctrl .NewControllerManagedBy (mgr ).
4346 For (& gatewayv1.HTTPRoute {}).
4447 WithEventFilter (predicate.GenerationChangedPredicate {}).
@@ -69,10 +72,91 @@ func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
6972 ).
7073 Watches (& v1alpha1.BackendTrafficPolicy {},
7174 handler .EnqueueRequestsFromMapFunc (r .listHTTPRoutesForBackendTrafficPolicy ),
75+ builder .WithPredicates (
76+ predicate.Funcs {
77+ GenericFunc : func (e event.GenericEvent ) bool {
78+ return false
79+ },
80+ DeleteFunc : func (e event.DeleteEvent ) bool {
81+ return true
82+ },
83+ CreateFunc : func (e event.CreateEvent ) bool {
84+ return true
85+ },
86+ UpdateFunc : func (e event.UpdateEvent ) bool {
87+ oldObj , ok := e .ObjectOld .(* v1alpha1.BackendTrafficPolicy )
88+ newObj , ok2 := e .ObjectNew .(* v1alpha1.BackendTrafficPolicy )
89+ if ! ok || ! ok2 {
90+ return false
91+ }
92+ oldRefs := oldObj .Spec .TargetRefs
93+ newRefs := newObj .Spec .TargetRefs
94+
95+ // 将旧引用转换为 Map
96+ oldRefMap := make (map [string ]v1alpha1.BackendPolicyTargetReferenceWithSectionName )
97+ for _ , ref := range oldRefs {
98+ key := fmt .Sprintf ("%s/%s/%s" , ref .Group , ref .Kind , ref .Name )
99+ oldRefMap [key ] = ref
100+ }
101+
102+ for _ , ref := range newRefs {
103+ key := fmt .Sprintf ("%s/%s/%s" , ref .Group , ref .Kind , ref .Name )
104+ delete (oldRefMap , key )
105+ }
106+ if len (oldRefMap ) > 0 {
107+ targetRefs := make ([]v1alpha1.BackendPolicyTargetReferenceWithSectionName , 0 , len (oldRefs ))
108+ for _ , ref := range oldRefMap {
109+ targetRefs = append (targetRefs , ref )
110+ }
111+ dump := oldObj .DeepCopy ()
112+ dump .Spec .TargetRefs = targetRefs
113+ r .genericEvent <- event.GenericEvent {
114+ Object : dump ,
115+ }
116+ }
117+ return true
118+ },
119+ },
120+ ),
121+ ).
122+ WatchesRawSource (
123+ source .Channel (
124+ r .genericEvent ,
125+ handler .EnqueueRequestsFromMapFunc (r .listHTTPRouteForGenericEvent ),
126+ ),
72127 ).
73128 Complete (r )
74129}
75130
131+ func (r * HTTPRouteReconciler ) listHTTPRouteForGenericEvent (ctx context.Context , obj client.Object ) []reconcile.Request {
132+ requests := []reconcile.Request {}
133+ switch v := obj .(type ) {
134+ case * v1alpha1.BackendTrafficPolicy :
135+ httprouteAll := []gatewayv1.HTTPRoute {}
136+ for _ , ref := range v .Spec .TargetRefs {
137+ httprouteList := & gatewayv1.HTTPRouteList {}
138+ if err := r .List (ctx , httprouteList , client.MatchingFields {
139+ indexer .ServiceIndexRef : indexer .GenIndexKey (v .GetNamespace (), string (ref .Name )),
140+ }); err != nil {
141+ r .Log .Error (err , "failed to list HTTPRoutes for BackendTrafficPolicy" , "namespace" , v .GetNamespace (), "ref" , ref .Name )
142+ return nil
143+ }
144+ httprouteAll = append (httprouteAll , httprouteList .Items ... )
145+ }
146+ for _ , hr := range httprouteAll {
147+ requests = append (requests , reconcile.Request {
148+ NamespacedName : client.ObjectKey {
149+ Namespace : hr .Namespace ,
150+ Name : hr .Name ,
151+ },
152+ })
153+ }
154+ default :
155+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to BackendTrafficPolicy" )
156+ }
157+ return requests
158+ }
159+
76160func (r * HTTPRouteReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
77161 hr := new (gatewayv1.HTTPRoute )
78162 if err := r .Get (ctx , req .NamespacedName , hr ); err != nil {
@@ -131,7 +215,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
131215 }
132216 }
133217
134- ProcessBackendTrafficPolicy (r .Client , tctx )
218+ ProcessBackendTrafficPolicy (r .Client , r . Log , tctx )
135219
136220 if err := r .Provider .Update (ctx , tctx , hr ); err != nil {
137221 acceptStatus .status = false
@@ -156,6 +240,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
156240 if err := r .Status ().Update (ctx , hr ); err != nil {
157241 return ctrl.Result {}, err
158242 }
243+ UpdateStatus (r .Client , r .Log , tctx )
159244 return ctrl.Result {}, nil
160245}
161246
@@ -253,7 +338,10 @@ func (r *HTTPRouteReconciler) listHTTPRoutesForBackendTrafficPolicy(ctx context.
253338 },
254339 })
255340 }
256- log .Errorw ("list httproutes for backend traffic policy" , zap .Any ("httproutes" , requests ))
341+ if ! policy .GetDeletionTimestamp ().IsZero () {
342+ // If the policy is deleted, we need to list all HTTPRoutes that reference this policy
343+ // and add them to the requests.
344+ }
257345 return requests
258346}
259347
0 commit comments