@@ -14,6 +14,7 @@ import (
1414 "encoding/json"
1515 "fmt"
1616 coreinformers "k8s.io/client-go/informers/core/v1"
17+ "k8s.io/client-go/tools/events"
1718 "time"
1819
1920 "github.com/oracle/oci-native-ingress-controller/pkg/client"
@@ -47,6 +48,7 @@ type Controller struct {
4748 podLister corelisters.PodLister
4849 endpointLister corelisters.EndpointsLister
4950 saLister corelisters.ServiceAccountLister
51+ eventRecorder events.EventRecorder
5052
5153 queue workqueue.RateLimitingInterface
5254 client * client.ClientProvider
@@ -61,6 +63,7 @@ func NewController(
6163 endpointLister corelisters.EndpointsLister ,
6264 podLister corelisters.PodLister ,
6365 client * client.ClientProvider ,
66+ eventRecorder events.EventRecorder ,
6467) * Controller {
6568
6669 c := & Controller {
@@ -72,6 +75,7 @@ func NewController(
7275 podLister : podLister ,
7376 saLister : saInformer .Lister (),
7477 client : client ,
78+ eventRecorder : eventRecorder ,
7579 queue : workqueue .NewRateLimitingQueue (workqueue .NewItemExponentialFailureRateLimiter (10 * time .Second , 5 * time .Minute )),
7680 }
7781
@@ -93,7 +97,7 @@ func (c *Controller) processNextItem() bool {
9397 err := c .sync (key .(string ))
9498
9599 // Handle the error if something went wrong during the execution of the business logic
96- util .HandleErr ( c .queue , err , "Error syncing backends for ingress class" , key )
100+ util .HandleErrForBackendController ( c . eventRecorder , c . ingressClassLister , c .queue , err , "Error syncing backends for ingress class" , key )
97101 return true
98102}
99103
@@ -157,50 +161,69 @@ func (c *Controller) ensureBackends(ctx context.Context, ingressClass *networkin
157161 }
158162
159163 for _ , ingress := range ingresses {
160- for _ , rule := range ingress .Spec .Rules {
161- for _ , path := range rule .HTTP .Paths {
162- pSvc , svc , err := util .ExtractServices (path , c .serviceLister , ingress )
163- if err != nil {
164- return err
165- }
166- svcName , svcPort , targetPort , err := util .PathToServiceAndTargetPort (c .endpointLister , svc , pSvc , ingress .Namespace , false )
167- if err != nil {
168- return err
169- }
170- epAddrs , err := util .GetEndpoints (c .endpointLister , ingress .Namespace , svcName )
171- if err != nil {
172- return fmt .Errorf ("unable to fetch endpoints for %s/%s/%d: %w" , ingress .Namespace , svcName , targetPort , err )
173- }
174- backends := []ociloadbalancer.BackendDetails {}
175- for _ , epAddr := range epAddrs {
176- backends = append (backends , util .NewBackend (epAddr .IP , targetPort ))
177- }
178- backendSetName := util .GenerateBackendSetName (ingress .Namespace , svcName , svcPort )
179- err = wrapperClient .GetLbClient ().UpdateBackends (context .TODO (), lbID , backendSetName , backends )
164+ err := c .ensureBackendsForIngress (ctx , ingress , ingressClass , lbID , wrapperClient )
165+ if err != nil {
166+ return fmt .Errorf ("for ingress %s, encountered error: %w" , klog .KObj (ingress ), err )
167+ }
168+ }
169+
170+ // Sync default backends
171+ c .syncDefaultBackend (ctx , lbID , ingresses )
172+ return nil
173+ }
174+
175+ func (c * Controller ) ensureBackendsForIngress (ctx context.Context , ingress * networkingv1.Ingress , ingressClass * networkingv1.IngressClass ,
176+ lbID string , wrapperClient * client.WrapperClient ) error {
177+
178+ for _ , rule := range ingress .Spec .Rules {
179+ for _ , path := range rule .HTTP .Paths {
180+ pSvc , svc , err := util .ExtractServices (path , c .serviceLister , ingress )
181+ if err != nil {
182+ return err
183+ }
184+ svcName , svcPort , targetPort , err := util .PathToServiceAndTargetPort (c .endpointLister , svc , pSvc , ingress .Namespace , false )
185+ if err != nil {
186+ return err
187+ }
188+
189+ epAddrs , err := util .GetEndpoints (c .endpointLister , ingress .Namespace , svcName )
190+ if err != nil {
191+ return fmt .Errorf ("unable to fetch endpoints for %s/%s/%d: %w" , ingress .Namespace , svcName , targetPort , err )
192+ }
193+
194+ backends := []ociloadbalancer.BackendDetails {}
195+ for _ , epAddr := range epAddrs {
196+ backends = append (backends , util .NewBackend (epAddr .IP , targetPort ))
197+ }
198+
199+ backendSetName := util .GenerateBackendSetName (ingress .Namespace , svcName , svcPort )
200+ err = wrapperClient .GetLbClient ().UpdateBackends (context .TODO (), lbID , backendSetName , backends )
201+ if err != nil {
202+ return fmt .Errorf ("unable to update backends for %s/%s: %w" , ingressClass .Name , backendSetName , err )
203+ }
204+
205+ backendSetHealth , err := wrapperClient .GetLbClient ().GetBackendSetHealth (context .TODO (), lbID , backendSetName )
206+ if err != nil {
207+ return fmt .Errorf ("unable to fetch backendset health: %w" , err )
208+ }
209+
210+ for _ , epAddr := range epAddrs {
211+ pod , err := c .podLister .Pods (ingress .Namespace ).Get (epAddr .TargetRef .Name )
180212 if err != nil {
181- return fmt .Errorf ("unable to update backends for %s/%s: %w" , ingressClass . Name , backendSetName , err )
213+ return fmt .Errorf ("failed to fetch pod %s/%s: %w" , ingress . Namespace , epAddr . TargetRef . Name , err )
182214 }
183- backendSetHealth , err := wrapperClient .GetLbClient ().GetBackendSetHealth (context .TODO (), lbID , backendSetName )
215+
216+ backendName := fmt .Sprintf ("%s:%d" , epAddr .IP , targetPort )
217+ readinessCondition := util .GetPodReadinessCondition (ingress .Name , rule .Host , path )
218+
219+ err = c .ensurePodReadinessCondition (ctx , pod , readinessCondition , backendSetHealth , backendName )
184220 if err != nil {
185- return fmt .Errorf ("unable to fetch backendset health: %w" , err )
186- }
187- for _ , epAddr := range epAddrs {
188- pod , err := c .podLister .Pods (ingress .Namespace ).Get (epAddr .TargetRef .Name )
189- if err != nil {
190- return fmt .Errorf ("failed to fetch pod %s/%s: %w" , ingress .Namespace , epAddr .TargetRef .Name , err )
191- }
192- backendName := fmt .Sprintf ("%s:%d" , epAddr .IP , targetPort )
193- readinessCondition := util .GetPodReadinessCondition (ingress .Name , rule .Host , path )
194- err = c .ensurePodReadinessCondition (ctx , pod , readinessCondition , backendSetHealth , backendName )
195- if err != nil {
196- return fmt .Errorf ("%w" , err )
197- }
221+ return fmt .Errorf ("%w" , err )
198222 }
199223 }
200224 }
201225 }
202- // Sync default backends
203- c .syncDefaultBackend (ctx , lbID , ingresses )
226+
204227 return nil
205228}
206229
0 commit comments