mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Merge pull request #118729 from danwinship/endpoint-naming
Fix endpoint-related names to use consistent singular/plural
This commit is contained in:
		@@ -27,23 +27,23 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CleanStaleEntries takes care of flushing stale conntrack entries for services and endpoints.
 | 
					// CleanStaleEntries takes care of flushing stale conntrack entries for services and endpoints.
 | 
				
			||||||
func CleanStaleEntries(isIPv6 bool, exec utilexec.Interface, svcPortMap proxy.ServicePortMap,
 | 
					func CleanStaleEntries(isIPv6 bool, exec utilexec.Interface, svcPortMap proxy.ServicePortMap,
 | 
				
			||||||
	serviceUpdateResult proxy.UpdateServiceMapResult, endpointUpdateResult proxy.UpdateEndpointMapResult) {
 | 
						serviceUpdateResult proxy.UpdateServiceMapResult, endpointsUpdateResult proxy.UpdateEndpointsMapResult) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deleteStaleServiceConntrackEntries(isIPv6, exec, svcPortMap, serviceUpdateResult, endpointUpdateResult)
 | 
						deleteStaleServiceConntrackEntries(isIPv6, exec, svcPortMap, serviceUpdateResult, endpointsUpdateResult)
 | 
				
			||||||
	deleteStaleEndpointConntrackEntries(exec, svcPortMap, endpointUpdateResult)
 | 
						deleteStaleEndpointConntrackEntries(exec, svcPortMap, endpointsUpdateResult)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// deleteStaleServiceConntrackEntries takes care of flushing stale conntrack entries related
 | 
					// deleteStaleServiceConntrackEntries takes care of flushing stale conntrack entries related
 | 
				
			||||||
// to UDP Service IPs. When a service has no endpoints and we drop traffic to it, conntrack
 | 
					// to UDP Service IPs. When a service has no endpoints and we drop traffic to it, conntrack
 | 
				
			||||||
// may create "black hole" entries for that IP+port. When the service gets endpoints we
 | 
					// may create "black hole" entries for that IP+port. When the service gets endpoints we
 | 
				
			||||||
// need to delete those entries so further traffic doesn't get dropped.
 | 
					// need to delete those entries so further traffic doesn't get dropped.
 | 
				
			||||||
func deleteStaleServiceConntrackEntries(isIPv6 bool, exec utilexec.Interface, svcPortMap proxy.ServicePortMap, serviceUpdateResult proxy.UpdateServiceMapResult, endpointUpdateResult proxy.UpdateEndpointMapResult) {
 | 
					func deleteStaleServiceConntrackEntries(isIPv6 bool, exec utilexec.Interface, svcPortMap proxy.ServicePortMap, serviceUpdateResult proxy.UpdateServiceMapResult, endpointsUpdateResult proxy.UpdateEndpointsMapResult) {
 | 
				
			||||||
	conntrackCleanupServiceIPs := serviceUpdateResult.DeletedUDPClusterIPs
 | 
						conntrackCleanupServiceIPs := serviceUpdateResult.DeletedUDPClusterIPs
 | 
				
			||||||
	conntrackCleanupServiceNodePorts := sets.New[int]()
 | 
						conntrackCleanupServiceNodePorts := sets.New[int]()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// merge newly active services gathered from updateEndpointsMap
 | 
						// merge newly active services gathered from endpointsUpdateResult
 | 
				
			||||||
	// a UDP service that changes from 0 to non-0 endpoints is newly active.
 | 
						// a UDP service that changes from 0 to non-0 endpoints is newly active.
 | 
				
			||||||
	for _, svcPortName := range endpointUpdateResult.NewlyActiveUDPServices {
 | 
						for _, svcPortName := range endpointsUpdateResult.NewlyActiveUDPServices {
 | 
				
			||||||
		if svcInfo, ok := svcPortMap[svcPortName]; ok {
 | 
							if svcInfo, ok := svcPortMap[svcPortName]; ok {
 | 
				
			||||||
			klog.V(4).InfoS("Newly-active UDP service may have stale conntrack entries", "servicePortName", svcPortName)
 | 
								klog.V(4).InfoS("Newly-active UDP service may have stale conntrack entries", "servicePortName", svcPortName)
 | 
				
			||||||
			conntrackCleanupServiceIPs.Insert(svcInfo.ClusterIP().String())
 | 
								conntrackCleanupServiceIPs.Insert(svcInfo.ClusterIP().String())
 | 
				
			||||||
@@ -78,8 +78,8 @@ func deleteStaleServiceConntrackEntries(isIPv6 bool, exec utilexec.Interface, sv
 | 
				
			|||||||
// deleteStaleEndpointConntrackEntries takes care of flushing stale conntrack entries related
 | 
					// deleteStaleEndpointConntrackEntries takes care of flushing stale conntrack entries related
 | 
				
			||||||
// to UDP endpoints. After a UDP endpoint is removed we must flush any conntrack entries
 | 
					// to UDP endpoints. After a UDP endpoint is removed we must flush any conntrack entries
 | 
				
			||||||
// for it so that if the same client keeps sending, the packets will get routed to a new endpoint.
 | 
					// for it so that if the same client keeps sending, the packets will get routed to a new endpoint.
 | 
				
			||||||
func deleteStaleEndpointConntrackEntries(exec utilexec.Interface, svcPortMap proxy.ServicePortMap, endpointUpdateResult proxy.UpdateEndpointMapResult) {
 | 
					func deleteStaleEndpointConntrackEntries(exec utilexec.Interface, svcPortMap proxy.ServicePortMap, endpointsUpdateResult proxy.UpdateEndpointsMapResult) {
 | 
				
			||||||
	for _, epSvcPair := range endpointUpdateResult.DeletedUDPEndpoints {
 | 
						for _, epSvcPair := range endpointsUpdateResult.DeletedUDPEndpoints {
 | 
				
			||||||
		if svcInfo, ok := svcPortMap[epSvcPair.ServicePortName]; ok {
 | 
							if svcInfo, ok := svcPortMap[epSvcPair.ServicePortName]; ok {
 | 
				
			||||||
			endpointIP := proxyutil.IPPart(epSvcPair.Endpoint)
 | 
								endpointIP := proxyutil.IPPart(epSvcPair.Endpoint)
 | 
				
			||||||
			nodePort := svcInfo.NodePort()
 | 
								nodePort := svcInfo.NodePort()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -147,9 +147,9 @@ type makeEndpointFunc func(info *BaseEndpointInfo, svcPortName *ServicePortName)
 | 
				
			|||||||
// EndpointsMap's but just use the changes for any Proxier specific cleanup.
 | 
					// EndpointsMap's but just use the changes for any Proxier specific cleanup.
 | 
				
			||||||
type processEndpointsMapChangeFunc func(oldEndpointsMap, newEndpointsMap EndpointsMap)
 | 
					type processEndpointsMapChangeFunc func(oldEndpointsMap, newEndpointsMap EndpointsMap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EndpointChangeTracker carries state about uncommitted changes to an arbitrary number of
 | 
					// EndpointsChangeTracker carries state about uncommitted changes to an arbitrary number of
 | 
				
			||||||
// Endpoints, keyed by their namespace and name.
 | 
					// Endpoints, keyed by their namespace and name.
 | 
				
			||||||
type EndpointChangeTracker struct {
 | 
					type EndpointsChangeTracker struct {
 | 
				
			||||||
	// lock protects lastChangeTriggerTimes
 | 
						// lock protects lastChangeTriggerTimes
 | 
				
			||||||
	lock sync.Mutex
 | 
						lock sync.Mutex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -159,16 +159,16 @@ type EndpointChangeTracker struct {
 | 
				
			|||||||
	// Map from the Endpoints namespaced-name to the times of the triggers that caused the endpoints
 | 
						// Map from the Endpoints namespaced-name to the times of the triggers that caused the endpoints
 | 
				
			||||||
	// object to change. Used to calculate the network-programming-latency.
 | 
						// object to change. Used to calculate the network-programming-latency.
 | 
				
			||||||
	lastChangeTriggerTimes map[types.NamespacedName][]time.Time
 | 
						lastChangeTriggerTimes map[types.NamespacedName][]time.Time
 | 
				
			||||||
	// record the time when the endpointChangeTracker was created so we can ignore the endpoints
 | 
						// record the time when the endpointsChangeTracker was created so we can ignore the endpoints
 | 
				
			||||||
	// that were generated before, because we can't estimate the network-programming-latency on those.
 | 
						// that were generated before, because we can't estimate the network-programming-latency on those.
 | 
				
			||||||
	// This is specially problematic on restarts, because we process all the endpoints that may have been
 | 
						// This is specially problematic on restarts, because we process all the endpoints that may have been
 | 
				
			||||||
	// created hours or days before.
 | 
						// created hours or days before.
 | 
				
			||||||
	trackerStartTime time.Time
 | 
						trackerStartTime time.Time
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewEndpointChangeTracker initializes an EndpointsChangeMap
 | 
					// NewEndpointsChangeTracker initializes an EndpointsChangeTracker
 | 
				
			||||||
func NewEndpointChangeTracker(hostname string, makeEndpointInfo makeEndpointFunc, ipFamily v1.IPFamily, recorder events.EventRecorder, processEndpointsMapChange processEndpointsMapChangeFunc) *EndpointChangeTracker {
 | 
					func NewEndpointsChangeTracker(hostname string, makeEndpointInfo makeEndpointFunc, ipFamily v1.IPFamily, recorder events.EventRecorder, processEndpointsMapChange processEndpointsMapChangeFunc) *EndpointsChangeTracker {
 | 
				
			||||||
	return &EndpointChangeTracker{
 | 
						return &EndpointsChangeTracker{
 | 
				
			||||||
		lastChangeTriggerTimes:    make(map[types.NamespacedName][]time.Time),
 | 
							lastChangeTriggerTimes:    make(map[types.NamespacedName][]time.Time),
 | 
				
			||||||
		trackerStartTime:          time.Now(),
 | 
							trackerStartTime:          time.Now(),
 | 
				
			||||||
		processEndpointsMapChange: processEndpointsMapChange,
 | 
							processEndpointsMapChange: processEndpointsMapChange,
 | 
				
			||||||
@@ -177,9 +177,9 @@ func NewEndpointChangeTracker(hostname string, makeEndpointInfo makeEndpointFunc
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EndpointSliceUpdate updates given service's endpoints change map based on the <previous, current> endpoints pair.
 | 
					// EndpointSliceUpdate updates given service's endpoints change map based on the <previous, current> endpoints pair.
 | 
				
			||||||
// It returns true if items changed, otherwise return false. Will add/update/delete items of EndpointsChangeMap.
 | 
					// It returns true if items changed, otherwise return false. Will add/update/delete items of EndpointsChangeTracker.
 | 
				
			||||||
// If removeSlice is true, slice will be removed, otherwise it will be added or updated.
 | 
					// If removeSlice is true, slice will be removed, otherwise it will be added or updated.
 | 
				
			||||||
func (ect *EndpointChangeTracker) EndpointSliceUpdate(endpointSlice *discovery.EndpointSlice, removeSlice bool) bool {
 | 
					func (ect *EndpointsChangeTracker) EndpointSliceUpdate(endpointSlice *discovery.EndpointSlice, removeSlice bool) bool {
 | 
				
			||||||
	if !supportedEndpointSliceAddressTypes.Has(string(endpointSlice.AddressType)) {
 | 
						if !supportedEndpointSliceAddressTypes.Has(string(endpointSlice.AddressType)) {
 | 
				
			||||||
		klog.V(4).InfoS("EndpointSlice address type not supported by kube-proxy", "addressType", endpointSlice.AddressType)
 | 
							klog.V(4).InfoS("EndpointSlice address type not supported by kube-proxy", "addressType", endpointSlice.AddressType)
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
@@ -225,13 +225,13 @@ func (ect *EndpointChangeTracker) EndpointSliceUpdate(endpointSlice *discovery.E
 | 
				
			|||||||
// PendingChanges returns a set whose keys are the names of the services whose endpoints
 | 
					// PendingChanges returns a set whose keys are the names of the services whose endpoints
 | 
				
			||||||
// have changed since the last time ect was used to update an EndpointsMap. (You must call
 | 
					// have changed since the last time ect was used to update an EndpointsMap. (You must call
 | 
				
			||||||
// this _before_ calling em.Update(ect).)
 | 
					// this _before_ calling em.Update(ect).)
 | 
				
			||||||
func (ect *EndpointChangeTracker) PendingChanges() sets.Set[string] {
 | 
					func (ect *EndpointsChangeTracker) PendingChanges() sets.Set[string] {
 | 
				
			||||||
	return ect.endpointSliceCache.pendingChanges()
 | 
						return ect.endpointSliceCache.pendingChanges()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// checkoutChanges returns a list of pending endpointsChanges and marks them as
 | 
					// checkoutChanges returns a list of pending endpointsChanges and marks them as
 | 
				
			||||||
// applied.
 | 
					// applied.
 | 
				
			||||||
func (ect *EndpointChangeTracker) checkoutChanges() []*endpointsChange {
 | 
					func (ect *EndpointsChangeTracker) checkoutChanges() []*endpointsChange {
 | 
				
			||||||
	metrics.EndpointChangesPending.Set(0)
 | 
						metrics.EndpointChangesPending.Set(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ect.endpointSliceCache.checkoutChanges()
 | 
						return ect.endpointSliceCache.checkoutChanges()
 | 
				
			||||||
@@ -239,7 +239,7 @@ func (ect *EndpointChangeTracker) checkoutChanges() []*endpointsChange {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// checkoutTriggerTimes applies the locally cached trigger times to a map of
 | 
					// checkoutTriggerTimes applies the locally cached trigger times to a map of
 | 
				
			||||||
// trigger times that have been passed in and empties the local cache.
 | 
					// trigger times that have been passed in and empties the local cache.
 | 
				
			||||||
func (ect *EndpointChangeTracker) checkoutTriggerTimes(lastChangeTriggerTimes *map[types.NamespacedName][]time.Time) {
 | 
					func (ect *EndpointsChangeTracker) checkoutTriggerTimes(lastChangeTriggerTimes *map[types.NamespacedName][]time.Time) {
 | 
				
			||||||
	ect.lock.Lock()
 | 
						ect.lock.Lock()
 | 
				
			||||||
	defer ect.lock.Unlock()
 | 
						defer ect.lock.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -284,8 +284,8 @@ type endpointsChange struct {
 | 
				
			|||||||
	current  EndpointsMap
 | 
						current  EndpointsMap
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdateEndpointMapResult is the updated results after applying endpoints changes.
 | 
					// UpdateEndpointsMapResult is the updated results after applying endpoints changes.
 | 
				
			||||||
type UpdateEndpointMapResult struct {
 | 
					type UpdateEndpointsMapResult struct {
 | 
				
			||||||
	// DeletedUDPEndpoints identifies UDP endpoints that have just been deleted.
 | 
						// DeletedUDPEndpoints identifies UDP endpoints that have just been deleted.
 | 
				
			||||||
	// Existing conntrack NAT entries pointing to these endpoints must be deleted to
 | 
						// Existing conntrack NAT entries pointing to these endpoints must be deleted to
 | 
				
			||||||
	// ensure that no further traffic for the Service gets delivered to them.
 | 
						// ensure that no further traffic for the Service gets delivered to them.
 | 
				
			||||||
@@ -304,7 +304,7 @@ type UpdateEndpointMapResult struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Update updates endpointsMap base on the given changes.
 | 
					// Update updates endpointsMap base on the given changes.
 | 
				
			||||||
func (em EndpointsMap) Update(changes *EndpointChangeTracker) (result UpdateEndpointMapResult) {
 | 
					func (em EndpointsMap) Update(changes *EndpointsChangeTracker) (result UpdateEndpointsMapResult) {
 | 
				
			||||||
	result.DeletedUDPEndpoints = make([]ServiceEndpoint, 0)
 | 
						result.DeletedUDPEndpoints = make([]ServiceEndpoint, 0)
 | 
				
			||||||
	result.NewlyActiveUDPServices = make([]ServicePortName, 0)
 | 
						result.NewlyActiveUDPServices = make([]ServicePortName, 0)
 | 
				
			||||||
	result.LastChangeTriggerTimes = make(map[types.NamespacedName][]time.Time)
 | 
						result.LastChangeTriggerTimes = make(map[types.NamespacedName][]time.Time)
 | 
				
			||||||
@@ -321,7 +321,7 @@ type EndpointsMap map[ServicePortName][]Endpoint
 | 
				
			|||||||
// and clear the changes map. In addition it returns (via argument) and resets the
 | 
					// and clear the changes map. In addition it returns (via argument) and resets the
 | 
				
			||||||
// lastChangeTriggerTimes for all endpoints that were changed and will result in syncing
 | 
					// lastChangeTriggerTimes for all endpoints that were changed and will result in syncing
 | 
				
			||||||
// the proxy rules. apply triggers processEndpointsMapChange on every change.
 | 
					// the proxy rules. apply triggers processEndpointsMapChange on every change.
 | 
				
			||||||
func (em EndpointsMap) apply(ect *EndpointChangeTracker, deletedUDPEndpoints *[]ServiceEndpoint,
 | 
					func (em EndpointsMap) apply(ect *EndpointsChangeTracker, deletedUDPEndpoints *[]ServiceEndpoint,
 | 
				
			||||||
	newlyActiveUDPServices *[]ServicePortName, lastChangeTriggerTimes *map[types.NamespacedName][]time.Time) {
 | 
						newlyActiveUDPServices *[]ServicePortName, lastChangeTriggerTimes *map[types.NamespacedName][]time.Time) {
 | 
				
			||||||
	if ect == nil {
 | 
						if ect == nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -396,7 +396,7 @@ func (em EndpointsMap) LocalReadyEndpoints() map[types.NamespacedName]int {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// detectStaleConntrackEntries detects services that may be associated with stale conntrack entries.
 | 
					// detectStaleConntrackEntries detects services that may be associated with stale conntrack entries.
 | 
				
			||||||
// (See UpdateEndpointMapResult.DeletedUDPEndpoints and .NewlyActiveUDPServices.)
 | 
					// (See UpdateEndpointsMapResult.DeletedUDPEndpoints and .NewlyActiveUDPServices.)
 | 
				
			||||||
func detectStaleConntrackEntries(oldEndpointsMap, newEndpointsMap EndpointsMap, deletedUDPEndpoints *[]ServiceEndpoint, newlyActiveUDPServices *[]ServicePortName) {
 | 
					func detectStaleConntrackEntries(oldEndpointsMap, newEndpointsMap EndpointsMap, deletedUDPEndpoints *[]ServiceEndpoint, newlyActiveUDPServices *[]ServicePortName) {
 | 
				
			||||||
	// Find the UDP endpoints that we were sending traffic to in oldEndpointsMap, but
 | 
						// Find the UDP endpoints that we were sending traffic to in oldEndpointsMap, but
 | 
				
			||||||
	// are no longer sending to newEndpointsMap. The proxier should make sure that
 | 
						// are no longer sending to newEndpointsMap. The proxier should make sure that
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1340,7 +1340,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	testCases := map[string]struct {
 | 
						testCases := map[string]struct {
 | 
				
			||||||
		startingSlices           []*discovery.EndpointSlice
 | 
							startingSlices           []*discovery.EndpointSlice
 | 
				
			||||||
		endpointChangeTracker    *EndpointChangeTracker
 | 
							endpointsChangeTracker   *EndpointsChangeTracker
 | 
				
			||||||
		namespacedName           types.NamespacedName
 | 
							namespacedName           types.NamespacedName
 | 
				
			||||||
		paramEndpointSlice       *discovery.EndpointSlice
 | 
							paramEndpointSlice       *discovery.EndpointSlice
 | 
				
			||||||
		paramRemoveSlice         bool
 | 
							paramRemoveSlice         bool
 | 
				
			||||||
@@ -1351,7 +1351,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
		// test starting from an empty state
 | 
							// test starting from an empty state
 | 
				
			||||||
		"add a simple slice that doesn't already exist": {
 | 
							"add a simple slice that doesn't already exist": {
 | 
				
			||||||
			startingSlices:         []*discovery.EndpointSlice{},
 | 
								startingSlices:         []*discovery.EndpointSlice{},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:       false,
 | 
								paramRemoveSlice:       false,
 | 
				
			||||||
@@ -1375,7 +1375,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
			startingSlices: []*discovery.EndpointSlice{
 | 
								startingSlices: []*discovery.EndpointSlice{
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker:    NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker:   NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:           types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:           types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:       generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:       generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:         false,
 | 
								paramRemoveSlice:         false,
 | 
				
			||||||
@@ -1388,7 +1388,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
			startingSlices: []*discovery.EndpointSlice{
 | 
								startingSlices: []*discovery.EndpointSlice{
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker:    NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker:   NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:           types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:           types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:       fqdnSlice,
 | 
								paramEndpointSlice:       fqdnSlice,
 | 
				
			||||||
			paramRemoveSlice:         false,
 | 
								paramRemoveSlice:         false,
 | 
				
			||||||
@@ -1402,7 +1402,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:       false,
 | 
								paramRemoveSlice:       false,
 | 
				
			||||||
@@ -1435,7 +1435,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSliceWithOffset("svc1", "ns1", 3, 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80)}),
 | 
								paramEndpointSlice:     generateEndpointSliceWithOffset("svc1", "ns1", 3, 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80)}),
 | 
				
			||||||
			paramRemoveSlice:       false,
 | 
								paramRemoveSlice:       false,
 | 
				
			||||||
@@ -1466,7 +1466,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:       true,
 | 
								paramRemoveSlice:       true,
 | 
				
			||||||
@@ -1489,7 +1489,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
				generateEndpointSlice("svc1", "ns1", 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 2, 2, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker:    NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker:   NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:           types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:           types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:       generateEndpointSlice("svc1", "ns1", 3, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:       generateEndpointSlice("svc1", "ns1", 3, 5, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:         true,
 | 
								paramRemoveSlice:         true,
 | 
				
			||||||
@@ -1502,7 +1502,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
			startingSlices: []*discovery.EndpointSlice{
 | 
								startingSlices: []*discovery.EndpointSlice{
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 999, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 1, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 1, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:       false,
 | 
								paramRemoveSlice:       false,
 | 
				
			||||||
@@ -1526,7 +1526,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
			startingSlices: []*discovery.EndpointSlice{
 | 
								startingSlices: []*discovery.EndpointSlice{
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 1, 2, 1, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 2, 1, 999, []string{"host1", "host2"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 2, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 2, 999, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:       false,
 | 
								paramRemoveSlice:       false,
 | 
				
			||||||
@@ -1549,7 +1549,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 2, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 2, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 2, 2, 2, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 2, 2, 2, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 3, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 3, 999, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:       false,
 | 
								paramRemoveSlice:       false,
 | 
				
			||||||
@@ -1578,7 +1578,7 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
				generateEndpointSlice("svc1", "ns1", 1, 3, 2, 2, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 1, 3, 2, 2, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
				generateEndpointSlice("svc1", "ns1", 2, 2, 2, 2, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
									generateEndpointSlice("svc1", "ns1", 2, 2, 2, 2, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("host1", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
								namespacedName:         types.NamespacedName{Name: "svc1", Namespace: "ns1"},
 | 
				
			||||||
			paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 3, 2, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
								paramEndpointSlice:     generateEndpointSlice("svc1", "ns1", 1, 3, 3, 2, []string{"host1"}, []*int32{pointer.Int32(80), pointer.Int32(443)}),
 | 
				
			||||||
			paramRemoveSlice:       false,
 | 
								paramRemoveSlice:       false,
 | 
				
			||||||
@@ -1605,19 +1605,19 @@ func TestEndpointSliceUpdate(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	for name, tc := range testCases {
 | 
						for name, tc := range testCases {
 | 
				
			||||||
		t.Run(name, func(t *testing.T) {
 | 
							t.Run(name, func(t *testing.T) {
 | 
				
			||||||
			initializeCache(tc.endpointChangeTracker.endpointSliceCache, tc.startingSlices)
 | 
								initializeCache(tc.endpointsChangeTracker.endpointSliceCache, tc.startingSlices)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			got := tc.endpointChangeTracker.EndpointSliceUpdate(tc.paramEndpointSlice, tc.paramRemoveSlice)
 | 
								got := tc.endpointsChangeTracker.EndpointSliceUpdate(tc.paramEndpointSlice, tc.paramRemoveSlice)
 | 
				
			||||||
			if !reflect.DeepEqual(got, tc.expectedReturnVal) {
 | 
								if !reflect.DeepEqual(got, tc.expectedReturnVal) {
 | 
				
			||||||
				t.Errorf("EndpointSliceUpdate return value got: %v, want %v", got, tc.expectedReturnVal)
 | 
									t.Errorf("EndpointSliceUpdate return value got: %v, want %v", got, tc.expectedReturnVal)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			pendingChanges := tc.endpointChangeTracker.PendingChanges()
 | 
								pendingChanges := tc.endpointsChangeTracker.PendingChanges()
 | 
				
			||||||
			if !pendingChanges.Equal(tc.expectedChangedEndpoints) {
 | 
								if !pendingChanges.Equal(tc.expectedChangedEndpoints) {
 | 
				
			||||||
				t.Errorf("expected changed endpoints %q, got %q", tc.expectedChangedEndpoints.UnsortedList(), pendingChanges.UnsortedList())
 | 
									t.Errorf("expected changed endpoints %q, got %q", tc.expectedChangedEndpoints.UnsortedList(), pendingChanges.UnsortedList())
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			changes := tc.endpointChangeTracker.checkoutChanges()
 | 
								changes := tc.endpointsChangeTracker.checkoutChanges()
 | 
				
			||||||
			if tc.expectedCurrentChange == nil {
 | 
								if tc.expectedCurrentChange == nil {
 | 
				
			||||||
				if len(changes) != 0 {
 | 
									if len(changes) != 0 {
 | 
				
			||||||
					t.Errorf("Expected %s to have no changes", tc.namespacedName)
 | 
										t.Errorf("Expected %s to have no changes", tc.namespacedName)
 | 
				
			||||||
@@ -1637,20 +1637,20 @@ func TestCheckoutChanges(t *testing.T) {
 | 
				
			|||||||
	svcPortName1 := ServicePortName{types.NamespacedName{Namespace: "ns1", Name: "svc1"}, "port-1", v1.ProtocolTCP}
 | 
						svcPortName1 := ServicePortName{types.NamespacedName{Namespace: "ns1", Name: "svc1"}, "port-1", v1.ProtocolTCP}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	testCases := map[string]struct {
 | 
						testCases := map[string]struct {
 | 
				
			||||||
		endpointChangeTracker *EndpointChangeTracker
 | 
							endpointsChangeTracker *EndpointsChangeTracker
 | 
				
			||||||
		expectedChanges        []*endpointsChange
 | 
							expectedChanges        []*endpointsChange
 | 
				
			||||||
		items                  map[types.NamespacedName]*endpointsChange
 | 
							items                  map[types.NamespacedName]*endpointsChange
 | 
				
			||||||
		appliedSlices          []*discovery.EndpointSlice
 | 
							appliedSlices          []*discovery.EndpointSlice
 | 
				
			||||||
		pendingSlices          []*discovery.EndpointSlice
 | 
							pendingSlices          []*discovery.EndpointSlice
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		"empty slices": {
 | 
							"empty slices": {
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			expectedChanges:        []*endpointsChange{},
 | 
								expectedChanges:        []*endpointsChange{},
 | 
				
			||||||
			appliedSlices:          []*discovery.EndpointSlice{},
 | 
								appliedSlices:          []*discovery.EndpointSlice{},
 | 
				
			||||||
			pendingSlices:          []*discovery.EndpointSlice{},
 | 
								pendingSlices:          []*discovery.EndpointSlice{},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"adding initial slice": {
 | 
							"adding initial slice": {
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			expectedChanges: []*endpointsChange{{
 | 
								expectedChanges: []*endpointsChange{{
 | 
				
			||||||
				previous: EndpointsMap{},
 | 
									previous: EndpointsMap{},
 | 
				
			||||||
				current: EndpointsMap{
 | 
									current: EndpointsMap{
 | 
				
			||||||
@@ -1663,7 +1663,7 @@ func TestCheckoutChanges(t *testing.T) {
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"removing port in update": {
 | 
							"removing port in update": {
 | 
				
			||||||
			endpointChangeTracker: NewEndpointChangeTracker("", nil, v1.IPv4Protocol, nil, nil),
 | 
								endpointsChangeTracker: NewEndpointsChangeTracker("", nil, v1.IPv4Protocol, nil, nil),
 | 
				
			||||||
			expectedChanges: []*endpointsChange{{
 | 
								expectedChanges: []*endpointsChange{{
 | 
				
			||||||
				previous: EndpointsMap{
 | 
									previous: EndpointsMap{
 | 
				
			||||||
					svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", "host1", true, true, false), newTestEp("10.0.1.2:80", "host1", true, true, false), newTestEp("10.0.1.3:80", "host1", false, false, false)},
 | 
										svcPortName0: []Endpoint{newTestEp("10.0.1.1:80", "host1", true, true, false), newTestEp("10.0.1.2:80", "host1", true, true, false), newTestEp("10.0.1.3:80", "host1", false, false, false)},
 | 
				
			||||||
@@ -1685,13 +1685,13 @@ func TestCheckoutChanges(t *testing.T) {
 | 
				
			|||||||
	for name, tc := range testCases {
 | 
						for name, tc := range testCases {
 | 
				
			||||||
		t.Run(name, func(t *testing.T) {
 | 
							t.Run(name, func(t *testing.T) {
 | 
				
			||||||
			for _, slice := range tc.appliedSlices {
 | 
								for _, slice := range tc.appliedSlices {
 | 
				
			||||||
				tc.endpointChangeTracker.EndpointSliceUpdate(slice, false)
 | 
									tc.endpointsChangeTracker.EndpointSliceUpdate(slice, false)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			tc.endpointChangeTracker.checkoutChanges()
 | 
								tc.endpointsChangeTracker.checkoutChanges()
 | 
				
			||||||
			for _, slice := range tc.pendingSlices {
 | 
								for _, slice := range tc.pendingSlices {
 | 
				
			||||||
				tc.endpointChangeTracker.EndpointSliceUpdate(slice, false)
 | 
									tc.endpointsChangeTracker.EndpointSliceUpdate(slice, false)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			changes := tc.endpointChangeTracker.checkoutChanges()
 | 
								changes := tc.endpointsChangeTracker.checkoutChanges()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if len(tc.expectedChanges) != len(changes) {
 | 
								if len(tc.expectedChanges) != len(changes) {
 | 
				
			||||||
				t.Fatalf("Expected %d changes, got %d", len(tc.expectedChanges), len(changes))
 | 
									t.Fatalf("Expected %d changes, got %d", len(tc.expectedChanges), len(changes))
 | 
				
			||||||
@@ -1730,7 +1730,7 @@ func compareEndpointsMapsStr(t *testing.T, newMap EndpointsMap, expected map[Ser
 | 
				
			|||||||
			for i := range expected[x] {
 | 
								for i := range expected[x] {
 | 
				
			||||||
				newEp, ok := newMap[x][i].(*BaseEndpointInfo)
 | 
									newEp, ok := newMap[x][i].(*BaseEndpointInfo)
 | 
				
			||||||
				if !ok {
 | 
									if !ok {
 | 
				
			||||||
					t.Fatalf("Failed to cast endpointsInfo")
 | 
										t.Fatalf("Failed to cast endpointInfo")
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if !endpointEqual(newEp, expected[x][i]) {
 | 
									if !endpointEqual(newEp, expected[x][i]) {
 | 
				
			||||||
					t.Fatalf("expected new[%v][%d] to be %v, got %v"+
 | 
										t.Fatalf("expected new[%v][%d] to be %v, got %v"+
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -122,15 +122,15 @@ func newServiceInfo(port *v1.ServicePort, service *v1.Service, bsvcPortInfo *pro
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// internal struct for endpoints information
 | 
					// internal struct for endpoints information
 | 
				
			||||||
type endpointsInfo struct {
 | 
					type endpointInfo struct {
 | 
				
			||||||
	*proxy.BaseEndpointInfo
 | 
						*proxy.BaseEndpointInfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ChainName utiliptables.Chain
 | 
						ChainName utiliptables.Chain
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// returns a new proxy.Endpoint which abstracts a endpointsInfo
 | 
					// returns a new proxy.Endpoint which abstracts a endpointInfo
 | 
				
			||||||
func newEndpointInfo(baseInfo *proxy.BaseEndpointInfo, svcPortName *proxy.ServicePortName) proxy.Endpoint {
 | 
					func newEndpointInfo(baseInfo *proxy.BaseEndpointInfo, svcPortName *proxy.ServicePortName) proxy.Endpoint {
 | 
				
			||||||
	return &endpointsInfo{
 | 
						return &endpointInfo{
 | 
				
			||||||
		BaseEndpointInfo: baseInfo,
 | 
							BaseEndpointInfo: baseInfo,
 | 
				
			||||||
		ChainName:        servicePortEndpointChainName(svcPortName.String(), strings.ToLower(string(svcPortName.Protocol)), baseInfo.Endpoint),
 | 
							ChainName:        servicePortEndpointChainName(svcPortName.String(), strings.ToLower(string(svcPortName.Protocol)), baseInfo.Endpoint),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -143,7 +143,7 @@ type Proxier struct {
 | 
				
			|||||||
	// services that happened since iptables was synced. For a single object,
 | 
						// services that happened since iptables was synced. For a single object,
 | 
				
			||||||
	// changes are accumulated, i.e. previous is state from before all of them,
 | 
						// changes are accumulated, i.e. previous is state from before all of them,
 | 
				
			||||||
	// current is state after applying all of those.
 | 
						// current is state after applying all of those.
 | 
				
			||||||
	endpointsChanges *proxy.EndpointChangeTracker
 | 
						endpointsChanges *proxy.EndpointsChangeTracker
 | 
				
			||||||
	serviceChanges   *proxy.ServiceChangeTracker
 | 
						serviceChanges   *proxy.ServiceChangeTracker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mu           sync.Mutex // protects the following fields
 | 
						mu           sync.Mutex // protects the following fields
 | 
				
			||||||
@@ -265,7 +265,7 @@ func NewProxier(ipFamily v1.IPFamily,
 | 
				
			|||||||
		svcPortMap:               make(proxy.ServicePortMap),
 | 
							svcPortMap:               make(proxy.ServicePortMap),
 | 
				
			||||||
		serviceChanges:           proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, recorder, nil),
 | 
							serviceChanges:           proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, recorder, nil),
 | 
				
			||||||
		endpointsMap:             make(proxy.EndpointsMap),
 | 
							endpointsMap:             make(proxy.EndpointsMap),
 | 
				
			||||||
		endpointsChanges:         proxy.NewEndpointChangeTracker(hostname, newEndpointInfo, ipFamily, recorder, nil),
 | 
							endpointsChanges:         proxy.NewEndpointsChangeTracker(hostname, newEndpointInfo, ipFamily, recorder, nil),
 | 
				
			||||||
		needFullSync:             true,
 | 
							needFullSync:             true,
 | 
				
			||||||
		syncPeriod:               syncPeriod,
 | 
							syncPeriod:               syncPeriod,
 | 
				
			||||||
		iptables:                 ipt,
 | 
							iptables:                 ipt,
 | 
				
			||||||
@@ -952,7 +952,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Note the endpoint chains that will be used
 | 
							// Note the endpoint chains that will be used
 | 
				
			||||||
		for _, ep := range allLocallyReachableEndpoints {
 | 
							for _, ep := range allLocallyReachableEndpoints {
 | 
				
			||||||
			if epInfo, ok := ep.(*endpointsInfo); ok {
 | 
								if epInfo, ok := ep.(*endpointInfo); ok {
 | 
				
			||||||
				activeNATChains[epInfo.ChainName] = true
 | 
									activeNATChains[epInfo.ChainName] = true
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -1345,9 +1345,9 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Generate the per-endpoint chains.
 | 
							// Generate the per-endpoint chains.
 | 
				
			||||||
		for _, ep := range allLocallyReachableEndpoints {
 | 
							for _, ep := range allLocallyReachableEndpoints {
 | 
				
			||||||
			epInfo, ok := ep.(*endpointsInfo)
 | 
								epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
			if !ok {
 | 
								if !ok {
 | 
				
			||||||
				klog.ErrorS(nil, "Failed to cast endpointsInfo", "endpointsInfo", ep)
 | 
									klog.ErrorS(nil, "Failed to cast endpointInfo", "endpointInfo", ep)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1556,7 +1556,7 @@ func (proxier *Proxier) writeServiceToEndpointRules(natRules proxyutil.LineBuffe
 | 
				
			|||||||
	// First write session affinity rules, if applicable.
 | 
						// First write session affinity rules, if applicable.
 | 
				
			||||||
	if svcInfo.SessionAffinityType() == v1.ServiceAffinityClientIP {
 | 
						if svcInfo.SessionAffinityType() == v1.ServiceAffinityClientIP {
 | 
				
			||||||
		for _, ep := range endpoints {
 | 
							for _, ep := range endpoints {
 | 
				
			||||||
			epInfo, ok := ep.(*endpointsInfo)
 | 
								epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
			if !ok {
 | 
								if !ok {
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -1578,7 +1578,7 @@ func (proxier *Proxier) writeServiceToEndpointRules(natRules proxyutil.LineBuffe
 | 
				
			|||||||
	// Now write loadbalancing rules.
 | 
						// Now write loadbalancing rules.
 | 
				
			||||||
	numEndpoints := len(endpoints)
 | 
						numEndpoints := len(endpoints)
 | 
				
			||||||
	for i, ep := range endpoints {
 | 
						for i, ep := range endpoints {
 | 
				
			||||||
		epInfo, ok := ep.(*endpointsInfo)
 | 
							epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -330,7 +330,7 @@ func NewFakeProxier(ipt utiliptables.Interface) *Proxier {
 | 
				
			|||||||
		svcPortMap:               make(proxy.ServicePortMap),
 | 
							svcPortMap:               make(proxy.ServicePortMap),
 | 
				
			||||||
		serviceChanges:           proxy.NewServiceChangeTracker(newServiceInfo, ipfamily, nil, nil),
 | 
							serviceChanges:           proxy.NewServiceChangeTracker(newServiceInfo, ipfamily, nil, nil),
 | 
				
			||||||
		endpointsMap:             make(proxy.EndpointsMap),
 | 
							endpointsMap:             make(proxy.EndpointsMap),
 | 
				
			||||||
		endpointsChanges:         proxy.NewEndpointChangeTracker(testHostname, newEndpointInfo, ipfamily, nil, nil),
 | 
							endpointsChanges:         proxy.NewEndpointsChangeTracker(testHostname, newEndpointInfo, ipfamily, nil, nil),
 | 
				
			||||||
		needFullSync:             true,
 | 
							needFullSync:             true,
 | 
				
			||||||
		iptables:                 ipt,
 | 
							iptables:                 ipt,
 | 
				
			||||||
		masqueradeMark:           "0x4000",
 | 
							masqueradeMark:           "0x4000",
 | 
				
			||||||
@@ -3371,7 +3371,7 @@ func makeServiceMap(proxier *Proxier, allServices ...*v1.Service) {
 | 
				
			|||||||
	proxier.servicesSynced = true
 | 
						proxier.servicesSynced = true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func compareEndpointsMapsExceptChainName(t *testing.T, tci int, newMap proxy.EndpointsMap, expected map[proxy.ServicePortName][]*endpointsInfo) {
 | 
					func compareEndpointsMapsExceptChainName(t *testing.T, tci int, newMap proxy.EndpointsMap, expected map[proxy.ServicePortName][]*endpointInfo) {
 | 
				
			||||||
	if len(newMap) != len(expected) {
 | 
						if len(newMap) != len(expected) {
 | 
				
			||||||
		t.Errorf("[%d] expected %d results, got %d: %v", tci, len(expected), len(newMap), newMap)
 | 
							t.Errorf("[%d] expected %d results, got %d: %v", tci, len(expected), len(newMap), newMap)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -3380,9 +3380,9 @@ func compareEndpointsMapsExceptChainName(t *testing.T, tci int, newMap proxy.End
 | 
				
			|||||||
			t.Errorf("[%d] expected %d endpoints for %v, got %d", tci, len(expected[x]), x, len(newMap[x]))
 | 
								t.Errorf("[%d] expected %d endpoints for %v, got %d", tci, len(expected[x]), x, len(newMap[x]))
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			for i := range expected[x] {
 | 
								for i := range expected[x] {
 | 
				
			||||||
				newEp, ok := newMap[x][i].(*endpointsInfo)
 | 
									newEp, ok := newMap[x][i].(*endpointInfo)
 | 
				
			||||||
				if !ok {
 | 
									if !ok {
 | 
				
			||||||
					t.Errorf("Failed to cast endpointsInfo")
 | 
										t.Errorf("Failed to cast endpointInfo")
 | 
				
			||||||
					continue
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if newEp.Endpoint != expected[x][i].Endpoint ||
 | 
									if newEp.Endpoint != expected[x][i].Endpoint ||
 | 
				
			||||||
@@ -3731,16 +3731,16 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name                           string
 | 
							name                           string
 | 
				
			||||||
		previousEndpoints              []*discovery.EndpointSlice
 | 
							previousEndpoints              []*discovery.EndpointSlice
 | 
				
			||||||
		currentEndpoints               []*discovery.EndpointSlice
 | 
							currentEndpoints               []*discovery.EndpointSlice
 | 
				
			||||||
		oldEndpoints                   map[proxy.ServicePortName][]*endpointsInfo
 | 
							oldEndpoints                   map[proxy.ServicePortName][]*endpointInfo
 | 
				
			||||||
		expectedResult                 map[proxy.ServicePortName][]*endpointsInfo
 | 
							expectedResult                 map[proxy.ServicePortName][]*endpointInfo
 | 
				
			||||||
		expectedDeletedUDPEndpoints    []proxy.ServiceEndpoint
 | 
							expectedDeletedUDPEndpoints    []proxy.ServiceEndpoint
 | 
				
			||||||
		expectedNewlyActiveUDPServices map[proxy.ServicePortName]bool
 | 
							expectedNewlyActiveUDPServices map[proxy.ServicePortName]bool
 | 
				
			||||||
		expectedLocalEndpoints         map[types.NamespacedName]int
 | 
							expectedLocalEndpoints         map[types.NamespacedName]int
 | 
				
			||||||
	}{{
 | 
						}{{
 | 
				
			||||||
		// Case[0]: nothing
 | 
							// Case[0]: nothing
 | 
				
			||||||
		name:                           "nothing",
 | 
							name:                           "nothing",
 | 
				
			||||||
		oldEndpoints:                   map[proxy.ServicePortName][]*endpointsInfo{},
 | 
							oldEndpoints:                   map[proxy.ServicePortName][]*endpointInfo{},
 | 
				
			||||||
		expectedResult:                 map[proxy.ServicePortName][]*endpointsInfo{},
 | 
							expectedResult:                 map[proxy.ServicePortName][]*endpointInfo{},
 | 
				
			||||||
		expectedDeletedUDPEndpoints:    []proxy.ServiceEndpoint{},
 | 
							expectedDeletedUDPEndpoints:    []proxy.ServiceEndpoint{},
 | 
				
			||||||
		expectedNewlyActiveUDPServices: map[proxy.ServicePortName]bool{},
 | 
							expectedNewlyActiveUDPServices: map[proxy.ServicePortName]bool{},
 | 
				
			||||||
		expectedLocalEndpoints:         map[types.NamespacedName]int{},
 | 
							expectedLocalEndpoints:         map[types.NamespacedName]int{},
 | 
				
			||||||
@@ -3749,12 +3749,12 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "no change, named port, local",
 | 
							name:              "no change, named port, local",
 | 
				
			||||||
		previousEndpoints: namedPortLocal,
 | 
							previousEndpoints: namedPortLocal,
 | 
				
			||||||
		currentEndpoints:  namedPortLocal,
 | 
							currentEndpoints:  namedPortLocal,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -3769,7 +3769,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "no change, multiple subsets",
 | 
							name:              "no change, multiple subsets",
 | 
				
			||||||
		previousEndpoints: multipleSubsets,
 | 
							previousEndpoints: multipleSubsets,
 | 
				
			||||||
		currentEndpoints:  multipleSubsets,
 | 
							currentEndpoints:  multipleSubsets,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -3777,7 +3777,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:12", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:12", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -3793,7 +3793,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "no change, multiple subsets, multiple ports, local",
 | 
							name:              "no change, multiple subsets, multiple ports, local",
 | 
				
			||||||
		previousEndpoints: multipleSubsetsMultiplePortsLocal,
 | 
							previousEndpoints: multipleSubsetsMultiplePortsLocal,
 | 
				
			||||||
		currentEndpoints:  multipleSubsetsMultiplePortsLocal,
 | 
							currentEndpoints:  multipleSubsetsMultiplePortsLocal,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -3804,7 +3804,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.3:13", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.3:13", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -3825,7 +3825,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "no change, multiple endpoints, subsets, IPs, and ports",
 | 
							name:              "no change, multiple endpoints, subsets, IPs, and ports",
 | 
				
			||||||
		previousEndpoints: multipleSubsetsIPsPorts,
 | 
							previousEndpoints: multipleSubsetsIPsPorts,
 | 
				
			||||||
		currentEndpoints:  multipleSubsetsIPsPorts,
 | 
							currentEndpoints:  multipleSubsetsIPsPorts,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
@@ -3851,7 +3851,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.2.2.2:22", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.2.2.2:22", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
@@ -3888,8 +3888,8 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "add an Endpoints",
 | 
							name:              "add an Endpoints",
 | 
				
			||||||
		previousEndpoints: []*discovery.EndpointSlice{nil},
 | 
							previousEndpoints: []*discovery.EndpointSlice{nil},
 | 
				
			||||||
		currentEndpoints:  namedPortLocal,
 | 
							currentEndpoints:  namedPortLocal,
 | 
				
			||||||
		oldEndpoints:      map[proxy.ServicePortName][]*endpointsInfo{},
 | 
							oldEndpoints:      map[proxy.ServicePortName][]*endpointInfo{},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -3906,12 +3906,12 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "remove an Endpoints",
 | 
							name:              "remove an Endpoints",
 | 
				
			||||||
		previousEndpoints: namedPortLocal,
 | 
							previousEndpoints: namedPortLocal,
 | 
				
			||||||
		currentEndpoints:  []*discovery.EndpointSlice{nil},
 | 
							currentEndpoints:  []*discovery.EndpointSlice{nil},
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{},
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{},
 | 
				
			||||||
		expectedDeletedUDPEndpoints: []proxy.ServiceEndpoint{{
 | 
							expectedDeletedUDPEndpoints: []proxy.ServiceEndpoint{{
 | 
				
			||||||
			Endpoint:        "10.1.1.1:11",
 | 
								Endpoint:        "10.1.1.1:11",
 | 
				
			||||||
			ServicePortName: makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP),
 | 
								ServicePortName: makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP),
 | 
				
			||||||
@@ -3923,12 +3923,12 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "add an IP and port",
 | 
							name:              "add an IP and port",
 | 
				
			||||||
		previousEndpoints: namedPort,
 | 
							previousEndpoints: namedPort,
 | 
				
			||||||
		currentEndpoints:  namedPortsLocalNoLocal,
 | 
							currentEndpoints:  namedPortsLocalNoLocal,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
@@ -3950,7 +3950,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "remove an IP and port",
 | 
							name:              "remove an IP and port",
 | 
				
			||||||
		previousEndpoints: namedPortsLocalNoLocal,
 | 
							previousEndpoints: namedPortsLocalNoLocal,
 | 
				
			||||||
		currentEndpoints:  namedPort,
 | 
							currentEndpoints:  namedPort,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:11", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
@@ -3960,7 +3960,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:12", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:12", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -3982,12 +3982,12 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "add a subset",
 | 
							name:              "add a subset",
 | 
				
			||||||
		previousEndpoints: []*discovery.EndpointSlice{namedPort[0], nil},
 | 
							previousEndpoints: []*discovery.EndpointSlice{namedPort[0], nil},
 | 
				
			||||||
		currentEndpoints:  multipleSubsetsWithLocal,
 | 
							currentEndpoints:  multipleSubsetsWithLocal,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -4007,7 +4007,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "remove a subset",
 | 
							name:              "remove a subset",
 | 
				
			||||||
		previousEndpoints: multipleSubsets,
 | 
							previousEndpoints: multipleSubsets,
 | 
				
			||||||
		currentEndpoints:  []*discovery.EndpointSlice{namedPort[0], nil},
 | 
							currentEndpoints:  []*discovery.EndpointSlice{namedPort[0], nil},
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -4015,7 +4015,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:12", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.2:12", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -4031,12 +4031,12 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "rename a port",
 | 
							name:              "rename a port",
 | 
				
			||||||
		previousEndpoints: namedPort,
 | 
							previousEndpoints: namedPort,
 | 
				
			||||||
		currentEndpoints:  namedPortRenamed,
 | 
							currentEndpoints:  namedPortRenamed,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11-2", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11-2", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -4054,12 +4054,12 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "renumber a port",
 | 
							name:              "renumber a port",
 | 
				
			||||||
		previousEndpoints: namedPort,
 | 
							previousEndpoints: namedPort,
 | 
				
			||||||
		currentEndpoints:  namedPortRenumbered,
 | 
							currentEndpoints:  namedPortRenumbered,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:22", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:22", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -4075,7 +4075,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "complex add and remove",
 | 
							name:              "complex add and remove",
 | 
				
			||||||
		previousEndpoints: complexBefore,
 | 
							previousEndpoints: complexBefore,
 | 
				
			||||||
		currentEndpoints:  complexAfter,
 | 
							currentEndpoints:  complexAfter,
 | 
				
			||||||
		oldEndpoints: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							oldEndpoints: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
@@ -4094,7 +4094,7 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.4.4.6:45", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.4.4.6:45", IsLocal: true, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.11:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.11:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
@@ -4141,8 +4141,8 @@ func TestUpdateEndpointsMap(t *testing.T) {
 | 
				
			|||||||
		name:              "change from 0 endpoint address to 1 unnamed port",
 | 
							name:              "change from 0 endpoint address to 1 unnamed port",
 | 
				
			||||||
		previousEndpoints: emptyEndpointSlices,
 | 
							previousEndpoints: emptyEndpointSlices,
 | 
				
			||||||
		currentEndpoints:  namedPort,
 | 
							currentEndpoints:  namedPort,
 | 
				
			||||||
		oldEndpoints:      map[proxy.ServicePortName][]*endpointsInfo{},
 | 
							oldEndpoints:      map[proxy.ServicePortName][]*endpointInfo{},
 | 
				
			||||||
		expectedResult: map[proxy.ServicePortName][]*endpointsInfo{
 | 
							expectedResult: map[proxy.ServicePortName][]*endpointInfo{
 | 
				
			||||||
			makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
								makeServicePortName("ns1", "ep1", "p11", v1.ProtocolUDP): {
 | 
				
			||||||
				{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
									{BaseEndpointInfo: &proxy.BaseEndpointInfo{Endpoint: "10.1.1.1:11", IsLocal: false, Ready: true, Serving: true, Terminating: false}},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -226,7 +226,7 @@ type Proxier struct {
 | 
				
			|||||||
	// services that happened since last syncProxyRules call. For a single object,
 | 
						// services that happened since last syncProxyRules call. For a single object,
 | 
				
			||||||
	// changes are accumulated, i.e. previous is state from before all of them,
 | 
						// changes are accumulated, i.e. previous is state from before all of them,
 | 
				
			||||||
	// current is state after applying all of those.
 | 
						// current is state after applying all of those.
 | 
				
			||||||
	endpointsChanges *proxy.EndpointChangeTracker
 | 
						endpointsChanges *proxy.EndpointsChangeTracker
 | 
				
			||||||
	serviceChanges   *proxy.ServiceChangeTracker
 | 
						serviceChanges   *proxy.ServiceChangeTracker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mu           sync.Mutex // protects the following fields
 | 
						mu           sync.Mutex // protects the following fields
 | 
				
			||||||
@@ -425,7 +425,7 @@ func NewProxier(ipFamily v1.IPFamily,
 | 
				
			|||||||
		svcPortMap:            make(proxy.ServicePortMap),
 | 
							svcPortMap:            make(proxy.ServicePortMap),
 | 
				
			||||||
		serviceChanges:        proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, recorder, nil),
 | 
							serviceChanges:        proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, recorder, nil),
 | 
				
			||||||
		endpointsMap:          make(proxy.EndpointsMap),
 | 
							endpointsMap:          make(proxy.EndpointsMap),
 | 
				
			||||||
		endpointsChanges:      proxy.NewEndpointChangeTracker(hostname, nil, ipFamily, recorder, nil),
 | 
							endpointsChanges:      proxy.NewEndpointsChangeTracker(hostname, nil, ipFamily, recorder, nil),
 | 
				
			||||||
		initialSync:           true,
 | 
							initialSync:           true,
 | 
				
			||||||
		syncPeriod:            syncPeriod,
 | 
							syncPeriod:            syncPeriod,
 | 
				
			||||||
		minSyncPeriod:         minSyncPeriod,
 | 
							minSyncPeriod:         minSyncPeriod,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -154,7 +154,7 @@ func NewFakeProxier(ipt utiliptables.Interface, ipvs utilipvs.Interface, ipset u
 | 
				
			|||||||
		svcPortMap:            make(proxy.ServicePortMap),
 | 
							svcPortMap:            make(proxy.ServicePortMap),
 | 
				
			||||||
		serviceChanges:        proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, nil, nil),
 | 
							serviceChanges:        proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, nil, nil),
 | 
				
			||||||
		endpointsMap:          make(proxy.EndpointsMap),
 | 
							endpointsMap:          make(proxy.EndpointsMap),
 | 
				
			||||||
		endpointsChanges:      proxy.NewEndpointChangeTracker(testHostname, nil, ipFamily, nil, nil),
 | 
							endpointsChanges:      proxy.NewEndpointsChangeTracker(testHostname, nil, ipFamily, nil, nil),
 | 
				
			||||||
		excludeCIDRs:          excludeCIDRs,
 | 
							excludeCIDRs:          excludeCIDRs,
 | 
				
			||||||
		iptables:              ipt,
 | 
							iptables:              ipt,
 | 
				
			||||||
		ipvs:                  ipvs,
 | 
							ipvs:                  ipvs,
 | 
				
			||||||
@@ -4358,7 +4358,7 @@ raid10 57344 0 - Live 0xffffffffc0597000`,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The majority of EndpointSlice specific tests are not ipvs specific and focus on
 | 
					// The majority of EndpointSlice specific tests are not ipvs specific and focus on
 | 
				
			||||||
// the shared EndpointChangeTracker and EndpointSliceCache. This test ensures that the
 | 
					// the shared EndpointsChangeTracker and EndpointSliceCache. This test ensures that the
 | 
				
			||||||
// ipvs proxier supports translating EndpointSlices to ipvs output.
 | 
					// ipvs proxier supports translating EndpointSlices to ipvs output.
 | 
				
			||||||
func TestEndpointSliceE2E(t *testing.T) {
 | 
					func TestEndpointSliceE2E(t *testing.T) {
 | 
				
			||||||
	ipt := iptablestest.NewFake()
 | 
						ipt := iptablestest.NewFake()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -595,7 +595,7 @@ func TestServiceToServiceMap(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type FakeProxier struct {
 | 
					type FakeProxier struct {
 | 
				
			||||||
	endpointsChanges *EndpointChangeTracker
 | 
						endpointsChanges *EndpointsChangeTracker
 | 
				
			||||||
	serviceChanges   *ServiceChangeTracker
 | 
						serviceChanges   *ServiceChangeTracker
 | 
				
			||||||
	svcPortMap       ServicePortMap
 | 
						svcPortMap       ServicePortMap
 | 
				
			||||||
	endpointsMap     EndpointsMap
 | 
						endpointsMap     EndpointsMap
 | 
				
			||||||
@@ -607,7 +607,7 @@ func newFakeProxier(ipFamily v1.IPFamily, t time.Time) *FakeProxier {
 | 
				
			|||||||
		svcPortMap:     make(ServicePortMap),
 | 
							svcPortMap:     make(ServicePortMap),
 | 
				
			||||||
		serviceChanges: NewServiceChangeTracker(nil, ipFamily, nil, nil),
 | 
							serviceChanges: NewServiceChangeTracker(nil, ipFamily, nil, nil),
 | 
				
			||||||
		endpointsMap:   make(EndpointsMap),
 | 
							endpointsMap:   make(EndpointsMap),
 | 
				
			||||||
		endpointsChanges: &EndpointChangeTracker{
 | 
							endpointsChanges: &EndpointsChangeTracker{
 | 
				
			||||||
			lastChangeTriggerTimes:    make(map[types.NamespacedName][]time.Time),
 | 
								lastChangeTriggerTimes:    make(map[types.NamespacedName][]time.Time),
 | 
				
			||||||
			trackerStartTime:          t,
 | 
								trackerStartTime:          t,
 | 
				
			||||||
			processEndpointsMapChange: nil,
 | 
								processEndpointsMapChange: nil,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,13 +32,13 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type HostNetworkService interface {
 | 
					type HostNetworkService interface {
 | 
				
			||||||
	getNetworkByName(name string) (*hnsNetworkInfo, error)
 | 
						getNetworkByName(name string) (*hnsNetworkInfo, error)
 | 
				
			||||||
	getAllEndpointsByNetwork(networkName string) (map[string]*endpointsInfo, error)
 | 
						getAllEndpointsByNetwork(networkName string) (map[string]*endpointInfo, error)
 | 
				
			||||||
	getEndpointByID(id string) (*endpointsInfo, error)
 | 
						getEndpointByID(id string) (*endpointInfo, error)
 | 
				
			||||||
	getEndpointByIpAddress(ip string, networkName string) (*endpointsInfo, error)
 | 
						getEndpointByIpAddress(ip string, networkName string) (*endpointInfo, error)
 | 
				
			||||||
	getEndpointByName(id string) (*endpointsInfo, error)
 | 
						getEndpointByName(id string) (*endpointInfo, error)
 | 
				
			||||||
	createEndpoint(ep *endpointsInfo, networkName string) (*endpointsInfo, error)
 | 
						createEndpoint(ep *endpointInfo, networkName string) (*endpointInfo, error)
 | 
				
			||||||
	deleteEndpoint(hnsID string) error
 | 
						deleteEndpoint(hnsID string) error
 | 
				
			||||||
	getLoadBalancer(endpoints []endpointsInfo, flags loadBalancerFlags, sourceVip string, vip string, protocol uint16, internalPort uint16, externalPort uint16, previousLoadBalancers map[loadBalancerIdentifier]*loadBalancerInfo) (*loadBalancerInfo, error)
 | 
						getLoadBalancer(endpoints []endpointInfo, flags loadBalancerFlags, sourceVip string, vip string, protocol uint16, internalPort uint16, externalPort uint16, previousLoadBalancers map[loadBalancerIdentifier]*loadBalancerInfo) (*loadBalancerInfo, error)
 | 
				
			||||||
	getAllLoadBalancers() (map[loadBalancerIdentifier]*loadBalancerInfo, error)
 | 
						getAllLoadBalancers() (map[loadBalancerIdentifier]*loadBalancerInfo, error)
 | 
				
			||||||
	deleteLoadBalancer(hnsID string) error
 | 
						deleteLoadBalancer(hnsID string) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -87,7 +87,7 @@ func (hns hns) getNetworkByName(name string) (*hnsNetworkInfo, error) {
 | 
				
			|||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (hns hns) getAllEndpointsByNetwork(networkName string) (map[string]*(endpointsInfo), error) {
 | 
					func (hns hns) getAllEndpointsByNetwork(networkName string) (map[string]*(endpointInfo), error) {
 | 
				
			||||||
	hcnnetwork, err := hns.hcn.GetNetworkByName(networkName)
 | 
						hcnnetwork, err := hns.hcn.GetNetworkByName(networkName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		klog.ErrorS(err, "failed to get HNS network by name", "name", networkName)
 | 
							klog.ErrorS(err, "failed to get HNS network by name", "name", networkName)
 | 
				
			||||||
@@ -97,7 +97,7 @@ func (hns hns) getAllEndpointsByNetwork(networkName string) (map[string]*(endpoi
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("failed to list endpoints: %w", err)
 | 
							return nil, fmt.Errorf("failed to list endpoints: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpointInfos := make(map[string]*(endpointsInfo))
 | 
						endpointInfos := make(map[string]*(endpointInfo))
 | 
				
			||||||
	for _, ep := range endpoints {
 | 
						for _, ep := range endpoints {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(ep.IpConfigurations) == 0 {
 | 
							if len(ep.IpConfigurations) == 0 {
 | 
				
			||||||
@@ -108,7 +108,7 @@ func (hns hns) getAllEndpointsByNetwork(networkName string) (map[string]*(endpoi
 | 
				
			|||||||
		// Add to map with key endpoint ID or IP address
 | 
							// Add to map with key endpoint ID or IP address
 | 
				
			||||||
		// Storing this is expensive in terms of memory, however there is a bug in Windows Server 2019 that can cause two endpoints to be created with the same IP address.
 | 
							// Storing this is expensive in terms of memory, however there is a bug in Windows Server 2019 that can cause two endpoints to be created with the same IP address.
 | 
				
			||||||
		// TODO: Store by IP only and remove any lookups by endpoint ID.
 | 
							// TODO: Store by IP only and remove any lookups by endpoint ID.
 | 
				
			||||||
		endpointInfos[ep.Id] = &endpointsInfo{
 | 
							endpointInfos[ep.Id] = &endpointInfo{
 | 
				
			||||||
			ip:         ep.IpConfigurations[0].IpAddress,
 | 
								ip:         ep.IpConfigurations[0].IpAddress,
 | 
				
			||||||
			isLocal:    uint32(ep.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0,
 | 
								isLocal:    uint32(ep.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0,
 | 
				
			||||||
			macAddress: ep.MacAddress,
 | 
								macAddress: ep.MacAddress,
 | 
				
			||||||
@@ -127,7 +127,7 @@ func (hns hns) getAllEndpointsByNetwork(networkName string) (map[string]*(endpoi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// If ipFamilyPolicy is RequireDualStack or PreferDualStack, then there will be 2 IPS (iPV4 and IPV6)
 | 
							// If ipFamilyPolicy is RequireDualStack or PreferDualStack, then there will be 2 IPS (iPV4 and IPV6)
 | 
				
			||||||
		// in the endpoint list
 | 
							// in the endpoint list
 | 
				
			||||||
		endpointDualstack := &endpointsInfo{
 | 
							endpointDualstack := &endpointInfo{
 | 
				
			||||||
			ip:         ep.IpConfigurations[1].IpAddress,
 | 
								ip:         ep.IpConfigurations[1].IpAddress,
 | 
				
			||||||
			isLocal:    uint32(ep.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0,
 | 
								isLocal:    uint32(ep.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0,
 | 
				
			||||||
			macAddress: ep.MacAddress,
 | 
								macAddress: ep.MacAddress,
 | 
				
			||||||
@@ -145,12 +145,12 @@ func (hns hns) getAllEndpointsByNetwork(networkName string) (map[string]*(endpoi
 | 
				
			|||||||
	return endpointInfos, nil
 | 
						return endpointInfos, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (hns hns) getEndpointByID(id string) (*endpointsInfo, error) {
 | 
					func (hns hns) getEndpointByID(id string) (*endpointInfo, error) {
 | 
				
			||||||
	hnsendpoint, err := hns.hcn.GetEndpointByID(id)
 | 
						hnsendpoint, err := hns.hcn.GetEndpointByID(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &endpointsInfo{ //TODO: fill out PA
 | 
						return &endpointInfo{ //TODO: fill out PA
 | 
				
			||||||
		ip:         hnsendpoint.IpConfigurations[0].IpAddress,
 | 
							ip:         hnsendpoint.IpConfigurations[0].IpAddress,
 | 
				
			||||||
		isLocal:    uint32(hnsendpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0, //TODO: Change isLocal to isRemote
 | 
							isLocal:    uint32(hnsendpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0, //TODO: Change isLocal to isRemote
 | 
				
			||||||
		macAddress: hnsendpoint.MacAddress,
 | 
							macAddress: hnsendpoint.MacAddress,
 | 
				
			||||||
@@ -158,7 +158,7 @@ func (hns hns) getEndpointByID(id string) (*endpointsInfo, error) {
 | 
				
			|||||||
		hns:        hns,
 | 
							hns:        hns,
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (hns hns) getEndpointByIpAddress(ip string, networkName string) (*endpointsInfo, error) {
 | 
					func (hns hns) getEndpointByIpAddress(ip string, networkName string) (*endpointInfo, error) {
 | 
				
			||||||
	hnsnetwork, err := hns.hcn.GetNetworkByName(networkName)
 | 
						hnsnetwork, err := hns.hcn.GetNetworkByName(networkName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		klog.ErrorS(err, "Error getting network by name")
 | 
							klog.ErrorS(err, "Error getting network by name")
 | 
				
			||||||
@@ -179,7 +179,7 @@ func (hns hns) getEndpointByIpAddress(ip string, networkName string) (*endpoints
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if equal && strings.EqualFold(endpoint.HostComputeNetwork, hnsnetwork.Id) {
 | 
							if equal && strings.EqualFold(endpoint.HostComputeNetwork, hnsnetwork.Id) {
 | 
				
			||||||
			return &endpointsInfo{
 | 
								return &endpointInfo{
 | 
				
			||||||
				ip:         ip,
 | 
									ip:         ip,
 | 
				
			||||||
				isLocal:    uint32(endpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0, //TODO: Change isLocal to isRemote
 | 
									isLocal:    uint32(endpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0, //TODO: Change isLocal to isRemote
 | 
				
			||||||
				macAddress: endpoint.MacAddress,
 | 
									macAddress: endpoint.MacAddress,
 | 
				
			||||||
@@ -190,12 +190,12 @@ func (hns hns) getEndpointByIpAddress(ip string, networkName string) (*endpoints
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return nil, fmt.Errorf("Endpoint %v not found on network %s", ip, networkName)
 | 
						return nil, fmt.Errorf("Endpoint %v not found on network %s", ip, networkName)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (hns hns) getEndpointByName(name string) (*endpointsInfo, error) {
 | 
					func (hns hns) getEndpointByName(name string) (*endpointInfo, error) {
 | 
				
			||||||
	hnsendpoint, err := hns.hcn.GetEndpointByName(name)
 | 
						hnsendpoint, err := hns.hcn.GetEndpointByName(name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &endpointsInfo{ //TODO: fill out PA
 | 
						return &endpointInfo{ //TODO: fill out PA
 | 
				
			||||||
		ip:         hnsendpoint.IpConfigurations[0].IpAddress,
 | 
							ip:         hnsendpoint.IpConfigurations[0].IpAddress,
 | 
				
			||||||
		isLocal:    uint32(hnsendpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0, //TODO: Change isLocal to isRemote
 | 
							isLocal:    uint32(hnsendpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0, //TODO: Change isLocal to isRemote
 | 
				
			||||||
		macAddress: hnsendpoint.MacAddress,
 | 
							macAddress: hnsendpoint.MacAddress,
 | 
				
			||||||
@@ -203,7 +203,7 @@ func (hns hns) getEndpointByName(name string) (*endpointsInfo, error) {
 | 
				
			|||||||
		hns:        hns,
 | 
							hns:        hns,
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (hns hns) createEndpoint(ep *endpointsInfo, networkName string) (*endpointsInfo, error) {
 | 
					func (hns hns) createEndpoint(ep *endpointInfo, networkName string) (*endpointInfo, error) {
 | 
				
			||||||
	hnsNetwork, err := hns.hcn.GetNetworkByName(networkName)
 | 
						hnsNetwork, err := hns.hcn.GetNetworkByName(networkName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -251,7 +251,7 @@ func (hns hns) createEndpoint(ep *endpointsInfo, networkName string) (*endpoints
 | 
				
			|||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &endpointsInfo{
 | 
						return &endpointInfo{
 | 
				
			||||||
		ip:              createdEndpoint.IpConfigurations[0].IpAddress,
 | 
							ip:              createdEndpoint.IpConfigurations[0].IpAddress,
 | 
				
			||||||
		isLocal:         uint32(createdEndpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0,
 | 
							isLocal:         uint32(createdEndpoint.Flags&hcn.EndpointFlagsRemoteEndpoint) == 0,
 | 
				
			||||||
		macAddress:      createdEndpoint.MacAddress,
 | 
							macAddress:      createdEndpoint.MacAddress,
 | 
				
			||||||
@@ -273,7 +273,7 @@ func (hns hns) deleteEndpoint(hnsID string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// findLoadBalancerID will construct a id from the provided loadbalancer fields
 | 
					// findLoadBalancerID will construct a id from the provided loadbalancer fields
 | 
				
			||||||
func findLoadBalancerID(endpoints []endpointsInfo, vip string, protocol, internalPort, externalPort uint16) (loadBalancerIdentifier, error) {
 | 
					func findLoadBalancerID(endpoints []endpointInfo, vip string, protocol, internalPort, externalPort uint16) (loadBalancerIdentifier, error) {
 | 
				
			||||||
	// Compute hash from backends (endpoint IDs)
 | 
						// Compute hash from backends (endpoint IDs)
 | 
				
			||||||
	hash, err := hashEndpoints(endpoints)
 | 
						hash, err := hashEndpoints(endpoints)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -315,7 +315,7 @@ func (hns hns) getAllLoadBalancers() (map[loadBalancerIdentifier]*loadBalancerIn
 | 
				
			|||||||
	return loadBalancers, nil
 | 
						return loadBalancers, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (hns hns) getLoadBalancer(endpoints []endpointsInfo, flags loadBalancerFlags, sourceVip string, vip string, protocol uint16, internalPort uint16, externalPort uint16, previousLoadBalancers map[loadBalancerIdentifier]*loadBalancerInfo) (*loadBalancerInfo, error) {
 | 
					func (hns hns) getLoadBalancer(endpoints []endpointInfo, flags loadBalancerFlags, sourceVip string, vip string, protocol uint16, internalPort uint16, externalPort uint16, previousLoadBalancers map[loadBalancerIdentifier]*loadBalancerInfo) (*loadBalancerInfo, error) {
 | 
				
			||||||
	var id loadBalancerIdentifier
 | 
						var id loadBalancerIdentifier
 | 
				
			||||||
	vips := []string{}
 | 
						vips := []string{}
 | 
				
			||||||
	// Compute hash from backends (endpoint IDs)
 | 
						// Compute hash from backends (endpoint IDs)
 | 
				
			||||||
@@ -424,7 +424,7 @@ func (hns hns) deleteLoadBalancer(hnsID string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Calculates a hash from the given endpoint IDs.
 | 
					// Calculates a hash from the given endpoint IDs.
 | 
				
			||||||
func hashEndpoints[T string | endpointsInfo](endpoints []T) (hash [20]byte, err error) {
 | 
					func hashEndpoints[T string | endpointInfo](endpoints []T) (hash [20]byte, err error) {
 | 
				
			||||||
	var id string
 | 
						var id string
 | 
				
			||||||
	// Recover in case something goes wrong. Return error and null byte array.
 | 
						// Recover in case something goes wrong. Return error and null byte array.
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
@@ -437,7 +437,7 @@ func hashEndpoints[T string | endpointsInfo](endpoints []T) (hash [20]byte, err
 | 
				
			|||||||
	// Iterate over endpoints, compute hash
 | 
						// Iterate over endpoints, compute hash
 | 
				
			||||||
	for _, ep := range endpoints {
 | 
						for _, ep := range endpoints {
 | 
				
			||||||
		switch x := any(ep).(type) {
 | 
							switch x := any(ep).(type) {
 | 
				
			||||||
		case endpointsInfo:
 | 
							case endpointInfo:
 | 
				
			||||||
			id = strings.ToUpper(x.hnsID)
 | 
								id = strings.ToUpper(x.hnsID)
 | 
				
			||||||
		case string:
 | 
							case string:
 | 
				
			||||||
			id = x
 | 
								id = x
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -203,7 +203,7 @@ func TestCreateEndpointLocal(t *testing.T) {
 | 
				
			|||||||
	hns := hns{hcn: newHcnImpl()}
 | 
						hns := hns{hcn: newHcnImpl()}
 | 
				
			||||||
	Network := mustTestNetwork(t)
 | 
						Network := mustTestNetwork(t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	endpoint := &endpointsInfo{
 | 
						endpoint := &endpointInfo{
 | 
				
			||||||
		ip:         epIpAddress,
 | 
							ip:         epIpAddress,
 | 
				
			||||||
		macAddress: epMacAddress,
 | 
							macAddress: epMacAddress,
 | 
				
			||||||
		isLocal:    true,
 | 
							isLocal:    true,
 | 
				
			||||||
@@ -242,7 +242,7 @@ func TestCreateEndpointRemote(t *testing.T) {
 | 
				
			|||||||
	Network := mustTestNetwork(t)
 | 
						Network := mustTestNetwork(t)
 | 
				
			||||||
	providerAddress := epPaAddress
 | 
						providerAddress := epPaAddress
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	endpoint := &endpointsInfo{
 | 
						endpoint := &endpointInfo{
 | 
				
			||||||
		ip:              epIpAddressRemote,
 | 
							ip:              epIpAddressRemote,
 | 
				
			||||||
		macAddress:      epMacAddress,
 | 
							macAddress:      epMacAddress,
 | 
				
			||||||
		isLocal:         false,
 | 
							isLocal:         false,
 | 
				
			||||||
@@ -350,11 +350,11 @@ func TestGetLoadBalancerExisting(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpoint := &endpointsInfo{
 | 
						endpoint := &endpointInfo{
 | 
				
			||||||
		ip:    Endpoint.IpConfigurations[0].IpAddress,
 | 
							ip:    Endpoint.IpConfigurations[0].IpAddress,
 | 
				
			||||||
		hnsID: Endpoint.Id,
 | 
							hnsID: Endpoint.Id,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpoints := []endpointsInfo{*endpoint}
 | 
						endpoints := []endpointInfo{*endpoint}
 | 
				
			||||||
	hash, err := hashEndpoints(endpoints)
 | 
						hash, err := hashEndpoints(endpoints)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
@@ -409,11 +409,11 @@ func TestGetLoadBalancerNew(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpoint := &endpointsInfo{
 | 
						endpoint := &endpointInfo{
 | 
				
			||||||
		ip:    Endpoint.IpConfigurations[0].IpAddress,
 | 
							ip:    Endpoint.IpConfigurations[0].IpAddress,
 | 
				
			||||||
		hnsID: Endpoint.Id,
 | 
							hnsID: Endpoint.Id,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpoints := []endpointsInfo{*endpoint}
 | 
						endpoints := []endpointInfo{*endpoint}
 | 
				
			||||||
	lb, err := hns.getLoadBalancer(endpoints, loadBalancerFlags{}, sourceVip, serviceVip, protocol, internalPort, externalPort, lbs)
 | 
						lb, err := hns.getLoadBalancer(endpoints, loadBalancerFlags{}, sourceVip, serviceVip, protocol, internalPort, externalPort, lbs)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
@@ -523,7 +523,7 @@ func TestHashEndpoints(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpointInfoA := &endpointsInfo{
 | 
						endpointInfoA := &endpointInfo{
 | 
				
			||||||
		ip:    endpointA.IpConfigurations[0].IpAddress,
 | 
							ip:    endpointA.IpConfigurations[0].IpAddress,
 | 
				
			||||||
		hnsID: endpointA.Id,
 | 
							hnsID: endpointA.Id,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -543,12 +543,12 @@ func TestHashEndpoints(t *testing.T) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpointInfoB := &endpointsInfo{
 | 
						endpointInfoB := &endpointInfo{
 | 
				
			||||||
		ip:    endpointB.IpConfigurations[0].IpAddress,
 | 
							ip:    endpointB.IpConfigurations[0].IpAddress,
 | 
				
			||||||
		hnsID: endpointB.Id,
 | 
							hnsID: endpointB.Id,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	endpoints := []endpointsInfo{*endpointInfoA, *endpointInfoB}
 | 
						endpoints := []endpointInfo{*endpointInfoA, *endpointInfoB}
 | 
				
			||||||
	endpointsReverse := []endpointsInfo{*endpointInfoB, *endpointInfoA}
 | 
						endpointsReverse := []endpointInfo{*endpointInfoB, *endpointInfoA}
 | 
				
			||||||
	h1, err := hashEndpoints(endpoints)
 | 
						h1, err := hashEndpoints(endpoints)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -123,7 +123,7 @@ type serviceInfo struct {
 | 
				
			|||||||
	hnsID                  string
 | 
						hnsID                  string
 | 
				
			||||||
	nodePorthnsID          string
 | 
						nodePorthnsID          string
 | 
				
			||||||
	policyApplied          bool
 | 
						policyApplied          bool
 | 
				
			||||||
	remoteEndpoint         *endpointsInfo
 | 
						remoteEndpoint         *endpointInfo
 | 
				
			||||||
	hns                    HostNetworkService
 | 
						hns                    HostNetworkService
 | 
				
			||||||
	preserveDIP            bool
 | 
						preserveDIP            bool
 | 
				
			||||||
	localTrafficDSR        bool
 | 
						localTrafficDSR        bool
 | 
				
			||||||
@@ -273,7 +273,7 @@ func (t DualStackCompatTester) DualStackCompatible(networkName string) bool {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// internal struct for endpoints information
 | 
					// internal struct for endpoints information
 | 
				
			||||||
type endpointsInfo struct {
 | 
					type endpointInfo struct {
 | 
				
			||||||
	ip              string
 | 
						ip              string
 | 
				
			||||||
	port            uint16
 | 
						port            uint16
 | 
				
			||||||
	isLocal         bool
 | 
						isLocal         bool
 | 
				
			||||||
@@ -290,57 +290,57 @@ type endpointsInfo struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// String is part of proxy.Endpoint interface.
 | 
					// String is part of proxy.Endpoint interface.
 | 
				
			||||||
func (info *endpointsInfo) String() string {
 | 
					func (info *endpointInfo) String() string {
 | 
				
			||||||
	return net.JoinHostPort(info.ip, strconv.Itoa(int(info.port)))
 | 
						return net.JoinHostPort(info.ip, strconv.Itoa(int(info.port)))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetIsLocal is part of proxy.Endpoint interface.
 | 
					// GetIsLocal is part of proxy.Endpoint interface.
 | 
				
			||||||
func (info *endpointsInfo) GetIsLocal() bool {
 | 
					func (info *endpointInfo) GetIsLocal() bool {
 | 
				
			||||||
	return info.isLocal
 | 
						return info.isLocal
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsReady returns true if an endpoint is ready and not terminating.
 | 
					// IsReady returns true if an endpoint is ready and not terminating.
 | 
				
			||||||
func (info *endpointsInfo) IsReady() bool {
 | 
					func (info *endpointInfo) IsReady() bool {
 | 
				
			||||||
	return info.ready
 | 
						return info.ready
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsServing returns true if an endpoint is ready, regardless of it's terminating state.
 | 
					// IsServing returns true if an endpoint is ready, regardless of it's terminating state.
 | 
				
			||||||
func (info *endpointsInfo) IsServing() bool {
 | 
					func (info *endpointInfo) IsServing() bool {
 | 
				
			||||||
	return info.serving
 | 
						return info.serving
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsTerminating returns true if an endpoint is terminating.
 | 
					// IsTerminating returns true if an endpoint is terminating.
 | 
				
			||||||
func (info *endpointsInfo) IsTerminating() bool {
 | 
					func (info *endpointInfo) IsTerminating() bool {
 | 
				
			||||||
	return info.terminating
 | 
						return info.terminating
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetZoneHint returns the zone hint for the endpoint.
 | 
					// GetZoneHint returns the zone hint for the endpoint.
 | 
				
			||||||
func (info *endpointsInfo) GetZoneHints() sets.Set[string] {
 | 
					func (info *endpointInfo) GetZoneHints() sets.Set[string] {
 | 
				
			||||||
	return sets.Set[string]{}
 | 
						return sets.Set[string]{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IP returns just the IP part of the endpoint, it's a part of proxy.Endpoint interface.
 | 
					// IP returns just the IP part of the endpoint, it's a part of proxy.Endpoint interface.
 | 
				
			||||||
func (info *endpointsInfo) IP() string {
 | 
					func (info *endpointInfo) IP() string {
 | 
				
			||||||
	return info.ip
 | 
						return info.ip
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Port returns just the Port part of the endpoint.
 | 
					// Port returns just the Port part of the endpoint.
 | 
				
			||||||
func (info *endpointsInfo) Port() (int, error) {
 | 
					func (info *endpointInfo) Port() (int, error) {
 | 
				
			||||||
	return int(info.port), nil
 | 
						return int(info.port), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Equal is part of proxy.Endpoint interface.
 | 
					// Equal is part of proxy.Endpoint interface.
 | 
				
			||||||
func (info *endpointsInfo) Equal(other proxy.Endpoint) bool {
 | 
					func (info *endpointInfo) Equal(other proxy.Endpoint) bool {
 | 
				
			||||||
	return info.String() == other.String() && info.GetIsLocal() == other.GetIsLocal()
 | 
						return info.String() == other.String() && info.GetIsLocal() == other.GetIsLocal()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetNodeName returns the NodeName for this endpoint.
 | 
					// GetNodeName returns the NodeName for this endpoint.
 | 
				
			||||||
func (info *endpointsInfo) GetNodeName() string {
 | 
					func (info *endpointInfo) GetNodeName() string {
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetZone returns the Zone for this endpoint.
 | 
					// GetZone returns the Zone for this endpoint.
 | 
				
			||||||
func (info *endpointsInfo) GetZone() string {
 | 
					func (info *endpointInfo) GetZone() string {
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -407,7 +407,7 @@ func (proxier *Proxier) onEndpointsMapChange(svcPortName *proxy.ServicePortName,
 | 
				
			|||||||
		if exists {
 | 
							if exists {
 | 
				
			||||||
			// Cleanup Endpoints references
 | 
								// Cleanup Endpoints references
 | 
				
			||||||
			for _, ep := range epInfos {
 | 
								for _, ep := range epInfos {
 | 
				
			||||||
				epInfo, ok := ep.(*endpointsInfo)
 | 
									epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if ok {
 | 
									if ok {
 | 
				
			||||||
					epInfo.Cleanup()
 | 
										epInfo.Cleanup()
 | 
				
			||||||
@@ -448,7 +448,7 @@ func (proxier *Proxier) onServiceMapChange(svcPortName *proxy.ServicePortName) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// returns a new proxy.Endpoint which abstracts a endpointsInfo
 | 
					// returns a new proxy.Endpoint which abstracts a endpointInfo
 | 
				
			||||||
func (proxier *Proxier) newEndpointInfo(baseInfo *proxy.BaseEndpointInfo, _ *proxy.ServicePortName) proxy.Endpoint {
 | 
					func (proxier *Proxier) newEndpointInfo(baseInfo *proxy.BaseEndpointInfo, _ *proxy.ServicePortName) proxy.Endpoint {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	portNumber, err := baseInfo.Port()
 | 
						portNumber, err := baseInfo.Port()
 | 
				
			||||||
@@ -457,7 +457,7 @@ func (proxier *Proxier) newEndpointInfo(baseInfo *proxy.BaseEndpointInfo, _ *pro
 | 
				
			|||||||
		portNumber = 0
 | 
							portNumber = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	info := &endpointsInfo{
 | 
						info := &endpointInfo{
 | 
				
			||||||
		ip:         baseInfo.IP(),
 | 
							ip:         baseInfo.IP(),
 | 
				
			||||||
		port:       uint16(portNumber),
 | 
							port:       uint16(portNumber),
 | 
				
			||||||
		isLocal:    baseInfo.GetIsLocal(),
 | 
							isLocal:    baseInfo.GetIsLocal(),
 | 
				
			||||||
@@ -474,8 +474,8 @@ func (proxier *Proxier) newEndpointInfo(baseInfo *proxy.BaseEndpointInfo, _ *pro
 | 
				
			|||||||
	return info
 | 
						return info
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newSourceVIP(hns HostNetworkService, network string, ip string, mac string, providerAddress string) (*endpointsInfo, error) {
 | 
					func newSourceVIP(hns HostNetworkService, network string, ip string, mac string, providerAddress string) (*endpointInfo, error) {
 | 
				
			||||||
	hnsEndpoint := &endpointsInfo{
 | 
						hnsEndpoint := &endpointInfo{
 | 
				
			||||||
		ip:              ip,
 | 
							ip:              ip,
 | 
				
			||||||
		isLocal:         true,
 | 
							isLocal:         true,
 | 
				
			||||||
		macAddress:      mac,
 | 
							macAddress:      mac,
 | 
				
			||||||
@@ -489,15 +489,15 @@ func newSourceVIP(hns HostNetworkService, network string, ip string, mac string,
 | 
				
			|||||||
	return ep, err
 | 
						return ep, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ep *endpointsInfo) DecrementRefCount() {
 | 
					func (ep *endpointInfo) DecrementRefCount() {
 | 
				
			||||||
	klog.V(3).InfoS("Decrementing Endpoint RefCount", "endpointsInfo", ep)
 | 
						klog.V(3).InfoS("Decrementing Endpoint RefCount", "endpointInfo", ep)
 | 
				
			||||||
	if !ep.GetIsLocal() && ep.refCount != nil && *ep.refCount > 0 {
 | 
						if !ep.GetIsLocal() && ep.refCount != nil && *ep.refCount > 0 {
 | 
				
			||||||
		*ep.refCount--
 | 
							*ep.refCount--
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ep *endpointsInfo) Cleanup() {
 | 
					func (ep *endpointInfo) Cleanup() {
 | 
				
			||||||
	klog.V(3).InfoS("Endpoint cleanup", "endpointsInfo", ep)
 | 
						klog.V(3).InfoS("Endpoint cleanup", "endpointInfo", ep)
 | 
				
			||||||
	if !ep.GetIsLocal() && ep.refCount != nil {
 | 
						if !ep.GetIsLocal() && ep.refCount != nil {
 | 
				
			||||||
		*ep.refCount--
 | 
							*ep.refCount--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -601,7 +601,7 @@ type Proxier struct {
 | 
				
			|||||||
	// services that happened since policies were synced. For a single object,
 | 
						// services that happened since policies were synced. For a single object,
 | 
				
			||||||
	// changes are accumulated, i.e. previous is state from before all of them,
 | 
						// changes are accumulated, i.e. previous is state from before all of them,
 | 
				
			||||||
	// current is state after applying all of those.
 | 
						// current is state after applying all of those.
 | 
				
			||||||
	endpointsChanges  *proxy.EndpointChangeTracker
 | 
						endpointsChanges  *proxy.EndpointsChangeTracker
 | 
				
			||||||
	serviceChanges    *proxy.ServiceChangeTracker
 | 
						serviceChanges    *proxy.ServiceChangeTracker
 | 
				
			||||||
	endPointsRefCount endPointsReferenceCountMap
 | 
						endPointsRefCount endPointsReferenceCountMap
 | 
				
			||||||
	mu                sync.Mutex // protects the following fields
 | 
						mu                sync.Mutex // protects the following fields
 | 
				
			||||||
@@ -802,7 +802,7 @@ func NewProxier(
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	serviceChanges := proxy.NewServiceChangeTracker(proxier.newServiceInfo, ipFamily, recorder, proxier.serviceMapChange)
 | 
						serviceChanges := proxy.NewServiceChangeTracker(proxier.newServiceInfo, ipFamily, recorder, proxier.serviceMapChange)
 | 
				
			||||||
	endPointChangeTracker := proxy.NewEndpointChangeTracker(hostname, proxier.newEndpointInfo, ipFamily, recorder, proxier.endpointsMapChange)
 | 
						endPointChangeTracker := proxy.NewEndpointsChangeTracker(hostname, proxier.newEndpointInfo, ipFamily, recorder, proxier.endpointsMapChange)
 | 
				
			||||||
	proxier.endpointsChanges = endPointChangeTracker
 | 
						proxier.endpointsChanges = endPointChangeTracker
 | 
				
			||||||
	proxier.serviceChanges = serviceChanges
 | 
						proxier.serviceChanges = serviceChanges
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -868,7 +868,7 @@ func (svcInfo *serviceInfo) cleanupAllPolicies(endpoints []proxy.Endpoint, mapSt
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	// Cleanup Endpoints references
 | 
						// Cleanup Endpoints references
 | 
				
			||||||
	for _, ep := range endpoints {
 | 
						for _, ep := range endpoints {
 | 
				
			||||||
		epInfo, ok := ep.(*endpointsInfo)
 | 
							epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
		if ok {
 | 
							if ok {
 | 
				
			||||||
			if winProxyOptimization {
 | 
								if winProxyOptimization {
 | 
				
			||||||
				epInfo.DecrementRefCount()
 | 
									epInfo.DecrementRefCount()
 | 
				
			||||||
@@ -1062,7 +1062,7 @@ func isNetworkNotFoundError(err error) bool {
 | 
				
			|||||||
// If atleast one is not terminating, then return false
 | 
					// If atleast one is not terminating, then return false
 | 
				
			||||||
func (proxier *Proxier) isAllEndpointsTerminating(svcName proxy.ServicePortName, isLocalTrafficDSR bool) bool {
 | 
					func (proxier *Proxier) isAllEndpointsTerminating(svcName proxy.ServicePortName, isLocalTrafficDSR bool) bool {
 | 
				
			||||||
	for _, epInfo := range proxier.endpointsMap[svcName] {
 | 
						for _, epInfo := range proxier.endpointsMap[svcName] {
 | 
				
			||||||
		ep, ok := epInfo.(*endpointsInfo)
 | 
							ep, ok := epInfo.(*endpointInfo)
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -1087,7 +1087,7 @@ func (proxier *Proxier) isAllEndpointsTerminating(svcName proxy.ServicePortName,
 | 
				
			|||||||
// If atleast one is serving, then return false
 | 
					// If atleast one is serving, then return false
 | 
				
			||||||
func (proxier *Proxier) isAllEndpointsNonServing(svcName proxy.ServicePortName, isLocalTrafficDSR bool) bool {
 | 
					func (proxier *Proxier) isAllEndpointsNonServing(svcName proxy.ServicePortName, isLocalTrafficDSR bool) bool {
 | 
				
			||||||
	for _, epInfo := range proxier.endpointsMap[svcName] {
 | 
						for _, epInfo := range proxier.endpointsMap[svcName] {
 | 
				
			||||||
		ep, ok := epInfo.(*endpointsInfo)
 | 
							ep, ok := epInfo.(*endpointInfo)
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -1102,7 +1102,7 @@ func (proxier *Proxier) isAllEndpointsNonServing(svcName proxy.ServicePortName,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// updateQueriedEndpoints updates the queriedEndpoints map with newly created endpoint details
 | 
					// updateQueriedEndpoints updates the queriedEndpoints map with newly created endpoint details
 | 
				
			||||||
func updateQueriedEndpoints(newHnsEndpoint *endpointsInfo, queriedEndpoints map[string]*endpointsInfo) {
 | 
					func updateQueriedEndpoints(newHnsEndpoint *endpointInfo, queriedEndpoints map[string]*endpointInfo) {
 | 
				
			||||||
	// store newly created endpoints in queriedEndpoints
 | 
						// store newly created endpoints in queriedEndpoints
 | 
				
			||||||
	queriedEndpoints[newHnsEndpoint.hnsID] = newHnsEndpoint
 | 
						queriedEndpoints[newHnsEndpoint.hnsID] = newHnsEndpoint
 | 
				
			||||||
	queriedEndpoints[newHnsEndpoint.ip] = newHnsEndpoint
 | 
						queriedEndpoints[newHnsEndpoint.ip] = newHnsEndpoint
 | 
				
			||||||
@@ -1130,7 +1130,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
	hnsNetworkName := proxier.network.name
 | 
						hnsNetworkName := proxier.network.name
 | 
				
			||||||
	hns := proxier.hns
 | 
						hns := proxier.hns
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var gatewayHnsendpoint *endpointsInfo
 | 
						var gatewayHnsendpoint *endpointInfo
 | 
				
			||||||
	if proxier.forwardHealthCheckVip {
 | 
						if proxier.forwardHealthCheckVip {
 | 
				
			||||||
		gatewayHnsendpoint, _ = hns.getEndpointByName(proxier.rootHnsEndpointName)
 | 
							gatewayHnsendpoint, _ = hns.getEndpointByName(proxier.rootHnsEndpointName)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1153,7 +1153,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
	endpointUpdateResult := proxier.endpointsMap.Update(proxier.endpointsChanges)
 | 
						endpointUpdateResult := proxier.endpointsMap.Update(proxier.endpointsChanges)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deletedUDPClusterIPs := serviceUpdateResult.DeletedUDPClusterIPs
 | 
						deletedUDPClusterIPs := serviceUpdateResult.DeletedUDPClusterIPs
 | 
				
			||||||
	// merge stale services gathered from updateEndpointsMap
 | 
						// merge stale services gathered from EndpointsMap.Update
 | 
				
			||||||
	for _, svcPortName := range endpointUpdateResult.NewlyActiveUDPServices {
 | 
						for _, svcPortName := range endpointUpdateResult.NewlyActiveUDPServices {
 | 
				
			||||||
		if svcInfo, ok := proxier.svcPortMap[svcPortName]; ok && svcInfo != nil && svcInfo.Protocol() == v1.ProtocolUDP {
 | 
							if svcInfo, ok := proxier.svcPortMap[svcPortName]; ok && svcInfo != nil && svcInfo.Protocol() == v1.ProtocolUDP {
 | 
				
			||||||
			klog.V(2).InfoS("Newly-active UDP service may have stale conntrack entries", "servicePortName", svcPortName)
 | 
								klog.V(2).InfoS("Newly-active UDP service may have stale conntrack entries", "servicePortName", svcPortName)
 | 
				
			||||||
@@ -1168,7 +1168,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	if queriedEndpoints == nil {
 | 
						if queriedEndpoints == nil {
 | 
				
			||||||
		klog.V(4).InfoS("No existing endpoints found in HNS")
 | 
							klog.V(4).InfoS("No existing endpoints found in HNS")
 | 
				
			||||||
		queriedEndpoints = make(map[string]*(endpointsInfo))
 | 
							queriedEndpoints = make(map[string]*(endpointInfo))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	queriedLoadBalancers, err := hns.getAllLoadBalancers()
 | 
						queriedLoadBalancers, err := hns.getAllLoadBalancers()
 | 
				
			||||||
	if queriedLoadBalancers == nil {
 | 
						if queriedLoadBalancers == nil {
 | 
				
			||||||
@@ -1208,7 +1208,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
			serviceVipEndpoint := queriedEndpoints[svcInfo.ClusterIP().String()]
 | 
								serviceVipEndpoint := queriedEndpoints[svcInfo.ClusterIP().String()]
 | 
				
			||||||
			if serviceVipEndpoint == nil {
 | 
								if serviceVipEndpoint == nil {
 | 
				
			||||||
				klog.V(4).InfoS("No existing remote endpoint", "IP", svcInfo.ClusterIP())
 | 
									klog.V(4).InfoS("No existing remote endpoint", "IP", svcInfo.ClusterIP())
 | 
				
			||||||
				hnsEndpoint := &endpointsInfo{
 | 
									hnsEndpoint := &endpointInfo{
 | 
				
			||||||
					ip:              svcInfo.ClusterIP().String(),
 | 
										ip:              svcInfo.ClusterIP().String(),
 | 
				
			||||||
					isLocal:         false,
 | 
										isLocal:         false,
 | 
				
			||||||
					macAddress:      proxier.hostMac,
 | 
										macAddress:      proxier.hostMac,
 | 
				
			||||||
@@ -1228,8 +1228,8 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var hnsEndpoints []endpointsInfo
 | 
							var hnsEndpoints []endpointInfo
 | 
				
			||||||
		var hnsLocalEndpoints []endpointsInfo
 | 
							var hnsLocalEndpoints []endpointInfo
 | 
				
			||||||
		klog.V(4).InfoS("Applying Policy", "serviceInfo", svcName)
 | 
							klog.V(4).InfoS("Applying Policy", "serviceInfo", svcName)
 | 
				
			||||||
		// Create Remote endpoints for every endpoint, corresponding to the service
 | 
							// Create Remote endpoints for every endpoint, corresponding to the service
 | 
				
			||||||
		containsPublicIP := false
 | 
							containsPublicIP := false
 | 
				
			||||||
@@ -1249,9 +1249,9 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for _, epInfo := range proxier.endpointsMap[svcName] {
 | 
							for _, epInfo := range proxier.endpointsMap[svcName] {
 | 
				
			||||||
			ep, ok := epInfo.(*endpointsInfo)
 | 
								ep, ok := epInfo.(*endpointInfo)
 | 
				
			||||||
			if !ok {
 | 
								if !ok {
 | 
				
			||||||
				klog.ErrorS(nil, "Failed to cast endpointsInfo", "serviceName", svcName)
 | 
									klog.ErrorS(nil, "Failed to cast endpointInfo", "serviceName", svcName)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1274,7 +1274,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var newHnsEndpoint *endpointsInfo
 | 
								var newHnsEndpoint *endpointInfo
 | 
				
			||||||
			hnsNetworkName := proxier.network.name
 | 
								hnsNetworkName := proxier.network.name
 | 
				
			||||||
			var err error
 | 
								var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1319,7 +1319,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
						providerAddress = proxier.nodeIP.String()
 | 
											providerAddress = proxier.nodeIP.String()
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					hnsEndpoint := &endpointsInfo{
 | 
										hnsEndpoint := &endpointInfo{
 | 
				
			||||||
						ip:              ep.ip,
 | 
											ip:              ep.ip,
 | 
				
			||||||
						isLocal:         false,
 | 
											isLocal:         false,
 | 
				
			||||||
						macAddress:      conjureMac("02-11", netutils.ParseIPSloppy(ep.ip)),
 | 
											macAddress:      conjureMac("02-11", netutils.ParseIPSloppy(ep.ip)),
 | 
				
			||||||
@@ -1328,13 +1328,13 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					newHnsEndpoint, err = hns.createEndpoint(hnsEndpoint, hnsNetworkName)
 | 
										newHnsEndpoint, err = hns.createEndpoint(hnsEndpoint, hnsNetworkName)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						klog.ErrorS(err, "Remote endpoint creation failed", "endpointsInfo", hnsEndpoint)
 | 
											klog.ErrorS(err, "Remote endpoint creation failed", "endpointInfo", hnsEndpoint)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					updateQueriedEndpoints(newHnsEndpoint, queriedEndpoints)
 | 
										updateQueriedEndpoints(newHnsEndpoint, queriedEndpoints)
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					hnsEndpoint := &endpointsInfo{
 | 
										hnsEndpoint := &endpointInfo{
 | 
				
			||||||
						ip:         ep.ip,
 | 
											ip:         ep.ip,
 | 
				
			||||||
						isLocal:    false,
 | 
											isLocal:    false,
 | 
				
			||||||
						macAddress: ep.macAddress,
 | 
											macAddress: ep.macAddress,
 | 
				
			||||||
@@ -1371,7 +1371,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Save the hnsId for reference
 | 
								// Save the hnsId for reference
 | 
				
			||||||
			klog.V(1).InfoS("Hns endpoint resource", "endpointsInfo", newHnsEndpoint)
 | 
								klog.V(1).InfoS("Hns endpoint resource", "endpointInfo", newHnsEndpoint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			hnsEndpoints = append(hnsEndpoints, *newHnsEndpoint)
 | 
								hnsEndpoints = append(hnsEndpoints, *newHnsEndpoint)
 | 
				
			||||||
			if newHnsEndpoint.GetIsLocal() {
 | 
								if newHnsEndpoint.GetIsLocal() {
 | 
				
			||||||
@@ -1384,10 +1384,10 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			ep.hnsID = newHnsEndpoint.hnsID
 | 
								ep.hnsID = newHnsEndpoint.hnsID
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			klog.V(3).InfoS("Endpoint resource found", "endpointsInfo", ep)
 | 
								klog.V(3).InfoS("Endpoint resource found", "endpointInfo", ep)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		klog.V(3).InfoS("Associated endpoints for service", "endpointsInfo", hnsEndpoints, "serviceName", svcName)
 | 
							klog.V(3).InfoS("Associated endpoints for service", "endpointInfo", hnsEndpoints, "serviceName", svcName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(svcInfo.hnsID) > 0 {
 | 
							if len(svcInfo.hnsID) > 0 {
 | 
				
			||||||
			// This should not happen
 | 
								// This should not happen
 | 
				
			||||||
@@ -1399,7 +1399,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
		if len(hnsEndpoints) == 0 {
 | 
							if len(hnsEndpoints) == 0 {
 | 
				
			||||||
			if svcInfo.winProxyOptimization {
 | 
								if svcInfo.winProxyOptimization {
 | 
				
			||||||
				// Deleting loadbalancers when there are no endpoints to serve.
 | 
									// Deleting loadbalancers when there are no endpoints to serve.
 | 
				
			||||||
				klog.V(3).InfoS("Cleanup existing ", "endpointsInfo", hnsEndpoints, "serviceName", svcName)
 | 
									klog.V(3).InfoS("Cleanup existing ", "endpointInfo", hnsEndpoints, "serviceName", svcName)
 | 
				
			||||||
				svcInfo.deleteLoadBalancerPolicy(proxier.mapStaleLoadbalancers)
 | 
									svcInfo.deleteLoadBalancerPolicy(proxier.mapStaleLoadbalancers)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			klog.ErrorS(nil, "Endpoint information not available for service, not applying any policy", "serviceName", svcName)
 | 
								klog.ErrorS(nil, "Endpoint information not available for service, not applying any policy", "serviceName", svcName)
 | 
				
			||||||
@@ -1560,10 +1560,10 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
					nodeport = svcInfo.HealthCheckNodePort()
 | 
										nodeport = svcInfo.HealthCheckNodePort()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				proxier.deleteExistingLoadBalancer(hns, svcInfo.winProxyOptimization, &lbIngressIP.healthCheckHnsID, sourceVip, Enum(svcInfo.Protocol()), uint16(svcInfo.targetPort), uint16(svcInfo.Port()), []endpointsInfo{*gatewayHnsendpoint}, queriedLoadBalancers)
 | 
									proxier.deleteExistingLoadBalancer(hns, svcInfo.winProxyOptimization, &lbIngressIP.healthCheckHnsID, sourceVip, Enum(svcInfo.Protocol()), uint16(svcInfo.targetPort), uint16(svcInfo.Port()), []endpointInfo{*gatewayHnsendpoint}, queriedLoadBalancers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				hnsHealthCheckLoadBalancer, err := hns.getLoadBalancer(
 | 
									hnsHealthCheckLoadBalancer, err := hns.getLoadBalancer(
 | 
				
			||||||
					[]endpointsInfo{*gatewayHnsendpoint},
 | 
										[]endpointInfo{*gatewayHnsendpoint},
 | 
				
			||||||
					loadBalancerFlags{isDSR: false, useMUX: svcInfo.preserveDIP, preserveDIP: svcInfo.preserveDIP},
 | 
										loadBalancerFlags{isDSR: false, useMUX: svcInfo.preserveDIP, preserveDIP: svcInfo.preserveDIP},
 | 
				
			||||||
					sourceVip,
 | 
										sourceVip,
 | 
				
			||||||
					lbIngressIP.ip,
 | 
										lbIngressIP.ip,
 | 
				
			||||||
@@ -1623,7 +1623,7 @@ func (proxier *Proxier) syncProxyRules() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// deleteExistingLoadBalancer checks whether loadbalancer delete is needed or not.
 | 
					// deleteExistingLoadBalancer checks whether loadbalancer delete is needed or not.
 | 
				
			||||||
// If it is needed, the function will delete the existing loadbalancer and return true, else false.
 | 
					// If it is needed, the function will delete the existing loadbalancer and return true, else false.
 | 
				
			||||||
func (proxier *Proxier) deleteExistingLoadBalancer(hns HostNetworkService, winProxyOptimization bool, lbHnsID *string, sourceVip string, protocol, intPort, extPort uint16, endpoints []endpointsInfo, queriedLoadBalancers map[loadBalancerIdentifier]*loadBalancerInfo) bool {
 | 
					func (proxier *Proxier) deleteExistingLoadBalancer(hns HostNetworkService, winProxyOptimization bool, lbHnsID *string, sourceVip string, protocol, intPort, extPort uint16, endpoints []endpointInfo, queriedLoadBalancers map[loadBalancerIdentifier]*loadBalancerInfo) bool {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !winProxyOptimization || *lbHnsID == "" {
 | 
						if !winProxyOptimization || *lbHnsID == "" {
 | 
				
			||||||
		// Loadbalancer delete not needed
 | 
							// Loadbalancer delete not needed
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -123,8 +123,8 @@ func NewFakeProxier(syncPeriod time.Duration, minSyncPeriod time.Duration, clust
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	serviceChanges := proxy.NewServiceChangeTracker(proxier.newServiceInfo, v1.IPv4Protocol, nil, proxier.serviceMapChange)
 | 
						serviceChanges := proxy.NewServiceChangeTracker(proxier.newServiceInfo, v1.IPv4Protocol, nil, proxier.serviceMapChange)
 | 
				
			||||||
	endpointChangeTracker := proxy.NewEndpointChangeTracker(hostname, proxier.newEndpointInfo, v1.IPv4Protocol, nil, proxier.endpointsMapChange)
 | 
						endpointsChangeTracker := proxy.NewEndpointsChangeTracker(hostname, proxier.newEndpointInfo, v1.IPv4Protocol, nil, proxier.endpointsMapChange)
 | 
				
			||||||
	proxier.endpointsChanges = endpointChangeTracker
 | 
						proxier.endpointsChanges = endpointsChangeTracker
 | 
				
			||||||
	proxier.serviceChanges = serviceChanges
 | 
						proxier.serviceChanges = serviceChanges
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return proxier
 | 
						return proxier
 | 
				
			||||||
@@ -232,9 +232,9 @@ func TestCreateRemoteEndpointOverlay(t *testing.T) {
 | 
				
			|||||||
	proxier.syncProxyRules()
 | 
						proxier.syncProxyRules()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ep := proxier.endpointsMap[svcPortName][0]
 | 
						ep := proxier.endpointsMap[svcPortName][0]
 | 
				
			||||||
	epInfo, ok := ep.(*endpointsInfo)
 | 
						epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Failed to cast endpointsInfo %q", svcPortName.String())
 | 
							t.Errorf("Failed to cast endpointInfo %q", svcPortName.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if epInfo.hnsID != "EPID-3" {
 | 
							if epInfo.hnsID != "EPID-3" {
 | 
				
			||||||
@@ -296,9 +296,9 @@ func TestCreateRemoteEndpointL2Bridge(t *testing.T) {
 | 
				
			|||||||
	proxier.setInitialized(true)
 | 
						proxier.setInitialized(true)
 | 
				
			||||||
	proxier.syncProxyRules()
 | 
						proxier.syncProxyRules()
 | 
				
			||||||
	ep := proxier.endpointsMap[svcPortName][0]
 | 
						ep := proxier.endpointsMap[svcPortName][0]
 | 
				
			||||||
	epInfo, ok := ep.(*endpointsInfo)
 | 
						epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Failed to cast endpointsInfo %q", svcPortName.String())
 | 
							t.Errorf("Failed to cast endpointInfo %q", svcPortName.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if epInfo.hnsID != endpointGuid1 {
 | 
							if epInfo.hnsID != endpointGuid1 {
 | 
				
			||||||
@@ -389,9 +389,9 @@ func TestSharedRemoteEndpointDelete(t *testing.T) {
 | 
				
			|||||||
	proxier.setInitialized(true)
 | 
						proxier.setInitialized(true)
 | 
				
			||||||
	proxier.syncProxyRules()
 | 
						proxier.syncProxyRules()
 | 
				
			||||||
	ep := proxier.endpointsMap[svcPortName1][0]
 | 
						ep := proxier.endpointsMap[svcPortName1][0]
 | 
				
			||||||
	epInfo, ok := ep.(*endpointsInfo)
 | 
						epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Failed to cast endpointsInfo %q", svcPortName1.String())
 | 
							t.Errorf("Failed to cast endpointInfo %q", svcPortName1.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if epInfo.hnsID != endpointGuid1 {
 | 
							if epInfo.hnsID != endpointGuid1 {
 | 
				
			||||||
@@ -439,9 +439,9 @@ func TestSharedRemoteEndpointDelete(t *testing.T) {
 | 
				
			|||||||
	proxier.syncProxyRules()
 | 
						proxier.syncProxyRules()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ep = proxier.endpointsMap[svcPortName1][0]
 | 
						ep = proxier.endpointsMap[svcPortName1][0]
 | 
				
			||||||
	epInfo, ok = ep.(*endpointsInfo)
 | 
						epInfo, ok = ep.(*endpointInfo)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Failed to cast endpointsInfo %q", svcPortName1.String())
 | 
							t.Errorf("Failed to cast endpointInfo %q", svcPortName1.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if epInfo.hnsID != endpointGuid1 {
 | 
							if epInfo.hnsID != endpointGuid1 {
 | 
				
			||||||
@@ -534,9 +534,9 @@ func TestSharedRemoteEndpointUpdate(t *testing.T) {
 | 
				
			|||||||
	proxier.setInitialized(true)
 | 
						proxier.setInitialized(true)
 | 
				
			||||||
	proxier.syncProxyRules()
 | 
						proxier.syncProxyRules()
 | 
				
			||||||
	ep := proxier.endpointsMap[svcPortName1][0]
 | 
						ep := proxier.endpointsMap[svcPortName1][0]
 | 
				
			||||||
	epInfo, ok := ep.(*endpointsInfo)
 | 
						epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Failed to cast endpointsInfo %q", svcPortName1.String())
 | 
							t.Errorf("Failed to cast endpointInfo %q", svcPortName1.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if epInfo.hnsID != endpointGuid1 {
 | 
							if epInfo.hnsID != endpointGuid1 {
 | 
				
			||||||
@@ -613,10 +613,10 @@ func TestSharedRemoteEndpointUpdate(t *testing.T) {
 | 
				
			|||||||
	proxier.syncProxyRules()
 | 
						proxier.syncProxyRules()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ep = proxier.endpointsMap[svcPortName1][0]
 | 
						ep = proxier.endpointsMap[svcPortName1][0]
 | 
				
			||||||
	epInfo, ok = ep.(*endpointsInfo)
 | 
						epInfo, ok = ep.(*endpointInfo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Failed to cast endpointsInfo %q", svcPortName1.String())
 | 
							t.Errorf("Failed to cast endpointInfo %q", svcPortName1.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if epInfo.hnsID != endpointGuid1 {
 | 
							if epInfo.hnsID != endpointGuid1 {
 | 
				
			||||||
@@ -913,9 +913,9 @@ func TestEndpointSlice(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ep := proxier.endpointsMap[svcPortName][0]
 | 
						ep := proxier.endpointsMap[svcPortName][0]
 | 
				
			||||||
	epInfo, ok := ep.(*endpointsInfo)
 | 
						epInfo, ok := ep.(*endpointInfo)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Failed to cast endpointsInfo %q", svcPortName.String())
 | 
							t.Errorf("Failed to cast endpointInfo %q", svcPortName.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if epInfo.hnsID != "EPID-3" {
 | 
							if epInfo.hnsID != "EPID-3" {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user