From 32b8a3a473701d98db2e2537c1f701fab5a931d5 Mon Sep 17 00:00:00 2001 From: hazim1093 Date: Sun, 30 Aug 2020 18:27:24 +0200 Subject: [PATCH] Return unique addresses from service --- internal/ingress/status/status.go | 19 ++++++++--------- internal/ingress/status/status_test.go | 28 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/internal/ingress/status/status.go b/internal/ingress/status/status.go index 815674c0e..58fb26a07 100644 --- a/internal/ingress/status/status.go +++ b/internal/ingress/status/status.go @@ -25,6 +25,7 @@ import ( "time" "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/klog/v2" pool "gopkg.in/go-playground/pool.v3" @@ -339,26 +340,26 @@ func statusAddressFromService(service string, kubeClient clientset.Interface) ([ case apiv1.ServiceTypeClusterIP: return []string{svc.Spec.ClusterIP}, nil case apiv1.ServiceTypeNodePort: - addresses := []string{} + addresses := sets.NewString() if svc.Spec.ExternalIPs != nil { - addresses = append(addresses, svc.Spec.ExternalIPs...) + addresses.Insert(svc.Spec.ExternalIPs...) } else { - addresses = append(addresses, svc.Spec.ClusterIP) + addresses.Insert(svc.Spec.ClusterIP) } - return addresses, nil + return addresses.List(), nil case apiv1.ServiceTypeLoadBalancer: - addresses := []string{} + addresses := sets.NewString() for _, ip := range svc.Status.LoadBalancer.Ingress { if ip.IP == "" { - addresses = append(addresses, ip.Hostname) + addresses.Insert(ip.Hostname) } else { - addresses = append(addresses, ip.IP) + addresses.Insert(ip.IP) } } - addresses = append(addresses, svc.Spec.ExternalIPs...) + addresses.Insert(svc.Spec.ExternalIPs...) - return addresses, nil + return addresses.List(), nil } return nil, fmt.Errorf("unable to extract IP address/es from service %v", service) diff --git a/internal/ingress/status/status_test.go b/internal/ingress/status/status_test.go index 5bc4a9646..e6e89d0a3 100644 --- a/internal/ingress/status/status_test.go +++ b/internal/ingress/status/status_test.go @@ -483,6 +483,34 @@ func TestRunningAddresessWithPublishService(t *testing.T) { []string{"10.0.0.1", "foo"}, false, }, + "service type LoadBalancer with same externalIP and ingress IP": { + testclient.NewSimpleClientset( + &apiv1.ServiceList{Items: []apiv1.Service{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: apiv1.NamespaceDefault, + }, + Spec: apiv1.ServiceSpec{ + Type: apiv1.ServiceTypeLoadBalancer, + ExternalIPs: []string{"10.0.0.1"}, + }, + Status: apiv1.ServiceStatus{ + LoadBalancer: apiv1.LoadBalancerStatus{ + Ingress: []apiv1.LoadBalancerIngress{ + { + IP: "10.0.0.1", + }, + }, + }, + }, + }, + }, + }, + ), + []string{"10.0.0.1"}, + false, + }, "invalid service type": { testclient.NewSimpleClientset( &apiv1.ServiceList{Items: []apiv1.Service{