Add names to all KubeProxyConfiguration validation test cases

This commit is contained in:
Dan Winship 2024-03-06 10:27:09 -05:00
parent 7320e54e0e
commit c7f3caf498

View File

@ -37,203 +37,234 @@ func TestValidateKubeProxyConfiguration(t *testing.T) {
} else { } else {
proxyMode = kubeproxyconfig.ProxyModeIPVS proxyMode = kubeproxyconfig.ProxyModeIPVS
} }
successCases := []kubeproxyconfig.KubeProxyConfiguration{{
BindAddress: "192.168.59.103", successCases := map[string]struct {
HealthzBindAddress: "0.0.0.0:10256", config kubeproxyconfig.KubeProxyConfiguration
MetricsBindAddress: "127.0.0.1:10249", }{
ClusterCIDR: "192.168.59.0/24", "Mode specified, extra mode-specific configs": {
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second}, config: kubeproxyconfig.KubeProxyConfiguration{
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{ BindAddress: "192.168.59.103",
MasqueradeAll: true, HealthzBindAddress: "0.0.0.0:10256",
SyncPeriod: metav1.Duration{Duration: 5 * time.Second}, MetricsBindAddress: "127.0.0.1:10249",
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second}, ClusterCIDR: "192.168.59.0/24",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Mode: proxyMode,
IPVS: kubeproxyconfig.KubeProxyIPVSConfiguration{
SyncPeriod: metav1.Duration{Duration: 10 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 5 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
Mode: proxyMode, "basic config, unspecified Mode": {
IPVS: kubeproxyconfig.KubeProxyIPVSConfiguration{ config: kubeproxyconfig.KubeProxyConfiguration{
SyncPeriod: metav1.Duration{Duration: 10 * time.Second}, BindAddress: "192.168.59.103",
MinSyncPeriod: metav1.Duration{Duration: 5 * time.Second}, HealthzBindAddress: "0.0.0.0:10256",
MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{ "empty HealthzBindAddress": {
MaxPerCore: ptr.To[int32](1), config: kubeproxyconfig.KubeProxyConfiguration{
Min: ptr.To[int32](1), BindAddress: "192.168.59.103",
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second}, HealthzBindAddress: "",
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second}, MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
Logging: logsapi.LoggingConfiguration{ "IPv6": {
Format: "text", config: kubeproxyconfig.KubeProxyConfiguration{
BindAddress: "fd00:192:168:59::103",
HealthzBindAddress: "",
MetricsBindAddress: "[::1]:10249",
ClusterCIDR: "fd00:192:168:59::/64",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
}, { "alternate healthz port": {
BindAddress: "192.168.59.103", config: kubeproxyconfig.KubeProxyConfiguration{
HealthzBindAddress: "0.0.0.0:10256", BindAddress: "10.10.12.11",
MetricsBindAddress: "127.0.0.1:10249", HealthzBindAddress: "0.0.0.0:12345",
ClusterCIDR: "192.168.59.0/24", MetricsBindAddress: "127.0.0.1:10249",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second}, ClusterCIDR: "192.168.59.0/24",
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{ ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
MasqueradeAll: true, IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
SyncPeriod: metav1.Duration{Duration: 5 * time.Second}, MasqueradeAll: true,
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second}, SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{ "ClusterCIDR is wrong IP family": {
MaxPerCore: ptr.To[int32](1), config: kubeproxyconfig.KubeProxyConfiguration{
Min: ptr.To[int32](1), BindAddress: "10.10.12.11",
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second}, HealthzBindAddress: "0.0.0.0:12345",
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second}, MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "fd00:192:168::/64",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
Logging: logsapi.LoggingConfiguration{ "ClusterCIDR is dual-stack": {
Format: "text", config: kubeproxyconfig.KubeProxyConfiguration{
BindAddress: "10.10.12.11",
HealthzBindAddress: "0.0.0.0:12345",
MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24,fd00:192:168::/64",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
}, { "LocalModeInterfaceNamePrefix": {
BindAddress: "192.168.59.103", config: kubeproxyconfig.KubeProxyConfiguration{
HealthzBindAddress: "", BindAddress: "10.10.12.11",
MetricsBindAddress: "127.0.0.1:10249", HealthzBindAddress: "0.0.0.0:12345",
ClusterCIDR: "192.168.59.0/24", MetricsBindAddress: "127.0.0.1:10249",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second}, ClusterCIDR: "192.168.59.0/24",
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{ ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
MasqueradeAll: true, IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
SyncPeriod: metav1.Duration{Duration: 5 * time.Second}, MasqueradeAll: true,
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second}, SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
DetectLocalMode: kubeproxyconfig.LocalModeInterfaceNamePrefix,
DetectLocal: kubeproxyconfig.DetectLocalConfiguration{
InterfaceNamePrefix: "vethabcde",
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{ "LocalModeBridgeInterface": {
MaxPerCore: ptr.To[int32](1), config: kubeproxyconfig.KubeProxyConfiguration{
Min: ptr.To[int32](1), BindAddress: "10.10.12.11",
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second}, HealthzBindAddress: "0.0.0.0:12345",
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second}, MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
DetectLocalMode: kubeproxyconfig.LocalModeBridgeInterface,
DetectLocal: kubeproxyconfig.DetectLocalConfiguration{
BridgeInterface: "avz",
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
},
}, },
Logging: logsapi.LoggingConfiguration{ }
Format: "text",
},
}, {
BindAddress: "fd00:192:168:59::103",
HealthzBindAddress: "",
MetricsBindAddress: "[::1]:10249",
ClusterCIDR: "fd00:192:168:59::/64",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
}, {
BindAddress: "10.10.12.11",
HealthzBindAddress: "0.0.0.0:12345",
MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
}, {
BindAddress: "10.10.12.11",
HealthzBindAddress: "0.0.0.0:12345",
MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "fd00:192:168::/64",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
}, {
BindAddress: "10.10.12.11",
HealthzBindAddress: "0.0.0.0:12345",
MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24,fd00:192:168::/64",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
}, {
BindAddress: "10.10.12.11",
HealthzBindAddress: "0.0.0.0:12345",
MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
DetectLocalMode: kubeproxyconfig.LocalModeInterfaceNamePrefix,
DetectLocal: kubeproxyconfig.DetectLocalConfiguration{
InterfaceNamePrefix: "vethabcde",
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
}, {
BindAddress: "10.10.12.11",
HealthzBindAddress: "0.0.0.0:12345",
MetricsBindAddress: "127.0.0.1:10249",
ClusterCIDR: "192.168.59.0/24",
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
IPTables: kubeproxyconfig.KubeProxyIPTablesConfiguration{
MasqueradeAll: true,
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
},
Conntrack: kubeproxyconfig.KubeProxyConntrackConfiguration{
MaxPerCore: ptr.To[int32](1),
Min: ptr.To[int32](1),
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
},
DetectLocalMode: kubeproxyconfig.LocalModeBridgeInterface,
DetectLocal: kubeproxyconfig.DetectLocalConfiguration{
BridgeInterface: "avz",
},
Logging: logsapi.LoggingConfiguration{
Format: "text",
},
}}
for _, successCase := range successCases { for _, successCase := range successCases {
if errs := Validate(&successCase); len(errs) != 0 { if errs := Validate(&successCase.config); len(errs) != 0 {
t.Errorf("expected success: %v", errs) t.Errorf("expected success: %v", errs)
} }
} }
@ -951,14 +982,22 @@ func TestValidateClientConnectionConfiguration(t *testing.T) {
func TestValidateHostPort(t *testing.T) { func TestValidateHostPort(t *testing.T) {
newPath := field.NewPath("KubeProxyConfiguration") newPath := field.NewPath("KubeProxyConfiguration")
successCases := []string{ successCases := map[string]struct {
"0.0.0.0:10256", ip string
"127.0.0.1:10256", }{
"10.10.10.10:10256", "all IPs": {
ip: "0.0.0.0:10256",
},
"localhost": {
ip: "127.0.0.1:10256",
},
"specific IP": {
ip: "10.10.10.10:10256",
},
} }
for _, successCase := range successCases { for _, successCase := range successCases {
if errs := validateHostPort(successCase, newPath.Child("HealthzBindAddress")); len(errs) != 0 { if errs := validateHostPort(successCase.ip, newPath.Child("HealthzBindAddress")); len(errs) != 0 {
t.Errorf("expected success: %v", errs) t.Errorf("expected success: %v", errs)
} }
} }
@ -1005,23 +1044,48 @@ func TestValidateHostPort(t *testing.T) {
func TestValidateKubeProxyNodePortAddress(t *testing.T) { func TestValidateKubeProxyNodePortAddress(t *testing.T) {
newPath := field.NewPath("KubeProxyConfiguration") newPath := field.NewPath("KubeProxyConfiguration")
successCases := []struct { successCases := map[string]struct {
addresses []string addresses []string
}{ }{
{[]string{}}, "no addresses": {
{[]string{"127.0.0.0/8"}}, addresses: []string{},
{[]string{"0.0.0.0/0"}}, },
{[]string{"::/0"}}, "valid 1": {
{[]string{"127.0.0.1/32", "1.2.3.0/24"}}, addresses: []string{"127.0.0.0/8"},
{[]string{"127.0.0.0/8"}}, },
{[]string{"127.0.0.1/32"}}, "valid 2": {
{[]string{"::1/128"}}, addresses: []string{"0.0.0.0/0"},
{[]string{"1.2.3.4/32"}}, },
{[]string{"10.20.30.0/24"}}, "valid 3": {
{[]string{"10.20.0.0/16", "100.200.0.0/16"}}, addresses: []string{"::/0"},
{[]string{"10.0.0.0/8"}}, },
{[]string{"2001:db8::/32"}}, "valid 4": {
{[]string{kubeproxyconfig.NodePortAddressesPrimary}}, addresses: []string{"127.0.0.1/32", "1.2.3.0/24"},
},
"valid 5": {
addresses: []string{"127.0.0.1/32"},
},
"valid 6": {
addresses: []string{"::1/128"},
},
"valid 7": {
addresses: []string{"1.2.3.4/32"},
},
"valid 8": {
addresses: []string{"10.20.30.0/24"},
},
"valid 9": {
addresses: []string{"10.20.0.0/16", "100.200.0.0/16"},
},
"valid 10": {
addresses: []string{"10.0.0.0/8"},
},
"valid 11": {
addresses: []string{"2001:db8::/32"},
},
"primary": {
addresses: []string{kubeproxyconfig.NodePortAddressesPrimary},
},
} }
for _, successCase := range successCases { for _, successCase := range successCases {
@ -1085,22 +1149,45 @@ func TestValidateKubeProxyNodePortAddress(t *testing.T) {
func TestValidateKubeProxyExcludeCIDRs(t *testing.T) { func TestValidateKubeProxyExcludeCIDRs(t *testing.T) {
newPath := field.NewPath("KubeProxyConfiguration") newPath := field.NewPath("KubeProxyConfiguration")
successCases := []struct { successCases := map[string]struct {
addresses []string addresses []string
}{ }{
{[]string{}}, "no cidrs": {
{[]string{"127.0.0.0/8"}}, addresses: []string{},
{[]string{"0.0.0.0/0"}}, },
{[]string{"::/0"}}, "valid 1": {
{[]string{"127.0.0.1/32", "1.2.3.0/24"}}, addresses: []string{"127.0.0.0/8"},
{[]string{"127.0.0.0/8"}}, },
{[]string{"127.0.0.1/32"}}, "valid 2": {
{[]string{"::1/128"}}, addresses: []string{"0.0.0.0/0"},
{[]string{"1.2.3.4/32"}}, },
{[]string{"10.20.30.0/24"}}, "valid 3": {
{[]string{"10.20.0.0/16", "100.200.0.0/16"}}, addresses: []string{"::/0"},
{[]string{"10.0.0.0/8"}}, },
{[]string{"2001:db8::/32"}}, "valid 4": {
addresses: []string{"127.0.0.1/32", "1.2.3.0/24"},
},
"valid 5": {
addresses: []string{"127.0.0.1/32"},
},
"valid 6": {
addresses: []string{"::1/128"},
},
"valid 7": {
addresses: []string{"1.2.3.4/32"},
},
"valid 8": {
addresses: []string{"10.20.30.0/24"},
},
"valid 9": {
addresses: []string{"10.20.0.0/16", "100.200.0.0/16"},
},
"valid 10": {
addresses: []string{"10.0.0.0/8"},
},
"valid 11": {
addresses: []string{"2001:db8::/32"},
},
} }
for _, successCase := range successCases { for _, successCase := range successCases {