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