From f984b4c7a27889234d3c863a99ba2bcef44bb345 Mon Sep 17 00:00:00 2001 From: Yassine TIJANI Date: Wed, 2 Oct 2019 21:50:24 +0200 Subject: [PATCH] remove ipallocator in favor of k/utils net package Signed-off-by: Yassine TIJANI --- cmd/kubeadm/app/apis/kubeadm/validation/BUILD | 2 +- .../app/apis/kubeadm/validation/validation.go | 6 +- cmd/kubeadm/app/constants/BUILD | 1 - cmd/kubeadm/app/constants/constants.go | 5 +- cmd/kubeadm/app/preflight/BUILD | 1 - cmd/kubeadm/app/preflight/checks.go | 3 +- cmd/kubeadm/app/util/apiclient/BUILD | 2 +- cmd/kubeadm/app/util/apiclient/init_dryrun.go | 4 +- pkg/master/BUILD | 3 +- pkg/master/services.go | 10 +++- pkg/registry/core/service/ipallocator/BUILD | 2 + .../core/service/ipallocator/allocator.go | 59 ++++--------------- .../service/ipallocator/allocator_test.go | 41 +------------ 13 files changed, 33 insertions(+), 106 deletions(-) diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/BUILD b/cmd/kubeadm/app/apis/kubeadm/validation/BUILD index b21f53c3dc3..d4006b520b9 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/validation/BUILD @@ -13,7 +13,6 @@ go_library( "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/features:go_default_library", "//cmd/kubeadm/app/util:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", @@ -21,6 +20,7 @@ go_library( "//staging/src/k8s.io/cluster-bootstrap/token/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/utils/integer:go_default_library", "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go index b37665a59c6..70a0d84f46a 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go +++ b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go @@ -39,7 +39,7 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/features" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" - "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" + "k8s.io/utils/integer" utilnet "k8s.io/utils/net" ) @@ -385,7 +385,7 @@ func ValidateIPNetFromString(subnetStr string, minAddrs int64, isDualStack bool, allErrs = append(allErrs, field.Invalid(fldPath, subnetStr, "expected at least one IP from each family (v4 or v6) for dual-stack networking")) } for _, s := range subnets { - numAddresses := ipallocator.RangeSize(s) + numAddresses := integer.Int64Min(utilnet.RangeSize(s), 1<<16) if numAddresses < minAddrs { allErrs = append(allErrs, field.Invalid(fldPath, s, "subnet is too small")) } @@ -397,7 +397,7 @@ func ValidateIPNetFromString(subnetStr string, minAddrs int64, isDualStack bool, allErrs = append(allErrs, field.Invalid(fldPath, subnetStr, "couldn't parse subnet")) return allErrs } - numAddresses := ipallocator.RangeSize(svcSubnet) + numAddresses := integer.Int64Min(utilnet.RangeSize(svcSubnet), 1<<16) if numAddresses < minAddrs { allErrs = append(allErrs, field.Invalid(fldPath, subnetStr, "subnet is too small")) } diff --git a/cmd/kubeadm/app/constants/BUILD b/cmd/kubeadm/app/constants/BUILD index c064cfeb513..940745fc209 100644 --- a/cmd/kubeadm/app/constants/BUILD +++ b/cmd/kubeadm/app/constants/BUILD @@ -16,7 +16,6 @@ go_library( importpath = "k8s.io/kubernetes/cmd/kubeadm/app/constants", deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", "//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library", diff --git a/cmd/kubeadm/app/constants/constants.go b/cmd/kubeadm/app/constants/constants.go index 4c34e6f3dc1..6053828c1d9 100644 --- a/cmd/kubeadm/app/constants/constants.go +++ b/cmd/kubeadm/app/constants/constants.go @@ -31,7 +31,6 @@ import ( "k8s.io/apimachinery/pkg/util/version" bootstrapapi "k8s.io/cluster-bootstrap/token/api" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" - "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" utilnet "k8s.io/utils/net" ) @@ -532,7 +531,7 @@ func GetDNSIP(svcSubnetList string, isDualStack bool) (net.IP, error) { } // Selects the 10th IP in service subnet CIDR range as dnsIP - dnsIP, err := ipallocator.GetIndexedIP(svcSubnetCIDR, 10) + dnsIP, err := utilnet.GetIndexedIP(svcSubnetCIDR, 10) if err != nil { return nil, errors.Wrap(err, "unable to get internal Kubernetes Service IP from the given service CIDR") } @@ -569,7 +568,7 @@ func GetAPIServerVirtualIP(svcSubnetList string, isDualStack bool) (net.IP, erro if err != nil { return nil, errors.Wrap(err, "unable to get internal Kubernetes Service IP from the given service CIDR") } - internalAPIServerVirtualIP, err := ipallocator.GetIndexedIP(svcSubnet, 1) + internalAPIServerVirtualIP, err := utilnet.GetIndexedIP(svcSubnet, 1) if err != nil { return nil, errors.Wrapf(err, "unable to get the first IP address from the given CIDR: %s", svcSubnet.String()) } diff --git a/cmd/kubeadm/app/preflight/BUILD b/cmd/kubeadm/app/preflight/BUILD index ce9bd369dc7..611f6d4365c 100644 --- a/cmd/kubeadm/app/preflight/BUILD +++ b/cmd/kubeadm/app/preflight/BUILD @@ -24,7 +24,6 @@ go_library( "//cmd/kubeadm/app/util/initsystem:go_default_library", "//cmd/kubeadm/app/util/runtime:go_default_library", "//cmd/kubeadm/app/util/system:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", diff --git a/cmd/kubeadm/app/preflight/checks.go b/cmd/kubeadm/app/preflight/checks.go index 3c29bbe54ee..14143734e2f 100644 --- a/cmd/kubeadm/app/preflight/checks.go +++ b/cmd/kubeadm/app/preflight/checks.go @@ -47,7 +47,6 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/util/initsystem" utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime" "k8s.io/kubernetes/cmd/kubeadm/app/util/system" - "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" utilsexec "k8s.io/utils/exec" utilsnet "k8s.io/utils/net" ) @@ -479,7 +478,7 @@ func (subnet HTTPProxyCIDRCheck) Check() (warnings, errorList []error) { return nil, []error{errors.Wrapf(err, "error parsing CIDR %q", subnet.CIDR)} } - testIP, err := ipallocator.GetIndexedIP(cidr, 1) + testIP, err := utilsnet.GetIndexedIP(cidr, 1) if err != nil { return nil, []error{errors.Wrapf(err, "unable to get first IP address from the given CIDR (%s)", cidr.String())} } diff --git a/cmd/kubeadm/app/util/apiclient/BUILD b/cmd/kubeadm/app/util/apiclient/BUILD index f305b9fee7b..5e15f1f26e9 100644 --- a/cmd/kubeadm/app/util/apiclient/BUILD +++ b/cmd/kubeadm/app/util/apiclient/BUILD @@ -20,7 +20,6 @@ go_library( "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/util:go_default_library", "//pkg/kubelet/types:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/rbac/v1:go_default_library", @@ -42,6 +41,7 @@ go_library( "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", "//staging/src/k8s.io/client-go/util/retry:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/cmd/kubeadm/app/util/apiclient/init_dryrun.go b/cmd/kubeadm/app/util/apiclient/init_dryrun.go index 44492ce9b49..c8ce32eb5e0 100644 --- a/cmd/kubeadm/app/util/apiclient/init_dryrun.go +++ b/cmd/kubeadm/app/util/apiclient/init_dryrun.go @@ -29,7 +29,7 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" core "k8s.io/client-go/testing" "k8s.io/kubernetes/cmd/kubeadm/app/constants" - "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" + utilnet "k8s.io/utils/net" ) // InitDryRunGetter implements the DryRunGetter interface and can be used to GET/LIST values in the dryrun fake clientset @@ -92,7 +92,7 @@ func (idr *InitDryRunGetter) handleKubernetesService(action core.GetAction) (boo return true, nil, errors.Wrapf(err, "error parsing CIDR %q", idr.serviceSubnet) } - internalAPIServerVirtualIP, err := ipallocator.GetIndexedIP(svcSubnet, 1) + internalAPIServerVirtualIP, err := utilnet.GetIndexedIP(svcSubnet, 1) if err != nil { return true, nil, errors.Wrapf(err, "unable to get first IP address from the given CIDR (%s)", svcSubnet.String()) } diff --git a/pkg/master/BUILD b/pkg/master/BUILD index 105290c0ec9..20748a15034 100644 --- a/pkg/master/BUILD +++ b/pkg/master/BUILD @@ -53,7 +53,6 @@ go_library( "//pkg/registry/coordination/rest:go_default_library", "//pkg/registry/core/rangeallocation:go_default_library", "//pkg/registry/core/rest:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", "//pkg/registry/core/service/ipallocator/controller:go_default_library", "//pkg/registry/core/service/portallocator/controller:go_default_library", "//pkg/registry/discovery/rest:go_default_library", @@ -128,6 +127,8 @@ go_library( "//staging/src/k8s.io/client-go/rest:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/k8s.io/klog:go_default_library", + "//vendor/k8s.io/utils/integer:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/master/services.go b/pkg/master/services.go index 80c640ed8ac..420d2fcbf19 100644 --- a/pkg/master/services.go +++ b/pkg/master/services.go @@ -21,8 +21,10 @@ import ( "net" "k8s.io/klog" + "k8s.io/utils/integer" + utilnet "k8s.io/utils/net" + kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options" - "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" ) // ServiceIPRange checks if the serviceClusterIPRange flag is nil, raising a warning if so and @@ -35,12 +37,14 @@ func ServiceIPRange(passedServiceClusterIPRange net.IPNet) (net.IPNet, net.IP, e klog.Warningf("No CIDR for service cluster IPs specified. Default value which was %s is deprecated and will be removed in future releases. Please specify it using --service-cluster-ip-range on kube-apiserver.", kubeoptions.DefaultServiceIPCIDR.String()) serviceClusterIPRange = kubeoptions.DefaultServiceIPCIDR } - if size := ipallocator.RangeSize(&serviceClusterIPRange); size < 8 { + + size := integer.Int64Min(utilnet.RangeSize(&serviceClusterIPRange), 1<<16) + if size < 8 { return net.IPNet{}, net.IP{}, fmt.Errorf("The service cluster IP range must be at least %d IP addresses", 8) } // Select the first valid IP from ServiceClusterIPRange to use as the GenericAPIServer service IP. - apiServerServiceIP, err := ipallocator.GetIndexedIP(&serviceClusterIPRange, 1) + apiServerServiceIP, err := utilnet.GetIndexedIP(&serviceClusterIPRange, 1) if err != nil { return net.IPNet{}, net.IP{}, err } diff --git a/pkg/registry/core/service/ipallocator/BUILD b/pkg/registry/core/service/ipallocator/BUILD index 10db164981f..b07cda65801 100644 --- a/pkg/registry/core/service/ipallocator/BUILD +++ b/pkg/registry/core/service/ipallocator/BUILD @@ -13,6 +13,8 @@ go_library( deps = [ "//pkg/apis/core:go_default_library", "//pkg/registry/core/service/allocator:go_default_library", + "//vendor/k8s.io/utils/integer:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/registry/core/service/ipallocator/allocator.go b/pkg/registry/core/service/ipallocator/allocator.go index 722d299683c..642738e151b 100644 --- a/pkg/registry/core/service/ipallocator/allocator.go +++ b/pkg/registry/core/service/ipallocator/allocator.go @@ -19,10 +19,14 @@ package ipallocator import ( "errors" "fmt" - api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/registry/core/service/allocator" + "math/big" "net" + + api "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/registry/core/service/allocator" + "k8s.io/utils/integer" + utilnet "k8s.io/utils/net" ) // Interface manages the allocation of IP addresses out of a range. Interface @@ -80,8 +84,8 @@ type Range struct { // NewAllocatorCIDRRange creates a Range over a net.IPNet, calling allocatorFactory to construct the backing store. func NewAllocatorCIDRRange(cidr *net.IPNet, allocatorFactory allocator.AllocatorFactory) (*Range, error) { - max := RangeSize(cidr) - base := bigForIP(cidr.IP) + max := integer.Int64Min(utilnet.RangeSize(cidr), 1<<16) + base := utilnet.BigForIP(cidr.IP) rangeSpec := cidr.String() r := Range{ @@ -169,7 +173,7 @@ func (r *Range) AllocateNext() (net.IP, error) { if !ok { return nil, ErrFull } - return addIPOffset(r.base, offset), nil + return utilnet.AddIPOffset(r.base, offset), nil } // Release releases the IP back to the pool. Releasing an @@ -187,7 +191,7 @@ func (r *Range) Release(ip net.IP) error { // ForEach calls the provided function for each allocated IP. func (r *Range) ForEach(fn func(net.IP)) { r.alloc.ForEach(func(offset int) { - ip, _ := GetIndexedIP(r.net, offset+1) // +1 because Range doesn't store IP 0 + ip, _ := utilnet.GetIndexedIP(r.net, offset+1) // +1 because Range doesn't store IP 0 fn(ip) }) } @@ -243,49 +247,8 @@ func (r *Range) contains(ip net.IP) (bool, int) { return true, offset } -// bigForIP creates a big.Int based on the provided net.IP -func bigForIP(ip net.IP) *big.Int { - b := ip.To4() - if b == nil { - b = ip.To16() - } - return big.NewInt(0).SetBytes(b) -} - -// addIPOffset adds the provided integer offset to a base big.Int representing a -// net.IP -func addIPOffset(base *big.Int, offset int) net.IP { - return net.IP(big.NewInt(0).Add(base, big.NewInt(int64(offset))).Bytes()) -} - // calculateIPOffset calculates the integer offset of ip from base such that // base + offset = ip. It requires ip >= base. func calculateIPOffset(base *big.Int, ip net.IP) int { - return int(big.NewInt(0).Sub(bigForIP(ip), base).Int64()) -} - -// RangeSize returns the size of a range in valid addresses. -func RangeSize(subnet *net.IPNet) int64 { - ones, bits := subnet.Mask.Size() - if bits == 32 && (bits-ones) >= 31 || bits == 128 && (bits-ones) >= 127 { - return 0 - } - // For IPv6, the max size will be limited to 65536 - // This is due to the allocator keeping track of all the - // allocated IP's in a bitmap. This will keep the size of - // the bitmap to 64k. - if bits == 128 && (bits-ones) >= 16 { - return int64(1) << uint(16) - } else { - return int64(1) << uint(bits-ones) - } -} - -// GetIndexedIP returns a net.IP that is subnet.IP + index in the contiguous IP space. -func GetIndexedIP(subnet *net.IPNet, index int) (net.IP, error) { - ip := addIPOffset(bigForIP(subnet.IP), index) - if !subnet.Contains(ip) { - return nil, fmt.Errorf("can't generate IP with index %d from subnet. subnet too small. subnet: %q", index, subnet) - } - return ip, nil + return int(big.NewInt(0).Sub(utilnet.BigForIP(ip), base).Int64()) } diff --git a/pkg/registry/core/service/ipallocator/allocator_test.go b/pkg/registry/core/service/ipallocator/allocator_test.go index e821a6a1016..1055f5dea41 100644 --- a/pkg/registry/core/service/ipallocator/allocator_test.go +++ b/pkg/registry/core/service/ipallocator/allocator_test.go @@ -66,6 +66,7 @@ func TestAllocate(t *testing.T) { t.Fatal(err) } t.Logf("base: %v", r.base.Bytes()) + t.Logf("max: %v", r.max) if f := r.Free(); f != tc.free { t.Errorf("Test %s unexpected free %d", tc.name, f) } @@ -213,46 +214,6 @@ func TestAllocateSmall(t *testing.T) { t.Logf("allocated: %v", found) } -func TestRangeSize(t *testing.T) { - testCases := []struct { - name string - cidr string - addrs int64 - }{ - { - name: "supported IPv4 cidr", - cidr: "192.168.1.0/24", - addrs: 256, - }, - { - name: "unsupported IPv4 cidr", - cidr: "192.168.1.0/1", - addrs: 0, - }, - { - name: "supported IPv6 cidr", - cidr: "2001:db8::/48", - addrs: 65536, - }, - { - name: "unsupported IPv6 mask", - cidr: "2001:db8::/1", - addrs: 0, - }, - } - - for _, tc := range testCases { - _, cidr, err := net.ParseCIDR(tc.cidr) - if err != nil { - t.Errorf("failed to parse cidr for test %s, unexpected error: '%s'", tc.name, err) - } - if size := RangeSize(cidr); size != tc.addrs { - t.Errorf("test %s failed. %s should have a range size of %d, got %d", - tc.name, tc.cidr, tc.addrs, size) - } - } -} - func TestForEach(t *testing.T) { _, cidr, err := net.ParseCIDR("192.168.1.0/24") if err != nil {