Skip to content

Commit 870df27

Browse files
dergeberlMenekse Ceylan
authored andcommitted
Refactor SetupWithManager
1 parent 730655c commit 870df27

2 files changed

Lines changed: 113 additions & 43 deletions

File tree

pkg/alb/ingress/add.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package ingress
2+
3+
import (
4+
"context"
5+
"reflect"
6+
7+
corev1 "k8s.io/api/core/v1"
8+
networkingv1 "k8s.io/api/networking/v1"
9+
ctrl "sigs.k8s.io/controller-runtime"
10+
"sigs.k8s.io/controller-runtime/pkg/builder"
11+
"sigs.k8s.io/controller-runtime/pkg/client"
12+
"sigs.k8s.io/controller-runtime/pkg/event"
13+
"sigs.k8s.io/controller-runtime/pkg/handler"
14+
"sigs.k8s.io/controller-runtime/pkg/predicate"
15+
)
16+
17+
// SetupWithManager sets up the controller with the Manager.
18+
func (r *IngressClassReconciler) SetupWithManager(mgr ctrl.Manager) error {
19+
return ctrl.NewControllerManagedBy(mgr).
20+
// Uncomment the following line adding a pointer to an instance of the controlled resource as an argument
21+
For(&networkingv1.IngressClass{}, builder.WithPredicates(ingressClassPredicate())).
22+
Watches(&corev1.Node{}, nodeEventHandler(r.Client), builder.WithPredicates(nodePredicate())).
23+
Watches(&networkingv1.Ingress{}, ingressEventHandler(r.Client)).
24+
Named("ingressclass").
25+
Complete(r)
26+
}
27+
28+
func nodeEventHandler(c client.Client) handler.EventHandler {
29+
return handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, _ client.Object) []ctrl.Request {
30+
ingressClassList := &networkingv1.IngressClassList{}
31+
err := c.List(ctx, ingressClassList)
32+
if err != nil {
33+
return nil
34+
}
35+
requestList := []ctrl.Request{}
36+
for i := range ingressClassList.Items {
37+
if ingressClassList.Items[i].Spec.Controller != controllerName {
38+
continue
39+
}
40+
requestList = append(requestList, ctrl.Request{
41+
NamespacedName: client.ObjectKeyFromObject(new(ingressClassList.Items[i])),
42+
})
43+
}
44+
return requestList
45+
})
46+
}
47+
48+
func ingressEventHandler(c client.Client) handler.EventHandler {
49+
return handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, o client.Object) []ctrl.Request {
50+
ingress, ok := o.(*networkingv1.Ingress)
51+
if !ok || ingress.Spec.IngressClassName == nil {
52+
return nil
53+
}
54+
55+
ingressClass := &networkingv1.IngressClass{}
56+
err := c.Get(ctx, client.ObjectKey{Name: *ingress.Spec.IngressClassName}, ingressClass)
57+
if err != nil {
58+
return nil
59+
}
60+
61+
if ingressClass.Spec.Controller != controllerName {
62+
return []ctrl.Request{
63+
{
64+
NamespacedName: client.ObjectKeyFromObject(ingressClass),
65+
},
66+
}
67+
}
68+
69+
return nil
70+
})
71+
}
72+
73+
func nodePredicate() predicate.Predicate {
74+
return predicate.Funcs{
75+
CreateFunc: func(_ event.CreateEvent) bool {
76+
return true
77+
},
78+
UpdateFunc: func(e event.UpdateEvent) bool {
79+
oldNode, ok := e.ObjectOld.(*corev1.Node)
80+
if !ok {
81+
return false
82+
}
83+
newNode, ok := e.ObjectNew.(*corev1.Node)
84+
if !ok {
85+
return false
86+
}
87+
88+
if !reflect.DeepEqual(oldNode.Status.Addresses, newNode.Status.Addresses) {
89+
return true
90+
}
91+
92+
return false
93+
},
94+
DeleteFunc: func(_ event.DeleteEvent) bool {
95+
return true
96+
},
97+
GenericFunc: func(_ event.GenericEvent) bool {
98+
return true
99+
},
100+
}
101+
}
102+
103+
func ingressClassPredicate() predicate.Predicate {
104+
return predicate.NewPredicateFuncs(func(object client.Object) bool {
105+
ingressClass, ok := object.(*networkingv1.IngressClass)
106+
if !ok {
107+
return false
108+
}
109+
return ingressClass.Spec.Controller == controllerName
110+
})
111+
}

pkg/alb/ingress/ingressclass_controller.go

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import (
2424
"fmt"
2525
"time"
2626

27+
"github.com/stackitcloud/cloud-provider-stackit/pkg/stackit"
2728
stackitconfig "github.com/stackitcloud/cloud-provider-stackit/pkg/stackit/config"
29+
albsdk "github.com/stackitcloud/stackit-sdk-go/services/alb/v2api"
2830
corev1 "k8s.io/api/core/v1"
2931
networkingv1 "k8s.io/api/networking/v1"
3032
"k8s.io/apimachinery/pkg/runtime"
@@ -33,10 +35,6 @@ import (
3335
ctrl "sigs.k8s.io/controller-runtime"
3436
"sigs.k8s.io/controller-runtime/pkg/client"
3537
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
36-
"sigs.k8s.io/controller-runtime/pkg/handler"
37-
38-
"github.com/stackitcloud/cloud-provider-stackit/pkg/stackit"
39-
albsdk "github.com/stackitcloud/stackit-sdk-go/services/alb/v2api"
4038
)
4139

4240
const (
@@ -105,45 +103,6 @@ func (r *IngressClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
105103
return ctrl.Result{}, nil
106104
}
107105

108-
// SetupWithManager sets up the controller with the Manager.
109-
func (r *IngressClassReconciler) SetupWithManager(mgr ctrl.Manager) error {
110-
return ctrl.NewControllerManagedBy(mgr).
111-
// Uncomment the following line adding a pointer to an instance of the controlled resource as an argument
112-
For(&networkingv1.IngressClass{}).
113-
Watches(&corev1.Node{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, _ client.Object) []ctrl.Request {
114-
// TODO: Add predicates - watch only for specific changes on nodes
115-
ingressClassList := &networkingv1.IngressClassList{}
116-
err := r.Client.List(ctx, ingressClassList)
117-
if err != nil {
118-
panic(err)
119-
}
120-
requestList := []ctrl.Request{}
121-
for i := range ingressClassList.Items {
122-
ingressClass := ingressClassList.Items[i]
123-
requestList = append(requestList, ctrl.Request{
124-
NamespacedName: client.ObjectKeyFromObject(&ingressClass),
125-
})
126-
}
127-
return requestList
128-
})).
129-
Watches(&networkingv1.Ingress{}, handler.EnqueueRequestsFromMapFunc(func(_ context.Context, o client.Object) []ctrl.Request {
130-
ingress, ok := o.(*networkingv1.Ingress)
131-
if !ok || ingress.Spec.IngressClassName == nil {
132-
return nil
133-
}
134-
135-
return []ctrl.Request{
136-
{
137-
NamespacedName: types.NamespacedName{
138-
Name: *ingress.Spec.IngressClassName,
139-
},
140-
},
141-
}
142-
})).
143-
Named("ingressclass").
144-
Complete(r)
145-
}
146-
147106
// handleIngressClassWithIngresses handles the state of IngressClass when at least one Ingress resource is referencing it.
148107
// It ensures that the ALB is created when it is the first ever Ingress
149108
// referencing the specified IngressClass, and performs updates otherwise.

0 commit comments

Comments
 (0)