diff --git a/pkg/proxy/endpointslicecache.go b/pkg/proxy/endpointslicecache.go index 9b81a6476241..83cd1c2c31cb 100644 --- a/pkg/proxy/endpointslicecache.go +++ b/pkg/proxy/endpointslicecache.go @@ -59,6 +59,10 @@ type endpointInfo struct { Topology map[string]string } +// spToEndpointMap stores groups Endpoint objects by ServicePortName and +// EndpointSlice name. +type spToEndpointMap map[ServicePortName]map[string]Endpoint + // NewEndpointSliceCache initializes an EndpointSliceCache. func NewEndpointSliceCache(hostname string, isIPv6Mode *bool, recorder record.EventRecorder, makeEndpointInfo makeEndpointFunc) *EndpointSliceCache { if makeEndpointInfo == nil { @@ -121,10 +125,15 @@ func (cache *EndpointSliceCache) EndpointsMap(serviceNN types.NamespacedName) En } // endpointInfoByServicePort groups endpoint info by service port name and address. -func (cache *EndpointSliceCache) endpointInfoByServicePort(serviceNN types.NamespacedName) map[ServicePortName]map[string]Endpoint { - endpointInfoBySP := map[ServicePortName]map[string]Endpoint{} +func (cache *EndpointSliceCache) endpointInfoByServicePort(serviceNN types.NamespacedName) spToEndpointMap { + endpointInfoBySP := spToEndpointMap{} + sliceInfoByName, ok := cache.sliceByServiceMap[serviceNN] + + if !ok { + return endpointInfoBySP + } - for _, sliceInfo := range cache.sliceByServiceMap[serviceNN] { + for _, sliceInfo := range sliceInfoByName { for _, port := range sliceInfo.Ports { if port.Name == nil { klog.Warningf("ignoring port with nil name %v", port) diff --git a/pkg/proxy/endpointslicecache_test.go b/pkg/proxy/endpointslicecache_test.go index 73dcc683692b..d4d4af395292 100644 --- a/pkg/proxy/endpointslicecache_test.go +++ b/pkg/proxy/endpointslicecache_test.go @@ -163,7 +163,7 @@ func TestEndpointInfoByServicePort(t *testing.T) { namespacedName types.NamespacedName endpointSlices []*discovery.EndpointSlice hostname string - expectedMap map[ServicePortName]map[string]Endpoint + expectedMap spToEndpointMap }{ "simple use case with 3 endpoints": { namespacedName: types.NamespacedName{Name: "svc1", Namespace: "ns1"}, @@ -171,7 +171,7 @@ func TestEndpointInfoByServicePort(t *testing.T) { endpointSlices: []*discovery.EndpointSlice{ generateEndpointSlice("svc1", "ns1", 1, 3, 999, []string{"host1", "host2"}, []*int32{utilpointer.Int32Ptr(80)}), }, - expectedMap: map[ServicePortName]map[string]Endpoint{ + expectedMap: spToEndpointMap{ {NamespacedName: types.NamespacedName{Name: "svc1", Namespace: "ns1"}, Port: "port-0"}: { "10.0.1.1": &BaseEndpointInfo{Endpoint: "10.0.1.1:80", IsLocal: false}, "10.0.1.2": &BaseEndpointInfo{Endpoint: "10.0.1.2:80", IsLocal: true}, @@ -190,7 +190,7 @@ func TestEndpointInfoByServicePort(t *testing.T) { got := esCache.endpointInfoByServicePort(tc.namespacedName) if !reflect.DeepEqual(got, tc.expectedMap) { - t.Errorf("[%s] endpointInfoByServicePort does not match. Want: %v, Got: %v", name, tc.expectedMap, got) + t.Errorf("[%s] endpointInfoByServicePort does not match. Want: %+v, Got: %+v", name, tc.expectedMap, got) } }