@@ -5,89 +5,37 @@ import (
55 "fmt"
66 "net"
77
8+ "github.com/haproxytech/kubernetes-ingress/pkg/annotations"
9+ "github.com/haproxytech/kubernetes-ingress/pkg/store"
10+ "github.com/haproxytech/kubernetes-ingress/pkg/utils"
811 corev1 "k8s.io/api/core/v1"
912 extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
1013 networkingv1 "k8s.io/api/networking/v1"
1114 networkingv1beta "k8s.io/api/networking/v1beta1"
1215 k8serror "k8s.io/apimachinery/pkg/api/errors"
1316 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1417 "k8s.io/client-go/kubernetes"
15-
16- "github.com/haproxytech/kubernetes-ingress/pkg/annotations"
17- "github.com/haproxytech/kubernetes-ingress/pkg/store"
1818)
1919
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 ))
3627 }
37- } else if i = New (k , sync .Ingress , class , emptyClass , a ); i != nil {
38- // Update single Ingress
39- logger .Error (i .updateStatus (client , addresses ))
4028 }
4129 }
4230}
4331
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
7034
71- if len (* curAddr ) != len (addresses ) {
72- updated = true
73- * curAddr = addresses
35+ if utils .EqualSliceStringsWithoutOrder (i .resource .Addresses , addresses ) {
7436 return
7537 }
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- }
8738
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
9139 for _ , addr := range addresses {
9240 if net .ParseIP (addr ) == nil {
9341 lbi = append (lbi , corev1.LoadBalancerIngress {Hostname : addr })
@@ -135,6 +83,13 @@ func (i *Ingress) updateStatus(client *kubernetes.Clientset, addresses []string)
13583 return fmt .Errorf ("failed to update LoadBalancer status of ingress %s/%s: %w" , i .resource .Namespace , i .resource .Name , err )
13684 }
13785 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
13988 return nil
14089}
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