@@ -5,36 +5,46 @@ import (
55 "fmt"
66 "reflect"
77
8- "github.com/api7/gopkg/pkg/log"
98 "github.com/go-logr/logr"
9+ "github.com/pkg/errors"
1010 corev1 "k8s.io/api/core/v1"
1111 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1212 "k8s.io/apimachinery/pkg/runtime"
1313 "k8s.io/apimachinery/pkg/types"
1414 ctrl "sigs.k8s.io/controller-runtime"
1515 "sigs.k8s.io/controller-runtime/pkg/builder"
1616 "sigs.k8s.io/controller-runtime/pkg/client"
17+ "sigs.k8s.io/controller-runtime/pkg/event"
1718 "sigs.k8s.io/controller-runtime/pkg/handler"
1819 "sigs.k8s.io/controller-runtime/pkg/predicate"
1920 "sigs.k8s.io/controller-runtime/pkg/reconcile"
21+ "sigs.k8s.io/controller-runtime/pkg/source"
2022 gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
2123
24+ "github.com/api7/gopkg/pkg/log"
25+
2226 "github.com/api7/api7-ingress-controller/api/v1alpha1"
2327 "github.com/api7/api7-ingress-controller/internal/controller/indexer"
2428 "github.com/api7/api7-ingress-controller/internal/provider"
2529)
2630
31+ // +kubebuilder:rbac:groups="",resources=events,verbs=get;list;watch;update
32+ // +kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;update
33+
2734// GatewayReconciler reconciles a Gateway object.
2835type GatewayReconciler struct { //nolint:revive
2936 client.Client
3037 Scheme * runtime.Scheme
3138 Log logr.Logger
3239
3340 Provider provider.Provider
41+
42+ GenericEvent chan event.GenericEvent
3443}
3544
3645// SetupWithManager sets up the controller with the Manager.
3746func (r * GatewayReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
47+ r .GenericEvent = GatewaySecretChan
3848 return ctrl .NewControllerManagedBy (mgr ).
3949 For (
4050 & gatewayv1.Gateway {},
@@ -58,10 +68,24 @@ func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error {
5868 & v1alpha1.GatewayProxy {},
5969 handler .EnqueueRequestsFromMapFunc (r .listGatewaysForGatewayProxy ),
6070 ).
71+ WatchesRawSource (
72+ source .Channel (
73+ r .GenericEvent ,
74+ handler .EnqueueRequestsFromMapFunc (func (ctx context.Context , object client.Object ) []reconcile.Request {
75+ switch object .(type ) {
76+ case * corev1.Secret :
77+ return r .listGatewaysForSecret (ctx , object )
78+ default :
79+ return nil
80+ }
81+ })),
82+ ).
6183 Complete (r )
6284}
6385
6486func (r * GatewayReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
87+ r .Log .Info ("request Reconcile" )
88+
6589 gateway := new (gatewayv1.Gateway )
6690 if err := r .Get (ctx , req .NamespacedName , gateway ); err != nil {
6791 if client .IgnoreNotFound (err ) == nil {
@@ -295,6 +319,36 @@ func (r *GatewayReconciler) listGatewaysForHTTPRoute(ctx context.Context, obj cl
295319 return recs
296320}
297321
322+ func (r * GatewayReconciler ) listGatewaysForSecret (ctx context.Context , obj client.Object ) (requests []reconcile.Request ) {
323+ secret , ok := obj .(* corev1.Secret )
324+ if ! ok {
325+ r .Log .Error (
326+ errors .New ("unexpected object type" ),
327+ "Secret watch predicate received unexpected object type" ,
328+ "expected" , FullTypeName (new (corev1.Secret )), "found" , FullTypeName (obj ),
329+ )
330+ return nil
331+ }
332+ r .Log .Info ("listGatewaysForSecret, secret" , "namespace" , secret .GetNamespace (), "name" , secret .GetName ())
333+ var gatewayList gatewayv1.GatewayList
334+ if err := r .List (ctx , & gatewayList , client.MatchingFields {
335+ indexer .SecretIndexRef : indexer .GenIndexKey (secret .GetNamespace (), secret .GetName ()),
336+ }); err != nil {
337+ r .Log .Error (err , "failed to list gateways" )
338+ return nil
339+ }
340+ for _ , gateway := range gatewayList .Items {
341+ requests = append (requests , reconcile.Request {
342+ NamespacedName : types.NamespacedName {
343+ Namespace : gateway .GetNamespace (),
344+ Name : gateway .GetName (),
345+ },
346+ })
347+ }
348+ r .Log .Info ("listGatewaysForSecret" , "requests" , requests )
349+ return requests
350+ }
351+
298352func (r * GatewayReconciler ) processInfrastructure (tctx * provider.TranslateContext , gateway * gatewayv1.Gateway ) error {
299353 rk := provider.ResourceKind {
300354 Kind : gateway .Kind ,
@@ -316,12 +370,12 @@ func (r *GatewayReconciler) processListenerConfig(tctx *provider.TranslateContex
316370 if ref .Namespace != nil {
317371 ns = string (* ref .Namespace )
318372 }
319- if ref .Kind != nil && * ref .Kind == gatewayv1 . Kind ( "Secret" ) {
373+ if ref .Kind != nil && * ref .Kind == "Secret" {
320374 if err := r .Get (context .Background (), client.ObjectKey {
321375 Namespace : ns ,
322376 Name : string (ref .Name ),
323377 }, & secret ); err != nil {
324- log .Error (err , "failed to get secret" , "namespace" , ns , "name" , string ( ref .Name ) )
378+ log .Error (err , "failed to get secret" , "namespace" , ns , "name" , ref .Name )
325379 SetGatewayListenerConditionProgrammed (gateway , string (listener .Name ), false , err .Error ())
326380 SetGatewayListenerConditionResolvedRefs (gateway , string (listener .Name ), false , err .Error ())
327381 break
0 commit comments