Skip to content

Commit ffd4974

Browse files
authored
refactor IngressLink controller (#6348)
1 parent 44683e8 commit ffd4974

File tree

3 files changed

+124
-114
lines changed

3 files changed

+124
-114
lines changed

internal/k8s/controller.go

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -564,22 +564,6 @@ func (nsi *namespacedInformer) addTransportServerHandler(handlers cache.Resource
564564
nsi.cacheSyncs = append(nsi.cacheSyncs, informer.HasSynced)
565565
}
566566

567-
func (lbc *LoadBalancerController) addIngressLinkHandler(handlers cache.ResourceEventHandlerFuncs, name string) {
568-
optionsModifier := func(options *meta_v1.ListOptions) {
569-
options.FieldSelector = fields.Set{"metadata.name": name}.String()
570-
}
571-
572-
informer := dynamicinformer.NewFilteredDynamicInformer(lbc.dynClient, ingressLinkGVR, lbc.controllerNamespace, lbc.resync,
573-
cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, optionsModifier)
574-
575-
informer.Informer().AddEventHandlerWithResyncPeriod(handlers, lbc.resync)
576-
577-
lbc.ingressLinkInformer = informer.Informer()
578-
lbc.ingressLinkLister = informer.Informer().GetStore()
579-
580-
lbc.cacheSyncs = append(lbc.cacheSyncs, lbc.ingressLinkInformer.HasSynced)
581-
}
582-
583567
func (lbc *LoadBalancerController) addNamespaceHandler(handlers cache.ResourceEventHandlerFuncs, nsLabel string) {
584568
optionsModifier := func(options *meta_v1.ListOptions) {
585569
options.LabelSelector = nsLabel
@@ -1196,62 +1180,6 @@ func (lbc *LoadBalancerController) cleanupUnwatchedNamespacedResources(nsi *name
11961180
nsi.stop()
11971181
}
11981182

1199-
func (lbc *LoadBalancerController) syncIngressLink(task task) {
1200-
key := task.Key
1201-
glog.V(2).Infof("Adding, Updating or Deleting IngressLink: %v", key)
1202-
1203-
obj, exists, err := lbc.ingressLinkLister.GetByKey(key)
1204-
if err != nil {
1205-
lbc.syncQueue.Requeue(task, err)
1206-
return
1207-
}
1208-
1209-
if !exists {
1210-
// IngressLink got removed
1211-
lbc.statusUpdater.ClearStatusFromIngressLink()
1212-
} else {
1213-
// IngressLink is added or updated
1214-
link := obj.(*unstructured.Unstructured)
1215-
1216-
// spec.virtualServerAddress contains the IP of the BIG-IP device
1217-
ip, found, err := unstructured.NestedString(link.Object, "spec", "virtualServerAddress")
1218-
if err != nil {
1219-
glog.Errorf("Failed to get virtualServerAddress from IngressLink %s: %v", key, err)
1220-
lbc.statusUpdater.ClearStatusFromIngressLink()
1221-
} else if !found {
1222-
glog.Errorf("virtualServerAddress is not found in IngressLink %s", key)
1223-
lbc.statusUpdater.ClearStatusFromIngressLink()
1224-
} else if ip == "" {
1225-
glog.Warningf("IngressLink %s has the empty virtualServerAddress field", key)
1226-
lbc.statusUpdater.ClearStatusFromIngressLink()
1227-
} else {
1228-
lbc.statusUpdater.SaveStatusFromIngressLink(ip)
1229-
}
1230-
}
1231-
1232-
if lbc.reportStatusEnabled() {
1233-
ingresses := lbc.configuration.GetResourcesWithFilter(resourceFilter{Ingresses: true})
1234-
1235-
glog.V(3).Infof("Updating status for %v Ingresses", len(ingresses))
1236-
1237-
err := lbc.statusUpdater.UpdateExternalEndpointsForResources(ingresses)
1238-
if err != nil {
1239-
glog.Errorf("Error updating ingress status in syncIngressLink: %v", err)
1240-
}
1241-
}
1242-
1243-
if lbc.areCustomResourcesEnabled && lbc.reportCustomResourceStatusEnabled() {
1244-
virtualServers := lbc.configuration.GetResourcesWithFilter(resourceFilter{VirtualServers: true})
1245-
1246-
glog.V(3).Infof("Updating status for %v VirtualServers", len(virtualServers))
1247-
1248-
err := lbc.statusUpdater.UpdateExternalEndpointsForResources(virtualServers)
1249-
if err != nil {
1250-
glog.V(3).Infof("Error updating VirtualServer/VirtualServerRoute status in syncIngressLink: %v", err)
1251-
}
1252-
}
1253-
}
1254-
12551183
func (lbc *LoadBalancerController) syncPolicy(task task) {
12561184
key := task.Key
12571185
var obj interface{}

internal/k8s/handlers.go

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -395,48 +395,6 @@ func createPolicyHandlers(lbc *LoadBalancerController) cache.ResourceEventHandle
395395
}
396396
}
397397

398-
func createIngressLinkHandlers(lbc *LoadBalancerController) cache.ResourceEventHandlerFuncs {
399-
return cache.ResourceEventHandlerFuncs{
400-
AddFunc: func(obj interface{}) {
401-
link := obj.(*unstructured.Unstructured)
402-
glog.V(3).Infof("Adding IngressLink: %v", link.GetName())
403-
lbc.AddSyncQueue(link)
404-
},
405-
DeleteFunc: func(obj interface{}) {
406-
link, isUnstructured := obj.(*unstructured.Unstructured)
407-
408-
if !isUnstructured {
409-
deletedState, ok := obj.(cache.DeletedFinalStateUnknown)
410-
if !ok {
411-
glog.V(3).Infof("Error received unexpected object: %v", obj)
412-
return
413-
}
414-
link, ok = deletedState.Obj.(*unstructured.Unstructured)
415-
if !ok {
416-
glog.V(3).Infof("Error DeletedFinalStateUnknown contained non-Unstructured object: %v", deletedState.Obj)
417-
return
418-
}
419-
}
420-
421-
glog.V(3).Infof("Removing IngressLink: %v", link.GetName())
422-
lbc.AddSyncQueue(link)
423-
},
424-
UpdateFunc: func(old, cur interface{}) {
425-
oldLink := old.(*unstructured.Unstructured)
426-
curLink := cur.(*unstructured.Unstructured)
427-
different, err := areResourcesDifferent(oldLink, curLink)
428-
if err != nil {
429-
glog.V(3).Infof("Error when comparing IngressLinks: %v", err)
430-
lbc.AddSyncQueue(curLink)
431-
}
432-
if different {
433-
glog.V(3).Infof("IngressLink %v changed, syncing", oldLink.GetName())
434-
lbc.AddSyncQueue(curLink)
435-
}
436-
},
437-
}
438-
}
439-
440398
// areResourcesDifferent returns true if the resources are different based on their spec.
441399
func areResourcesDifferent(oldresource, resource *unstructured.Unstructured) (bool, error) {
442400
oldSpec, found, err := unstructured.NestedMap(oldresource.Object, "spec")

internal/k8s/ingress_link.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package k8s
2+
3+
import (
4+
"github.com/golang/glog"
5+
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
6+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
7+
"k8s.io/apimachinery/pkg/fields"
8+
"k8s.io/client-go/dynamic/dynamicinformer"
9+
"k8s.io/client-go/tools/cache"
10+
)
11+
12+
func createIngressLinkHandlers(lbc *LoadBalancerController) cache.ResourceEventHandlerFuncs {
13+
return cache.ResourceEventHandlerFuncs{
14+
AddFunc: func(obj interface{}) {
15+
link := obj.(*unstructured.Unstructured)
16+
glog.V(3).Infof("Adding IngressLink: %v", link.GetName())
17+
lbc.AddSyncQueue(link)
18+
},
19+
DeleteFunc: func(obj interface{}) {
20+
link, isUnstructured := obj.(*unstructured.Unstructured)
21+
22+
if !isUnstructured {
23+
deletedState, ok := obj.(cache.DeletedFinalStateUnknown)
24+
if !ok {
25+
glog.V(3).Infof("Error received unexpected object: %v", obj)
26+
return
27+
}
28+
link, ok = deletedState.Obj.(*unstructured.Unstructured)
29+
if !ok {
30+
glog.V(3).Infof("Error DeletedFinalStateUnknown contained non-Unstructured object: %v", deletedState.Obj)
31+
return
32+
}
33+
}
34+
35+
glog.V(3).Infof("Removing IngressLink: %v", link.GetName())
36+
lbc.AddSyncQueue(link)
37+
},
38+
UpdateFunc: func(old, cur interface{}) {
39+
oldLink := old.(*unstructured.Unstructured)
40+
curLink := cur.(*unstructured.Unstructured)
41+
different, err := areResourcesDifferent(oldLink, curLink)
42+
if err != nil {
43+
glog.V(3).Infof("Error when comparing IngressLinks: %v", err)
44+
lbc.AddSyncQueue(curLink)
45+
}
46+
if different {
47+
glog.V(3).Infof("IngressLink %v changed, syncing", oldLink.GetName())
48+
lbc.AddSyncQueue(curLink)
49+
}
50+
},
51+
}
52+
}
53+
54+
func (lbc *LoadBalancerController) addIngressLinkHandler(handlers cache.ResourceEventHandlerFuncs, name string) {
55+
optionsModifier := func(options *meta_v1.ListOptions) {
56+
options.FieldSelector = fields.Set{"metadata.name": name}.String()
57+
}
58+
59+
informer := dynamicinformer.NewFilteredDynamicInformer(lbc.dynClient, ingressLinkGVR, lbc.controllerNamespace, lbc.resync,
60+
cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, optionsModifier)
61+
62+
informer.Informer().AddEventHandlerWithResyncPeriod(handlers, lbc.resync) //nolint:errcheck,gosec
63+
64+
lbc.ingressLinkInformer = informer.Informer()
65+
lbc.ingressLinkLister = informer.Informer().GetStore()
66+
67+
lbc.cacheSyncs = append(lbc.cacheSyncs, lbc.ingressLinkInformer.HasSynced)
68+
}
69+
70+
func (lbc *LoadBalancerController) syncIngressLink(task task) {
71+
key := task.Key
72+
glog.V(2).Infof("Adding, Updating or Deleting IngressLink: %v", key)
73+
74+
obj, exists, err := lbc.ingressLinkLister.GetByKey(key)
75+
if err != nil {
76+
lbc.syncQueue.Requeue(task, err)
77+
return
78+
}
79+
80+
if !exists {
81+
// IngressLink got removed
82+
lbc.statusUpdater.ClearStatusFromIngressLink()
83+
} else {
84+
// IngressLink is added or updated
85+
link := obj.(*unstructured.Unstructured)
86+
87+
// spec.virtualServerAddress contains the IP of the BIG-IP device
88+
ip, found, err := unstructured.NestedString(link.Object, "spec", "virtualServerAddress")
89+
if err != nil {
90+
glog.Errorf("Failed to get virtualServerAddress from IngressLink %s: %v", key, err)
91+
lbc.statusUpdater.ClearStatusFromIngressLink()
92+
} else if !found {
93+
glog.Errorf("virtualServerAddress is not found in IngressLink %s", key)
94+
lbc.statusUpdater.ClearStatusFromIngressLink()
95+
} else if ip == "" {
96+
glog.Warningf("IngressLink %s has the empty virtualServerAddress field", key)
97+
lbc.statusUpdater.ClearStatusFromIngressLink()
98+
} else {
99+
lbc.statusUpdater.SaveStatusFromIngressLink(ip)
100+
}
101+
}
102+
103+
if lbc.reportStatusEnabled() {
104+
ingresses := lbc.configuration.GetResourcesWithFilter(resourceFilter{Ingresses: true})
105+
106+
glog.V(3).Infof("Updating status for %v Ingresses", len(ingresses))
107+
108+
err := lbc.statusUpdater.UpdateExternalEndpointsForResources(ingresses)
109+
if err != nil {
110+
glog.Errorf("Error updating ingress status in syncIngressLink: %v", err)
111+
}
112+
}
113+
114+
if lbc.areCustomResourcesEnabled && lbc.reportCustomResourceStatusEnabled() {
115+
virtualServers := lbc.configuration.GetResourcesWithFilter(resourceFilter{VirtualServers: true})
116+
117+
glog.V(3).Infof("Updating status for %v VirtualServers", len(virtualServers))
118+
119+
err := lbc.statusUpdater.UpdateExternalEndpointsForResources(virtualServers)
120+
if err != nil {
121+
glog.V(3).Infof("Error updating VirtualServer/VirtualServerRoute status in syncIngressLink: %v", err)
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)