Commit 7be223e7 authored by Ashish Ranjan's avatar Ashish Ranjan

Refactor to use k8s.io/utils/net/ package instead of kubernetes/pkg/util/net/sets

parent 0bd35d1b
...@@ -4121,6 +4121,10 @@ ...@@ -4121,6 +4121,10 @@
"Rev": "ed37f7428a91fc2a81070808937195dcd46d320e" "Rev": "ed37f7428a91fc2a81070808937195dcd46d320e"
}, },
{ {
"ImportPath": "k8s.io/utils/net",
"Rev": "ed37f7428a91fc2a81070808937195dcd46d320e"
},
{
"ImportPath": "k8s.io/utils/nsenter", "ImportPath": "k8s.io/utils/nsenter",
"Rev": "ed37f7428a91fc2a81070808937195dcd46d320e" "Rev": "ed37f7428a91fc2a81070808937195dcd46d320e"
}, },
......
...@@ -42,7 +42,8 @@ ...@@ -42,7 +42,8 @@
"k8s.io/utils/exec", "k8s.io/utils/exec",
"k8s.io/utils/integer", "k8s.io/utils/integer",
"k8s.io/utils/path", "k8s.io/utils/path",
"k8s.io/utils/pointer" "k8s.io/utils/pointer",
"k8s.io/utils/net"
] ]
}, },
{ {
...@@ -82,7 +83,6 @@ ...@@ -82,7 +83,6 @@
"k8s.io/kubernetes/pkg/util/initsystem", "k8s.io/kubernetes/pkg/util/initsystem",
"k8s.io/kubernetes/pkg/util/ipvs", "k8s.io/kubernetes/pkg/util/ipvs",
"k8s.io/kubernetes/pkg/util/metrics", "k8s.io/kubernetes/pkg/util/metrics",
"k8s.io/kubernetes/pkg/util/net/sets",
"k8s.io/kubernetes/pkg/util/node", "k8s.io/kubernetes/pkg/util/node",
"k8s.io/kubernetes/pkg/util/normalizer", "k8s.io/kubernetes/pkg/util/normalizer",
"k8s.io/kubernetes/pkg/util/parsers", "k8s.io/kubernetes/pkg/util/parsers",
......
...@@ -12,7 +12,7 @@ go_library( ...@@ -12,7 +12,7 @@ go_library(
importpath = "k8s.io/kubernetes/pkg/api/service", importpath = "k8s.io/kubernetes/pkg/api/service",
deps = [ deps = [
"//pkg/apis/core:go_default_library", "//pkg/apis/core:go_default_library",
"//pkg/util/net/sets:go_default_library", "//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
...@@ -22,7 +22,7 @@ go_test( ...@@ -22,7 +22,7 @@ go_test(
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//pkg/apis/core:go_default_library", "//pkg/apis/core:go_default_library",
"//pkg/util/net/sets:go_default_library", "//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -18,17 +18,18 @@ package service ...@@ -18,17 +18,18 @@ package service
import ( import (
"fmt" "fmt"
api "k8s.io/kubernetes/pkg/apis/core"
netsets "k8s.io/kubernetes/pkg/util/net/sets"
"strings" "strings"
api "k8s.io/kubernetes/pkg/apis/core"
utilnet "k8s.io/utils/net"
) )
const ( const (
defaultLoadBalancerSourceRanges = "0.0.0.0/0" defaultLoadBalancerSourceRanges = "0.0.0.0/0"
) )
// IsAllowAll checks whether the netsets.IPNet allows traffic from 0.0.0.0/0 // IsAllowAll checks whether the utilnet.IPNet allows traffic from 0.0.0.0/0
func IsAllowAll(ipnets netsets.IPNet) bool { func IsAllowAll(ipnets utilnet.IPNetSet) bool {
for _, s := range ipnets.StringSlice() { for _, s := range ipnets.StringSlice() {
if s == "0.0.0.0/0" { if s == "0.0.0.0/0" {
return true return true
...@@ -40,13 +41,13 @@ func IsAllowAll(ipnets netsets.IPNet) bool { ...@@ -40,13 +41,13 @@ func IsAllowAll(ipnets netsets.IPNet) bool {
// GetLoadBalancerSourceRanges first try to parse and verify LoadBalancerSourceRanges field from a service. // GetLoadBalancerSourceRanges first try to parse and verify LoadBalancerSourceRanges field from a service.
// If the field is not specified, turn to parse and verify the AnnotationLoadBalancerSourceRangesKey annotation from a service, // If the field is not specified, turn to parse and verify the AnnotationLoadBalancerSourceRangesKey annotation from a service,
// extracting the source ranges to allow, and if not present returns a default (allow-all) value. // extracting the source ranges to allow, and if not present returns a default (allow-all) value.
func GetLoadBalancerSourceRanges(service *api.Service) (netsets.IPNet, error) { func GetLoadBalancerSourceRanges(service *api.Service) (utilnet.IPNetSet, error) {
var ipnets netsets.IPNet var ipnets utilnet.IPNetSet
var err error var err error
// if SourceRange field is specified, ignore sourceRange annotation // if SourceRange field is specified, ignore sourceRange annotation
if len(service.Spec.LoadBalancerSourceRanges) > 0 { if len(service.Spec.LoadBalancerSourceRanges) > 0 {
specs := service.Spec.LoadBalancerSourceRanges specs := service.Spec.LoadBalancerSourceRanges
ipnets, err = netsets.ParseIPNets(specs...) ipnets, err = utilnet.ParseIPNets(specs...)
if err != nil { if err != nil {
return nil, fmt.Errorf("service.Spec.LoadBalancerSourceRanges: %v is not valid. Expecting a list of IP ranges. For example, 10.0.0.0/24. Error msg: %v", specs, err) return nil, fmt.Errorf("service.Spec.LoadBalancerSourceRanges: %v is not valid. Expecting a list of IP ranges. For example, 10.0.0.0/24. Error msg: %v", specs, err)
...@@ -58,7 +59,7 @@ func GetLoadBalancerSourceRanges(service *api.Service) (netsets.IPNet, error) { ...@@ -58,7 +59,7 @@ func GetLoadBalancerSourceRanges(service *api.Service) (netsets.IPNet, error) {
val = defaultLoadBalancerSourceRanges val = defaultLoadBalancerSourceRanges
} }
specs := strings.Split(val, ",") specs := strings.Split(val, ",")
ipnets, err = netsets.ParseIPNets(specs...) ipnets, err = utilnet.ParseIPNets(specs...)
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %s is not valid. Expecting a comma-separated list of source IP ranges. For example, 10.0.0.0/24,192.168.2.0/24", api.AnnotationLoadBalancerSourceRangesKey, val) return nil, fmt.Errorf("%s: %s is not valid. Expecting a comma-separated list of source IP ranges. For example, 10.0.0.0/24,192.168.2.0/24", api.AnnotationLoadBalancerSourceRangesKey, val)
} }
......
...@@ -21,7 +21,7 @@ import ( ...@@ -21,7 +21,7 @@ import (
"testing" "testing"
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
netsets "k8s.io/kubernetes/pkg/util/net/sets" utilnet "k8s.io/utils/net"
) )
func TestGetLoadBalancerSourceRanges(t *testing.T) { func TestGetLoadBalancerSourceRanges(t *testing.T) {
...@@ -48,7 +48,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { ...@@ -48,7 +48,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) {
checkError("10.0.0.1/32, ") checkError("10.0.0.1/32, ")
checkError("10.0.0.1") checkError("10.0.0.1")
checkOK := func(v string) netsets.IPNet { checkOK := func(v string) utilnet.IPNetSet {
annotations := make(map[string]string) annotations := make(map[string]string)
annotations[api.AnnotationLoadBalancerSourceRangesKey] = v annotations[api.AnnotationLoadBalancerSourceRangesKey] = v
svc := api.Service{} svc := api.Service{}
...@@ -112,7 +112,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { ...@@ -112,7 +112,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) {
func TestAllowAll(t *testing.T) { func TestAllowAll(t *testing.T) {
checkAllowAll := func(allowAll bool, cidrs ...string) { checkAllowAll := func(allowAll bool, cidrs ...string) {
ipnets, err := netsets.ParseIPNets(cidrs...) ipnets, err := utilnet.ParseIPNets(cidrs...)
if err != nil { if err != nil {
t.Errorf("Unexpected error parsing cidrs: %v", cidrs) t.Errorf("Unexpected error parsing cidrs: %v", cidrs)
} }
......
...@@ -11,8 +11,8 @@ go_library( ...@@ -11,8 +11,8 @@ go_library(
srcs = ["util.go"], srcs = ["util.go"],
importpath = "k8s.io/kubernetes/pkg/api/v1/service", importpath = "k8s.io/kubernetes/pkg/api/v1/service",
deps = [ deps = [
"//pkg/util/net/sets:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
...@@ -21,8 +21,8 @@ go_test( ...@@ -21,8 +21,8 @@ go_test(
srcs = ["util_test.go"], srcs = ["util_test.go"],
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//pkg/util/net/sets:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -21,15 +21,15 @@ import ( ...@@ -21,15 +21,15 @@ import (
"strings" "strings"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
netsets "k8s.io/kubernetes/pkg/util/net/sets" utilnet "k8s.io/utils/net"
) )
const ( const (
defaultLoadBalancerSourceRanges = "0.0.0.0/0" defaultLoadBalancerSourceRanges = "0.0.0.0/0"
) )
// IsAllowAll checks whether the netsets.IPNet allows traffic from 0.0.0.0/0 // IsAllowAll checks whether the utilnet.IPNet allows traffic from 0.0.0.0/0
func IsAllowAll(ipnets netsets.IPNet) bool { func IsAllowAll(ipnets utilnet.IPNetSet) bool {
for _, s := range ipnets.StringSlice() { for _, s := range ipnets.StringSlice() {
if s == "0.0.0.0/0" { if s == "0.0.0.0/0" {
return true return true
...@@ -41,13 +41,13 @@ func IsAllowAll(ipnets netsets.IPNet) bool { ...@@ -41,13 +41,13 @@ func IsAllowAll(ipnets netsets.IPNet) bool {
// GetLoadBalancerSourceRanges first try to parse and verify LoadBalancerSourceRanges field from a service. // GetLoadBalancerSourceRanges first try to parse and verify LoadBalancerSourceRanges field from a service.
// If the field is not specified, turn to parse and verify the AnnotationLoadBalancerSourceRangesKey annotation from a service, // If the field is not specified, turn to parse and verify the AnnotationLoadBalancerSourceRangesKey annotation from a service,
// extracting the source ranges to allow, and if not present returns a default (allow-all) value. // extracting the source ranges to allow, and if not present returns a default (allow-all) value.
func GetLoadBalancerSourceRanges(service *v1.Service) (netsets.IPNet, error) { func GetLoadBalancerSourceRanges(service *v1.Service) (utilnet.IPNetSet, error) {
var ipnets netsets.IPNet var ipnets utilnet.IPNetSet
var err error var err error
// if SourceRange field is specified, ignore sourceRange annotation // if SourceRange field is specified, ignore sourceRange annotation
if len(service.Spec.LoadBalancerSourceRanges) > 0 { if len(service.Spec.LoadBalancerSourceRanges) > 0 {
specs := service.Spec.LoadBalancerSourceRanges specs := service.Spec.LoadBalancerSourceRanges
ipnets, err = netsets.ParseIPNets(specs...) ipnets, err = utilnet.ParseIPNets(specs...)
if err != nil { if err != nil {
return nil, fmt.Errorf("service.Spec.LoadBalancerSourceRanges: %v is not valid. Expecting a list of IP ranges. For example, 10.0.0.0/24. Error msg: %v", specs, err) return nil, fmt.Errorf("service.Spec.LoadBalancerSourceRanges: %v is not valid. Expecting a list of IP ranges. For example, 10.0.0.0/24. Error msg: %v", specs, err)
...@@ -59,7 +59,7 @@ func GetLoadBalancerSourceRanges(service *v1.Service) (netsets.IPNet, error) { ...@@ -59,7 +59,7 @@ func GetLoadBalancerSourceRanges(service *v1.Service) (netsets.IPNet, error) {
val = defaultLoadBalancerSourceRanges val = defaultLoadBalancerSourceRanges
} }
specs := strings.Split(val, ",") specs := strings.Split(val, ",")
ipnets, err = netsets.ParseIPNets(specs...) ipnets, err = utilnet.ParseIPNets(specs...)
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %s is not valid. Expecting a comma-separated list of source IP ranges. For example, 10.0.0.0/24,192.168.2.0/24", v1.AnnotationLoadBalancerSourceRangesKey, val) return nil, fmt.Errorf("%s: %s is not valid. Expecting a comma-separated list of source IP ranges. For example, 10.0.0.0/24,192.168.2.0/24", v1.AnnotationLoadBalancerSourceRangesKey, val)
} }
......
...@@ -21,7 +21,7 @@ import ( ...@@ -21,7 +21,7 @@ import (
"testing" "testing"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
netsets "k8s.io/kubernetes/pkg/util/net/sets" utilnet "k8s.io/utils/net"
) )
func TestGetLoadBalancerSourceRanges(t *testing.T) { func TestGetLoadBalancerSourceRanges(t *testing.T) {
...@@ -48,7 +48,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { ...@@ -48,7 +48,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) {
checkError("10.0.0.1/32, ") checkError("10.0.0.1/32, ")
checkError("10.0.0.1") checkError("10.0.0.1")
checkOK := func(v string) netsets.IPNet { checkOK := func(v string) utilnet.IPNetSet {
annotations := make(map[string]string) annotations := make(map[string]string)
annotations[v1.AnnotationLoadBalancerSourceRangesKey] = v annotations[v1.AnnotationLoadBalancerSourceRangesKey] = v
svc := v1.Service{} svc := v1.Service{}
...@@ -112,7 +112,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { ...@@ -112,7 +112,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) {
func TestAllowAll(t *testing.T) { func TestAllowAll(t *testing.T) {
checkAllowAll := func(allowAll bool, cidrs ...string) { checkAllowAll := func(allowAll bool, cidrs ...string) {
ipnets, err := netsets.ParseIPNets(cidrs...) ipnets, err := utilnet.ParseIPNets(cidrs...)
if err != nil { if err != nil {
t.Errorf("Unexpected error parsing cidrs: %v", cidrs) t.Errorf("Unexpected error parsing cidrs: %v", cidrs)
} }
......
{ {
"Rules": [ "Rules": [
{ {
"SelectorRegexp": "k8s[.]io/kubernetes", "SelectorRegexp": "k8s[.]io/utils",
"AllowedPrefixes": [ "AllowedPrefixes": [
"k8s.io/kubernetes/pkg/api/legacyscheme", "k8s.io/utils/net",
"k8s.io/kubernetes/pkg/api/service", "k8s.io/utils/nsenter",
"k8s.io/kubernetes/pkg/api/v1/service", "k8s.io/utils/io",
"k8s.io/kubernetes/pkg/apis/core", "k8s.io/utils/strings",
"k8s.io/kubernetes/pkg/cloudprovider", "k8s.io/utils/exec",
"k8s.io/kubernetes/pkg/credentialprovider", "k8s.io/utils/path"
"k8s.io/kubernetes/pkg/features", ]
"k8s.io/kubernetes/pkg/kubelet/apis", },
"k8s.io/kubernetes/pkg/master/ports", {
"k8s.io/kubernetes/pkg/util/mount", "SelectorRegexp": "k8s[.]io/kubernetes",
"k8s.io/kubernetes/pkg/util/net/sets", "AllowedPrefixes": [
"k8s.io/kubernetes/pkg/util/resizefs", "k8s.io/kubernetes/pkg/api/legacyscheme",
"k8s.io/kubernetes/pkg/version", "k8s.io/kubernetes/pkg/api/service",
"k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/api/v1/service",
], "k8s.io/kubernetes/pkg/apis/core",
"ForbiddenPrefixes": [ "k8s.io/kubernetes/pkg/cloudprovider",
] "k8s.io/kubernetes/pkg/credentialprovider",
} "k8s.io/kubernetes/pkg/features",
"k8s.io/kubernetes/pkg/kubelet/apis",
"k8s.io/kubernetes/pkg/master/ports",
"k8s.io/kubernetes/pkg/util/mount",
"k8s.io/kubernetes/pkg/util/resizefs",
"k8s.io/kubernetes/pkg/version",
"k8s.io/kubernetes/pkg/volume"
],
"ForbiddenPrefixes": []
}
] ]
} }
\ No newline at end of file
...@@ -48,7 +48,6 @@ go_library( ...@@ -48,7 +48,6 @@ go_library(
deps = [ deps = [
"//pkg/api/v1/service:go_default_library", "//pkg/api/v1/service:go_default_library",
"//pkg/kubelet/apis:go_default_library", "//pkg/kubelet/apis:go_default_library",
"//pkg/util/net/sets:go_default_library",
"//pkg/volume:go_default_library", "//pkg/volume:go_default_library",
"//pkg/volume/util:go_default_library", "//pkg/volume/util:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
...@@ -89,6 +88,7 @@ go_library( ...@@ -89,6 +88,7 @@ go_library(
"//vendor/google.golang.org/api/tpu/v1:go_default_library", "//vendor/google.golang.org/api/tpu/v1:go_default_library",
"//vendor/gopkg.in/gcfg.v1:go_default_library", "//vendor/gopkg.in/gcfg.v1:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
...@@ -111,7 +111,6 @@ go_test( ...@@ -111,7 +111,6 @@ go_test(
deps = [ deps = [
"//pkg/api/v1/service:go_default_library", "//pkg/api/v1/service:go_default_library",
"//pkg/kubelet/apis:go_default_library", "//pkg/kubelet/apis:go_default_library",
"//pkg/util/net/sets:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
...@@ -128,6 +127,7 @@ go_test( ...@@ -128,6 +127,7 @@ go_test(
"//vendor/google.golang.org/api/compute/v0.beta:go_default_library", "//vendor/google.golang.org/api/compute/v0.beta:go_default_library",
"//vendor/google.golang.org/api/compute/v1:go_default_library", "//vendor/google.golang.org/api/compute/v1:go_default_library",
"//vendor/google.golang.org/api/googleapi:go_default_library", "//vendor/google.golang.org/api/googleapi:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -24,16 +24,16 @@ import ( ...@@ -24,16 +24,16 @@ import (
"sort" "sort"
"strings" "strings"
"k8s.io/api/core/v1"
"k8s.io/klog" "k8s.io/klog"
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud"
"k8s.io/api/core/v1"
cloudprovider "k8s.io/cloud-provider" cloudprovider "k8s.io/cloud-provider"
netsets "k8s.io/kubernetes/pkg/util/net/sets" utilnet "k8s.io/utils/net"
) )
type cidrs struct { type cidrs struct {
ipn netsets.IPNet ipn utilnet.IPNetSet
isSet bool isSet bool
} }
...@@ -44,7 +44,7 @@ var ( ...@@ -44,7 +44,7 @@ var (
func init() { func init() {
var err error var err error
// LB L7 proxies and all L3/4/7 health checkers have client addresses within these known CIDRs. // LB L7 proxies and all L3/4/7 health checkers have client addresses within these known CIDRs.
lbSrcRngsFlag.ipn, err = netsets.ParseIPNets([]string{"130.211.0.0/22", "35.191.0.0/16", "209.85.152.0/22", "209.85.204.0/22"}...) lbSrcRngsFlag.ipn, err = utilnet.ParseIPNets([]string{"130.211.0.0/22", "35.191.0.0/16", "209.85.152.0/22", "209.85.204.0/22"}...)
if err != nil { if err != nil {
panic("Incorrect default GCE L7 source ranges") panic("Incorrect default GCE L7 source ranges")
} }
...@@ -64,7 +64,7 @@ func (c *cidrs) Set(value string) error { ...@@ -64,7 +64,7 @@ func (c *cidrs) Set(value string) error {
// On first Set(), clear the original defaults // On first Set(), clear the original defaults
if !c.isSet { if !c.isSet {
c.isSet = true c.isSet = true
c.ipn = make(netsets.IPNet) c.ipn = make(utilnet.IPNetSet)
} else { } else {
return fmt.Errorf("GCE LB CIDRs have already been set") return fmt.Errorf("GCE LB CIDRs have already been set")
} }
......
...@@ -29,7 +29,7 @@ import ( ...@@ -29,7 +29,7 @@ import (
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
apiservice "k8s.io/kubernetes/pkg/api/v1/service" apiservice "k8s.io/kubernetes/pkg/api/v1/service"
netsets "k8s.io/kubernetes/pkg/util/net/sets" utilnet "k8s.io/utils/net"
computealpha "google.golang.org/api/compute/v0.alpha" computealpha "google.golang.org/api/compute/v0.alpha"
compute "google.golang.org/api/compute/v1" compute "google.golang.org/api/compute/v1"
...@@ -819,7 +819,7 @@ func translateAffinityType(affinityType v1.ServiceAffinity) string { ...@@ -819,7 +819,7 @@ func translateAffinityType(affinityType v1.ServiceAffinity) string {
} }
} }
func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, ports []v1.ServicePort, sourceRanges netsets.IPNet) (exists bool, needsUpdate bool, err error) { func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, ports []v1.ServicePort, sourceRanges utilnet.IPNetSet) (exists bool, needsUpdate bool, err error) {
fw, err := g.GetFirewall(MakeFirewallName(name)) fw, err := g.GetFirewall(MakeFirewallName(name))
if err != nil { if err != nil {
if isHTTPErrorCode(err, http.StatusNotFound) { if isHTTPErrorCode(err, http.StatusNotFound) {
...@@ -843,7 +843,7 @@ func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, ...@@ -843,7 +843,7 @@ func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string,
} }
// The service controller already verified that the protocol matches on all ports, no need to check. // The service controller already verified that the protocol matches on all ports, no need to check.
actualSourceRanges, err := netsets.ParseIPNets(fw.SourceRanges...) actualSourceRanges, err := utilnet.ParseIPNets(fw.SourceRanges...)
if err != nil { if err != nil {
// This really shouldn't happen... GCE has returned something unexpected // This really shouldn't happen... GCE has returned something unexpected
klog.Warningf("Error parsing firewall SourceRanges: %v", fw.SourceRanges) klog.Warningf("Error parsing firewall SourceRanges: %v", fw.SourceRanges)
...@@ -934,7 +934,7 @@ func createForwardingRule(s CloudForwardingRuleService, name, serviceName, regio ...@@ -934,7 +934,7 @@ func createForwardingRule(s CloudForwardingRuleService, name, serviceName, regio
return nil return nil
} }
func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourceRanges netsets.IPNet, ports []v1.ServicePort, hosts []*gceInstance) error { func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error {
firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts) firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts)
if err != nil { if err != nil {
return err return err
...@@ -952,7 +952,7 @@ func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourc ...@@ -952,7 +952,7 @@ func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourc
return nil return nil
} }
func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourceRanges netsets.IPNet, ports []v1.ServicePort, hosts []*gceInstance) error { func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error {
firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts) firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts)
if err != nil { if err != nil {
return err return err
...@@ -971,7 +971,7 @@ func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourc ...@@ -971,7 +971,7 @@ func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourc
return nil return nil
} }
func (g *Cloud) firewallObject(name, region, desc string, sourceRanges netsets.IPNet, ports []v1.ServicePort, hosts []*gceInstance) (*compute.Firewall, error) { func (g *Cloud) firewallObject(name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) (*compute.Firewall, error) {
allowedPorts := make([]string, len(ports)) allowedPorts := make([]string, len(ports))
for ix := range ports { for ix := range ports {
allowedPorts[ix] = strconv.Itoa(int(ports[ix].Port)) allowedPorts[ix] = strconv.Itoa(int(ports[ix].Port))
......
...@@ -34,7 +34,7 @@ import ( ...@@ -34,7 +34,7 @@ import (
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
netsets "k8s.io/kubernetes/pkg/util/net/sets" utilnet "k8s.io/utils/net"
) )
func TestEnsureStaticIP(t *testing.T) { func TestEnsureStaticIP(t *testing.T) {
...@@ -620,10 +620,10 @@ func TestFirewallNeedsUpdate(t *testing.T) { ...@@ -620,10 +620,10 @@ func TestFirewallNeedsUpdate(t *testing.T) {
ipAddr := status.Ingress[0].IP ipAddr := status.Ingress[0].IP
lbName := gce.GetLoadBalancerName(context.TODO(), "", svc) lbName := gce.GetLoadBalancerName(context.TODO(), "", svc)
ipnet, err := netsets.ParseIPNets("0.0.0.0/0") ipnet, err := utilnet.ParseIPNets("0.0.0.0/0")
require.NoError(t, err) require.NoError(t, err)
wrongIpnet, err := netsets.ParseIPNets("1.0.0.0/10") wrongIpnet, err := utilnet.ParseIPNets("1.0.0.0/10")
require.NoError(t, err) require.NoError(t, err)
fw, err := gce.GetFirewall(MakeFirewallName(lbName)) fw, err := gce.GetFirewall(MakeFirewallName(lbName))
...@@ -633,7 +633,7 @@ func TestFirewallNeedsUpdate(t *testing.T) { ...@@ -633,7 +633,7 @@ func TestFirewallNeedsUpdate(t *testing.T) {
lbName string lbName string
ipAddr string ipAddr string
ports []v1.ServicePort ports []v1.ServicePort
ipnet netsets.IPNet ipnet utilnet.IPNetSet
fwIPProtocol string fwIPProtocol string
getHook func(context.Context, *meta.Key, *cloud.MockFirewalls) (bool, *ga.Firewall, error) getHook func(context.Context, *meta.Key, *cloud.MockFirewalls) (bool, *ga.Firewall, error)
sourceRange string sourceRange string
...@@ -864,7 +864,7 @@ func TestCreateAndUpdateFirewallSucceedsOnXPN(t *testing.T) { ...@@ -864,7 +864,7 @@ func TestCreateAndUpdateFirewallSucceedsOnXPN(t *testing.T) {
hostNames := nodeNames(nodes) hostNames := nodeNames(nodes)
hosts, err := gce.getInstancesByNames(hostNames) hosts, err := gce.getInstancesByNames(hostNames)
require.NoError(t, err) require.NoError(t, err)
ipnet, err := netsets.ParseIPNets("10.0.0.0/20") ipnet, err := utilnet.ParseIPNets("10.0.0.0/20")
require.NoError(t, err) require.NoError(t, err)
gce.createFirewall( gce.createFirewall(
svc, svc,
......
...@@ -307,7 +307,6 @@ ...@@ -307,7 +307,6 @@
"k8s.io/kubernetes/pkg/scheduler/api", "k8s.io/kubernetes/pkg/scheduler/api",
"k8s.io/kubernetes/pkg/scheduler/util", "k8s.io/kubernetes/pkg/scheduler/util",
"k8s.io/kubernetes/pkg/security/apparmor", "k8s.io/kubernetes/pkg/security/apparmor",
"k8s.io/kubernetes/pkg/util/net/sets",
"k8s.io/kubernetes/pkg/util/parsers", "k8s.io/kubernetes/pkg/util/parsers",
"k8s.io/kubernetes/pkg/fieldpath", "k8s.io/kubernetes/pkg/fieldpath",
"k8s.io/kubernetes/pkg/scheduler/volumebinder", "k8s.io/kubernetes/pkg/scheduler/volumebinder",
...@@ -342,7 +341,8 @@ ...@@ -342,7 +341,8 @@
"k8s.io/utils/path", "k8s.io/utils/path",
"k8s.io/utils/pointer", "k8s.io/utils/pointer",
"k8s.io/utils/exec", "k8s.io/utils/exec",
"k8s.io/utils/strings" "k8s.io/utils/strings",
"k8s.io/utils/net"
] ]
}, },
{ {
......
...@@ -132,7 +132,6 @@ ...@@ -132,7 +132,6 @@
"k8s.io/kubernetes/pkg/util/labels", "k8s.io/kubernetes/pkg/util/labels",
"k8s.io/kubernetes/pkg/util/metrics", "k8s.io/kubernetes/pkg/util/metrics",
"k8s.io/kubernetes/pkg/util/mount", "k8s.io/kubernetes/pkg/util/mount",
"k8s.io/kubernetes/pkg/util/net/sets",
"k8s.io/kubernetes/pkg/util/node", "k8s.io/kubernetes/pkg/util/node",
"k8s.io/kubernetes/pkg/util/parsers", "k8s.io/kubernetes/pkg/util/parsers",
"k8s.io/kubernetes/pkg/util/slice", "k8s.io/kubernetes/pkg/util/slice",
...@@ -144,7 +143,8 @@ ...@@ -144,7 +143,8 @@
"k8s.io/utils/nsenter", "k8s.io/utils/nsenter",
"k8s.io/utils/io", "k8s.io/utils/io",
"k8s.io/utils/path", "k8s.io/utils/path",
"k8s.io/utils/pointer" "k8s.io/utils/pointer",
"k8s.io/utils/net"
], ],
"ForbiddenPrefixes": [] "ForbiddenPrefixes": []
}] }]
......
...@@ -19,12 +19,12 @@ go_library( ...@@ -19,12 +19,12 @@ go_library(
"//pkg/proxy/iptables:go_default_library", "//pkg/proxy/iptables:go_default_library",
"//pkg/util/conntrack:go_default_library", "//pkg/util/conntrack:go_default_library",
"//pkg/util/iptables:go_default_library", "//pkg/util/iptables:go_default_library",
"//pkg/util/net:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -31,8 +31,8 @@ import ( ...@@ -31,8 +31,8 @@ import (
iptablesproxy "k8s.io/kubernetes/pkg/proxy/iptables" iptablesproxy "k8s.io/kubernetes/pkg/proxy/iptables"
"k8s.io/kubernetes/pkg/util/conntrack" "k8s.io/kubernetes/pkg/util/conntrack"
utiliptables "k8s.io/kubernetes/pkg/util/iptables" utiliptables "k8s.io/kubernetes/pkg/util/iptables"
utilnet "k8s.io/kubernetes/pkg/util/net"
"k8s.io/utils/exec" "k8s.io/utils/exec"
utilnet "k8s.io/utils/net"
) )
// HostPortManager is an interface for adding and removing hostport for a given pod sandbox. // HostPortManager is an interface for adding and removing hostport for a given pod sandbox.
......
...@@ -18,12 +18,12 @@ go_library( ...@@ -18,12 +18,12 @@ go_library(
deps = [ deps = [
"//pkg/api/v1/service:go_default_library", "//pkg/api/v1/service:go_default_library",
"//pkg/proxy/util:go_default_library", "//pkg/proxy/util:go_default_library",
"//pkg/util/net:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -29,7 +29,7 @@ import ( ...@@ -29,7 +29,7 @@ import (
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
utilproxy "k8s.io/kubernetes/pkg/proxy/util" utilproxy "k8s.io/kubernetes/pkg/proxy/util"
utilnet "k8s.io/kubernetes/pkg/util/net" utilnet "k8s.io/utils/net"
) )
// BaseEndpointInfo contains base information that defines an endpoint. // BaseEndpointInfo contains base information that defines an endpoint.
......
...@@ -18,7 +18,6 @@ go_library( ...@@ -18,7 +18,6 @@ go_library(
"//pkg/util/async:go_default_library", "//pkg/util/async:go_default_library",
"//pkg/util/conntrack:go_default_library", "//pkg/util/conntrack:go_default_library",
"//pkg/util/iptables:go_default_library", "//pkg/util/iptables:go_default_library",
"//pkg/util/net:go_default_library",
"//pkg/util/sysctl:go_default_library", "//pkg/util/sysctl:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
...@@ -27,6 +26,7 @@ go_library( ...@@ -27,6 +26,7 @@ go_library(
"//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -46,9 +46,9 @@ import ( ...@@ -46,9 +46,9 @@ import (
"k8s.io/kubernetes/pkg/util/async" "k8s.io/kubernetes/pkg/util/async"
"k8s.io/kubernetes/pkg/util/conntrack" "k8s.io/kubernetes/pkg/util/conntrack"
utiliptables "k8s.io/kubernetes/pkg/util/iptables" utiliptables "k8s.io/kubernetes/pkg/util/iptables"
utilnet "k8s.io/kubernetes/pkg/util/net"
utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl"
utilexec "k8s.io/utils/exec" utilexec "k8s.io/utils/exec"
utilnet "k8s.io/utils/net"
) )
const ( const (
...@@ -317,7 +317,7 @@ func NewProxier(ipt utiliptables.Interface, ...@@ -317,7 +317,7 @@ func NewProxier(ipt utiliptables.Interface,
if len(clusterCIDR) == 0 { if len(clusterCIDR) == 0 {
klog.Warning("clusterCIDR not specified, unable to distinguish between internal and external traffic") klog.Warning("clusterCIDR not specified, unable to distinguish between internal and external traffic")
} else if utilnet.IsIPv6CIDR(clusterCIDR) != ipt.IsIpv6() { } else if utilnet.IsIPv6CIDRString(clusterCIDR) != ipt.IsIpv6() {
return nil, fmt.Errorf("clusterCIDR %s has incorrect IP version: expect isIPv6=%t", clusterCIDR, ipt.IsIpv6()) return nil, fmt.Errorf("clusterCIDR %s has incorrect IP version: expect isIPv6=%t", clusterCIDR, ipt.IsIpv6())
} }
......
...@@ -55,7 +55,6 @@ go_library( ...@@ -55,7 +55,6 @@ go_library(
"//pkg/util/ipset:go_default_library", "//pkg/util/ipset:go_default_library",
"//pkg/util/iptables:go_default_library", "//pkg/util/iptables:go_default_library",
"//pkg/util/ipvs:go_default_library", "//pkg/util/ipvs:go_default_library",
"//pkg/util/net:go_default_library",
"//pkg/util/sysctl:go_default_library", "//pkg/util/sysctl:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
...@@ -65,6 +64,7 @@ go_library( ...@@ -65,6 +64,7 @@ go_library(
"//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
] + select({ ] + select({
"@io_bazel_rules_go//go/platform:linux": [ "@io_bazel_rules_go//go/platform:linux": [
"//vendor/github.com/vishvananda/netlink:go_default_library", "//vendor/github.com/vishvananda/netlink:go_default_library",
......
...@@ -44,9 +44,9 @@ import ( ...@@ -44,9 +44,9 @@ import (
utilipset "k8s.io/kubernetes/pkg/util/ipset" utilipset "k8s.io/kubernetes/pkg/util/ipset"
utiliptables "k8s.io/kubernetes/pkg/util/iptables" utiliptables "k8s.io/kubernetes/pkg/util/iptables"
utilipvs "k8s.io/kubernetes/pkg/util/ipvs" utilipvs "k8s.io/kubernetes/pkg/util/ipvs"
utilnet "k8s.io/kubernetes/pkg/util/net"
utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl"
utilexec "k8s.io/utils/exec" utilexec "k8s.io/utils/exec"
utilnet "k8s.io/utils/net"
) )
const ( const (
...@@ -373,7 +373,7 @@ func NewProxier(ipt utiliptables.Interface, ...@@ -373,7 +373,7 @@ func NewProxier(ipt utiliptables.Interface,
if len(clusterCIDR) == 0 { if len(clusterCIDR) == 0 {
klog.Warningf("clusterCIDR not specified, unable to distinguish between internal and external traffic") klog.Warningf("clusterCIDR not specified, unable to distinguish between internal and external traffic")
} else if utilnet.IsIPv6CIDR(clusterCIDR) != isIPv6 { } else if utilnet.IsIPv6CIDRString(clusterCIDR) != isIPv6 {
return nil, fmt.Errorf("clusterCIDR %s has incorrect IP version: expect isIPv6=%t", clusterCIDR, isIPv6) return nil, fmt.Errorf("clusterCIDR %s has incorrect IP version: expect isIPv6=%t", clusterCIDR, isIPv6)
} }
......
...@@ -31,7 +31,7 @@ import ( ...@@ -31,7 +31,7 @@ import (
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
apiservice "k8s.io/kubernetes/pkg/api/v1/service" apiservice "k8s.io/kubernetes/pkg/api/v1/service"
utilproxy "k8s.io/kubernetes/pkg/proxy/util" utilproxy "k8s.io/kubernetes/pkg/proxy/util"
utilnet "k8s.io/kubernetes/pkg/util/net" utilnet "k8s.io/utils/net"
) )
// BaseServiceInfo contains base information that defines a service. // BaseServiceInfo contains base information that defines a service.
...@@ -111,11 +111,11 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic ...@@ -111,11 +111,11 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic
// If ExternalIPs and LoadBalancerSourceRanges on service contains incorrect IP versions, // If ExternalIPs and LoadBalancerSourceRanges on service contains incorrect IP versions,
// only filter out the incorrect ones. // only filter out the incorrect ones.
var incorrectIPs []string var incorrectIPs []string
info.ExternalIPs, incorrectIPs = utilnet.FilterIncorrectIPVersion(service.Spec.ExternalIPs, *sct.isIPv6Mode) info.ExternalIPs, incorrectIPs = utilproxy.FilterIncorrectIPVersion(service.Spec.ExternalIPs, *sct.isIPv6Mode)
if len(incorrectIPs) > 0 { if len(incorrectIPs) > 0 {
utilproxy.LogAndEmitIncorrectIPVersionEvent(sct.recorder, "externalIPs", strings.Join(incorrectIPs, ","), service.Namespace, service.Name, service.UID) utilproxy.LogAndEmitIncorrectIPVersionEvent(sct.recorder, "externalIPs", strings.Join(incorrectIPs, ","), service.Namespace, service.Name, service.UID)
} }
info.LoadBalancerSourceRanges, incorrectIPs = utilnet.FilterIncorrectCIDRVersion(service.Spec.LoadBalancerSourceRanges, *sct.isIPv6Mode) info.LoadBalancerSourceRanges, incorrectIPs = utilproxy.FilterIncorrectCIDRVersion(service.Spec.LoadBalancerSourceRanges, *sct.isIPv6Mode)
if len(incorrectIPs) > 0 { if len(incorrectIPs) > 0 {
utilproxy.LogAndEmitIncorrectIPVersionEvent(sct.recorder, "loadBalancerSourceRanges", strings.Join(incorrectIPs, ","), service.Namespace, service.Name, service.UID) utilproxy.LogAndEmitIncorrectIPVersionEvent(sct.recorder, "loadBalancerSourceRanges", strings.Join(incorrectIPs, ","), service.Namespace, service.Name, service.UID)
} }
......
...@@ -12,12 +12,12 @@ go_library( ...@@ -12,12 +12,12 @@ go_library(
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//pkg/apis/core/v1/helper:go_default_library", "//pkg/apis/core/v1/helper:go_default_library",
"//pkg/util/net:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -27,7 +27,7 @@ import ( ...@@ -27,7 +27,7 @@ import (
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
utilnet "k8s.io/kubernetes/pkg/util/net" utilnet "k8s.io/utils/net"
"k8s.io/klog" "k8s.io/klog"
) )
...@@ -192,3 +192,25 @@ func LogAndEmitIncorrectIPVersionEvent(recorder record.EventRecorder, fieldName, ...@@ -192,3 +192,25 @@ func LogAndEmitIncorrectIPVersionEvent(recorder record.EventRecorder, fieldName,
}, v1.EventTypeWarning, "KubeProxyIncorrectIPVersion", errMsg) }, v1.EventTypeWarning, "KubeProxyIncorrectIPVersion", errMsg)
} }
} }
// FilterIncorrectIPVersion filters out the incorrect IP version case from a slice of IP strings.
func FilterIncorrectIPVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) {
return filterWithCondition(ipStrings, isIPv6Mode, utilnet.IsIPv6String)
}
// FilterIncorrectCIDRVersion filters out the incorrect IP version case from a slice of CIDR strings.
func FilterIncorrectCIDRVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) {
return filterWithCondition(ipStrings, isIPv6Mode, utilnet.IsIPv6CIDRString)
}
func filterWithCondition(strs []string, expectedCondition bool, conditionFunc func(string) bool) ([]string, []string) {
var corrects, incorrects []string
for _, str := range strs {
if conditionFunc(str) != expectedCondition {
incorrects = append(incorrects, str)
} else {
corrects = append(corrects, str)
}
}
return corrects, incorrects
}
...@@ -35,7 +35,6 @@ filegroup( ...@@ -35,7 +35,6 @@ filegroup(
"//pkg/util/maps:all-srcs", "//pkg/util/maps:all-srcs",
"//pkg/util/metrics:all-srcs", "//pkg/util/metrics:all-srcs",
"//pkg/util/mount:all-srcs", "//pkg/util/mount:all-srcs",
"//pkg/util/net:all-srcs",
"//pkg/util/netsh:all-srcs", "//pkg/util/netsh:all-srcs",
"//pkg/util/node:all-srcs", "//pkg/util/node:all-srcs",
"//pkg/util/normalizer:all-srcs", "//pkg/util/normalizer:all-srcs",
......
...@@ -6,9 +6,9 @@ go_library( ...@@ -6,9 +6,9 @@ go_library(
importpath = "k8s.io/kubernetes/pkg/util/conntrack", importpath = "k8s.io/kubernetes/pkg/util/conntrack",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//pkg/util/net:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
...@@ -17,10 +17,10 @@ go_test( ...@@ -17,10 +17,10 @@ go_test(
srcs = ["conntrack_test.go"], srcs = ["conntrack_test.go"],
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//pkg/util/net:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library",
"//vendor/k8s.io/utils/exec/testing:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
], ],
) )
......
...@@ -22,8 +22,8 @@ import ( ...@@ -22,8 +22,8 @@ import (
"strings" "strings"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
utilnet "k8s.io/kubernetes/pkg/util/net"
"k8s.io/utils/exec" "k8s.io/utils/exec"
utilnet "k8s.io/utils/net"
) )
// Utilities for dealing with conntrack // Utilities for dealing with conntrack
......
...@@ -22,9 +22,9 @@ import ( ...@@ -22,9 +22,9 @@ import (
"testing" "testing"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
utilnet "k8s.io/kubernetes/pkg/util/net"
"k8s.io/utils/exec" "k8s.io/utils/exec"
fakeexec "k8s.io/utils/exec/testing" fakeexec "k8s.io/utils/exec/testing"
utilnet "k8s.io/utils/net"
) )
func familyParamStr(isIPv6 bool) string { func familyParamStr(isIPv6 bool) string {
......
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
package(default_visibility = ["//visibility:public"])
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//pkg/util/net/sets:all-srcs",
],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["net.go"],
importpath = "k8s.io/kubernetes/pkg/util/net",
)
go_test(
name = "go_default_test",
srcs = ["net_test.go"],
embed = [":go_default_library"],
)
reviewers:
- sig-network-reviewers
approvers:
- sig-network-approvers
/*
Copyright 2018 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package net
import (
"net"
"reflect"
"testing"
)
func TestIsIPv6String(t *testing.T) {
testCases := []struct {
ip string
expectIPv6 bool
}{
{
ip: "127.0.0.1",
expectIPv6: false,
},
{
ip: "192.168.0.0",
expectIPv6: false,
},
{
ip: "1.2.3.4",
expectIPv6: false,
},
{
ip: "bad ip",
expectIPv6: false,
},
{
ip: "::1",
expectIPv6: true,
},
{
ip: "fd00::600d:f00d",
expectIPv6: true,
},
{
ip: "2001:db8::5",
expectIPv6: true,
},
}
for i := range testCases {
isIPv6 := IsIPv6String(testCases[i].ip)
if isIPv6 != testCases[i].expectIPv6 {
t.Errorf("[%d] Expect ipv6 %v, got %v", i+1, testCases[i].expectIPv6, isIPv6)
}
}
}
func TestIsIPv6(t *testing.T) {
testCases := []struct {
ip net.IP
expectIPv6 bool
}{
{
ip: net.IPv4zero,
expectIPv6: false,
},
{
ip: net.IPv4bcast,
expectIPv6: false,
},
{
ip: net.ParseIP("127.0.0.1"),
expectIPv6: false,
},
{
ip: net.ParseIP("10.20.40.40"),
expectIPv6: false,
},
{
ip: net.ParseIP("172.17.3.0"),
expectIPv6: false,
},
{
ip: nil,
expectIPv6: false,
},
{
ip: net.IPv6loopback,
expectIPv6: true,
},
{
ip: net.IPv6zero,
expectIPv6: true,
},
{
ip: net.ParseIP("fd00::600d:f00d"),
expectIPv6: true,
},
{
ip: net.ParseIP("2001:db8::5"),
expectIPv6: true,
},
}
for i := range testCases {
isIPv6 := IsIPv6(testCases[i].ip)
if isIPv6 != testCases[i].expectIPv6 {
t.Errorf("[%d] Expect ipv6 %v, got %v", i+1, testCases[i].expectIPv6, isIPv6)
}
}
}
func TestIsIPv6CIDR(t *testing.T) {
testCases := []struct {
desc string
cidr string
expectResult bool
}{
{
desc: "ipv4 CIDR 1",
cidr: "10.0.0.0/8",
expectResult: false,
},
{
desc: "ipv4 CIDR 2",
cidr: "192.168.0.0/16",
expectResult: false,
},
{
desc: "ipv6 CIDR 1",
cidr: "::/1",
expectResult: true,
},
{
desc: "ipv6 CIDR 2",
cidr: "2000::/10",
expectResult: true,
},
{
desc: "ipv6 CIDR 3",
cidr: "2001:db8::/32",
expectResult: true,
},
}
for _, tc := range testCases {
res := IsIPv6CIDR(tc.cidr)
if res != tc.expectResult {
t.Errorf("%v: want IsIPv6CIDR=%v, got %v", tc.desc, tc.expectResult, res)
}
}
}
func TestFilterIncorrectIPVersion(t *testing.T) {
testCases := []struct {
desc string
isIPv6 bool
ipStrings []string
expectCorrects []string
expectIncorrects []string
}{
{
desc: "all ipv4 strings in ipv4 mode",
isIPv6: false,
ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"},
expectCorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"},
expectIncorrects: nil,
},
{
desc: "all ipv6 strings in ipv4 mode",
isIPv6: false,
ipStrings: []string{"::1", "fd00::600d:f00d", "2001:db8::5"},
expectCorrects: nil,
expectIncorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"},
},
{
desc: "mixed versions in ipv4 mode",
isIPv6: false,
ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1", "::1", "fd00::600d:f00d", "2001:db8::5"},
expectCorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"},
expectIncorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"},
},
{
desc: "all ipv4 strings in ipv6 mode",
isIPv6: true,
ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"},
expectCorrects: nil,
expectIncorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"},
},
{
desc: "all ipv6 strings in ipv6 mode",
isIPv6: true,
ipStrings: []string{"::1", "fd00::600d:f00d", "2001:db8::5"},
expectCorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"},
expectIncorrects: nil,
},
{
desc: "mixed versions in ipv6 mode",
isIPv6: true,
ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1", "::1", "fd00::600d:f00d", "2001:db8::5"},
expectCorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"},
expectIncorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"},
},
}
for _, tc := range testCases {
corrects, incorrects := FilterIncorrectIPVersion(tc.ipStrings, tc.isIPv6)
if !reflect.DeepEqual(tc.expectCorrects, corrects) {
t.Errorf("%v: want corrects=%v, got %v", tc.desc, tc.expectCorrects, corrects)
}
if !reflect.DeepEqual(tc.expectIncorrects, incorrects) {
t.Errorf("%v: want incorrects=%v, got %v", tc.desc, tc.expectIncorrects, incorrects)
}
}
}
func TestFilterIncorrectCIDRVersion(t *testing.T) {
testCases := []struct {
desc string
isIPv6 bool
cidrStrings []string
expectCorrects []string
expectIncorrects []string
}{
{
desc: "all ipv4 strings in ipv4 mode",
isIPv6: false,
cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1"},
expectCorrects: []string{"0.0.0.0/1", "1.0.0.0/1"},
expectIncorrects: nil,
},
{
desc: "all ipv6 strings in ipv4 mode",
isIPv6: false,
cidrStrings: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"},
expectCorrects: nil,
expectIncorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"},
},
{
desc: "mixed versions in ipv4 mode",
isIPv6: false,
cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1", "2001:db8::/32", "2001:0db8:0123:4567::/64"},
expectCorrects: []string{"0.0.0.0/1", "1.0.0.0/1"},
expectIncorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"},
},
{
desc: "all ipv4 strings in ipv6 mode",
isIPv6: true,
cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1"},
expectCorrects: nil,
expectIncorrects: []string{"0.0.0.0/1", "1.0.0.0/1"},
},
{
desc: "all ipv6 strings in ipv6 mode",
isIPv6: true,
cidrStrings: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"},
expectCorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"},
expectIncorrects: nil,
},
{
desc: "mixed versions in ipv6 mode",
isIPv6: true,
cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1", "2001:db8::/32", "2001:0db8:0123:4567::/64"},
expectCorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"},
expectIncorrects: []string{"0.0.0.0/1", "1.0.0.0/1"},
},
}
for _, tc := range testCases {
corrects, incorrects := FilterIncorrectCIDRVersion(tc.cidrStrings, tc.isIPv6)
if !reflect.DeepEqual(tc.expectCorrects, corrects) {
t.Errorf("%v: want corrects=%v, got %v", tc.desc, tc.expectCorrects, corrects)
}
if !reflect.DeepEqual(tc.expectIncorrects, incorrects) {
t.Errorf("%v: want incorrects=%v, got %v", tc.desc, tc.expectIncorrects, incorrects)
}
}
}
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// This package contains hand-coded set implementations that should be similar
// to the autogenerated ones in pkg/util/sets.
// We can't simply use net.IPNet as a map-key in Go (because it contains a
// []byte).
// We could use the same workaround we use here (a string representation as the
// key) to autogenerate sets. If we do that, or decide on an alternate
// approach, we should replace the implementations in this package with the
// autogenerated versions.
// It is expected that callers will alias this import as "netsets" i.e. import
// netsets "k8s.io/kubernetes/pkg/util/net/sets"
package sets
/*
Copyright 2014 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package sets
import (
"net"
"reflect"
"sort"
"testing"
)
func parseIPNet(s string) *net.IPNet {
_, net, err := net.ParseCIDR(s)
if err != nil {
panic(err)
}
return net
}
func TestIPNets(t *testing.T) {
s := IPNet{}
s2 := IPNet{}
if len(s) != 0 {
t.Errorf("Expected len=0: %d", len(s))
}
a := parseIPNet("1.0.0.0/8")
b := parseIPNet("2.0.0.0/8")
c := parseIPNet("3.0.0.0/8")
d := parseIPNet("4.0.0.0/8")
s.Insert(a, b)
if len(s) != 2 {
t.Errorf("Expected len=2: %d", len(s))
}
s.Insert(c)
if s.Has(d) {
t.Errorf("Unexpected contents: %#v", s)
}
if !s.Has(a) {
t.Errorf("Missing contents: %#v", s)
}
s.Delete(a)
if s.Has(a) {
t.Errorf("Unexpected contents: %#v", s)
}
s.Insert(a)
if s.HasAll(a, b, d) {
t.Errorf("Unexpected contents: %#v", s)
}
if !s.HasAll(a, b) {
t.Errorf("Missing contents: %#v", s)
}
s2.Insert(a, b, d)
if s.IsSuperset(s2) {
t.Errorf("Unexpected contents: %#v", s)
}
s2.Delete(d)
if !s.IsSuperset(s2) {
t.Errorf("Missing contents: %#v", s)
}
}
func TestIPNetSetDeleteMultiples(t *testing.T) {
s := IPNet{}
a := parseIPNet("1.0.0.0/8")
b := parseIPNet("2.0.0.0/8")
c := parseIPNet("3.0.0.0/8")
s.Insert(a, b, c)
if len(s) != 3 {
t.Errorf("Expected len=3: %d", len(s))
}
s.Delete(a, c)
if len(s) != 1 {
t.Errorf("Expected len=1: %d", len(s))
}
if s.Has(a) {
t.Errorf("Unexpected contents: %#v", s)
}
if s.Has(c) {
t.Errorf("Unexpected contents: %#v", s)
}
if !s.Has(b) {
t.Errorf("Missing contents: %#v", s)
}
}
func TestNewIPSet(t *testing.T) {
s, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8")
if err != nil {
t.Errorf("error parsing IPNets: %v", err)
}
if len(s) != 3 {
t.Errorf("Expected len=3: %d", len(s))
}
a := parseIPNet("1.0.0.0/8")
b := parseIPNet("2.0.0.0/8")
c := parseIPNet("3.0.0.0/8")
if !s.Has(a) || !s.Has(b) || !s.Has(c) {
t.Errorf("Unexpected contents: %#v", s)
}
}
func TestIPNetSetDifference(t *testing.T) {
l, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8")
if err != nil {
t.Errorf("error parsing IPNets: %v", err)
}
r, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "4.0.0.0/8", "5.0.0.0/8")
if err != nil {
t.Errorf("error parsing IPNets: %v", err)
}
c := l.Difference(r)
d := r.Difference(l)
if len(c) != 1 {
t.Errorf("Expected len=1: %d", len(c))
}
if !c.Has(parseIPNet("3.0.0.0/8")) {
t.Errorf("Unexpected contents: %#v", c)
}
if len(d) != 2 {
t.Errorf("Expected len=2: %d", len(d))
}
if !d.Has(parseIPNet("4.0.0.0/8")) || !d.Has(parseIPNet("5.0.0.0/8")) {
t.Errorf("Unexpected contents: %#v", d)
}
}
func TestIPNetSetList(t *testing.T) {
s, err := ParseIPNets("3.0.0.0/8", "1.0.0.0/8", "2.0.0.0/8")
if err != nil {
t.Errorf("error parsing IPNets: %v", err)
}
l := s.StringSlice()
sort.Strings(l)
if !reflect.DeepEqual(l, []string{"1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8"}) {
t.Errorf("List gave unexpected result: %#v", l)
}
}
...@@ -795,7 +795,6 @@ k8s.io/kubernetes/pkg/util/iptables,rrati,0, ...@@ -795,7 +795,6 @@ k8s.io/kubernetes/pkg/util/iptables,rrati,0,
k8s.io/kubernetes/pkg/util/labels,rmmh,1, k8s.io/kubernetes/pkg/util/labels,rmmh,1,
k8s.io/kubernetes/pkg/util/limitwriter,deads2k,1, k8s.io/kubernetes/pkg/util/limitwriter,deads2k,1,
k8s.io/kubernetes/pkg/util/mount,xiang90,1, k8s.io/kubernetes/pkg/util/mount,xiang90,1,
k8s.io/kubernetes/pkg/util/net/sets,rrati,0,
k8s.io/kubernetes/pkg/util/node,liggitt,0, k8s.io/kubernetes/pkg/util/node,liggitt,0,
k8s.io/kubernetes/pkg/util/oom,vishh,0, k8s.io/kubernetes/pkg/util/oom,vishh,0,
k8s.io/kubernetes/pkg/util/parsers,derekwaynecarr,1, k8s.io/kubernetes/pkg/util/parsers,derekwaynecarr,1,
......
...@@ -473,6 +473,7 @@ filegroup( ...@@ -473,6 +473,7 @@ filegroup(
"//vendor/k8s.io/utils/integer:all-srcs", "//vendor/k8s.io/utils/integer:all-srcs",
"//vendor/k8s.io/utils/io:all-srcs", "//vendor/k8s.io/utils/io:all-srcs",
"//vendor/k8s.io/utils/keymutex:all-srcs", "//vendor/k8s.io/utils/keymutex:all-srcs",
"//vendor/k8s.io/utils/net:all-srcs",
"//vendor/k8s.io/utils/nsenter:all-srcs", "//vendor/k8s.io/utils/nsenter:all-srcs",
"//vendor/k8s.io/utils/path:all-srcs", "//vendor/k8s.io/utils/path:all-srcs",
"//vendor/k8s.io/utils/pointer:all-srcs", "//vendor/k8s.io/utils/pointer:all-srcs",
......
package(default_visibility = ["//visibility:public"]) load("@io_bazel_rules_go//go:def.bzl", "go_library")
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"doc.go",
"ipnet.go", "ipnet.go",
"net.go",
], ],
importpath = "k8s.io/kubernetes/pkg/util/net/sets", importmap = "k8s.io/kubernetes/vendor/k8s.io/utils/net",
) importpath = "k8s.io/utils/net",
visibility = ["//visibility:public"],
go_test(
name = "go_default_test",
srcs = ["ipnet_test.go"],
embed = [":go_default_library"],
) )
filegroup( filegroup(
...@@ -32,4 +22,5 @@ filegroup( ...@@ -32,4 +22,5 @@ filegroup(
name = "all-srcs", name = "all-srcs",
srcs = [":package-srcs"], srcs = [":package-srcs"],
tags = ["automanaged"], tags = ["automanaged"],
visibility = ["//visibility:public"],
) )
...@@ -14,19 +14,19 @@ See the License for the specific language governing permissions and ...@@ -14,19 +14,19 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package sets package net
import ( import (
"net" "net"
"strings" "strings"
) )
// IPNet maps string to net.IPNet. // IPNetSet maps string to net.IPNet.
type IPNet map[string]*net.IPNet type IPNetSet map[string]*net.IPNet
// ParseIPNets parses string slice to IPNet. // ParseIPNets parses string slice to IPNetSet.
func ParseIPNets(specs ...string) (IPNet, error) { func ParseIPNets(specs ...string) (IPNetSet, error) {
ipnetset := make(IPNet) ipnetset := make(IPNetSet)
for _, spec := range specs { for _, spec := range specs {
spec = strings.TrimSpace(spec) spec = strings.TrimSpace(spec)
_, ipnet, err := net.ParseCIDR(spec) _, ipnet, err := net.ParseCIDR(spec)
...@@ -40,27 +40,27 @@ func ParseIPNets(specs ...string) (IPNet, error) { ...@@ -40,27 +40,27 @@ func ParseIPNets(specs ...string) (IPNet, error) {
} }
// Insert adds items to the set. // Insert adds items to the set.
func (s IPNet) Insert(items ...*net.IPNet) { func (s IPNetSet) Insert(items ...*net.IPNet) {
for _, item := range items { for _, item := range items {
s[item.String()] = item s[item.String()] = item
} }
} }
// Delete removes all items from the set. // Delete removes all items from the set.
func (s IPNet) Delete(items ...*net.IPNet) { func (s IPNetSet) Delete(items ...*net.IPNet) {
for _, item := range items { for _, item := range items {
delete(s, item.String()) delete(s, item.String())
} }
} }
// Has returns true if and only if item is contained in the set. // Has returns true if and only if item is contained in the set.
func (s IPNet) Has(item *net.IPNet) bool { func (s IPNetSet) Has(item *net.IPNet) bool {
_, contained := s[item.String()] _, contained := s[item.String()]
return contained return contained
} }
// HasAll returns true if and only if all items are contained in the set. // HasAll returns true if and only if all items are contained in the set.
func (s IPNet) HasAll(items ...*net.IPNet) bool { func (s IPNetSet) HasAll(items ...*net.IPNet) bool {
for _, item := range items { for _, item := range items {
if !s.Has(item) { if !s.Has(item) {
return false return false
...@@ -75,8 +75,8 @@ func (s IPNet) HasAll(items ...*net.IPNet) bool { ...@@ -75,8 +75,8 @@ func (s IPNet) HasAll(items ...*net.IPNet) bool {
// s2 = {a1, a2, a4, a5} // s2 = {a1, a2, a4, a5}
// s1.Difference(s2) = {a3} // s1.Difference(s2) = {a3}
// s2.Difference(s1) = {a4, a5} // s2.Difference(s1) = {a4, a5}
func (s IPNet) Difference(s2 IPNet) IPNet { func (s IPNetSet) Difference(s2 IPNetSet) IPNetSet {
result := make(IPNet) result := make(IPNetSet)
for k, i := range s { for k, i := range s {
_, found := s2[k] _, found := s2[k]
if found { if found {
...@@ -89,7 +89,7 @@ func (s IPNet) Difference(s2 IPNet) IPNet { ...@@ -89,7 +89,7 @@ func (s IPNet) Difference(s2 IPNet) IPNet {
// StringSlice returns a []string with the String representation of each element in the set. // StringSlice returns a []string with the String representation of each element in the set.
// Order is undefined. // Order is undefined.
func (s IPNet) StringSlice() []string { func (s IPNetSet) StringSlice() []string {
a := make([]string, 0, len(s)) a := make([]string, 0, len(s))
for k := range s { for k := range s {
a = append(a, k) a = append(a, k)
...@@ -98,7 +98,7 @@ func (s IPNet) StringSlice() []string { ...@@ -98,7 +98,7 @@ func (s IPNet) StringSlice() []string {
} }
// IsSuperset returns true if and only if s1 is a superset of s2. // IsSuperset returns true if and only if s1 is a superset of s2.
func (s IPNet) IsSuperset(s2 IPNet) bool { func (s IPNetSet) IsSuperset(s2 IPNetSet) bool {
for k := range s2 { for k := range s2 {
_, found := s[k] _, found := s[k]
if !found { if !found {
...@@ -111,11 +111,11 @@ func (s IPNet) IsSuperset(s2 IPNet) bool { ...@@ -111,11 +111,11 @@ func (s IPNet) IsSuperset(s2 IPNet) bool {
// Equal returns true if and only if s1 is equal (as a set) to s2. // Equal returns true if and only if s1 is equal (as a set) to s2.
// Two sets are equal if their membership is identical. // Two sets are equal if their membership is identical.
// (In practice, this means same elements, order doesn't matter) // (In practice, this means same elements, order doesn't matter)
func (s IPNet) Equal(s2 IPNet) bool { func (s IPNetSet) Equal(s2 IPNetSet) bool {
return len(s) == len(s2) && s.IsSuperset(s2) return len(s) == len(s2) && s.IsSuperset(s2)
} }
// Len returns the size of the set. // Len returns the size of the set.
func (s IPNet) Len() int { func (s IPNetSet) Len() int {
return len(s) return len(s)
} }
...@@ -16,9 +16,7 @@ limitations under the License. ...@@ -16,9 +16,7 @@ limitations under the License.
package net package net
import ( import "net"
"net"
)
// IsIPv6 returns if netIP is IPv6. // IsIPv6 returns if netIP is IPv6.
func IsIPv6(netIP net.IP) bool { func IsIPv6(netIP net.IP) bool {
...@@ -31,31 +29,9 @@ func IsIPv6String(ip string) bool { ...@@ -31,31 +29,9 @@ func IsIPv6String(ip string) bool {
return IsIPv6(netIP) return IsIPv6(netIP)
} }
// IsIPv6CIDR returns if cidr is IPv6. // IsIPv6CIDRString returns if cidr is IPv6.
// This assumes cidr is a valid CIDR. // This assumes cidr is a valid CIDR.
func IsIPv6CIDR(cidr string) bool { func IsIPv6CIDRString(cidr string) bool {
ip, _, _ := net.ParseCIDR(cidr) ip, _, _ := net.ParseCIDR(cidr)
return IsIPv6(ip) return IsIPv6(ip)
} }
// FilterIncorrectIPVersion filters out the incorrect IP version case from a slice of IP strings.
func FilterIncorrectIPVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) {
return filterWithCondition(ipStrings, isIPv6Mode, IsIPv6String)
}
// FilterIncorrectCIDRVersion filters out the incorrect IP version case from a slice of CIDR strings.
func FilterIncorrectCIDRVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) {
return filterWithCondition(ipStrings, isIPv6Mode, IsIPv6CIDR)
}
func filterWithCondition(strs []string, expectedCondition bool, conditionFunc func(string) bool) ([]string, []string) {
var corrects, incorrects []string
for _, str := range strs {
if conditionFunc(str) != expectedCondition {
incorrects = append(incorrects, str)
} else {
corrects = append(corrects, str)
}
}
return corrects, incorrects
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment