From b2c8190ee7c6fdcee5ca91da9950df1a24543a56 Mon Sep 17 00:00:00 2001 From: Antonio Ojea Date: Tue, 24 Jan 2023 13:19:59 +0000 Subject: [PATCH] allow to set the service reference on the allocator --- pkg/registry/core/service/storage/alloc.go | 29 ++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/pkg/registry/core/service/storage/alloc.go b/pkg/registry/core/service/storage/alloc.go index b87e2be27c6..19a64c2b887 100644 --- a/pkg/registry/core/service/storage/alloc.go +++ b/pkg/registry/core/service/storage/alloc.go @@ -18,14 +18,17 @@ package storage import ( "fmt" + "net" "k8s.io/apimachinery/pkg/api/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" apiservice "k8s.io/kubernetes/pkg/api/service" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" "k8s.io/kubernetes/pkg/registry/core/service/portallocator" netutils "k8s.io/utils/net" @@ -399,7 +402,18 @@ func (al *Allocators) allocIPs(service *api.Service, toAlloc map[api.IPFamily]st allocator = allocator.DryRun() } if ip == "" { - allocatedIP, err := allocator.AllocateNext() + var allocatedIP net.IP + var err error + if utilfeature.DefaultFeatureGate.Enabled(features.MultiCIDRServiceAllocator) { + svcAllocator, ok := allocator.(*ipallocator.Allocator) + if ok { + allocatedIP, err = svcAllocator.AllocateNextService(service) + } else { + allocatedIP, err = allocator.AllocateNext() + } + } else { + allocatedIP, err = allocator.AllocateNext() + } if err != nil { return allocated, errors.NewInternalError(fmt.Errorf("failed to allocate a serviceIP: %v", err)) } @@ -409,7 +423,18 @@ func (al *Allocators) allocIPs(service *api.Service, toAlloc map[api.IPFamily]st if parsedIP == nil { return allocated, errors.NewInternalError(fmt.Errorf("failed to parse service IP %q", ip)) } - if err := allocator.Allocate(parsedIP); err != nil { + var err error + if utilfeature.DefaultFeatureGate.Enabled(features.MultiCIDRServiceAllocator) { + svcAllocator, ok := allocator.(*ipallocator.Allocator) + if ok { + err = svcAllocator.AllocateService(service, parsedIP) + } else { + err = allocator.Allocate(parsedIP) + } + } else { + err = allocator.Allocate(parsedIP) + } + if err != nil { el := field.ErrorList{field.Invalid(field.NewPath("spec", "clusterIPs"), service.Spec.ClusterIPs, fmt.Sprintf("failed to allocate IP %v: %v", ip, err))} return allocated, errors.NewInvalid(api.Kind("Service"), service.Name, el) }