clean up LocalTrafficDetector construction / tests (#124582)
* LocalTrafficDetector construction and test improvements * Reorder getLocalDetector unit test fields so "input" args come before "output" args * Don't pass DetectLocalMode as a separate arg to getLocalDetector It's already part of `config` * Clarify test names in preparation for merging * Merge single-stack/dual-stack LocalTrafficDetector construction Also, only warn if the *primary* IP family is not correctly configured (since we don't actually know if the cluster is really dual-stack or not), and pass the pair of detectors to the proxiers as a map rather than an array. * Remove the rest of Test_getDualStackLocalDetectorTuple
This commit is contained in:
		| @@ -162,18 +162,16 @@ func (s *ProxyServer) platformCheckSupported(ctx context.Context) (ipv4Supported | |||||||
| func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.KubeProxyConfiguration, dualStack, initOnly bool) (proxy.Provider, error) { | func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi.KubeProxyConfiguration, dualStack, initOnly bool) (proxy.Provider, error) { | ||||||
| 	logger := klog.FromContext(ctx) | 	logger := klog.FromContext(ctx) | ||||||
| 	var proxier proxy.Provider | 	var proxier proxy.Provider | ||||||
| 	var localDetectors [2]proxyutil.LocalTrafficDetector |  | ||||||
| 	var localDetector proxyutil.LocalTrafficDetector |  | ||||||
| 	var err error | 	var err error | ||||||
|  |  | ||||||
|  | 	localDetectors := getLocalDetectors(logger, s.PrimaryIPFamily, config, s.podCIDRs) | ||||||
|  |  | ||||||
| 	if config.Mode == proxyconfigapi.ProxyModeIPTables { | 	if config.Mode == proxyconfigapi.ProxyModeIPTables { | ||||||
| 		logger.Info("Using iptables Proxier") | 		logger.Info("Using iptables Proxier") | ||||||
|  |  | ||||||
| 		if dualStack { | 		if dualStack { | ||||||
| 			ipt, _ := getIPTables(s.PrimaryIPFamily) | 			ipt, _ := getIPTables(s.PrimaryIPFamily) | ||||||
|  |  | ||||||
| 			localDetectors = getDualStackLocalDetectorTuple(logger, config.DetectLocalMode, config, s.podCIDRs) |  | ||||||
|  |  | ||||||
| 			// TODO this has side effects that should only happen when Run() is invoked. | 			// TODO this has side effects that should only happen when Run() is invoked. | ||||||
| 			proxier, err = iptables.NewDualStackProxier( | 			proxier, err = iptables.NewDualStackProxier( | ||||||
| 				ctx, | 				ctx, | ||||||
| @@ -196,7 +194,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 		} else { | 		} else { | ||||||
| 			// Create a single-stack proxier if and only if the node does not support dual-stack (i.e, no iptables support). | 			// Create a single-stack proxier if and only if the node does not support dual-stack (i.e, no iptables support). | ||||||
| 			_, iptInterface := getIPTables(s.PrimaryIPFamily) | 			_, iptInterface := getIPTables(s.PrimaryIPFamily) | ||||||
| 			localDetector = getLocalDetector(logger, s.PrimaryIPFamily, config.DetectLocalMode, config, s.podCIDRs) |  | ||||||
|  |  | ||||||
| 			// TODO this has side effects that should only happen when Run() is invoked. | 			// TODO this has side effects that should only happen when Run() is invoked. | ||||||
| 			proxier, err = iptables.NewProxier( | 			proxier, err = iptables.NewProxier( | ||||||
| @@ -210,7 +207,7 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 				config.IPTables.MasqueradeAll, | 				config.IPTables.MasqueradeAll, | ||||||
| 				*config.IPTables.LocalhostNodePorts, | 				*config.IPTables.LocalhostNodePorts, | ||||||
| 				int(*config.IPTables.MasqueradeBit), | 				int(*config.IPTables.MasqueradeBit), | ||||||
| 				localDetector, | 				localDetectors[s.PrimaryIPFamily], | ||||||
| 				s.Hostname, | 				s.Hostname, | ||||||
| 				s.NodeIPs[s.PrimaryIPFamily], | 				s.NodeIPs[s.PrimaryIPFamily], | ||||||
| 				s.Recorder, | 				s.Recorder, | ||||||
| @@ -234,10 +231,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 		logger.Info("Using ipvs Proxier") | 		logger.Info("Using ipvs Proxier") | ||||||
| 		if dualStack { | 		if dualStack { | ||||||
| 			ipt, _ := getIPTables(s.PrimaryIPFamily) | 			ipt, _ := getIPTables(s.PrimaryIPFamily) | ||||||
|  |  | ||||||
| 			// Always ordered to match []ipt |  | ||||||
| 			localDetectors = getDualStackLocalDetectorTuple(logger, config.DetectLocalMode, config, s.podCIDRs) |  | ||||||
|  |  | ||||||
| 			proxier, err = ipvs.NewDualStackProxier( | 			proxier, err = ipvs.NewDualStackProxier( | ||||||
| 				ctx, | 				ctx, | ||||||
| 				ipt, | 				ipt, | ||||||
| @@ -265,8 +258,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 			) | 			) | ||||||
| 		} else { | 		} else { | ||||||
| 			_, iptInterface := getIPTables(s.PrimaryIPFamily) | 			_, iptInterface := getIPTables(s.PrimaryIPFamily) | ||||||
| 			localDetector = getLocalDetector(logger, s.PrimaryIPFamily, config.DetectLocalMode, config, s.podCIDRs) |  | ||||||
|  |  | ||||||
| 			proxier, err = ipvs.NewProxier( | 			proxier, err = ipvs.NewProxier( | ||||||
| 				ctx, | 				ctx, | ||||||
| 				s.PrimaryIPFamily, | 				s.PrimaryIPFamily, | ||||||
| @@ -284,7 +275,7 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 				config.IPVS.UDPTimeout.Duration, | 				config.IPVS.UDPTimeout.Duration, | ||||||
| 				config.IPTables.MasqueradeAll, | 				config.IPTables.MasqueradeAll, | ||||||
| 				int(*config.IPTables.MasqueradeBit), | 				int(*config.IPTables.MasqueradeBit), | ||||||
| 				localDetector, | 				localDetectors[s.PrimaryIPFamily], | ||||||
| 				s.Hostname, | 				s.Hostname, | ||||||
| 				s.NodeIPs[s.PrimaryIPFamily], | 				s.NodeIPs[s.PrimaryIPFamily], | ||||||
| 				s.Recorder, | 				s.Recorder, | ||||||
| @@ -301,8 +292,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 		logger.Info("Using nftables Proxier") | 		logger.Info("Using nftables Proxier") | ||||||
|  |  | ||||||
| 		if dualStack { | 		if dualStack { | ||||||
| 			localDetectors = getDualStackLocalDetectorTuple(logger, config.DetectLocalMode, config, s.podCIDRs) |  | ||||||
|  |  | ||||||
| 			// TODO this has side effects that should only happen when Run() is invoked. | 			// TODO this has side effects that should only happen when Run() is invoked. | ||||||
| 			proxier, err = nftables.NewDualStackProxier( | 			proxier, err = nftables.NewDualStackProxier( | ||||||
| 				ctx, | 				ctx, | ||||||
| @@ -321,8 +310,6 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 			) | 			) | ||||||
| 		} else { | 		} else { | ||||||
| 			// Create a single-stack proxier if and only if the node does not support dual-stack | 			// Create a single-stack proxier if and only if the node does not support dual-stack | ||||||
| 			localDetector = getLocalDetector(logger, s.PrimaryIPFamily, config.DetectLocalMode, config, s.podCIDRs) |  | ||||||
|  |  | ||||||
| 			// TODO this has side effects that should only happen when Run() is invoked. | 			// TODO this has side effects that should only happen when Run() is invoked. | ||||||
| 			proxier, err = nftables.NewProxier( | 			proxier, err = nftables.NewProxier( | ||||||
| 				ctx, | 				ctx, | ||||||
| @@ -332,7 +319,7 @@ func (s *ProxyServer) createProxier(ctx context.Context, config *proxyconfigapi. | |||||||
| 				config.NFTables.MinSyncPeriod.Duration, | 				config.NFTables.MinSyncPeriod.Duration, | ||||||
| 				config.NFTables.MasqueradeAll, | 				config.NFTables.MasqueradeAll, | ||||||
| 				int(*config.NFTables.MasqueradeBit), | 				int(*config.NFTables.MasqueradeBit), | ||||||
| 				localDetector, | 				localDetectors[s.PrimaryIPFamily], | ||||||
| 				s.Hostname, | 				s.Hostname, | ||||||
| 				s.NodeIPs[s.PrimaryIPFamily], | 				s.NodeIPs[s.PrimaryIPFamily], | ||||||
| 				s.Recorder, | 				s.Recorder, | ||||||
| @@ -484,48 +471,45 @@ func detectNumCPU() int { | |||||||
| 	return numCPU | 	return numCPU | ||||||
| } | } | ||||||
|  |  | ||||||
| func getLocalDetector(logger klog.Logger, ipFamily v1.IPFamily, mode proxyconfigapi.LocalMode, config *proxyconfigapi.KubeProxyConfiguration, nodePodCIDRs []string) proxyutil.LocalTrafficDetector { | func getLocalDetectors(logger klog.Logger, primaryIPFamily v1.IPFamily, config *proxyconfigapi.KubeProxyConfiguration, nodePodCIDRs []string) map[v1.IPFamily]proxyutil.LocalTrafficDetector { | ||||||
| 	switch mode { | 	localDetectors := map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 		v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 		v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	switch config.DetectLocalMode { | ||||||
| 	case proxyconfigapi.LocalModeClusterCIDR: | 	case proxyconfigapi.LocalModeClusterCIDR: | ||||||
| 		// LocalModeClusterCIDR is the default if --detect-local-mode wasn't passed, | 		clusterCIDRs := strings.Split(strings.TrimSpace(config.ClusterCIDR), ",") | ||||||
| 		// but --cluster-cidr is optional. | 		for family, cidrs := range proxyutil.MapCIDRsByIPFamily(clusterCIDRs) { | ||||||
| 		clusterCIDRs := strings.TrimSpace(config.ClusterCIDR) | 			localDetectors[family] = proxyutil.NewDetectLocalByCIDR(cidrs[0].String()) | ||||||
| 		if len(clusterCIDRs) == 0 { |  | ||||||
| 			logger.Info("Detect-local-mode set to ClusterCIDR, but no cluster CIDR defined") |  | ||||||
| 			break |  | ||||||
| 		} | 		} | ||||||
|  | 		if !localDetectors[primaryIPFamily].IsImplemented() { | ||||||
| 		cidrsByFamily := proxyutil.MapCIDRsByIPFamily(strings.Split(clusterCIDRs, ",")) | 			logger.Info("Detect-local-mode set to ClusterCIDR, but no cluster CIDR specified for primary IP family", "ipFamily", primaryIPFamily, "clusterCIDR", config.ClusterCIDR) | ||||||
| 		if len(cidrsByFamily[ipFamily]) != 0 { |  | ||||||
| 			return proxyutil.NewDetectLocalByCIDR(cidrsByFamily[ipFamily][0].String()) |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		logger.Info("Detect-local-mode set to ClusterCIDR, but no cluster CIDR for family", "ipFamily", ipFamily) |  | ||||||
|  |  | ||||||
| 	case proxyconfigapi.LocalModeNodeCIDR: | 	case proxyconfigapi.LocalModeNodeCIDR: | ||||||
| 		cidrsByFamily := proxyutil.MapCIDRsByIPFamily(nodePodCIDRs) | 		for family, cidrs := range proxyutil.MapCIDRsByIPFamily(nodePodCIDRs) { | ||||||
| 		if len(cidrsByFamily[ipFamily]) != 0 { | 			localDetectors[family] = proxyutil.NewDetectLocalByCIDR(cidrs[0].String()) | ||||||
| 			return proxyutil.NewDetectLocalByCIDR(cidrsByFamily[ipFamily][0].String()) | 		} | ||||||
|  | 		if !localDetectors[primaryIPFamily].IsImplemented() { | ||||||
|  | 			logger.Info("Detect-local-mode set to NodeCIDR, but no PodCIDR defined at node for primary IP family", "ipFamily", primaryIPFamily, "podCIDRs", nodePodCIDRs) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		logger.Info("Detect-local-mode set to NodeCIDR, but no PodCIDR defined at node for family", "ipFamily", ipFamily) |  | ||||||
|  |  | ||||||
| 	case proxyconfigapi.LocalModeBridgeInterface: | 	case proxyconfigapi.LocalModeBridgeInterface: | ||||||
| 		return proxyutil.NewDetectLocalByBridgeInterface(config.DetectLocal.BridgeInterface) | 		localDetector := proxyutil.NewDetectLocalByBridgeInterface(config.DetectLocal.BridgeInterface) | ||||||
|  | 		localDetectors[v1.IPv4Protocol] = localDetector | ||||||
|  | 		localDetectors[v1.IPv6Protocol] = localDetector | ||||||
|  |  | ||||||
| 	case proxyconfigapi.LocalModeInterfaceNamePrefix: | 	case proxyconfigapi.LocalModeInterfaceNamePrefix: | ||||||
| 		return proxyutil.NewDetectLocalByInterfaceNamePrefix(config.DetectLocal.InterfaceNamePrefix) | 		localDetector := proxyutil.NewDetectLocalByInterfaceNamePrefix(config.DetectLocal.InterfaceNamePrefix) | ||||||
|  | 		localDetectors[v1.IPv4Protocol] = localDetector | ||||||
|  | 		localDetectors[v1.IPv6Protocol] = localDetector | ||||||
|  |  | ||||||
|  | 	default: | ||||||
|  | 		logger.Info("Defaulting to no-op detect-local") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	logger.Info("Defaulting to no-op detect-local") | 	return localDetectors | ||||||
| 	return proxyutil.NewNoOpLocalDetector() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func getDualStackLocalDetectorTuple(logger klog.Logger, mode proxyconfigapi.LocalMode, config *proxyconfigapi.KubeProxyConfiguration, nodePodCIDRs []string) [2]proxyutil.LocalTrafficDetector { |  | ||||||
| 	return [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 		getLocalDetector(logger, v1.IPv4Protocol, mode, config, nodePodCIDRs), |  | ||||||
| 		getLocalDetector(logger, v1.IPv6Protocol, mode, config, nodePodCIDRs), |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // platformCleanup removes stale kube-proxy rules that can be safely removed. If | // platformCleanup removes stale kube-proxy rules that can be safely removed. If | ||||||
|   | |||||||
| @@ -108,299 +108,292 @@ func Test_platformApplyDefaults(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func Test_getLocalDetector(t *testing.T) { | func Test_getLocalDetectors(t *testing.T) { | ||||||
| 	cases := []struct { | 	cases := []struct { | ||||||
| 		name         string | 		name            string | ||||||
| 		mode         proxyconfigapi.LocalMode | 		config          *proxyconfigapi.KubeProxyConfiguration | ||||||
| 		config       *proxyconfigapi.KubeProxyConfiguration | 		primaryIPFamily v1.IPFamily | ||||||
| 		family       v1.IPFamily | 		nodePodCIDRs    []string | ||||||
| 		expected     proxyutil.LocalTrafficDetector | 		expected        map[v1.IPFamily]proxyutil.LocalTrafficDetector | ||||||
| 		nodePodCIDRs []string |  | ||||||
| 	}{ | 	}{ | ||||||
| 		// LocalModeClusterCIDR | 		// LocalModeClusterCIDR | ||||||
| 		{ | 		{ | ||||||
| 			name:     "LocalModeClusterCIDR, IPv4 cluster", | 			name: "LocalModeClusterCIDR, single-stack IPv4 cluster", | ||||||
| 			mode:     proxyconfigapi.LocalModeClusterCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:   &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"}, | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
| 			family:   v1.IPv4Protocol, | 				ClusterCIDR:     "10.0.0.0/14", | ||||||
| 			expected: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:     "LocalModeClusterCIDR, IPv6 cluster", | 			name: "LocalModeClusterCIDR, single-stack IPv6 cluster", | ||||||
| 			mode:     proxyconfigapi.LocalModeClusterCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:   &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"}, | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
| 			family:   v1.IPv6Protocol, | 				ClusterCIDR:     "2002:0:0:1234::/64", | ||||||
| 			expected: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv6Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:     "LocalModeClusterCIDR, IPv6 cluster with IPv4 config", | 			name: "LocalModeClusterCIDR, single-stack IPv6 cluster with single-stack IPv4 config", | ||||||
| 			mode:     proxyconfigapi.LocalModeClusterCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:   &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"}, | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
| 			family:   v1.IPv6Protocol, | 				ClusterCIDR:     "10.0.0.0/14", | ||||||
| 			expected: proxyutil.NewNoOpLocalDetector(), | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv6Protocol, | ||||||
|  | 			// This will output a warning that there is no IPv6 CIDR but it | ||||||
|  | 			// will still use the provided IPv4 CIDR for IPv4. | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:     "LocalModeClusterCIDR, IPv4 cluster with IPv6 config", | 			name: "LocalModeClusterCIDR, single-stack IPv4 cluster with single-stack IPv6 config", | ||||||
| 			mode:     proxyconfigapi.LocalModeClusterCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:   &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"}, | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
| 			family:   v1.IPv4Protocol, | 				ClusterCIDR:     "2002:0:0:1234::/64", | ||||||
| 			expected: proxyutil.NewNoOpLocalDetector(), | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			// This will output a warning that there is no IPv4 CIDR but it | ||||||
|  | 			// will still use the provided IPv6 CIDR for IPv6. | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:     "LocalModeClusterCIDR, IPv4 kube-proxy in dual-stack IPv6-primary cluster", | 			name: "LocalModeClusterCIDR, dual-stack IPv4-primary cluster", | ||||||
| 			mode:     proxyconfigapi.LocalModeClusterCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:   &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14"}, | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
| 			family:   v1.IPv4Protocol, | 				ClusterCIDR:     "10.0.0.0/14,2002:0:0:1234::/64", | ||||||
| 			expected: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:     "LocalModeClusterCIDR, no ClusterCIDR", | 			name: "LocalModeClusterCIDR, dual-stack IPv6-primary cluster", | ||||||
| 			mode:     proxyconfigapi.LocalModeClusterCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:   &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""}, | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
| 			family:   v1.IPv4Protocol, | 				ClusterCIDR:     "2002:0:0:1234::/64,10.0.0.0/14", | ||||||
| 			expected: proxyutil.NewNoOpLocalDetector(), | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv6Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "LocalModeClusterCIDR, IPv4-primary kube-proxy / IPv6-primary config", | ||||||
|  | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
|  | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
|  | 				ClusterCIDR:     "2002:0:0:1234::/64,10.0.0.0/14", | ||||||
|  | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "LocalModeClusterCIDR, no ClusterCIDR", | ||||||
|  | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
|  | 				DetectLocalMode: proxyconfigapi.LocalModeClusterCIDR, | ||||||
|  | 				ClusterCIDR:     "", | ||||||
|  | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		// LocalModeNodeCIDR | 		// LocalModeNodeCIDR | ||||||
| 		{ | 		{ | ||||||
| 			name:         "LocalModeNodeCIDR, IPv4 cluster", | 			name: "LocalModeNodeCIDR, single-stack IPv4 cluster", | ||||||
| 			mode:         proxyconfigapi.LocalModeNodeCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:       &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"}, | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
| 			family:       v1.IPv4Protocol, | 				ClusterCIDR:     "10.0.0.0/14", | ||||||
| 			expected:     proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), | 			}, | ||||||
| 			nodePodCIDRs: []string{"10.0.0.0/24"}, | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{"10.0.0.0/24"}, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "LocalModeNodeCIDR, IPv6 cluster", | 			name: "LocalModeNodeCIDR, single-stack IPv6 cluster", | ||||||
| 			mode:         proxyconfigapi.LocalModeNodeCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:       &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"}, | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
| 			family:       v1.IPv6Protocol, | 				ClusterCIDR:     "2002:0:0:1234::/64", | ||||||
| 			expected:     proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), | 			}, | ||||||
| 			nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"}, | 			primaryIPFamily: v1.IPv6Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{"2002::1234:abcd:ffff:0:0/96"}, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "LocalModeNodeCIDR, IPv6 cluster with IPv4 config", | 			name: "LocalModeNodeCIDR, single-stack IPv6 cluster with single-stack IPv4 config", | ||||||
| 			mode:         proxyconfigapi.LocalModeNodeCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:       &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"}, | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
| 			family:       v1.IPv6Protocol, | 				ClusterCIDR:     "10.0.0.0/14", | ||||||
| 			expected:     proxyutil.NewNoOpLocalDetector(), | 			}, | ||||||
| 			nodePodCIDRs: []string{"10.0.0.0/24"}, | 			primaryIPFamily: v1.IPv6Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{"10.0.0.0/24"}, | ||||||
|  | 			// This will output a warning that there is no IPv6 CIDR but it | ||||||
|  | 			// will still use the provided IPv4 CIDR for IPv4. | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "LocalModeNodeCIDR, IPv4 cluster with IPv6 config", | 			name: "LocalModeNodeCIDR, single-stack IPv4 cluster with single-stack IPv6 config", | ||||||
| 			mode:         proxyconfigapi.LocalModeNodeCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:       &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"}, | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
| 			family:       v1.IPv4Protocol, | 				ClusterCIDR:     "2002:0:0:1234::/64", | ||||||
| 			expected:     proxyutil.NewNoOpLocalDetector(), | 			}, | ||||||
| 			nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"}, | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{"2002::1234:abcd:ffff:0:0/96"}, | ||||||
|  | 			// This will output a warning that there is no IPv4 CIDR but it | ||||||
|  | 			// will still use the provided IPv6 CIDR for IPv6. | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "LocalModeNodeCIDR, IPv6 kube-proxy in dual-stack IPv4-primary cluster", | 			name: "LocalModeNodeCIDR, dual-stack IPv4-primary cluster", | ||||||
| 			mode:         proxyconfigapi.LocalModeNodeCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:       &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64"}, | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
| 			family:       v1.IPv6Protocol, | 				ClusterCIDR:     "10.0.0.0/14,2002:0:0:1234::/64", | ||||||
| 			expected:     proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), | 			}, | ||||||
| 			nodePodCIDRs: []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"}, | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"}, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "LocalModeNodeCIDR, no PodCIDRs", | 			name: "LocalModeNodeCIDR, dual-stack IPv6-primary cluster", | ||||||
| 			mode:         proxyconfigapi.LocalModeNodeCIDR, | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 			config:       &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""}, | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
| 			family:       v1.IPv4Protocol, | 				ClusterCIDR:     "2002:0:0:1234::/64,10.0.0.0/14", | ||||||
| 			expected:     proxyutil.NewNoOpLocalDetector(), | 			}, | ||||||
| 			nodePodCIDRs: []string{}, | 			primaryIPFamily: v1.IPv6Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{"2002::1234:abcd:ffff:0:0/96", "10.0.0.0/24"}, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "LocalModeNodeCIDR, IPv6-primary kube-proxy / IPv4-primary config", | ||||||
|  | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
|  | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
|  | 				ClusterCIDR:     "10.0.0.0/14,2002:0:0:1234::/64", | ||||||
|  | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv6Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"}, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "LocalModeNodeCIDR, no PodCIDRs", | ||||||
|  | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
|  | 				DetectLocalMode: proxyconfigapi.LocalModeNodeCIDR, | ||||||
|  | 				ClusterCIDR:     "", | ||||||
|  | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			nodePodCIDRs:    []string{}, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
|  | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		// unknown mode | 		// unknown mode | ||||||
| 		{ | 		{ | ||||||
| 			name:     "unknown LocalMode", | 			name: "unknown LocalMode", | ||||||
| 			mode:     proxyconfigapi.LocalMode("abcd"), |  | ||||||
| 			config:   &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"}, |  | ||||||
| 			family:   v1.IPv4Protocol, |  | ||||||
| 			expected: proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 		}, |  | ||||||
| 		// LocalModeBridgeInterface |  | ||||||
| 		{ |  | ||||||
| 			name: "LocalModeBrideInterface", |  | ||||||
| 			mode: proxyconfigapi.LocalModeBridgeInterface, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 				DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "eth"}, | 				DetectLocalMode: proxyconfigapi.LocalMode("abcd"), | ||||||
|  | 				ClusterCIDR:     "10.0.0.0/14", | ||||||
| 			}, | 			}, | ||||||
| 			family:   v1.IPv4Protocol, | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
| 			expected: proxyutil.NewDetectLocalByBridgeInterface("eth"), | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
| 		}, | 				v1.IPv4Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
| 		{ | 				v1.IPv6Protocol: proxyutil.NewNoOpLocalDetector(), | ||||||
| 			name: "LocalModeBridgeInterface, strange bridge name", |  | ||||||
| 			mode: proxyconfigapi.LocalModeBridgeInterface, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ |  | ||||||
| 				DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "1234567890123456789"}, |  | ||||||
| 			}, | 			}, | ||||||
| 			family:   v1.IPv4Protocol, |  | ||||||
| 			expected: proxyutil.NewDetectLocalByBridgeInterface("1234567890123456789"), |  | ||||||
| 		}, |  | ||||||
| 		// LocalModeInterfaceNamePrefix |  | ||||||
| 		{ |  | ||||||
| 			name: "LocalModeInterfaceNamePrefix", |  | ||||||
| 			mode: proxyconfigapi.LocalModeInterfaceNamePrefix, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ |  | ||||||
| 				DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "eth"}, |  | ||||||
| 			}, |  | ||||||
| 			family:   v1.IPv4Protocol, |  | ||||||
| 			expected: proxyutil.NewDetectLocalByInterfaceNamePrefix("eth"), |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name: "LocalModeInterfaceNamePrefix, strange interface name", |  | ||||||
| 			mode: proxyconfigapi.LocalModeInterfaceNamePrefix, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ |  | ||||||
| 				DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "1234567890123456789"}, |  | ||||||
| 			}, |  | ||||||
| 			family:   v1.IPv4Protocol, |  | ||||||
| 			expected: proxyutil.NewDetectLocalByInterfaceNamePrefix("1234567890123456789"), |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| 	for _, c := range cases { |  | ||||||
| 		t.Run(c.name, func(t *testing.T) { |  | ||||||
| 			logger, _ := ktesting.NewTestContext(t) |  | ||||||
| 			r := getLocalDetector(logger, c.family, c.mode, c.config, c.nodePodCIDRs) |  | ||||||
| 			if !reflect.DeepEqual(r, c.expected) { |  | ||||||
| 				t.Errorf("Unexpected detect-local implementation, expected: %q, got: %q", c.expected, r) |  | ||||||
| 			} |  | ||||||
| 		}) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func Test_getDualStackLocalDetectorTuple(t *testing.T) { |  | ||||||
| 	cases := []struct { |  | ||||||
| 		name         string |  | ||||||
| 		mode         proxyconfigapi.LocalMode |  | ||||||
| 		config       *proxyconfigapi.KubeProxyConfiguration |  | ||||||
| 		expected     [2]proxyutil.LocalTrafficDetector |  | ||||||
| 		nodePodCIDRs []string |  | ||||||
| 	}{ |  | ||||||
| 		// LocalModeClusterCIDR |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeClusterCIDR, dual-stack IPv4-primary cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeClusterCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeClusterCIDR, dual-stack IPv6-primary cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeClusterCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeClusterCIDR, single-stack IPv4 cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeClusterCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("10.0.0.0/14"), |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeClusterCIDR, single-stack IPv6 cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeClusterCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("2002:0:0:1234::/64"), |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeClusterCIDR, no ClusterCIDR", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeClusterCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		// LocalModeNodeCIDR |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeNodeCIDR, dual-stack IPv4-primary cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeNodeCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14,2002:0:0:1234::/64"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), |  | ||||||
| 			}, |  | ||||||
| 			nodePodCIDRs: []string{"10.0.0.0/24", "2002::1234:abcd:ffff:0:0/96"}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeNodeCIDR, dual-stack IPv6-primary cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeNodeCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64,10.0.0.0/14"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), |  | ||||||
| 			}, |  | ||||||
| 			nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96", "10.0.0.0/24"}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeNodeCIDR, single-stack IPv4 cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeNodeCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "10.0.0.0/14"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("10.0.0.0/24"), |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 			}, |  | ||||||
| 			nodePodCIDRs: []string{"10.0.0.0/24"}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeNodeCIDR, single-stack IPv6 cluster", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeNodeCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: "2002:0:0:1234::/64"}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 				proxyutil.NewDetectLocalByCIDR("2002::1234:abcd:ffff:0:0/96"), |  | ||||||
| 			}, |  | ||||||
| 			nodePodCIDRs: []string{"2002::1234:abcd:ffff:0:0/96"}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:   "LocalModeNodeCIDR, no PodCIDRs", |  | ||||||
| 			mode:   proxyconfigapi.LocalModeNodeCIDR, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ClusterCIDR: ""}, |  | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 				proxyutil.NewNoOpLocalDetector(), |  | ||||||
| 			}, |  | ||||||
| 			nodePodCIDRs: []string{}, |  | ||||||
| 		}, | 		}, | ||||||
| 		// LocalModeBridgeInterface | 		// LocalModeBridgeInterface | ||||||
| 		{ | 		{ | ||||||
| 			name: "LocalModeBridgeInterface", | 			name: "LocalModeBridgeInterface", | ||||||
| 			mode: proxyconfigapi.LocalModeBridgeInterface, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 				DetectLocal: proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "eth"}, | 				DetectLocalMode: proxyconfigapi.LocalModeBridgeInterface, | ||||||
|  | 				DetectLocal:     proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "eth"}, | ||||||
| 			}, | 			}, | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
| 				proxyutil.NewDetectLocalByBridgeInterface("eth"), | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
| 				proxyutil.NewDetectLocalByBridgeInterface("eth"), | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByBridgeInterface("eth"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByBridgeInterface("eth"), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "LocalModeBridgeInterface, strange bridge name", | ||||||
|  | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
|  | 				DetectLocalMode: proxyconfigapi.LocalModeBridgeInterface, | ||||||
|  | 				DetectLocal:     proxyconfigapi.DetectLocalConfiguration{BridgeInterface: "1234567890123456789"}, | ||||||
|  | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByBridgeInterface("1234567890123456789"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByBridgeInterface("1234567890123456789"), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		// LocalModeInterfaceNamePrefix | 		// LocalModeInterfaceNamePrefix | ||||||
| 		{ | 		{ | ||||||
| 			name: "LocalModeInterfaceNamePrefix", | 			name: "LocalModeInterfaceNamePrefix", | ||||||
| 			mode: proxyconfigapi.LocalModeInterfaceNamePrefix, |  | ||||||
| 			config: &proxyconfigapi.KubeProxyConfiguration{ | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
| 				DetectLocal: proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "veth"}, | 				DetectLocalMode: proxyconfigapi.LocalModeInterfaceNamePrefix, | ||||||
|  | 				DetectLocal:     proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "eth"}, | ||||||
| 			}, | 			}, | ||||||
| 			expected: [2]proxyutil.LocalTrafficDetector{ | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
| 				proxyutil.NewDetectLocalByInterfaceNamePrefix("veth"), | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
| 				proxyutil.NewDetectLocalByInterfaceNamePrefix("veth"), | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("eth"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("eth"), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "LocalModeInterfaceNamePrefix, strange interface name", | ||||||
|  | 			config: &proxyconfigapi.KubeProxyConfiguration{ | ||||||
|  | 				DetectLocalMode: proxyconfigapi.LocalModeInterfaceNamePrefix, | ||||||
|  | 				DetectLocal:     proxyconfigapi.DetectLocalConfiguration{InterfaceNamePrefix: "1234567890123456789"}, | ||||||
|  | 			}, | ||||||
|  | 			primaryIPFamily: v1.IPv4Protocol, | ||||||
|  | 			expected: map[v1.IPFamily]proxyutil.LocalTrafficDetector{ | ||||||
|  | 				v1.IPv4Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("1234567890123456789"), | ||||||
|  | 				v1.IPv6Protocol: proxyutil.NewDetectLocalByInterfaceNamePrefix("1234567890123456789"), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	for _, c := range cases { | 	for _, c := range cases { | ||||||
| 		t.Run(c.name, func(t *testing.T) { | 		t.Run(c.name, func(t *testing.T) { | ||||||
| 			logger, _ := ktesting.NewTestContext(t) | 			logger, _ := ktesting.NewTestContext(t) | ||||||
| 			r := getDualStackLocalDetectorTuple(logger, c.mode, c.config, c.nodePodCIDRs) | 			r := getLocalDetectors(logger, c.primaryIPFamily, c.config, c.nodePodCIDRs) | ||||||
| 			if !reflect.DeepEqual(r, c.expected) { | 			if !reflect.DeepEqual(r, c.expected) { | ||||||
| 				t.Errorf("Unexpected detect-local implementation, expected: %q, got: %q", c.expected, r) | 				t.Errorf("Unexpected detect-local implementation, expected: %q, got: %q", c.expected, r) | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -107,7 +107,7 @@ func NewDualStackProxier( | |||||||
| 	masqueradeAll bool, | 	masqueradeAll bool, | ||||||
| 	localhostNodePorts bool, | 	localhostNodePorts bool, | ||||||
| 	masqueradeBit int, | 	masqueradeBit int, | ||||||
| 	localDetectors [2]proxyutil.LocalTrafficDetector, | 	localDetectors map[v1.IPFamily]proxyutil.LocalTrafficDetector, | ||||||
| 	hostname string, | 	hostname string, | ||||||
| 	nodeIPs map[v1.IPFamily]net.IP, | 	nodeIPs map[v1.IPFamily]net.IP, | ||||||
| 	recorder events.EventRecorder, | 	recorder events.EventRecorder, | ||||||
| @@ -117,15 +117,17 @@ func NewDualStackProxier( | |||||||
| ) (proxy.Provider, error) { | ) (proxy.Provider, error) { | ||||||
| 	// Create an ipv4 instance of the single-stack proxier | 	// Create an ipv4 instance of the single-stack proxier | ||||||
| 	ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], sysctl, | 	ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], sysctl, | ||||||
| 		exec, syncPeriod, minSyncPeriod, masqueradeAll, localhostNodePorts, masqueradeBit, localDetectors[0], hostname, | 		exec, syncPeriod, minSyncPeriod, masqueradeAll, localhostNodePorts, masqueradeBit, | ||||||
| 		nodeIPs[v1.IPv4Protocol], recorder, healthzServer, nodePortAddresses, initOnly) | 		localDetectors[v1.IPv4Protocol], hostname, nodeIPs[v1.IPv4Protocol], | ||||||
|  | 		recorder, healthzServer, nodePortAddresses, initOnly) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) | 		return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], sysctl, | 	ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], sysctl, | ||||||
| 		exec, syncPeriod, minSyncPeriod, masqueradeAll, false, masqueradeBit, localDetectors[1], hostname, | 		exec, syncPeriod, minSyncPeriod, masqueradeAll, false, masqueradeBit, | ||||||
| 		nodeIPs[v1.IPv6Protocol], recorder, healthzServer, nodePortAddresses, initOnly) | 		localDetectors[v1.IPv6Protocol], hostname, nodeIPs[v1.IPv6Protocol], | ||||||
|  | 		recorder, healthzServer, nodePortAddresses, initOnly) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) | 		return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -126,7 +126,7 @@ func NewDualStackProxier( | |||||||
| 	udpTimeout time.Duration, | 	udpTimeout time.Duration, | ||||||
| 	masqueradeAll bool, | 	masqueradeAll bool, | ||||||
| 	masqueradeBit int, | 	masqueradeBit int, | ||||||
| 	localDetectors [2]proxyutil.LocalTrafficDetector, | 	localDetectors map[v1.IPFamily]proxyutil.LocalTrafficDetector, | ||||||
| 	hostname string, | 	hostname string, | ||||||
| 	nodeIPs map[v1.IPFamily]net.IP, | 	nodeIPs map[v1.IPFamily]net.IP, | ||||||
| 	recorder events.EventRecorder, | 	recorder events.EventRecorder, | ||||||
| @@ -139,7 +139,7 @@ func NewDualStackProxier( | |||||||
| 	ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], ipvs, ipset, sysctl, | 	ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, ipt[0], ipvs, ipset, sysctl, | ||||||
| 		exec, syncPeriod, minSyncPeriod, filterCIDRs(false, excludeCIDRs), strictARP, | 		exec, syncPeriod, minSyncPeriod, filterCIDRs(false, excludeCIDRs), strictARP, | ||||||
| 		tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit, | 		tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit, | ||||||
| 		localDetectors[0], hostname, nodeIPs[v1.IPv4Protocol], recorder, | 		localDetectors[v1.IPv4Protocol], hostname, nodeIPs[v1.IPv4Protocol], recorder, | ||||||
| 		healthzServer, scheduler, nodePortAddresses, initOnly) | 		healthzServer, scheduler, nodePortAddresses, initOnly) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) | 		return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) | ||||||
| @@ -148,7 +148,7 @@ func NewDualStackProxier( | |||||||
| 	ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], ipvs, ipset, sysctl, | 	ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, ipt[1], ipvs, ipset, sysctl, | ||||||
| 		exec, syncPeriod, minSyncPeriod, filterCIDRs(true, excludeCIDRs), strictARP, | 		exec, syncPeriod, minSyncPeriod, filterCIDRs(true, excludeCIDRs), strictARP, | ||||||
| 		tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit, | 		tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit, | ||||||
| 		localDetectors[1], hostname, nodeIPs[v1.IPv6Protocol], recorder, | 		localDetectors[v1.IPv6Protocol], hostname, nodeIPs[v1.IPv6Protocol], recorder, | ||||||
| 		healthzServer, scheduler, nodePortAddresses, initOnly) | 		healthzServer, scheduler, nodePortAddresses, initOnly) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) | 		return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) | ||||||
|   | |||||||
| @@ -110,7 +110,7 @@ func NewDualStackProxier( | |||||||
| 	minSyncPeriod time.Duration, | 	minSyncPeriod time.Duration, | ||||||
| 	masqueradeAll bool, | 	masqueradeAll bool, | ||||||
| 	masqueradeBit int, | 	masqueradeBit int, | ||||||
| 	localDetectors [2]proxyutil.LocalTrafficDetector, | 	localDetectors map[v1.IPFamily]proxyutil.LocalTrafficDetector, | ||||||
| 	hostname string, | 	hostname string, | ||||||
| 	nodeIPs map[v1.IPFamily]net.IP, | 	nodeIPs map[v1.IPFamily]net.IP, | ||||||
| 	recorder events.EventRecorder, | 	recorder events.EventRecorder, | ||||||
| @@ -120,15 +120,17 @@ func NewDualStackProxier( | |||||||
| ) (proxy.Provider, error) { | ) (proxy.Provider, error) { | ||||||
| 	// Create an ipv4 instance of the single-stack proxier | 	// Create an ipv4 instance of the single-stack proxier | ||||||
| 	ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, sysctl, | 	ipv4Proxier, err := NewProxier(ctx, v1.IPv4Protocol, sysctl, | ||||||
| 		syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, localDetectors[0], hostname, | 		syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, | ||||||
| 		nodeIPs[v1.IPv4Protocol], recorder, healthzServer, nodePortAddresses, initOnly) | 		localDetectors[v1.IPv4Protocol], hostname, nodeIPs[v1.IPv4Protocol], | ||||||
|  | 		recorder, healthzServer, nodePortAddresses, initOnly) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) | 		return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, sysctl, | 	ipv6Proxier, err := NewProxier(ctx, v1.IPv6Protocol, sysctl, | ||||||
| 		syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, localDetectors[1], hostname, | 		syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, | ||||||
| 		nodeIPs[v1.IPv6Protocol], recorder, healthzServer, nodePortAddresses, initOnly) | 		localDetectors[v1.IPv6Protocol], hostname, nodeIPs[v1.IPv6Protocol], | ||||||
|  | 		recorder, healthzServer, nodePortAddresses, initOnly) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) | 		return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Dan Winship
					Dan Winship