@@ -14,79 +14,28 @@ import (
14
14
"k8s.io/client-go/kubernetes"
15
15
16
16
"github.com/haproxytech/kubernetes-ingress/controller/store"
17
+ "github.com/haproxytech/kubernetes-ingress/controller/utils"
17
18
)
18
19
19
- func UpdateStatus (client * kubernetes.Clientset , k store.K8s , class string , emptyClass bool , channel chan Sync ) {
20
- var i * Ingress
21
- addresses := []string {}
22
- for sync := range channel {
23
- // Published Service updated: Update all Ingresses
24
- if sync .Service != nil && getServiceAddresses (sync .Service , & addresses ) {
25
- logger .Debug ("Addresses of Ingress Controller service changed, status of all ingress resources are going to be updated" )
26
- for _ , ns := range k .Namespaces {
27
- if ! ns .Relevant {
28
- continue
29
- }
30
- for _ , ingress := range k .Namespaces [ns .Name ].Ingresses {
31
- if i = New (k , ingress , class , emptyClass ); i != nil {
32
- logger .Error (i .updateStatus (client , addresses ))
33
- }
34
- }
20
+ type UpdateStatus func (service store.Service , ingresses []* store.Ingress )
21
+
22
+ func NewStatusIngressUpdater (client * kubernetes.Clientset , k store.K8s , class string , emptyClass bool ) UpdateStatus {
23
+ return func (service store.Service , ingresses []* store.Ingress ) {
24
+ for _ , ingress := range ingresses {
25
+ if ing := New (k , ingress , class , emptyClass ); ing != nil {
26
+ logger .Error (ing .UpdateStatus (client , service .Addresses ))
35
27
}
36
- } else if i = New (k , sync .Ingress , class , emptyClass ); i != nil {
37
- // Update single Ingress
38
- logger .Error (i .updateStatus (client , addresses ))
39
28
}
40
29
}
41
30
}
42
31
43
- func getServiceAddresses (service * corev1.Service , curAddr * []string ) (updated bool ) {
44
- addresses := []string {}
45
- switch service .Spec .Type {
46
- case corev1 .ServiceTypeExternalName :
47
- addresses = []string {service .Spec .ExternalName }
48
- case corev1 .ServiceTypeClusterIP :
49
- addresses = []string {service .Spec .ClusterIP }
50
- case corev1 .ServiceTypeNodePort :
51
- if service .Spec .ExternalIPs != nil {
52
- addresses = append (addresses , service .Spec .ExternalIPs ... )
53
- } else {
54
- addresses = append (addresses , service .Spec .ClusterIP )
55
- }
56
- case corev1 .ServiceTypeLoadBalancer :
57
- for _ , ip := range service .Status .LoadBalancer .Ingress {
58
- if ip .IP == "" {
59
- addresses = append (addresses , ip .Hostname )
60
- } else {
61
- addresses = append (addresses , ip .IP )
62
- }
63
- }
64
- addresses = append (addresses , service .Spec .ExternalIPs ... )
65
- default :
66
- logger .Errorf ("Unable to extract IP address/es from service %s/%s" , service .Namespace , service .Name )
67
- return
68
- }
32
+ func (i * Ingress ) UpdateStatus (client * kubernetes.Clientset , addresses []string ) (err error ) {
33
+ var lbi []corev1.LoadBalancerIngress
69
34
70
- if len (* curAddr ) != len (addresses ) {
71
- updated = true
72
- * curAddr = addresses
35
+ if utils .EqualSliceStringsWithoutOrder (i .resource .Addresses , addresses ) {
73
36
return
74
37
}
75
- for i , address := range addresses {
76
- if address != (* curAddr )[i ] {
77
- updated = true
78
- break
79
- }
80
- }
81
- if updated {
82
- * curAddr = addresses
83
- }
84
- return
85
- }
86
38
87
- func (i * Ingress ) updateStatus (client * kubernetes.Clientset , addresses []string ) (err error ) {
88
- logger .Tracef ("Updating status of Ingress %s/%s" , i .resource .Namespace , i .resource .Name )
89
- var lbi []corev1.LoadBalancerIngress
90
39
for _ , addr := range addresses {
91
40
if net .ParseIP (addr ) == nil {
92
41
lbi = append (lbi , corev1.LoadBalancerIngress {Hostname : addr })
@@ -134,6 +83,13 @@ func (i *Ingress) updateStatus(client *kubernetes.Clientset, addresses []string)
134
83
return fmt .Errorf ("failed to update LoadBalancer status of ingress %s/%s: %w" , i .resource .Namespace , i .resource .Name , err )
135
84
}
136
85
logger .Tracef ("Successful update of LoadBalancer status in ingress %s/%s" , i .resource .Namespace , i .resource .Name )
137
-
86
+ // Allow to store the publish service addresses affected to the ingress for future comparison in update test.
87
+ i .resource .Addresses = addresses
138
88
return nil
139
89
}
90
+
91
+ func UpdatePublishService (ingresses []* Ingress , api * kubernetes.Clientset , publishServiceAddresses []string ) {
92
+ for _ , i := range ingresses {
93
+ logger .Error (i .UpdateStatus (api , publishServiceAddresses ))
94
+ }
95
+ }
0 commit comments