@@ -3,6 +3,7 @@ package indexer
33import (
44 "context"
55
6+ networkingv1 "k8s.io/api/networking/v1"
67 ctrl "sigs.k8s.io/controller-runtime"
78 "sigs.k8s.io/controller-runtime/pkg/client"
89 gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
@@ -13,6 +14,9 @@ const (
1314 ExtensionRef = "extensionRef"
1415 ParametersRef = "parametersRef"
1516 ParentRefs = "parentRefs"
17+ IngressClass = "ingressClass"
18+ SecretIndexRef = "secretRefs"
19+ IngressClassRef = "ingressClassRef"
1620)
1721
1822func SetupIndexer (mgr ctrl.Manager ) error {
@@ -22,6 +26,9 @@ func SetupIndexer(mgr ctrl.Manager) error {
2226 if err := setupHTTPRouteIndexer (mgr ); err != nil {
2327 return err
2428 }
29+ if err := setupIngressIndexer (mgr ); err != nil {
30+ return err
31+ }
2532 return nil
2633}
2734
@@ -67,6 +74,102 @@ func setupHTTPRouteIndexer(mgr ctrl.Manager) error {
6774 return nil
6875}
6976
77+ func setupIngressIndexer (mgr ctrl.Manager ) error {
78+ // create IngressClass index
79+ if err := mgr .GetFieldIndexer ().IndexField (
80+ context .Background (),
81+ & networkingv1.Ingress {},
82+ IngressClassRef ,
83+ IngressClassRefIndexFunc ,
84+ ); err != nil {
85+ return err
86+ }
87+
88+ // create Service index for quick lookup of Ingresses using specific services
89+ if err := mgr .GetFieldIndexer ().IndexField (
90+ context .Background (),
91+ & networkingv1.Ingress {},
92+ ServiceIndexRef ,
93+ IngressServiceIndexFunc ,
94+ ); err != nil {
95+ return err
96+ }
97+
98+ // create secret index for TLS
99+ if err := mgr .GetFieldIndexer ().IndexField (
100+ context .Background (),
101+ & networkingv1.Ingress {},
102+ SecretIndexRef ,
103+ IngressSecretIndexFunc ,
104+ ); err != nil {
105+ return err
106+ }
107+
108+ // create IngressClass index
109+ if err := mgr .GetFieldIndexer ().IndexField (
110+ context .Background (),
111+ & networkingv1.IngressClass {},
112+ IngressClass ,
113+ IngressClassIndexFunc ,
114+ ); err != nil {
115+ return err
116+ }
117+
118+ return nil
119+ }
120+
121+ func IngressClassIndexFunc (rawObj client.Object ) []string {
122+ ingressClass := rawObj .(* networkingv1.IngressClass )
123+ if ingressClass .Spec .Controller == "" {
124+ return nil
125+ }
126+ controllerName := ingressClass .Spec .Controller
127+ return []string {controllerName }
128+ }
129+
130+ func IngressClassRefIndexFunc (rawObj client.Object ) []string {
131+ ingress := rawObj .(* networkingv1.Ingress )
132+ if ingress .Spec .IngressClassName == nil {
133+ return nil
134+ }
135+ return []string {* ingress .Spec .IngressClassName }
136+ }
137+
138+ func IngressServiceIndexFunc (rawObj client.Object ) []string {
139+ ingress := rawObj .(* networkingv1.Ingress )
140+ var services []string
141+
142+ for _ , rule := range ingress .Spec .Rules {
143+ if rule .HTTP == nil {
144+ continue
145+ }
146+
147+ for _ , path := range rule .HTTP .Paths {
148+ if path .Backend .Service == nil {
149+ continue
150+ }
151+ key := GenIndexKey (ingress .Namespace , path .Backend .Service .Name )
152+ services = append (services , key )
153+ }
154+ }
155+ return services
156+ }
157+
158+ func IngressSecretIndexFunc (rawObj client.Object ) []string {
159+ ingress := rawObj .(* networkingv1.Ingress )
160+ secrets := make ([]string , 0 )
161+
162+ for _ , tls := range ingress .Spec .TLS {
163+ if tls .SecretName == "" {
164+ continue
165+ }
166+
167+ key := GenIndexKey (ingress .Namespace , tls .SecretName )
168+ secrets = append (secrets , key )
169+ }
170+ return secrets
171+ }
172+
70173func GenIndexKey (namespace , name string ) string {
71174 return client.ObjectKey {
72175 Namespace : namespace ,
0 commit comments