66 "strings"
77
88 "github.com/go-logr/logr"
9+ "go.uber.org/zap"
910 corev1 "k8s.io/api/core/v1"
1011 discoveryv1 "k8s.io/api/discovery/v1"
1112 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -23,6 +24,7 @@ import (
2324 "github.com/api7/api7-ingress-controller/api/v1alpha1"
2425 "github.com/api7/api7-ingress-controller/internal/controller/indexer"
2526 "github.com/api7/api7-ingress-controller/internal/provider"
27+ "github.com/api7/gopkg/pkg/log"
2628)
2729
2830// HTTPRouteReconciler reconciles a GatewayClass object.
@@ -65,6 +67,9 @@ func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
6567 },
6668 ),
6769 ).
70+ Watches (& v1alpha1.BackendTrafficPolicy {},
71+ handler .EnqueueRequestsFromMapFunc (r .listHTTPRoutesForBackendTrafficPolicy ),
72+ ).
6873 Complete (r )
6974}
7075
@@ -126,6 +131,8 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
126131 }
127132 }
128133
134+ ProcessBackendTrafficPolicy (r .Client , tctx )
135+
129136 if err := r .Provider .Update (ctx , tctx , hr ); err != nil {
130137 acceptStatus .status = false
131138 acceptStatus .msg = err .Error ()
@@ -208,6 +215,48 @@ func (r *HTTPRouteReconciler) listHTTPRoutesByExtensionRef(ctx context.Context,
208215 return requests
209216}
210217
218+ func (r * HTTPRouteReconciler ) listHTTPRoutesForBackendTrafficPolicy (ctx context.Context , obj client.Object ) []reconcile.Request {
219+ policy , ok := obj .(* v1alpha1.BackendTrafficPolicy )
220+ if ! ok {
221+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to BackendTrafficPolicy" )
222+ return nil
223+ }
224+
225+ httprouteList := []gatewayv1.HTTPRoute {}
226+ for _ , targetRef := range policy .Spec .TargetRefs {
227+ service := & corev1.Service {}
228+ if err := r .Get (ctx , client.ObjectKey {
229+ Namespace : policy .Namespace ,
230+ Name : string (targetRef .Name ),
231+ }, service ); err != nil {
232+ if client .IgnoreNotFound (err ) != nil {
233+ r .Log .Error (err , "failed to get service" , "namespace" , policy .Namespace , "name" , targetRef .Name )
234+ }
235+ continue
236+ }
237+ hrList := & gatewayv1.HTTPRouteList {}
238+ if err := r .List (ctx , hrList , client.MatchingFields {
239+ indexer .ServiceIndexRef : indexer .GenIndexKey (policy .Namespace , string (targetRef .Name )),
240+ }); err != nil {
241+ r .Log .Error (err , "failed to list httproutes by service reference" , "service" , targetRef .Name )
242+ return nil
243+ }
244+ httprouteList = append (httprouteList , hrList .Items ... )
245+ }
246+
247+ requests := make ([]reconcile.Request , 0 , len (httprouteList ))
248+ for _ , hr := range httprouteList {
249+ requests = append (requests , reconcile.Request {
250+ NamespacedName : client.ObjectKey {
251+ Namespace : hr .Namespace ,
252+ Name : hr .Name ,
253+ },
254+ })
255+ }
256+ log .Errorw ("list httproutes for backend traffic policy" , zap .Any ("httproutes" , requests ))
257+ return requests
258+ }
259+
211260func (r * HTTPRouteReconciler ) listHTTPRoutesForGateway (ctx context.Context , obj client.Object ) []reconcile.Request {
212261 gateway , ok := obj .(* gatewayv1.Gateway )
213262 if ! ok {
0 commit comments