From 9dcf8ef344e93b0baacf108ab781549215f2462b Mon Sep 17 00:00:00 2001 From: Solly Ross Date: Thu, 18 Aug 2016 13:41:51 -0400 Subject: [PATCH] Userspace Proxy: allow check for endpoints on svc This commit adds a method to the `LoadBalancer` interface in the userspace proxy which allows consumers of the `LoadBalancer` to check if it thinks a given service has endpoints available. --- pkg/proxy/userspace/loadbalancer.go | 1 + pkg/proxy/userspace/roundrobin.go | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/pkg/proxy/userspace/loadbalancer.go b/pkg/proxy/userspace/loadbalancer.go index dee5cb843de..2bf23d5b940 100644 --- a/pkg/proxy/userspace/loadbalancer.go +++ b/pkg/proxy/userspace/loadbalancer.go @@ -31,4 +31,5 @@ type LoadBalancer interface { NewService(service proxy.ServicePortName, sessionAffinityType api.ServiceAffinity, stickyMaxAgeMinutes int) error DeleteService(service proxy.ServicePortName) CleanupStaleStickySessions(service proxy.ServicePortName) + ServiceHasEndpoints(service proxy.ServicePortName) bool } diff --git a/pkg/proxy/userspace/roundrobin.go b/pkg/proxy/userspace/roundrobin.go index 3d52445837e..ca0ccc6eddf 100644 --- a/pkg/proxy/userspace/roundrobin.go +++ b/pkg/proxy/userspace/roundrobin.go @@ -120,6 +120,16 @@ func isSessionAffinity(affinity *affinityPolicy) bool { return true } +// ServiceHasEndpoints checks whether a service entry has endpoints. +func (lb *LoadBalancerRR) ServiceHasEndpoints(svcPort proxy.ServicePortName) bool { + lb.lock.Lock() + defer lb.lock.Unlock() + state, exists := lb.services[svcPort] + // TODO: while nothing ever assigns nil to the map, *some* of the code using the map + // checks for it. The code should all follow the same convention. + return exists && state != nil && len(state.endpoints) > 0 +} + // NextEndpoint returns a service endpoint. // The service endpoint is chosen using the round-robin algorithm. func (lb *LoadBalancerRR) NextEndpoint(svcPort proxy.ServicePortName, srcAddr net.Addr, sessionAffinityReset bool) (string, error) {