Repository: metallb/metallb
Pull request #1319 (2022-04-11 10:45:08)

Rename IPPool to IPAddressPool
IPPool may clash with calico deployments, renaming it to IPAddressPool
to avoid naming collisions.


sabinaaledort: /lgtm

Patch:
diff --git a/api/v1beta1/addresspool_webhook.go b/api/v1beta1/addresspool_webhook.go
index 870ff6c6..80dc852d 100644
--- a/api/v1beta1/addresspool_webhook.go
+++ b/api/v1beta1/addresspool_webhook.go
@@ -46,12 +46,12 @@ func (addressPool *AddressPool) ValidateCreate() error {
 		return err
 	}
 
-	existingIPPoolList, err := getExistingIPPools()
+	existingIPAddressPoolList, err := getExistingIPAddressPools()
 	if err != nil {
 		return err
 	}
 	addressPoolList := listWithUpdate(existingAddressPoolList, addressPool)
-	err = Validator.Validate(addressPoolList, existingIPPoolList)
+	err = Validator.Validate(addressPoolList, existingIPAddressPoolList)
 	if err != nil {
 		level.Error(Logger).Log("webhook", "addressPool", "action", "create", "name", addressPool.Name, "namespace", addressPool.Namespace, "error", err)
 		return err
@@ -68,12 +68,12 @@ func (addressPool *AddressPool) ValidateUpdate(old runtime.Object) error {
 		return err
 	}
 
-	existingIPPoolList, err := getExistingIPPools()
+	existingIPAddressPoolList, err := getExistingIPAddressPools()
 	if err != nil {
 		return err
 	}
 	addressPoolList := listWithUpdate(existingAddressPoolList, addressPool)
-	err = Validator.Validate(addressPoolList, existingIPPoolList)
+	err = Validator.Validate(addressPoolList, existingIPAddressPoolList)
 	if err != nil {
 		level.Error(Logger).Log("webhook", "addressPool", "action", "update", "name", addressPool.Name, "namespace", addressPool.Namespace, "error", err)
 		return err
diff --git a/api/v1beta1/bgpadvertisement_types.go b/api/v1beta1/bgpadvertisement_types.go
index 17db2b8e..0488daf1 100644
--- a/api/v1beta1/bgpadvertisement_types.go
+++ b/api/v1beta1/bgpadvertisement_types.go
@@ -44,8 +44,8 @@ type BGPAdvertisementSpec struct {
 	// BGP communities
 	Communities []string `json:"communities,omitempty"`
 
-	// IPPools is the list of ippools to advertise via this advertisement.
-	IPPools []string `json:"ipPools,omitempty"`
+	// IPAddressPools is the list of ipaddresspools to advertise via this advertisement.
+	IPAddressPools []string `json:"ipAddressPools,omitempty"`
 }
 
 // BGPAdvertisementStatus defines the observed state of BGPAdvertisement.
diff --git a/api/v1beta1/bgpadvertisement_webhook.go b/api/v1beta1/bgpadvertisement_webhook.go
index 0fbaad06..fecb1973 100644
--- a/api/v1beta1/bgpadvertisement_webhook.go
+++ b/api/v1beta1/bgpadvertisement_webhook.go
@@ -51,13 +51,13 @@ func (bgpAdv *BGPAdvertisement) ValidateCreate() error {
 		return err
 	}
 
-	ipPools, err := getExistingIPPools()
+	ipAddressPools, err := getExistingIPAddressPools()
 	if err != nil {
 		return err
 	}
 
 	toValidate := bgpAdvListWithUpdate(existingBGPAdvList, bgpAdv)
-	err = Validator.Validate(toValidate, addressPools, ipPools)
+	err = Validator.Validate(toValidate, addressPools, ipAddressPools)
 	if err != nil {
 		level.Error(Logger).Log("webhook", "bgpadvertisement", "action", "create", "name", bgpAdv.Name, "namespace", bgpAdv.Namespace, "error", err)
 		return err
@@ -79,13 +79,13 @@ func (bgpAdv *BGPAdvertisement) ValidateUpdate(old runtime.Object) error {
 		return err
 	}
 
-	ipPools, err := getExistingIPPools()
+	ipAddressPools, err := getExistingIPAddressPools()
 	if err != nil {
 		return err
 	}
 
 	toValidate := bgpAdvListWithUpdate(bgpAdvs, bgpAdv)
-	err = Validator.Validate(toValidate, addressPools, ipPools)
+	err = Validator.Validate(toValidate, addressPools, ipAddressPools)
 	if err != nil {
 		level.Error(Logger).Log("webhook", "bgpadvertisement", "action", "create", "name", bgpAdv.Name, "namespace", bgpAdv.Namespace, "error", err)
 		return err
diff --git a/api/v1beta1/ippool_types.go b/api/v1beta1/ipaddresspool_types.go
similarity index 74%
rename from api/v1beta1/ippool_types.go
rename to api/v1beta1/ipaddresspool_types.go
index 4dda6ebf..858276e1 100644
--- a/api/v1beta1/ippool_types.go
+++ b/api/v1beta1/ipaddresspool_types.go
@@ -20,8 +20,8 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// IPPoolSpec defines the desired state of IPPool.
-type IPPoolSpec struct {
+// IPAddressPoolSpec defines the desired state of IPAddressPool.
+type IPAddressPoolSpec struct {
 	// A list of IP address ranges over which MetalLB has authority.
 	// You can list multiple ranges in a single pool, they will all share the
 	// same settings. Each range can be either a CIDR prefix, or an explicit
@@ -41,8 +41,8 @@ type IPPoolSpec struct {
 	AvoidBuggyIPs bool `json:"avoidBuggyIPs,omitempty"`
 }
 
-// IPPoolStatus defines the observed state of IPPool.
-type IPPoolStatus struct {
+// IPAddressPoolStatus defines the observed state of IPAddressPool.
+type IPAddressPoolStatus struct {
 	// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
 	// Important: Run "make" to regenerate code after modifying this file
 }
@@ -51,24 +51,24 @@ type IPPoolStatus struct {
 // +kubebuilder:subresource:status
 // +kubebuilder:storageversion
 
-// IPPool is the Schema for the IPPools API.
-type IPPool struct {
+// IPAddressPool is the Schema for the IPAddressPools API.
+type IPAddressPool struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	Spec   IPPoolSpec   `json:"spec"`
-	Status IPPoolStatus `json:"status,omitempty"`
+	Spec   IPAddressPoolSpec   `json:"spec"`
+	Status IPAddressPoolStatus `json:"status,omitempty"`
 }
 
 // +kubebuilder:object:root=true
 
-// IPPoolList contains a list of IPPool.
-type IPPoolList struct {
+// IPAddressPoolList contains a list of IPAddressPool.
+type IPAddressPoolList struct {
 	metav1.TypeMeta `json:",inline"`
 	metav1.ListMeta `json:"metadata,omitempty"`
-	Items           []IPPool `json:"items"`
+	Items           []IPAddressPool `json:"items"`
 }
 
 func init() {
-	SchemeBuilder.Register(&IPPool{}, &IPPoolList{})
+	SchemeBuilder.Register(&IPAddressPool{}, &IPAddressPoolList{})
 }
diff --git a/api/v1beta1/ipaddresspool_webhook.go b/api/v1beta1/ipaddresspool_webhook.go
new file mode 100644
index 00000000..4a857078
--- /dev/null
+++ b/api/v1beta1/ipaddresspool_webhook.go
@@ -0,0 +1,108 @@
+/*
+
+
+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 v1beta1
+
+import (
+	"context"
+
+	"github.com/go-kit/kit/log/level"
+	"github.com/pkg/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/webhook"
+)
+
+func (ipAddress *IPAddressPool) SetupWebhookWithManager(mgr ctrl.Manager) error {
+	return ctrl.NewWebhookManagedBy(mgr).
+		For(ipAddress).
+		Complete()
+}
+
+//+kubebuilder:webhook:verbs=create;update,path=/validate-metallb-io-v1beta1-ipaddresspool,mutating=false,failurePolicy=fail,groups=metallb.io,resources=ipaddresspools,versions=v1beta1,name=ipaddresspoolvalidationwebhook.metallb.io,sideEffects=None,admissionReviewVersions=v1
+
+var _ webhook.Validator = &IPAddressPool{}
+
+// ValidateCreate implements webhook.Validator so a webhook will be registered for IPAddressPool.
+func (ipAddress *IPAddressPool) ValidateCreate() error {
+	level.Debug(Logger).Log("webhook", "ipaddresspool", "action", "create", "name", ipAddress.Name, "namespace", ipAddress.Namespace)
+
+	existingIPAddressPoolList, err := getExistingIPAddressPools()
+	if err != nil {
+		return err
+	}
+
+	existingAddressPoolList, err := getExistingAddressPools()
+	if err != nil {
+		return err
+	}
+	toValidate := ipAddressListWithUpdate(existingIPAddressPoolList, ipAddress)
+	err = Validator.Validate(existingAddressPoolList, toValidate)
+	if err != nil {
+		level.Error(Logger).Log("webhook", "ipAddress", "action", "create", "name", ipAddress.Name, "namespace", ipAddress.Namespace, "error", err)
+		return err
+	}
+	return nil
+}
+
+// ValidateUpdate implements webhook.Validator so a webhook will be registered for IPAddressPool.
+func (ipAddress *IPAddressPool) ValidateUpdate(old runtime.Object) error {
+	level.Debug(Logger).Log("webhook", "ipaddresspool", "action", "update", "name", ipAddress.Name, "namespace", ipAddress.Namespace)
+	existingAddressPoolList, err := getExistingAddressPools()
+	if err != nil {
+		return err
+	}
+
+	existingIPAddressPoolList, err := getExistingIPAddressPools()
+	if err != nil {
+		return err
+	}
+
+	toValidate := ipAddressListWithUpdate(existingIPAddressPoolList, ipAddress)
+	err = Validator.Validate(existingAddressPoolList, toValidate)
+	if err != nil {
+		level.Error(Logger).Log("webhook", "ipAddress", "action", "update", "name", ipAddress.Name, "namespace", ipAddress.Namespace, "error", err)
+		return err
+	}
+	return nil
+}
+
+// ValidateDelete implements webhook.Validator so a webhook will be registered for IPAddressPool.
+func (ipAddress *IPAddressPool) ValidateDelete() error {
+	return nil
+}
+
+var getExistingIPAddressPools = func() (*IPAddressPoolList, error) {
+	existingIPAddressPoolList := &IPAddressPoolList{}
+	err := WebhookClient.List(context.Background(), existingIPAddressPoolList, &client.ListOptions{Namespace: MetalLBNamespace})
+	if err != nil {
+		return nil, errors.Wrapf(err, "Failed to get existing IPAddressPool objects")
+	}
+	return existingIPAddressPoolList, nil
+}
+
+func ipAddressListWithUpdate(existing *IPAddressPoolList, toAdd *IPAddressPool) *IPAddressPoolList {
+	res := existing.DeepCopy()
+	for i, item := range res.Items { // We override the element with the fresh copy
+		if item.Name == toAdd.Name {
+			res.Items[i] = *toAdd.DeepCopy()
+			return res
+		}
+	}
+	res.Items = append(res.Items, *toAdd.DeepCopy())
+	return res
+}
diff --git a/api/v1beta1/ippool_webhook.go b/api/v1beta1/ippool_webhook.go
deleted file mode 100644
index 4e2818aa..00000000
--- a/api/v1beta1/ippool_webhook.go
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
-
-
-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 v1beta1
-
-import (
-	"context"
-
-	"github.com/go-kit/kit/log/level"
-	"github.com/pkg/errors"
-	"k8s.io/apimachinery/pkg/runtime"
-	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/webhook"
-)
-
-func (ipPool *IPPool) SetupWebhookWithManager(mgr ctrl.Manager) error {
-	return ctrl.NewWebhookManagedBy(mgr).
-		For(ipPool).
-		Complete()
-}
-
-//+kubebuilder:webhook:verbs=create;update,path=/validate-metallb-io-v1beta1-ippool,mutating=false,failurePolicy=fail,groups=metallb.io,resources=ippools,versions=v1beta1,name=ippoolvalidationwebhook.metallb.io,sideEffects=None,admissionReviewVersions=v1
-
-var _ webhook.Validator = &IPPool{}
-
-// ValidateCreate implements webhook.Validator so a webhook will be registered for IPPool.
-func (ipPool *IPPool) ValidateCreate() error {
-	level.Debug(Logger).Log("webhook", "ippool", "action", "create", "name", ipPool.Name, "namespace", ipPool.Namespace)
-
-	existingIPPoolList, err := getExistingIPPools()
-	if err != nil {
-		return err
-	}
-
-	existingAddressPoolList, err := getExistingAddressPools()
-	if err != nil {
-		return err
-	}
-	toValidate := ipPoolListWithUpdate(existingIPPoolList, ipPool)
-	err = Validator.Validate(existingAddressPoolList, toValidate)
-	if err != nil {
-		level.Error(Logger).Log("webhook", "ipPool", "action", "create", "name", ipPool.Name, "namespace", ipPool.Namespace, "error", err)
-		return err
-	}
-	return nil
-}
-
-// ValidateUpdate implements webhook.Validator so a webhook will be registered for IPPool.
-func (ipPool *IPPool) ValidateUpdate(old runtime.Object) error {
-	level.Debug(Logger).Log("webhook", "ippool", "action", "update", "name", ipPool.Name, "namespace", ipPool.Namespace)
-	existingAddressPoolList, err := getExistingAddressPools()
-	if err != nil {
-		return err
-	}
-
-	existingIPPoolList, err := getExistingIPPools()
-	if err != nil {
-		return err
-	}
-
-	toValidate := ipPoolListWithUpdate(existingIPPoolList, ipPool)
-	err = Validator.Validate(existingAddressPoolList, toValidate)
-	if err != nil {
-		level.Error(Logger).Log("webhook", "ipPool", "action", "update", "name", ipPool.Name, "namespace", ipPool.Namespace, "error", err)
-		return err
-	}
-	return nil
-}
-
-// ValidateDelete implements webhook.Validator so a webhook will be registered for IPPool.
-func (ipPool *IPPool) ValidateDelete() error {
-	return nil
-}
-
-var getExistingIPPools = func() (*IPPoolList, error) {
-	existingIPPoolList := &IPPoolList{}
-	err := WebhookClient.List(context.Background(), existingIPPoolList, &client.ListOptions{Namespace: MetalLBNamespace})
-	if err != nil {
-		return nil, errors.Wrapf(err, "Failed to get existing IPPool objects")
-	}
-	return existingIPPoolList, nil
-}
-
-func ipPoolListWithUpdate(existing *IPPoolList, toAdd *IPPool) *IPPoolList {
-	res := existing.DeepCopy()
-	for i, item := range res.Items { // We override the element with the fresh copy
-		if item.Name == toAdd.Name {
-			res.Items[i] = *toAdd.DeepCopy()
-			return res
-		}
-	}
-	res.Items = append(res.Items, *toAdd.DeepCopy())
-	return res
-}
diff --git a/api/v1beta1/l2advertisement_types.go b/api/v1beta1/l2advertisement_types.go
index c107062d..cb5656ee 100644
--- a/api/v1beta1/l2advertisement_types.go
+++ b/api/v1beta1/l2advertisement_types.go
@@ -25,8 +25,8 @@ import (
 
 // L2AdvertisementSpec defines the desired state of L2Advertisement.
 type L2AdvertisementSpec struct {
-	// IPPools is the list of ippools to advertise via this advertisement.
-	IPPools []string `json:"ipPools,omitempty"`
+	// IPAddressPools is the list of ipaddresspools to advertise via this advertisement.
+	IPAddressPools []string `json:"ipAddressPools,omitempty"`
 }
 
 // L2AdvertisementStatus defines the observed state of L2Advertisement.
diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go
index 83a2e3e4..1aef71d5 100644
--- a/api/v1beta1/zz_generated.deepcopy.go
+++ b/api/v1beta1/zz_generated.deepcopy.go
@@ -8,7 +8,7 @@
 package v1beta1
 
 import (
-	runtime "k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime"
 )
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
@@ -318,8 +318,8 @@ func (in *BGPAdvertisementSpec) DeepCopyInto(out *BGPAdvertisementSpec) {
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
-	if in.IPPools != nil {
-		in, out := &in.IPPools, &out.IPPools
+	if in.IPAddressPools != nil {
+		in, out := &in.IPAddressPools, &out.IPAddressPools
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
@@ -449,7 +449,7 @@ func (in *BGPPeerStatus) DeepCopy() *BGPPeerStatus {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *IPPool) DeepCopyInto(out *IPPool) {
+func (in *IPAddressPool) DeepCopyInto(out *IPAddressPool) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
@@ -457,18 +457,18 @@ func (in *IPPool) DeepCopyInto(out *IPPool) {
 	out.Status = in.Status
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPPool.
-func (in *IPPool) DeepCopy() *IPPool {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressPool.
+func (in *IPAddressPool) DeepCopy() *IPAddressPool {
 	if in == nil {
 		return nil
 	}
-	out := new(IPPool)
+	out := new(IPAddressPool)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *IPPool) DeepCopyObject() runtime.Object {
+func (in *IPAddressPool) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
@@ -476,31 +476,31 @@ func (in *IPPool) DeepCopyObject() runtime.Object {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *IPPoolList) DeepCopyInto(out *IPPoolList) {
+func (in *IPAddressPoolList) DeepCopyInto(out *IPAddressPoolList) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ListMeta.DeepCopyInto(&out.ListMeta)
 	if in.Items != nil {
 		in, out := &in.Items, &out.Items
-		*out = make([]IPPool, len(*in))
+		*out = make([]IPAddressPool, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
 	}
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPPoolList.
-func (in *IPPoolList) DeepCopy() *IPPoolList {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressPoolList.
+func (in *IPAddressPoolList) DeepCopy() *IPAddressPoolList {
 	if in == nil {
 		return nil
 	}
-	out := new(IPPoolList)
+	out := new(IPAddressPoolList)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *IPPoolList) DeepCopyObject() runtime.Object {
+func (in *IPAddressPoolList) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
@@ -508,7 +508,7 @@ func (in *IPPoolList) DeepCopyObject() runtime.Object {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *IPPoolSpec) DeepCopyInto(out *IPPoolSpec) {
+func (in *IPAddressPoolSpec) DeepCopyInto(out *IPAddressPoolSpec) {
 	*out = *in
 	if in.Addresses != nil {
 		in, out := &in.Addresses, &out.Addresses
@@ -522,27 +522,27 @@ func (in *IPPoolSpec) DeepCopyInto(out *IPPoolSpec) {
 	}
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPPoolSpec.
-func (in *IPPoolSpec) DeepCopy() *IPPoolSpec {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressPoolSpec.
+func (in *IPAddressPoolSpec) DeepCopy() *IPAddressPoolSpec {
 	if in == nil {
 		return nil
 	}
-	out := new(IPPoolSpec)
+	out := new(IPAddressPoolSpec)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *IPPoolStatus) DeepCopyInto(out *IPPoolStatus) {
+func (in *IPAddressPoolStatus) DeepCopyInto(out *IPAddressPoolStatus) {
 	*out = *in
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPPoolStatus.
-func (in *IPPoolStatus) DeepCopy() *IPPoolStatus {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressPoolStatus.
+func (in *IPAddressPoolStatus) DeepCopy() *IPAddressPoolStatus {
 	if in == nil {
 		return nil
 	}
-	out := new(IPPoolStatus)
+	out := new(IPAddressPoolStatus)
 	in.DeepCopyInto(out)
 	return out
 }
@@ -609,8 +609,8 @@ func (in *L2AdvertisementList) DeepCopyObject() runtime.Object {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *L2AdvertisementSpec) DeepCopyInto(out *L2AdvertisementSpec) {
 	*out = *in
-	if in.IPPools != nil {
-		in, out := &in.IPPools, &out.IPPools
+	if in.IPAddressPools != nil {
+		in, out := &in.IPAddressPools, &out.IPAddressPools
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
diff --git a/api/v1beta2/zz_generated.deepcopy.go b/api/v1beta2/zz_generated.deepcopy.go
index 59698298..f6a9deee 100644
--- a/api/v1beta2/zz_generated.deepcopy.go
+++ b/api/v1beta2/zz_generated.deepcopy.go
@@ -9,7 +9,7 @@ package v1beta2
 
 import (
 	"k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime"
 )
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
diff --git a/charts/metallb/templates/crds.yaml b/charts/metallb/templates/crds.yaml
index 79dfd9d0..1489e217 100644
--- a/charts/metallb/templates/crds.yaml
+++ b/charts/metallb/templates/crds.yaml
@@ -1,3 +1,4 @@
+---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
@@ -31,202 +32,183 @@ spec:
           path: /convert
   {{- end }}
   versions:
-    - deprecated: true
-      deprecationWarning: metallbio.io v1alpha1 AddressPool is deprecated
-      name: v1alpha1
-      schema:
-        openAPIV3Schema:
-          description: AddressPool is the Schema for the addresspools API.
-          properties:
-            apiVersion:
-              description:
-                "APIVersion defines the versioned schema of this representation
-                of an object. Servers should convert recognized schemas to the latest
-                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
-              type: string
-            kind:
-              description:
-                "Kind is a string value representing the REST resource this
-                object represents. Servers may infer this from the endpoint the client
-                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
-              type: string
-            metadata:
-              type: object
-            spec:
-              description: AddressPoolSpec defines the desired state of AddressPool.
-              properties:
-                addresses:
-                  description:
-                    A list of IP address ranges over which MetalLB has authority.
-                    You can list multiple ranges in a single pool, they will all share
-                    the same settings. Each range can be either a CIDR prefix, or an
-                    explicit start-end range of IPs.
-                  items:
-                    type: string
-                  type: array
-                autoAssign:
-                  default: true
-                  description:
-                    AutoAssign flag used to prevent MetallB from automatic
-                    allocation for a pool.
-                  type: boolean
-                bgpAdvertisements:
-                  description:
-                    When an IP is allocated from this pool, how should it
-                    be translated into BGP announcements?
-                  items:
-                    properties:
-                      aggregationLength:
-                        default: 32
-                        description:
-                          The aggregation-length advertisement option lets
-                          you “roll up” the /32s into a larger prefix.
-                        format: int32
-                        minimum: 1
-                        type: integer
-                      aggregationLengthV6:
-                        default: 128
-                        description:
-                          Optional, defaults to 128 (i.e. no aggregation)
-                          if not specified.
-                        format: int32
-                        type: integer
-                      communities:
-                        description: BGP communities
-                        items:
-                          type: string
-                        type: array
-                      localPref:
-                        description:
-                          BGP LOCAL_PREF attribute which is used by BGP best
-                          path algorithm, Path with higher localpref is preferred over
-                          one with lower localpref.
-                        format: int32
-                        type: integer
-                    type: object
-                  type: array
-                protocol:
-                  description:
-                    Protocol can be used to select how the announcement is
-                    done.
-                  enum:
-                    - layer2
-                    - bgp
+  - deprecated: true
+    deprecationWarning: metallbio.io v1alpha1 AddressPool is deprecated
+    name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        description: AddressPool is the Schema for the addresspools API.
+        properties:
+          apiVersion:
+            description: 'APIVersion defines the versioned schema of this representation
+              of an object. Servers should convert recognized schemas to the latest
+              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+            type: string
+          kind:
+            description: 'Kind is a string value representing the REST resource this
+              object represents. Servers may infer this from the endpoint the client
+              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: AddressPoolSpec defines the desired state of AddressPool.
+            properties:
+              addresses:
+                description: A list of IP address ranges over which MetalLB has authority.
+                  You can list multiple ranges in a single pool, they will all share
+                  the same settings. Each range can be either a CIDR prefix, or an
+                  explicit start-end range of IPs.
+                items:
                   type: string
-              required:
-                - addresses
-                - protocol
-              type: object
-            status:
-              description: AddressPoolStatus defines the observed state of AddressPool.
-              type: object
-          required:
-            - spec
-          type: object
-      served: true
-      storage: false
-      subresources:
-        status: {}
-    - name: v1beta1
-      schema:
-        openAPIV3Schema:
-          description: AddressPool is the Schema for the addresspools API.
-          properties:
-            apiVersion:
-              description:
-                "APIVersion defines the versioned schema of this representation
-                of an object. Servers should convert recognized schemas to the latest
-                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
-              type: string
-            kind:
-              description:
-                "Kind is a string value representing the REST resource this
-                object represents. Servers may infer this from the endpoint the client
-                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
-              type: string
-            metadata:
-              type: object
-            spec:
-              description: AddressPoolSpec defines the desired state of AddressPool.
-              properties:
-                addresses:
-                  description:
-                    A list of IP address ranges over which MetalLB has authority.
-                    You can list multiple ranges in a single pool, they will all share
-                    the same settings. Each range can be either a CIDR prefix, or an
-                    explicit start-end range of IPs.
-                  items:
-                    type: string
-                  type: array
-                autoAssign:
-                  default: true
-                  description:
-                    AutoAssign flag used to prevent MetallB from automatic
-                    allocation for a pool.
-                  type: boolean
-                avoidBuggyIPs:
-                  default: false
-                  description:
-                    AvoidBuggyIPs prevents addresses ending with .0 and .255
-                    to be used by a pool.
-                  type: boolean
-                bgpAdvertisements:
-                  description:
-                    When an IP is allocated from this pool, how should it
-                    be translated into BGP announcements?
-                  items:
-                    properties:
-                      aggregationLength:
-                        default: 32
-                        description:
-                          The aggregation-length advertisement option lets
-                          you “roll up” the /32s into a larger prefix.
-                        format: int32
-                        minimum: 1
-                        type: integer
-                      aggregationLengthV6:
-                        default: 128
-                        description:
-                          Optional, defaults to 128 (i.e. no aggregation)
-                          if not specified.
-                        format: int32
-                        type: integer
-                      communities:
-                        description: BGP communities
-                        items:
-                          type: string
-                        type: array
-                      localPref:
-                        description:
-                          BGP LOCAL_PREF attribute which is used by BGP best
-                          path algorithm, Path with higher localpref is preferred over
-                          one with lower localpref.
-                        format: int32
-                        type: integer
-                    type: object
-                  type: array
-                protocol:
-                  description:
-                    Protocol can be used to select how the announcement is
-                    done.
-                  enum:
-                    - layer2
-                    - bgp
+                type: array
+              autoAssign:
+                default: true
+                description: AutoAssign flag used to prevent MetallB from automatic
+                  allocation for a pool.
+                type: boolean
+              bgpAdvertisements:
+                description: When an IP is allocated from this pool, how should it
+                  be translated into BGP announcements?
+                items:
+                  properties:
+                    aggregationLength:
+                      default: 32
+                      description: The aggregation-length advertisement option lets
+                        you “roll up” the /32s into a larger prefix.
+                      format: int32
+                      minimum: 1
+                      type: integer
+                    aggregationLengthV6:
+                      default: 128
+                      description: Optional, defaults to 128 (i.e. no aggregation)
+                        if not specified.
+                      format: int32
+                      type: integer
+                    communities:
+                      description: BGP communities
+                      items:
+                        type: string
+                      type: array
+                    localPref:
+                      description: BGP LOCAL_PREF attribute which is used by BGP best
+                        path algorithm, Path with higher localpref is preferred over
+                        one with lower localpref.
+                      format: int32
+                      type: integer
+                  type: object
+                type: array
+              protocol:
+                description: Protocol can be used to select how the announcement is
+                  done.
+                enum:
+                - layer2
+                - bgp
+                type: string
+            required:
+            - addresses
+            - protocol
+            type: object
+          status:
+            description: AddressPoolStatus defines the observed state of AddressPool.
+            type: object
+        required:
+        - spec
+        type: object
+    served: true
+    storage: false
+    subresources:
+      status: {}
+  - name: v1beta1
+    schema:
+      openAPIV3Schema:
+        description: AddressPool is the Schema for the addresspools API.
+        properties:
+          apiVersion:
+            description: 'APIVersion defines the versioned schema of this representation
+              of an object. Servers should convert recognized schemas to the latest
+              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+            type: string
+          kind:
+            description: 'Kind is a string value representing the REST resource this
+              object represents. Servers may infer this from the endpoint the client
+              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: AddressPoolSpec defines the desired state of AddressPool.
+            properties:
+              addresses:
+                description: A list of IP address ranges over which MetalLB has authority.
+                  You can list multiple ranges in a single pool, they will all share
+                  the same settings. Each range can be either a CIDR prefix, or an
+                  explicit start-end range of IPs.
+                items:
                   type: string
-              required:
-                - addresses
-                - protocol
-              type: object
-            status:
-              description: AddressPoolStatus defines the observed state of AddressPool.
-              type: object
-          required:
-            - spec
-          type: object
-      served: true
-      storage: true
-      subresources:
-        status: {}
+                type: array
+              autoAssign:
+                default: true
+                description: AutoAssign flag used to prevent MetallB from automatic
+                  allocation for a pool.
+                type: boolean
+              avoidBuggyIPs:
+                default: false
+                description: AvoidBuggyIPs prevents addresses ending with .0 and .255
+                  to be used by a pool.
+                type: boolean
+              bgpAdvertisements:
+                description: When an IP is allocated from this pool, how should it
+                  be translated into BGP announcements?
+                items:
+                  properties:
+                    aggregationLength:
+                      default: 32
+                      description: The aggregation-length advertisement option lets
+                        you “roll up” the /32s into a larger prefix.
+                      format: int32
+                      minimum: 1
+                      type: integer
+                    aggregationLengthV6:
+                      default: 128
+                      description: Optional, defaults to 128 (i.e. no aggregation)
+                        if not specified.
+                      format: int32
+                      type: integer
+                    communities:
+                      description: BGP communities
+                      items:
+                        type: string
+                      type: array
+                    localPref:
+                      description: BGP LOCAL_PREF attribute which is used by BGP best
+                        path algorithm, Path with higher localpref is preferred over
+                        one with lower localpref.
+                      format: int32
+                      type: integer
+                  type: object
+                type: array
+              protocol:
+                description: Protocol can be used to select how the announcement is
+                  done.
+                enum:
+                - layer2
+                - bgp
+                type: string
+            required:
+            - addresses
+            - protocol
+            type: object
+          status:
+            description: AddressPoolStatus defines the observed state of AddressPool.
+            type: object
+        required:
+        - spec
+        type: object
+    served: true
+    storage: true
+    subresources:
+      status: {}
 status:
   acceptedNames:
     kind: ""
@@ -250,66 +232,64 @@ spec:
     singular: bfdprofile
   scope: Namespaced
   versions:
-    - name: v1beta1
-      schema:
-        openAPIV3Schema:
-          description: BFDProfile is the Schema for the bfdprofiles API.
-          properties:
-            apiVersion:
-              description:
-                "APIVersion defines the versioned schema of this representation
-                of an object. Servers should convert recognized schemas to the latest
-                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
-              type: string
-            kind:
-              description:
-                "Kind is a string value representing the REST resource this
-                object represents. Servers may infer this from the endpoint the client
-                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
-              type: string
-            metadata:
-              type: object
-            spec:
-              description: BFDProfileSpec defines the desired state of BFDProfile.
-              properties:
-                detectMultiplier:
-                  format: int32
-                  maximum: 255
-                  minimum: 2
-                  type: integer
-                echoInterval:
-                  format: int32
-                  maximum: 60000
-                  minimum: 10
-                  type: integer
-                echoMode:
-                  type: boolean
-                minimumTtl:
-                  format: int32
-                  maximum: 254
-                  minimum: 1
-                  type: integer
-                passiveMode:
-                  type: boolean
-                receiveInterval:
-                  format: int32
-                  maximum: 60000
-                  minimum: 10
-                  type: integer
-                transmitInterval:
-                  format: int32
-                  maximum: 60000
-                  minimum: 10
-                  type: integer
-              type: object
-            status:
-              description: BFDProfileStatus defines the observed state of BFDProfile.
-              type: object
-          type: object
-      served: true
-      storage: true
-      subresources:
-        status: {}
+  - name: v1beta1
+    schema:
+      openAPIV3Schema:
+        description: BFDProfile is the Schema for the bfdprofiles API.
+        properties:
+          apiVersion:
+            description: 'APIVersion defines the versioned schema of this representation
+              of an object. Servers should convert recognized schemas to the latest
+              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+            type: string
+          kind:
+            description: 'Kind is a string value representing the REST resource this
+              object represents. Servers may infer this from the endpoint the client
+              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: BFDProfileSpec defines the desired state of BFDProfile.
+            properties:
+              detectMultiplier:
+                format: int32
+                maximum: 255
+                minimum: 2
+                type: integer
+              echoInterval:
+                format: int32
+                maximum: 60000
+                minimum: 10
+                type: integer
+              echoMode:
+                type: boolean
+              minimumTtl:
+                format: int32
+                maximum: 254
+                minimum: 1
+                type: integer
+              passiveMode:
+                type: boolean
+              receiveInterval:
+                format: int32
+                maximum: 60000
+                minimum: 10
+                type: integer
+              transmitInterval:
+                format: int32
+                maximum: 60000
+                minimum: 10
+                type: integer
+            type: object
+          status:
+            description: BFDProfileStatus defines the observed state of BFDProfile.
+            type: object
+        type: object
+    served: true
+    storage: true
+    subresources:
+      status: {}
 status:
   acceptedNames:
     kind: ""
@@ -371,9 +351,9 @@ spec:
                 items:
                   type: string
                 type: array
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -628,14 +608,16 @@ spec:
                   authenticated sessions
                 type: string
               passwordSecret:
-                description: Authentication secret reference for routers enforcing
-                   TCP MD5 authenticated sessions
+                description: passwordSecret is name of the authentication secret for
+                  BGP Peer
                 properties:
                   name:
-                    description: Name of the secret object
+                    description: Name is unique within a namespace to reference a
+                      secret resource.
                     type: string
                   namespace:
-                    description: Namespace on which secret object resides
+                    description: Namespace defines the space within which the secret
+                      name must be unique.
                     type: string
                 type: object
               peerASN:
@@ -684,72 +666,67 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
-  name: ippools.metallb.io
+  name: ipaddresspools.metallb.io
 spec:
   group: metallb.io
   names:
-    kind: IPPool
-    listKind: IPPoolList
-    plural: ippools
-    singular: ippool
+    kind: IPAddressPool
+    listKind: IPAddressPoolList
+    plural: ipaddresspools
+    singular: ipaddresspool
   scope: Namespaced
   versions:
-    - name: v1beta1
-      schema:
-        openAPIV3Schema:
-          description: IPPool is the Schema for the IPPools API.
-          properties:
-            apiVersion:
-              description:
-                "APIVersion defines the versioned schema of this representation
-                of an object. Servers should convert recognized schemas to the latest
-                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
-              type: string
-            kind:
-              description:
-                "Kind is a string value representing the REST resource this
-                object represents. Servers may infer this from the endpoint the client
-                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
-              type: string
-            metadata:
-              type: object
-            spec:
-              description: IPPoolSpec defines the desired state of IPPool.
-              properties:
-                addresses:
-                  description:
-                    A list of IP address ranges over which MetalLB has authority.
-                    You can list multiple ranges in a single pool, they will all share
-                    the same settings. Each range can be either a CIDR prefix, or an
-                    explicit start-end range of IPs.
-                  items:
-                    type: string
-                  type: array
-                autoAssign:
-                  default: true
-                  description:
-                    AutoAssign flag used to prevent MetallB from automatic
-                    allocation for a pool.
-                  type: boolean
-                avoidBuggyIPs:
-                  default: false
-                  description:
-                    AvoidBuggyIPs prevents addresses ending with .0 and .255
-                    to be used by a pool.
-                  type: boolean
-              required:
-                - addresses
-              type: object
-            status:
-              description: IPPoolStatus defines the observed state of IPPool.
-              type: object
-          required:
-            - spec
-          type: object
-      served: true
-      storage: true
-      subresources:
-        status: {}
+  - name: v1beta1
+    schema:
+      openAPIV3Schema:
+        description: IPAddressPool is the Schema for the IPAddressPools API.
+        properties:
+          apiVersion:
+            description: 'APIVersion defines the versioned schema of this representation
+              of an object. Servers should convert recognized schemas to the latest
+              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+            type: string
+          kind:
+            description: 'Kind is a string value representing the REST resource this
+              object represents. Servers may infer this from the endpoint the client
+              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: IPAddressPoolSpec defines the desired state of IPAddressPool.
+            properties:
+              addresses:
+                description: A list of IP address ranges over which MetalLB has authority.
+                  You can list multiple ranges in a single pool, they will all share
+                  the same settings. Each range can be either a CIDR prefix, or an
+                  explicit start-end range of IPs.
+                items:
+                  type: string
+                type: array
+              autoAssign:
+                default: true
+                description: AutoAssign flag used to prevent MetallB from automatic
+                  allocation for a pool.
+                type: boolean
+              avoidBuggyIPs:
+                default: false
+                description: AvoidBuggyIPs prevents addresses ending with .0 and .255
+                  to be used by a pool.
+                type: boolean
+            required:
+            - addresses
+            type: object
+          status:
+            description: IPAddressPoolStatus defines the observed state of IPAddressPool.
+            type: object
+        required:
+        - spec
+        type: object
+    served: true
+    storage: true
+    subresources:
+      status: {}
 status:
   acceptedNames:
     kind: ""
@@ -793,9 +770,9 @@ spec:
           spec:
             description: L2AdvertisementSpec defines the desired state of L2Advertisement.
             properties:
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
diff --git a/charts/metallb/templates/rbac.yaml b/charts/metallb/templates/rbac.yaml
index 48b9bf94..584a6156 100644
--- a/charts/metallb/templates/rbac.yaml
+++ b/charts/metallb/templates/rbac.yaml
@@ -73,7 +73,7 @@ rules:
   resources: ["bgpadvertisements"]
   verbs: ["get", "list", "watch"]
 - apiGroups: ["metallb.io"]
-  resources: ["ippools"]
+  resources: ["ipaddresspools"]
   verbs: ["get", "list", "watch"]
 {{- if .Values.speaker.memberlist.enabled }}
 ---
@@ -110,7 +110,7 @@ rules:
   resources: ["bgpadvertisements"]
   verbs: ["get", "list", "watch"]
 - apiGroups: ["metallb.io"]
-  resources: ["ippools"]
+  resources: ["ipaddresspools"]
   verbs: ["get", "list", "watch"]
 {{- end }}
 ---
diff --git a/charts/metallb/templates/webhooks.yaml b/charts/metallb/templates/webhooks.yaml
index 9f96836b..ea5d6907 100644
--- a/charts/metallb/templates/webhooks.yaml
+++ b/charts/metallb/templates/webhooks.yaml
@@ -54,9 +54,9 @@ webhooks:
     service:
       name: {{ template "metallb.fullname" . }}-webhook-service
       namespace: {{ .Release.Namespace }}
-      path: /validate-metallb-io-v1beta1-ippool
+      path: /validate-metallb-io-v1beta1-ipaddresspool
   failurePolicy: Fail
-  name: ippoolvalidationwebhook.metallb.io
+  name: ipaddresspoolvalidationwebhook.metallb.io
   rules:
   - apiGroups:
     - metallb.io
@@ -66,7 +66,7 @@ webhooks:
     - CREATE
     - UPDATE
     resources:
-    - ippools
+    - ipaddresspools
   sideEffects: None
 - admissionReviewVersions:
   - v1
diff --git a/config/crd/bases/metallb.io_bgpadvertisements.yaml b/config/crd/bases/metallb.io_bgpadvertisements.yaml
index 7c3f9bed..15c17f6a 100644
--- a/config/crd/bases/metallb.io_bgpadvertisements.yaml
+++ b/config/crd/bases/metallb.io_bgpadvertisements.yaml
@@ -54,9 +54,9 @@ spec:
                 items:
                   type: string
                 type: array
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
diff --git a/config/crd/bases/metallb.io_ippools.yaml b/config/crd/bases/metallb.io_ipaddresspools.yaml
similarity index 85%
rename from config/crd/bases/metallb.io_ippools.yaml
rename to config/crd/bases/metallb.io_ipaddresspools.yaml
index a7052698..2e2bdd0e 100644
--- a/config/crd/bases/metallb.io_ippools.yaml
+++ b/config/crd/bases/metallb.io_ipaddresspools.yaml
@@ -6,20 +6,20 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
-  name: ippools.metallb.io
+  name: ipaddresspools.metallb.io
 spec:
   group: metallb.io
   names:
-    kind: IPPool
-    listKind: IPPoolList
-    plural: ippools
-    singular: ippool
+    kind: IPAddressPool
+    listKind: IPAddressPoolList
+    plural: ipaddresspools
+    singular: ipaddresspool
   scope: Namespaced
   versions:
   - name: v1beta1
     schema:
       openAPIV3Schema:
-        description: IPPool is the Schema for the IPPools API.
+        description: IPAddressPool is the Schema for the IPAddressPools API.
         properties:
           apiVersion:
             description: 'APIVersion defines the versioned schema of this representation
@@ -34,7 +34,7 @@ spec:
           metadata:
             type: object
           spec:
-            description: IPPoolSpec defines the desired state of IPPool.
+            description: IPAddressPoolSpec defines the desired state of IPAddressPool.
             properties:
               addresses:
                 description: A list of IP address ranges over which MetalLB has authority.
@@ -58,7 +58,7 @@ spec:
             - addresses
             type: object
           status:
-            description: IPPoolStatus defines the observed state of IPPool.
+            description: IPAddressPoolStatus defines the observed state of IPAddressPool.
             type: object
         required:
         - spec
diff --git a/config/crd/bases/metallb.io_l2advertisements.yaml b/config/crd/bases/metallb.io_l2advertisements.yaml
index 26eb6292..85c628af 100644
--- a/config/crd/bases/metallb.io_l2advertisements.yaml
+++ b/config/crd/bases/metallb.io_l2advertisements.yaml
@@ -36,9 +36,9 @@ spec:
           spec:
             description: L2AdvertisementSpec defines the desired state of L2Advertisement.
             properties:
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml
index dd5411fc..d754a885 100644
--- a/config/crd/kustomization.yaml
+++ b/config/crd/kustomization.yaml
@@ -2,7 +2,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 resources:
   - bases/metallb.io_addresspools.yaml
-  - bases/metallb.io_ippools.yaml
+  - bases/metallb.io_ipaddresspools.yaml
   - bases/metallb.io_bgppeers.yaml
   - bases/metallb.io_bfdprofiles.yaml
   - bases/metallb.io_bgpadvertisements.yaml
diff --git a/config/manifests/metallb-frr-with-webhooks.yaml b/config/manifests/metallb-frr-with-webhooks.yaml
index febef01d..0e527097 100644
--- a/config/manifests/metallb-frr-with-webhooks.yaml
+++ b/config/manifests/metallb-frr-with-webhooks.yaml
@@ -350,9 +350,9 @@ spec:
                 items:
                   type: string
                 type: array
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -660,20 +660,20 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
-  name: ippools.metallb.io
+  name: ipaddresspools.metallb.io
 spec:
   group: metallb.io
   names:
-    kind: IPPool
-    listKind: IPPoolList
-    plural: ippools
-    singular: ippool
+    kind: IPAddressPool
+    listKind: IPAddressPoolList
+    plural: ipaddresspools
+    singular: ipaddresspool
   scope: Namespaced
   versions:
   - name: v1beta1
     schema:
       openAPIV3Schema:
-        description: IPPool is the Schema for the IPPools API.
+        description: IPAddressPool is the Schema for the IPAddressPools API.
         properties:
           apiVersion:
             description: 'APIVersion defines the versioned schema of this representation
@@ -688,7 +688,7 @@ spec:
           metadata:
             type: object
           spec:
-            description: IPPoolSpec defines the desired state of IPPool.
+            description: IPAddressPoolSpec defines the desired state of IPAddressPool.
             properties:
               addresses:
                 description: A list of IP address ranges over which MetalLB has authority.
@@ -712,7 +712,7 @@ spec:
             - addresses
             type: object
           status:
-            description: IPPoolStatus defines the observed state of IPPool.
+            description: IPAddressPoolStatus defines the observed state of IPAddressPool.
             type: object
         required:
         - spec
@@ -764,9 +764,9 @@ spec:
           spec:
             description: L2AdvertisementSpec defines the desired state of L2Advertisement.
             properties:
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -959,7 +959,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
@@ -1030,7 +1030,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
@@ -1670,9 +1670,9 @@ webhooks:
     service:
       name: webhook-service
       namespace: metallb-system
-      path: /validate-metallb-io-v1beta1-ippool
+      path: /validate-metallb-io-v1beta1-ipaddresspool
   failurePolicy: Fail
-  name: ippoolvalidationwebhook.metallb.io
+  name: ipaddresspoolvalidationwebhook.metallb.io
   rules:
   - apiGroups:
     - metallb.io
@@ -1682,5 +1682,5 @@ webhooks:
     - CREATE
     - UPDATE
     resources:
-    - ippools
+    - ipaddresspools
   sideEffects: None
diff --git a/config/manifests/metallb-frr.yaml b/config/manifests/metallb-frr.yaml
index a48755e9..b8b9a70a 100644
--- a/config/manifests/metallb-frr.yaml
+++ b/config/manifests/metallb-frr.yaml
@@ -338,9 +338,9 @@ spec:
                 items:
                   type: string
                 type: array
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -636,20 +636,20 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
-  name: ippools.metallb.io
+  name: ipaddresspools.metallb.io
 spec:
   group: metallb.io
   names:
-    kind: IPPool
-    listKind: IPPoolList
-    plural: ippools
-    singular: ippool
+    kind: IPAddressPool
+    listKind: IPAddressPoolList
+    plural: ipaddresspools
+    singular: ipaddresspool
   scope: Namespaced
   versions:
   - name: v1beta1
     schema:
       openAPIV3Schema:
-        description: IPPool is the Schema for the IPPools API.
+        description: IPAddressPool is the Schema for the IPAddressPools API.
         properties:
           apiVersion:
             description: 'APIVersion defines the versioned schema of this representation
@@ -664,7 +664,7 @@ spec:
           metadata:
             type: object
           spec:
-            description: IPPoolSpec defines the desired state of IPPool.
+            description: IPAddressPoolSpec defines the desired state of IPAddressPool.
             properties:
               addresses:
                 description: A list of IP address ranges over which MetalLB has authority.
@@ -688,7 +688,7 @@ spec:
             - addresses
             type: object
           status:
-            description: IPPoolStatus defines the observed state of IPPool.
+            description: IPAddressPoolStatus defines the observed state of IPAddressPool.
             type: object
         required:
         - spec
@@ -740,9 +740,9 @@ spec:
           spec:
             description: L2AdvertisementSpec defines the desired state of L2Advertisement.
             properties:
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -935,7 +935,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
@@ -1006,7 +1006,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
diff --git a/config/manifests/metallb-native-with-webhooks.yaml b/config/manifests/metallb-native-with-webhooks.yaml
index 1244b528..d328842f 100644
--- a/config/manifests/metallb-native-with-webhooks.yaml
+++ b/config/manifests/metallb-native-with-webhooks.yaml
@@ -350,9 +350,9 @@ spec:
                 items:
                   type: string
                 type: array
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -660,20 +660,20 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
-  name: ippools.metallb.io
+  name: ipaddresspools.metallb.io
 spec:
   group: metallb.io
   names:
-    kind: IPPool
-    listKind: IPPoolList
-    plural: ippools
-    singular: ippool
+    kind: IPAddressPool
+    listKind: IPAddressPoolList
+    plural: ipaddresspools
+    singular: ipaddresspool
   scope: Namespaced
   versions:
   - name: v1beta1
     schema:
       openAPIV3Schema:
-        description: IPPool is the Schema for the IPPools API.
+        description: IPAddressPool is the Schema for the IPAddressPools API.
         properties:
           apiVersion:
             description: 'APIVersion defines the versioned schema of this representation
@@ -688,7 +688,7 @@ spec:
           metadata:
             type: object
           spec:
-            description: IPPoolSpec defines the desired state of IPPool.
+            description: IPAddressPoolSpec defines the desired state of IPAddressPool.
             properties:
               addresses:
                 description: A list of IP address ranges over which MetalLB has authority.
@@ -712,7 +712,7 @@ spec:
             - addresses
             type: object
           status:
-            description: IPPoolStatus defines the observed state of IPPool.
+            description: IPAddressPoolStatus defines the observed state of IPAddressPool.
             type: object
         required:
         - spec
@@ -764,9 +764,9 @@ spec:
           spec:
             description: L2AdvertisementSpec defines the desired state of L2Advertisement.
             properties:
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -959,7 +959,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
@@ -1030,7 +1030,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
@@ -1458,9 +1458,9 @@ webhooks:
     service:
       name: webhook-service
       namespace: metallb-system
-      path: /validate-metallb-io-v1beta1-ippool
+      path: /validate-metallb-io-v1beta1-ipaddresspool
   failurePolicy: Fail
-  name: ippoolvalidationwebhook.metallb.io
+  name: ipaddresspoolvalidationwebhook.metallb.io
   rules:
   - apiGroups:
     - metallb.io
@@ -1470,5 +1470,5 @@ webhooks:
     - CREATE
     - UPDATE
     resources:
-    - ippools
+    - ipaddresspools
   sideEffects: None
diff --git a/config/manifests/metallb-native.yaml b/config/manifests/metallb-native.yaml
index 0f62cd25..57582bab 100644
--- a/config/manifests/metallb-native.yaml
+++ b/config/manifests/metallb-native.yaml
@@ -338,9 +338,9 @@ spec:
                 items:
                   type: string
                 type: array
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -636,20 +636,20 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.7.0
   creationTimestamp: null
-  name: ippools.metallb.io
+  name: ipaddresspools.metallb.io
 spec:
   group: metallb.io
   names:
-    kind: IPPool
-    listKind: IPPoolList
-    plural: ippools
-    singular: ippool
+    kind: IPAddressPool
+    listKind: IPAddressPoolList
+    plural: ipaddresspools
+    singular: ipaddresspool
   scope: Namespaced
   versions:
   - name: v1beta1
     schema:
       openAPIV3Schema:
-        description: IPPool is the Schema for the IPPools API.
+        description: IPAddressPool is the Schema for the IPAddressPools API.
         properties:
           apiVersion:
             description: 'APIVersion defines the versioned schema of this representation
@@ -664,7 +664,7 @@ spec:
           metadata:
             type: object
           spec:
-            description: IPPoolSpec defines the desired state of IPPool.
+            description: IPAddressPoolSpec defines the desired state of IPAddressPool.
             properties:
               addresses:
                 description: A list of IP address ranges over which MetalLB has authority.
@@ -688,7 +688,7 @@ spec:
             - addresses
             type: object
           status:
-            description: IPPoolStatus defines the observed state of IPPool.
+            description: IPAddressPoolStatus defines the observed state of IPAddressPool.
             type: object
         required:
         - spec
@@ -740,9 +740,9 @@ spec:
           spec:
             description: L2AdvertisementSpec defines the desired state of L2Advertisement.
             properties:
-              ipPools:
-                description: IPPools is the list of ippools to advertise via this
-                  advertisement.
+              ipAddressPools:
+                description: IPAddressPools is the list of ipaddresspools to advertise
+                  via this advertisement.
                 items:
                   type: string
                 type: array
@@ -935,7 +935,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
@@ -1006,7 +1006,7 @@ rules:
 - apiGroups:
   - metallb.io
   resources:
-  - ippools
+  - ipaddresspools
   verbs:
   - get
   - list
diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml
index a49d816f..3c04ea92 100644
--- a/config/rbac/role.yaml
+++ b/config/rbac/role.yaml
@@ -139,7 +139,7 @@ rules:
   - apiGroups:
       - metallb.io
     resources:
-      - ippools
+      - ipaddresspools
     verbs:
       - get
       - list
@@ -223,7 +223,7 @@ rules:
   - apiGroups:
       - metallb.io
     resources:
-      - ippools
+      - ipaddresspools
     verbs:
       - get
       - list
diff --git a/config/webhook/manifests.yaml b/config/webhook/manifests.yaml
index 3e4e9e15..0b20212c 100644
--- a/config/webhook/manifests.yaml
+++ b/config/webhook/manifests.yaml
@@ -72,9 +72,9 @@ webhooks:
     service:
       name: webhook-service
       namespace: system
-      path: /validate-metallb-io-v1beta1-ippool
+      path: /validate-metallb-io-v1beta1-ipaddresspool
   failurePolicy: Fail
-  name: ippoolvalidationwebhook.metallb.io
+  name: ipaddresspoolvalidationwebhook.metallb.io
   rules:
   - apiGroups:
     - metallb.io
@@ -84,5 +84,5 @@ webhooks:
     - CREATE
     - UPDATE
     resources:
-    - ippools
+    - ipaddresspools
   sideEffects: None
diff --git a/internal/config/config.go b/internal/config/config.go
index 86e401d4..e1920c5b 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -34,7 +34,7 @@ import (
 )
 
 type ClusterResources struct {
-	Pools              []metallbv1beta1.IPPool           `json:"ippools"`
+	Pools              []metallbv1beta1.IPAddressPool    `json:"ipaddresspools"`
 	Peers              []metallbv1beta2.BGPPeer          `json:"bgppeers"`
 	BFDProfiles        []metallbv1beta1.BFDProfile       `json:"bfdprofiles"`
 	BGPAdvs            []metallbv1beta1.BGPAdvertisement `json:"bgpadvertisements"`
@@ -237,7 +237,7 @@ func For(resources ClusterResources, validate Validate) (*Config, error) {
 	for _, l2Adv := range resources.L2Advs {
 		adv := l2AdvertisementFromCR(l2Adv)
 		// No pool selector means select all pools
-		if len(l2Adv.Spec.IPPools) == 0 {
+		if len(l2Adv.Spec.IPAddressPools) == 0 {
 			for _, pool := range cfg.Pools {
 				if !containsAdvertisement(pool.L2Advertisements, adv) {
 					pool.L2Advertisements = append(pool.L2Advertisements, adv)
@@ -245,7 +245,7 @@ func For(resources ClusterResources, validate Validate) (*Config, error) {
 			}
 			continue
 		}
-		for _, poolName := range l2Adv.Spec.IPPools {
+		for _, poolName := range l2Adv.Spec.IPAddressPools {
 			if pool, ok := cfg.Pools[poolName]; ok {
 				if !containsAdvertisement(pool.L2Advertisements, adv) {
 					pool.L2Advertisements = append(pool.L2Advertisements, adv)
@@ -265,7 +265,7 @@ func For(resources ClusterResources, validate Validate) (*Config, error) {
 			return nil, err
 		}
 		// No pool selector means select all pools
-		if len(bgpAdv.Spec.IPPools) == 0 {
+		if len(bgpAdv.Spec.IPAddressPools) == 0 {
 			for _, pool := range cfg.Pools {
 				err := validateBGPAdvPerPool(adv, pool)
 				if err != nil {
@@ -275,7 +275,7 @@ func For(resources ClusterResources, validate Validate) (*Config, error) {
 			}
 			continue
 		}
-		for _, poolName := range bgpAdv.Spec.IPPools {
+		for _, poolName := range bgpAdv.Spec.IPAddressPools {
 			if pool, ok := cfg.Pools[poolName]; ok {
 				err := validateBGPAdvPerPool(adv, pool)
 				if err != nil {
@@ -419,7 +419,7 @@ func passwordForPeer(p metallbv1beta2.BGPPeer, passwordSecrets map[string]corev1
 	return password, nil
 }
 
-func addressPoolFromCR(p metallbv1beta1.IPPool, bgpCommunities map[string]uint32) (*Pool, error) {
+func addressPoolFromCR(p metallbv1beta1.IPAddressPool, bgpCommunities map[string]uint32) (*Pool, error) {
 	if p.Name == "" {
 		return nil, errors.New("missing pool name")
 	}
diff --git a/internal/config/validator.go b/internal/config/validator.go
index 8b9af2df..1a1a5ad4 100644
--- a/internal/config/validator.go
+++ b/internal/config/validator.go
@@ -29,7 +29,7 @@ type validator struct {
 
 func (v *validator) Validate(resources ...client.ObjectList) error {
 	clusterResources := ClusterResources{
-		Pools:              make([]metallbv1beta1.IPPool, 0),
+		Pools:              make([]metallbv1beta1.IPAddressPool, 0),
 		Peers:              make([]metallbv1beta2.BGPPeer, 0),
 		BFDProfiles:        make([]metallbv1beta1.BFDProfile, 0),
 		BGPAdvs:            make([]metallbv1beta1.BGPAdvertisement, 0),
@@ -38,7 +38,7 @@ func (v *validator) Validate(resources ...client.ObjectList) error {
 	}
 	for _, list := range resources {
 		switch list := list.(type) {
-		case *metallbv1beta1.IPPoolList:
+		case *metallbv1beta1.IPAddressPoolList:
 			clusterResources.Pools = append(clusterResources.Pools, list.Items...)
 		case *metallbv1beta2.BGPPeerList:
 			clusterResources.Peers = append(clusterResources.Peers, list.Items...)
diff --git a/internal/k8s/controllers/config_controller.go b/internal/k8s/controllers/config_controller.go
index bf52a775..fd6b1c54 100644
--- a/internal/k8s/controllers/config_controller.go
+++ b/internal/k8s/controllers/config_controller.go
@@ -54,9 +54,9 @@ func (r *ConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
 		return ctrl.Result{}, err
 	}
 
-	var ipPools metallbv1beta1.IPPoolList
-	if err := r.List(ctx, &ipPools, client.InNamespace(r.Namespace)); err != nil {
-		level.Error(r.Logger).Log("controller", "ConfigReconciler", "error", "failed to get ippools", "error", err)
+	var ipAddressPools metallbv1beta1.IPAddressPoolList
+	if err := r.List(ctx, &ipAddressPools, client.InNamespace(r.Namespace)); err != nil {
+		level.Error(r.Logger).Log("controller", "ConfigReconciler", "error", "failed to get ipaddresspools", "error", err)
 		return ctrl.Result{}, err
 	}
 
@@ -90,7 +90,7 @@ func (r *ConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
 	}
 
 	resources := config.ClusterResources{
-		Pools:              ipPools.Items,
+		Pools:              ipAddressPools.Items,
 		Peers:              bgpPeers.Items,
 		BFDProfiles:        bfdProfiles.Items,
 		L2Advs:             l2Advertisements.Items,
@@ -129,7 +129,7 @@ func (r *ConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
 func (r *ConfigReconciler) SetupWithManager(mgr ctrl.Manager) error {
 	return ctrl.NewControllerManagedBy(mgr).
 		For(&metallbv1beta2.BGPPeer{}).
-		Watches(&source.Kind{Type: &metallbv1beta1.IPPool{}}, &handler.EnqueueRequestForObject{}).
+		Watches(&source.Kind{Type: &metallbv1beta1.IPAddressPool{}}, &handler.EnqueueRequestForObject{}).
 		Watches(&source.Kind{Type: &metallbv1beta1.BGPAdvertisement{}}, &handler.EnqueueRequestForObject{}).
 		Watches(&source.Kind{Type: &metallbv1beta1.L2Advertisement{}}, &handler.EnqueueRequestForObject{}).
 		Watches(&source.Kind{Type: &metallbv1beta1.BFDProfile{}}, &handler.EnqueueRequestForObject{}).
diff --git a/internal/k8s/k8s.go b/internal/k8s/k8s.go
index 5408074d..f663204d 100644
--- a/internal/k8s/k8s.go
+++ b/internal/k8s/k8s.go
@@ -122,7 +122,7 @@ func New(cfg *Config) (*Client, error) {
 				&metallbv1beta1.BFDProfile{}:       namespaceSelector,
 				&metallbv1beta1.BGPAdvertisement{}: namespaceSelector,
 				&metallbv1beta1.BGPPeer{}:          namespaceSelector,
-				&metallbv1beta1.IPPool{}:           namespaceSelector,
+				&metallbv1beta1.IPAddressPool{}:    namespaceSelector,
 				&metallbv1beta1.L2Advertisement{}:  namespaceSelector,
 				&metallbv1beta2.BGPPeer{}:          namespaceSelector,
 				&corev1.Secret{}:                   namespaceSelector,
@@ -286,8 +286,8 @@ func enableWebhook(mgr manager.Manager, validate config.Validate, namespace stri
 		return err
 	}
 
-	if err := (&metallbv1beta1.IPPool{}).SetupWebhookWithManager(mgr); err != nil {
-		level.Error(logger).Log("op", "startup", "error", err, "msg", "unable to create webhook", "webhook", "IPPool")
+	if err := (&metallbv1beta1.IPAddressPool{}).SetupWebhookWithManager(mgr); err != nil {
+		level.Error(logger).Log("op", "startup", "error", err, "msg", "unable to create webhook", "webhook", "IPAddressPool")
 		return err
 	}
 


Test patch:
diff --git a/api/v1beta1/addresspool_webhook_test.go b/api/v1beta1/addresspool_webhook_test.go
index c13d3733..453f9744 100644
--- a/api/v1beta1/addresspool_webhook_test.go
+++ b/api/v1beta1/addresspool_webhook_test.go
@@ -31,14 +31,14 @@ func TestValidateAddressPool(t *testing.T) {
 			},
 		}, nil
 	}
-	toRestoreIPpools := getExistingIPPools
-	getExistingIPPools = func() (*IPPoolList, error) {
-		return &IPPoolList{}, nil
+	toRestoreIPAddressPools := getExistingIPAddressPools
+	getExistingIPAddressPools = func() (*IPAddressPoolList, error) {
+		return &IPAddressPoolList{}, nil
 	}
 
 	defer func() {
 		getExistingAddressPools = toRestoreAddresspools
-		getExistingIPPools = toRestoreIPpools
+		getExistingIPAddressPools = toRestoreIPAddressPools
 	}()
 
 	tests := []struct {
diff --git a/api/v1beta1/bgpadvertisement_webhook_test.go b/api/v1beta1/bgpadvertisement_webhook_test.go
index 16bafd0e..232545d1 100644
--- a/api/v1beta1/bgpadvertisement_webhook_test.go
+++ b/api/v1beta1/bgpadvertisement_webhook_test.go
@@ -32,15 +32,15 @@ func TestValidateBGPAdvertisement(t *testing.T) {
 	getExistingAddressPools = func() (*AddressPoolList, error) {
 		return &AddressPoolList{}, nil
 	}
-	toRestoreIPpools := getExistingIPPools
-	getExistingIPPools = func() (*IPPoolList, error) {
-		return &IPPoolList{}, nil
+	toRestoreIPAddressPools := getExistingIPAddressPools
+	getExistingIPAddressPools = func() (*IPAddressPoolList, error) {
+		return &IPAddressPoolList{}, nil
 	}
 
 	defer func() {
 		getExistingBGPAdvs = toRestore
 		getExistingAddressPools = toRestoreAddresspools
-		getExistingIPPools = toRestoreIPpools
+		getExistingIPAddressPools = toRestoreIPAddressPools
 	}()
 
 	tests := []struct {
diff --git a/api/v1beta1/ippool_webhook_test.go b/api/v1beta1/ipaddresspool_webhook_test.go
similarity index 66%
rename from api/v1beta1/ippool_webhook_test.go
rename to api/v1beta1/ipaddresspool_webhook_test.go
index 4c93a9b1..70585815 100644
--- a/api/v1beta1/ippool_webhook_test.go
+++ b/api/v1beta1/ipaddresspool_webhook_test.go
@@ -10,8 +10,8 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-func TestValidateIPPool(t *testing.T) {
-	ipPool := IPPool{
+func TestValidateIPAddressPool(t *testing.T) {
+	ipAddressPool := IPAddressPool{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      "test-ippool",
 			Namespace: MetalLBTestNameSpace,
@@ -23,38 +23,38 @@ func TestValidateIPPool(t *testing.T) {
 	getExistingAddressPools = func() (*AddressPoolList, error) {
 		return &AddressPoolList{}, nil
 	}
-	toRestoreIPpools := getExistingIPPools
-	getExistingIPPools = func() (*IPPoolList, error) {
-		return &IPPoolList{
-			Items: []IPPool{
-				ipPool,
+	toRestoreIPAddressPools := getExistingIPAddressPools
+	getExistingIPAddressPools = func() (*IPAddressPoolList, error) {
+		return &IPAddressPoolList{
+			Items: []IPAddressPool{
+				ipAddressPool,
 			},
 		}, nil
 	}
 
 	defer func() {
 		getExistingAddressPools = toRestoreAddresspools
-		getExistingIPPools = toRestoreIPpools
+		getExistingIPAddressPools = toRestoreIPAddressPools
 	}()
 
 	tests := []struct {
-		desc         string
-		ipPool       *IPPool
-		isNew        bool
-		failValidate bool
-		expected     *IPPoolList
+		desc          string
+		ipAddressPool *IPAddressPool
+		isNew         bool
+		failValidate  bool
+		expected      *IPAddressPoolList
 	}{
 		{
-			desc: "Second IPPool",
-			ipPool: &IPPool{
+			desc: "Second IPAddressPool",
+			ipAddressPool: &IPAddressPool{
 				ObjectMeta: metav1.ObjectMeta{
 					Name:      "test-ippool1",
 					Namespace: MetalLBTestNameSpace,
 				},
 			},
 			isNew: true,
-			expected: &IPPoolList{
-				Items: []IPPool{
+			expected: &IPAddressPoolList{
+				Items: []IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name:      "test-ippool",
@@ -71,16 +71,16 @@ func TestValidateIPPool(t *testing.T) {
 			},
 		},
 		{
-			desc: "Same IPPool, update",
-			ipPool: &IPPool{
+			desc: "Same IPAddressPool, update",
+			ipAddressPool: &IPAddressPool{
 				ObjectMeta: metav1.ObjectMeta{
 					Name:      "test-ippool",
 					Namespace: MetalLBTestNameSpace,
 				},
 			},
 			isNew: false,
-			expected: &IPPoolList{
-				Items: []IPPool{
+			expected: &IPAddressPoolList{
+				Items: []IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name:      "test-ippool",
@@ -92,15 +92,15 @@ func TestValidateIPPool(t *testing.T) {
 		},
 		{
 			desc: "Validation fails",
-			ipPool: &IPPool{
+			ipAddressPool: &IPAddressPool{
 				ObjectMeta: metav1.ObjectMeta{
 					Name:      "test-ippool",
 					Namespace: MetalLBTestNameSpace,
 				},
 			},
 			isNew: false,
-			expected: &IPPoolList{
-				Items: []IPPool{
+			expected: &IPAddressPoolList{
+				Items: []IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name:      "test-ippool",
@@ -120,15 +120,15 @@ func TestValidateIPPool(t *testing.T) {
 		mock.forceError = test.failValidate
 
 		if test.isNew {
-			err = test.ipPool.ValidateCreate()
+			err = test.ipAddressPool.ValidateCreate()
 		} else {
-			err = test.ipPool.ValidateUpdate(nil)
+			err = test.ipAddressPool.ValidateUpdate(nil)
 		}
 		if test.failValidate && err == nil {
 			t.Fatalf("test %s failed, expecting error", test.desc)
 		}
-		if !cmp.Equal(test.expected, mock.ipPools) {
-			t.Fatalf("test %s failed, %s", test.desc, cmp.Diff(test.expected, mock.ipPools))
+		if !cmp.Equal(test.expected, mock.ipAddressPools) {
+			t.Fatalf("test %s failed, %s", test.desc, cmp.Diff(test.expected, mock.ipAddressPools))
 		}
 	}
 }
diff --git a/api/v1beta1/mock_validator_test.go b/api/v1beta1/mock_validator_test.go
index a8d84398..c9e7cb77 100644
--- a/api/v1beta1/mock_validator_test.go
+++ b/api/v1beta1/mock_validator_test.go
@@ -8,10 +8,10 @@ import (
 )
 
 type mockValidator struct {
-	pools      *AddressPoolList
-	ipPools    *IPPoolList
-	bgpAdvs    *BGPAdvertisementList
-	forceError bool
+	pools          *AddressPoolList
+	ipAddressPools *IPAddressPoolList
+	bgpAdvs        *BGPAdvertisementList
+	forceError     bool
 }
 
 func (m *mockValidator) Validate(objects ...client.ObjectList) error {
@@ -21,8 +21,8 @@ func (m *mockValidator) Validate(objects ...client.ObjectList) error {
 			m.pools = list
 		case *BGPAdvertisementList:
 			m.bgpAdvs = list
-		case *IPPoolList:
-			m.ipPools = list
+		case *IPAddressPoolList:
+			m.ipAddressPools = list
 		default:
 			panic("unexpected type")
 		}
diff --git a/e2etest/bgptests/bgp.go b/e2etest/bgptests/bgp.go
index 831ecbae..7a78e6b7 100644
--- a/e2etest/bgptests/bgp.go
+++ b/e2etest/bgptests/bgp.go
@@ -117,12 +117,12 @@ var _ = ginkgo.Describe("BGP", func() {
 	table.DescribeTable("A service of protocol load balancer should work with", func(pairingIPFamily ipfamily.Family, setProtocoltest string, poolAddresses []string, tweak testservice.Tweak) {
 		var allNodes *corev1.NodeList
 		resources := metallbconfig.ClusterResources{
-			Pools: []metallbv1beta1.IPPool{
+			Pools: []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "bgp-test",
 					},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: poolAddresses,
 					},
 				},
@@ -238,12 +238,12 @@ var _ = ginkgo.Describe("BGP", func() {
 			}
 
 			resources := metallbconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: poolName,
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{poolAddress},
 						},
 					},
@@ -365,7 +365,7 @@ var _ = ginkgo.Describe("BGP", func() {
 			framework.ExpectNoError(err)
 		})
 
-		table.DescribeTable("set different AddressPools ranges modes", func(addressPools []metallbv1beta1.IPPool, pairingFamily ipfamily.Family, tweak testservice.Tweak) {
+		table.DescribeTable("set different AddressPools ranges modes", func(addressPools []metallbv1beta1.IPAddressPool, pairingFamily ipfamily.Family, tweak testservice.Tweak) {
 			resources := metallbconfig.ClusterResources{
 				Pools:   addressPools,
 				Peers:   metallb.PeersForContainers(FRRContainers, pairingFamily),
@@ -401,50 +401,50 @@ var _ = ginkgo.Describe("BGP", func() {
 				validateService(cs, svc, allNodes.Items, c)
 			}
 		},
-			table.Entry("IPV4 - test AddressPool defined by address range", []metallbv1beta1.IPPool{
+			table.Entry("IPV4 - test AddressPool defined by address range", []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{Name: "bgp-test"},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							"192.168.10.0-192.168.10.18",
 						},
 					},
 				}}, ipfamily.IPv4, testservice.TrafficPolicyCluster,
 			),
-			table.Entry("IPV4 - test AddressPool defined by network prefix", []metallbv1beta1.IPPool{
+			table.Entry("IPV4 - test AddressPool defined by network prefix", []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{Name: "bgp-test"},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							"192.168.10.0/24",
 						},
 					},
 				}}, ipfamily.IPv4, testservice.TrafficPolicyCluster,
 			),
-			table.Entry("IPV6 - test AddressPool defined by address range", []metallbv1beta1.IPPool{
+			table.Entry("IPV6 - test AddressPool defined by address range", []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{Name: "bgp-test"},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							"fc00:f853:0ccd:e799::0-fc00:f853:0ccd:e799::18",
 						},
 					},
 				}}, ipfamily.IPv6, testservice.TrafficPolicyCluster,
 			),
-			table.Entry("IPV6 - test AddressPool defined by network prefix", []metallbv1beta1.IPPool{
+			table.Entry("IPV6 - test AddressPool defined by network prefix", []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{Name: "bgp-test"},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							"fc00:f853:0ccd:e799::/124",
 						},
 					},
 				}}, ipfamily.IPv6, testservice.TrafficPolicyCluster,
 			),
-			table.Entry("DUALSTACK - test AddressPool defined by address range", []metallbv1beta1.IPPool{
+			table.Entry("DUALSTACK - test AddressPool defined by address range", []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{Name: "bgp-test"},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							"192.168.10.0-192.168.10.18",
 							"fc00:f853:0ccd:e799::0-fc00:f853:0ccd:e799::18",
@@ -452,10 +452,10 @@ var _ = ginkgo.Describe("BGP", func() {
 					},
 				}}, ipfamily.DualStack, testservice.TrafficPolicyCluster,
 			),
-			table.Entry("DUALSTACK - test AddressPool defined by network prefix", []metallbv1beta1.IPPool{
+			table.Entry("DUALSTACK - test AddressPool defined by network prefix", []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{Name: "bgp-test"},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							"192.168.10.0/24",
 							"fc00:f853:0ccd:e799::/124",
@@ -526,12 +526,12 @@ var _ = ginkgo.Describe("BGP", func() {
 	ginkgo.Context("BFD", func() {
 		table.DescribeTable("should work with the given bfd profile", func(bfd metallbv1beta1.BFDProfile, pairingFamily ipfamily.Family, poolAddresses []string, tweak testservice.Tweak) {
 			resources := metallbconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "bfd-test",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: poolAddresses,
 						},
 					},
@@ -675,12 +675,12 @@ var _ = ginkgo.Describe("BGP", func() {
 
 		table.DescribeTable("metrics", func(bfd metallbv1beta1.BFDProfile, pairingFamily ipfamily.Family, poolAddresses []string) {
 			resources := metallbconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "bfd-test",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: poolAddresses,
 						},
 					},
@@ -885,7 +885,7 @@ var _ = ginkgo.Describe("BGP", func() {
 		table.DescribeTable("should work after subsequent configuration updates", func(addressRange string, ipFamily ipfamily.Family) {
 			var services []*corev1.Service
 			var servicesIngressIP []string
-			var pools []metallbv1beta1.IPPool
+			var pools []metallbv1beta1.IPAddressPool
 
 			allNodes, err := cs.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{})
 			framework.ExpectNoError(err)
@@ -897,11 +897,11 @@ var _ = ginkgo.Describe("BGP", func() {
 				lastIP, err := config.GetIPFromRangeByIndex(addressRange, i*10+10)
 				framework.ExpectNoError(err)
 				addressesRange := fmt.Sprintf("%s-%s", firstIP, lastIP)
-				pool := metallbv1beta1.IPPool{
+				pool := metallbv1beta1.IPAddressPool{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: fmt.Sprintf("test-addresspool%d", i+1),
 					},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{addressesRange},
 					},
 				}
@@ -934,7 +934,7 @@ var _ = ginkgo.Describe("BGP", func() {
 				ginkgo.By("validate LoadBalancer IP is in the AddressPool range")
 				ingressIP := e2eservice.GetIngressPoint(
 					&svc.Status.LoadBalancer.Ingress[0])
-				err = config.ValidateIPInRange([]metallbv1beta1.IPPool{pool}, ingressIP)
+				err = config.ValidateIPInRange([]metallbv1beta1.IPAddressPool{pool}, ingressIP)
 				framework.ExpectNoError(err)
 
 				services = append(services, svc)
@@ -982,23 +982,23 @@ var _ = ginkgo.Describe("BGP", func() {
 						Name: "empty",
 					},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						IPPools: []string{"bgp-with-no-advertisement"},
+						IPAddressPools: []string{"bgp-with-no-advertisement"},
 					},
 				}
 
-				poolWithAdvertisement := metallbv1beta1.IPPool{
+				poolWithAdvertisement := metallbv1beta1.IPAddressPool{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "bgp-with-advertisement",
 					},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{rangeWithAdvertisement},
 					},
 				}
-				poolWithoutAdvertisement := metallbv1beta1.IPPool{
+				poolWithoutAdvertisement := metallbv1beta1.IPAddressPool{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "bgp-with-no-advertisement",
 					},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{rangeWithoutAdvertisement},
 					},
 				}
@@ -1008,13 +1008,13 @@ var _ = ginkgo.Describe("BGP", func() {
 				}
 
 				if !legacy {
-					resources.Pools = []metallbv1beta1.IPPool{poolWithAdvertisement, poolWithoutAdvertisement}
+					resources.Pools = []metallbv1beta1.IPAddressPool{poolWithAdvertisement, poolWithoutAdvertisement}
 					resources.BGPAdvs = []metallbv1beta1.BGPAdvertisement{emptyAdvertisement, advertisement}
 				} else {
 					resources.LegacyAddressPools = make([]metallbv1beta1.AddressPool, 0)
 					resources.LegacyAddressPools = []metallbv1beta1.AddressPool{
-						config.IPPoolToLegacy(poolWithAdvertisement, metallbconfig.BGP, []metallbv1beta1.BGPAdvertisement{advertisement}),
-						config.IPPoolToLegacy(poolWithoutAdvertisement, metallbconfig.BGP, []metallbv1beta1.BGPAdvertisement{}),
+						config.IPAddressPoolToLegacy(poolWithAdvertisement, metallbconfig.BGP, []metallbv1beta1.BGPAdvertisement{advertisement}),
+						config.IPAddressPoolToLegacy(poolWithoutAdvertisement, metallbconfig.BGP, []metallbv1beta1.BGPAdvertisement{}),
 					}
 				}
 
@@ -1115,9 +1115,9 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						Communities: []string{CommunityNoAdv},
-						LocalPref:   50,
-						IPPools:     []string{"bgp-with-advertisement"},
+						Communities:    []string{CommunityNoAdv},
+						LocalPref:      50,
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				false,
@@ -1128,8 +1128,8 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						LocalPref: 50,
-						IPPools:   []string{"bgp-with-advertisement"},
+						LocalPref:      50,
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				false,
@@ -1140,8 +1140,8 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						Communities: []string{CommunityNoAdv},
-						IPPools:     []string{"bgp-with-advertisement"},
+						Communities:    []string{CommunityNoAdv},
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				false,
@@ -1152,9 +1152,9 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						Communities: []string{CommunityNoAdv},
-						LocalPref:   50,
-						IPPools:     []string{"bgp-with-advertisement"},
+						Communities:    []string{CommunityNoAdv},
+						LocalPref:      50,
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				true,
@@ -1165,8 +1165,8 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						LocalPref: 50,
-						IPPools:   []string{"bgp-with-advertisement"},
+						LocalPref:      50,
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				true,
@@ -1177,9 +1177,9 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						LocalPref:   50,
-						Communities: []string{CommunityNoAdv},
-						IPPools:     []string{"bgp-with-advertisement"},
+						LocalPref:      50,
+						Communities:    []string{CommunityNoAdv},
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				false,
@@ -1190,8 +1190,8 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						Communities: []string{CommunityNoAdv},
-						IPPools:     []string{"bgp-with-advertisement"},
+						Communities:    []string{CommunityNoAdv},
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				false,
@@ -1202,8 +1202,8 @@ var _ = ginkgo.Describe("BGP", func() {
 				metallbv1beta1.BGPAdvertisement{
 					ObjectMeta: metav1.ObjectMeta{Name: "advertisement"},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
-						LocalPref: 50,
-						IPPools:   []string{"bgp-with-advertisement"},
+						LocalPref:      50,
+						IPAddressPools: []string{"bgp-with-advertisement"},
 					},
 				},
 				false,
@@ -1213,12 +1213,12 @@ var _ = ginkgo.Describe("BGP", func() {
 
 	table.DescribeTable("MetalLB FRR rejects any routes advertised by any neighbor", func(addressesRange, toInject string, pairingIPFamily ipfamily.Family) {
 		resources := metallbconfig.ClusterResources{
-			Pools: []metallbv1beta1.IPPool{
+			Pools: []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "rejectroutes",
 					},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							addressesRange,
 						},
@@ -1280,12 +1280,12 @@ var _ = ginkgo.Describe("BGP", func() {
 	ginkgo.Context("FRR validate reload feedback", func() {
 		ginkgo.It("should update MetalLB config and log reload-validate success", func() {
 			resources := metallbconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "new-config",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								v4PoolAddresses,
 							},
@@ -1323,12 +1323,12 @@ var _ = ginkgo.Describe("BGP", func() {
 	ginkgo.Context("validate FRR running configuration", func() {
 		ginkgo.It("Full BFD profile", func() {
 			resources := metallbconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "bgp-test",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{v4PoolAddresses},
 						},
 					},
diff --git a/e2etest/l2tests/l2.go b/e2etest/l2tests/l2.go
index 7cb61493..47e8e121 100644
--- a/e2etest/l2tests/l2.go
+++ b/e2etest/l2tests/l2.go
@@ -89,12 +89,12 @@ var _ = ginkgo.Describe("L2", func() {
 	ginkgo.Context("type=Loadbalancer", func() {
 		ginkgo.BeforeEach(func() {
 			resources := internalconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "l2-test",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								IPV4ServiceRange,
 								IPV6ServiceRange},
@@ -183,7 +183,7 @@ var _ = ginkgo.Describe("L2", func() {
 
 	ginkgo.Context("validate different AddressPools for type=Loadbalancer", func() {
 
-		table.DescribeTable("set different AddressPools ranges modes", func(getAddressPools func() []metallbv1beta1.IPPool) {
+		table.DescribeTable("set different AddressPools ranges modes", func(getAddressPools func() []metallbv1beta1.IPAddressPool) {
 			resources := internalconfig.ClusterResources{
 				Pools:  getAddressPools(),
 				L2Advs: []metallbv1beta1.L2Advertisement{emptyL2Advertisement},
@@ -214,13 +214,13 @@ var _ = ginkgo.Describe("L2", func() {
 			err = wget.Do(address, executor.Host)
 			framework.ExpectNoError(err)
 		},
-			table.Entry("AddressPool defined by address range", func() []metallbv1beta1.IPPool {
-				return []metallbv1beta1.IPPool{
+			table.Entry("AddressPool defined by address range", func() []metallbv1beta1.IPAddressPool {
+				return []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "l2-test",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								IPV4ServiceRange,
 								IPV6ServiceRange},
@@ -230,7 +230,7 @@ var _ = ginkgo.Describe("L2", func() {
 			}),
 			table.Entry("AddressPool defined by network prefix",
 
-				func() []metallbv1beta1.IPPool {
+				func() []metallbv1beta1.IPAddressPool {
 					var ipv4AddressesByCIDR []string
 					var ipv6AddressesByCIDR []string
 
@@ -245,12 +245,12 @@ var _ = ginkgo.Describe("L2", func() {
 					for _, cidr := range cidrs {
 						ipv6AddressesByCIDR = append(ipv6AddressesByCIDR, cidr.String())
 					}
-					return []metallbv1beta1.IPPool{
+					return []metallbv1beta1.IPAddressPool{
 						{
 							ObjectMeta: metav1.ObjectMeta{
 								Name: "l2-test",
 							},
-							Spec: metallbv1beta1.IPPoolSpec{
+							Spec: metallbv1beta1.IPAddressPoolSpec{
 								Addresses: append(ipv4AddressesByCIDR, ipv6AddressesByCIDR...),
 							},
 						},
@@ -261,12 +261,12 @@ var _ = ginkgo.Describe("L2", func() {
 
 	table.DescribeTable("different services sharing the same ip should advertise from the same node", func(ipRange *string) {
 		resources := internalconfig.ClusterResources{
-			Pools: []metallbv1beta1.IPPool{
+			Pools: []metallbv1beta1.IPAddressPool{
 				{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "l2-services-same-ip-test",
 					},
-					Spec: metallbv1beta1.IPPoolSpec{
+					Spec: metallbv1beta1.IPAddressPoolSpec{
 						Addresses: []string{
 							IPV4ServiceRange,
 							IPV6ServiceRange},
@@ -378,12 +378,12 @@ var _ = ginkgo.Describe("L2", func() {
 		table.DescribeTable("should be exposed by the controller", func(ipFamily string) {
 			poolName := "l2-metrics-test"
 			resources := internalconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: poolName,
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								IPV4ServiceRange,
 								IPV6ServiceRange},
@@ -534,7 +534,7 @@ var _ = ginkgo.Describe("L2", func() {
 	table.DescribeTable("validate requesting a specific address pool for Loadbalancer service", func(ipRange *string) {
 		var services []*corev1.Service
 		var servicesIngressIP []string
-		var pools []metallbv1beta1.IPPool
+		var pools []metallbv1beta1.IPAddressPool
 
 		namespace := f.Namespace.Name
 
@@ -543,11 +543,11 @@ var _ = ginkgo.Describe("L2", func() {
 			ip, err := config.GetIPFromRangeByIndex(*ipRange, i)
 			framework.ExpectNoError(err)
 			addressesRange := fmt.Sprintf("%s-%s", ip, ip)
-			pool := metallbv1beta1.IPPool{
+			pool := metallbv1beta1.IPAddressPool{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: fmt.Sprintf("test-addresspool%d", i+1),
 				},
-				Spec: metallbv1beta1.IPPoolSpec{
+				Spec: metallbv1beta1.IPAddressPoolSpec{
 					Addresses: []string{addressesRange},
 				},
 			}
@@ -575,7 +575,7 @@ var _ = ginkgo.Describe("L2", func() {
 
 			ginkgo.By("validate LoadBalancer IP is in the AddressPool range")
 			ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0])
-			err = config.ValidateIPInRange([]metallbv1beta1.IPPool{pool}, ingressIP)
+			err = config.ValidateIPInRange([]metallbv1beta1.IPAddressPool{pool}, ingressIP)
 			framework.ExpectNoError(err)
 
 			services = append(services, svc)
diff --git a/e2etest/pkg/config/parse.go b/e2etest/pkg/config/parse.go
index 12b0cc79..bd9496aa 100644
--- a/e2etest/pkg/config/parse.go
+++ b/e2etest/pkg/config/parse.go
@@ -28,21 +28,21 @@ func BFDProfileWithDefaults(profile metallbv1beta1.BFDProfile, multiHop bool) me
 	return res
 }
 
-// IPPoolToLegacy converts the given IPPool to the legacy addresspool.
-func IPPoolToLegacy(ippool metallbv1beta1.IPPool, protocol config.Proto, bgpAdv []metallbv1beta1.BGPAdvertisement) metallbv1beta1.AddressPool {
+// IPAddressPoolToLegacy converts the given IPAddressPool to the legacy addresspool.
+func IPAddressPoolToLegacy(ipAddressPool metallbv1beta1.IPAddressPool, protocol config.Proto, bgpAdv []metallbv1beta1.BGPAdvertisement) metallbv1beta1.AddressPool {
 	res := metallbv1beta1.AddressPool{
 		ObjectMeta: v1.ObjectMeta{
-			Name: ippool.Name,
+			Name: ipAddressPool.Name,
 		},
 		Spec: metallbv1beta1.AddressPoolSpec{
 			Protocol:          string(protocol),
 			Addresses:         make([]string, 0),
-			AutoAssign:        ippool.Spec.AutoAssign,
-			AvoidBuggyIPs:     ippool.Spec.AvoidBuggyIPs,
+			AutoAssign:        ipAddressPool.Spec.AutoAssign,
+			AvoidBuggyIPs:     ipAddressPool.Spec.AvoidBuggyIPs,
 			BGPAdvertisements: make([]metallbv1beta1.LegacyBgpAdvertisement, 0),
 		},
 	}
-	res.Spec.Addresses = append(res.Spec.Addresses, ippool.Spec.Addresses...)
+	res.Spec.Addresses = append(res.Spec.Addresses, ipAddressPool.Spec.Addresses...)
 
 	for _, adv := range bgpAdv {
 		legacy := metallbv1beta1.LegacyBgpAdvertisement{
diff --git a/e2etest/pkg/config/update.go b/e2etest/pkg/config/update.go
index 5c4e4fd7..5cc556d8 100644
--- a/e2etest/pkg/config/update.go
+++ b/e2etest/pkg/config/update.go
@@ -112,8 +112,8 @@ func (o beta1Updater) Update(r config.ClusterResources) error {
 			// the mutate function is expected to change the object when updating.
 			// we always override with the old version, and we change only the spec part.
 			switch toChange := obj.(type) {
-			case *metallbv1beta1.IPPool:
-				old := oldValues[i].(*metallbv1beta1.IPPool)
+			case *metallbv1beta1.IPAddressPool:
+				old := oldValues[i].(*metallbv1beta1.IPAddressPool)
 				toChange.Spec = *old.Spec.DeepCopy()
 			case *metallbv1beta1.AddressPool:
 				old := oldValues[i].(*metallbv1beta1.AddressPool)
@@ -142,7 +142,7 @@ func (o beta1Updater) Update(r config.ClusterResources) error {
 }
 
 func (o beta1Updater) Clean() error {
-	err := o.cli.DeleteAllOf(context.Background(), &metallbv1beta1.IPPool{}, client.InNamespace(o.namespace))
+	err := o.cli.DeleteAllOf(context.Background(), &metallbv1beta1.IPAddressPool{}, client.InNamespace(o.namespace))
 	if err != nil {
 		return err
 	}
diff --git a/e2etest/pkg/config/validate.go b/e2etest/pkg/config/validate.go
index 31b0710f..03504620 100644
--- a/e2etest/pkg/config/validate.go
+++ b/e2etest/pkg/config/validate.go
@@ -14,7 +14,7 @@ import (
 	"k8s.io/kubernetes/test/e2e/framework"
 )
 
-func ValidateIPInRange(addressPools []metallbv1beta1.IPPool, ip string) error {
+func ValidateIPInRange(addressPools []metallbv1beta1.IPAddressPool, ip string) error {
 	input := net.ParseIP(ip)
 	for _, addressPool := range addressPools {
 		for _, address := range addressPool.Spec.Addresses {
@@ -53,7 +53,7 @@ func GetIPFromRangeByIndex(ipRange string, index int) (string, error) {
 }
 
 // PoolCount returns the number of addresses in a given Pool.
-func PoolCount(p metallbv1beta1.IPPool) (int64, error) {
+func PoolCount(p metallbv1beta1.IPAddressPool) (int64, error) {
 	var total int64
 	for _, r := range p.Spec.Addresses {
 		cidrs, err := internalconfig.ParseCIDR(r)
diff --git a/e2etest/webhookstests/webhooks.go b/e2etest/webhookstests/webhooks.go
index a36c2384..e8b7e70a 100644
--- a/e2etest/webhookstests/webhooks.go
+++ b/e2etest/webhookstests/webhooks.go
@@ -41,7 +41,7 @@ var _ = ginkgo.Describe("Webhooks", func() {
 		framework.ExpectNoError(err)
 	})
 
-	ginkgo.Context("For IPPool", func() {
+	ginkgo.Context("For IPAddressPool", func() {
 		ginkgo.AfterEach(func() {
 			// Clean previous configuration.
 			err := ConfigUpdater.Clean()
@@ -49,14 +49,14 @@ var _ = ginkgo.Describe("Webhooks", func() {
 		})
 
 		ginkgo.It("Should recognize overlapping addresses in two AddressPools", func() {
-			ginkgo.By("Creating first IPPool")
+			ginkgo.By("Creating first IPAddressPool")
 			resources := metallbconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "webhooks-test1",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.1.1.1-1.1.1.100",
 							},
@@ -67,12 +67,12 @@ var _ = ginkgo.Describe("Webhooks", func() {
 			err := ConfigUpdater.Update(resources)
 			framework.ExpectNoError(err)
 
-			ginkgo.By("Creating second IPPool with overlapping addresses defined by address range")
-			resources.Pools = append(resources.Pools, metallbv1beta1.IPPool{
+			ginkgo.By("Creating second IPAddressPool with overlapping addresses defined by address range")
+			resources.Pools = append(resources.Pools, metallbv1beta1.IPAddressPool{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "webhooks-test2",
 				},
-				Spec: metallbv1beta1.IPPoolSpec{
+				Spec: metallbv1beta1.IPAddressPoolSpec{
 					Addresses: []string{
 						"1.1.1.15-1.1.1.20",
 					},
@@ -82,12 +82,12 @@ var _ = ginkgo.Describe("Webhooks", func() {
 			framework.ExpectError(err)
 			Expect(err.Error()).To(ContainSubstring("overlaps with already defined CIDR"))
 
-			ginkgo.By("Creating second valid IPPool")
+			ginkgo.By("Creating second valid IPAddressPool")
 			resources.Pools[1].Spec.Addresses = []string{"1.1.1.101-1.1.1.200"}
 			err = ConfigUpdater.Update(resources)
 			framework.ExpectNoError(err)
 
-			ginkgo.By("Updating second IPPool addresses to overlapping addresses defined by network prefix")
+			ginkgo.By("Updating second IPAddressPool addresses to overlapping addresses defined by network prefix")
 			resources.Pools[1].Spec.Addresses = []string{"1.1.1.0/24"}
 			err = ConfigUpdater.Update(resources)
 			framework.ExpectError(err)
@@ -164,12 +164,12 @@ var _ = ginkgo.Describe("Webhooks", func() {
 		ginkgo.It("Should recognize invalid AggregationLength", func() {
 			ginkgo.By("Creating AddressPool")
 			resources := metallbconfig.ClusterResources{
-				Pools: []metallbv1beta1.IPPool{
+				Pools: []metallbv1beta1.IPAddressPool{
 					{
 						ObjectMeta: metav1.ObjectMeta{
 							Name: "pool-webhooks-test",
 						},
-						Spec: metallbv1beta1.IPPoolSpec{
+						Spec: metallbv1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.1.1.0/28",
 							},
@@ -188,7 +188,7 @@ var _ = ginkgo.Describe("Webhooks", func() {
 					},
 					Spec: metallbv1beta1.BGPAdvertisementSpec{
 						AggregationLength: pointer.Int32Ptr(26),
-						IPPools:           []string{"pool-webhooks-test"},
+						IPAddressPools:    []string{"pool-webhooks-test"},
 					},
 				},
 			}
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index 08db4fa5..fa3a1307 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -89,12 +89,12 @@ func TestParse(t *testing.T) {
 						},
 					},
 				},
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool1",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"10.20.0.0/16",
 								"10.50.0.0/24",
@@ -107,7 +107,7 @@ func TestParse(t *testing.T) {
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool2",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"30.0.0.0/8",
 							},
@@ -117,7 +117,7 @@ func TestParse(t *testing.T) {
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool3",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"40.0.0.0/25",
 								"40.0.0.150-40.0.0.200",
@@ -130,7 +130,7 @@ func TestParse(t *testing.T) {
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool4",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"2001:db8::/64",
 							},
@@ -146,7 +146,7 @@ func TestParse(t *testing.T) {
 							AggregationLength: pointer.Int32Ptr(32),
 							LocalPref:         uint32(100),
 							Communities:       []string{ /* TODO CRD Add communities"bar", */ "1234:2345"},
-							IPPools:           []string{"pool1"},
+							IPAddressPools:    []string{"pool1"},
 						},
 					},
 					{
@@ -156,7 +156,7 @@ func TestParse(t *testing.T) {
 						Spec: v1beta1.BGPAdvertisementSpec{
 							AggregationLength:   pointer.Int32Ptr(24),
 							AggregationLengthV6: pointer.Int32Ptr(64),
-							IPPools:             []string{"pool1"},
+							IPAddressPools:      []string{"pool1"},
 						},
 					},
 					{
@@ -164,7 +164,7 @@ func TestParse(t *testing.T) {
 							Name: "adv3",
 						},
 						Spec: v1beta1.BGPAdvertisementSpec{
-							IPPools: []string{"pool2"},
+							IPAddressPools: []string{"pool2"},
 						},
 					},
 				},
@@ -174,7 +174,7 @@ func TestParse(t *testing.T) {
 							Name: "l2adv1",
 						},
 						Spec: v1beta1.L2AdvertisementSpec{
-							IPPools: []string{"pool3"},
+							IPAddressPools: []string{"pool3"},
 						},
 					},
 					{
@@ -521,7 +521,7 @@ func TestParse(t *testing.T) {
 		{
 			desc: "no pool name",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{},
 				},
 			},
@@ -529,10 +529,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "address pool with no address",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec:       v1beta1.IPPoolSpec{},
+						Spec:       v1beta1.IPAddressPoolSpec{},
 					},
 				},
 			},
@@ -540,7 +540,7 @@ func TestParse(t *testing.T) {
 		{
 			desc: "address pool with no protocol",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
 					},
@@ -550,10 +550,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "invalid pool CIDR",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"100.200.300.400/24",
 							},
@@ -565,10 +565,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "invalid pool CIDR prefix length",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.0/33",
 							},
@@ -580,10 +580,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "invalid pool CIDR, first address of the range is after the second",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.10-1.2.3.1",
 							},
@@ -595,10 +595,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "simple advertisement",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.0/24",
 							},
@@ -633,10 +633,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "advertisement with default BGP settings",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.0/24",
 							},
@@ -671,10 +671,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "bad aggregation length (too long)",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.10-1.2.3.1",
 							},
@@ -693,10 +693,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "bad aggregation length (incompatible with CIDR)",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"10.20.30.40/24",
 								"1.2.3.0/28",
@@ -716,10 +716,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "aggregation length by range",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"3.3.3.2-3.3.3.254",
 							},
@@ -768,10 +768,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "aggregation length by range, too wide",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"3.3.3.2-3.3.3.254",
 							},
@@ -832,18 +832,18 @@ func TestParse(t *testing.T) {
 		{
 			desc: "duplicate pool definition",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec:       v1beta1.IPPoolSpec{},
+						Spec:       v1beta1.IPAddressPoolSpec{},
 					},
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool2"},
-						Spec:       v1beta1.IPPoolSpec{},
+						Spec:       v1beta1.IPAddressPoolSpec{},
 					},
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec:       v1beta1.IPPoolSpec{},
+						Spec:       v1beta1.IPAddressPoolSpec{},
 					},
 				},
 			},
@@ -851,10 +851,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "duplicate CIDRs",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								" 10.0.0.0/8",
 							},
@@ -862,7 +862,7 @@ func TestParse(t *testing.T) {
 					},
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool2"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								" 10.0.0.0/8",
 							},
@@ -874,10 +874,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "overlapping CIDRs",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								" 10.0.0.0/8",
 							},
@@ -885,7 +885,7 @@ func TestParse(t *testing.T) {
 					},
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool2"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"10.0.0.0/16",
 							},
@@ -907,12 +907,12 @@ func TestParse(t *testing.T) {
 						},
 					},
 				},
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool1",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.0/24",
 							},
@@ -1088,12 +1088,12 @@ func TestParse(t *testing.T) {
 						},
 					},
 				},
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool1",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.0/24",
 							},
@@ -1112,12 +1112,12 @@ func TestParse(t *testing.T) {
 		{
 			desc: "Multiple BFD Profiles with the same name",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool1",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.0/24",
 							},
@@ -1146,12 +1146,12 @@ func TestParse(t *testing.T) {
 		{
 			desc: "Session with nondefault BFD Profile",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool1",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"1.2.3.0/24",
 							},
@@ -1259,12 +1259,12 @@ func TestParse(t *testing.T) {
 						},
 					},
 				},
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool1",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"10.20.0.0/16",
 								"10.50.0.0/24",
@@ -1320,7 +1320,7 @@ func TestParse(t *testing.T) {
 							AggregationLength: pointer.Int32Ptr(32),
 							LocalPref:         uint32(100),
 							Communities:       []string{"1234:2345"},
-							IPPools:           []string{"pool1"},
+							IPAddressPools:    []string{"pool1"},
 						},
 					},
 				},
@@ -1383,12 +1383,12 @@ func TestParse(t *testing.T) {
 		{
 			desc: "config mixing legacy pools with IP pools with overlapping ips",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{
 							Name: "pool1",
 						},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{
 								"10.20.0.0/16",
 								"10.50.0.0/24",
@@ -1432,10 +1432,10 @@ func TestParse(t *testing.T) {
 		{
 			desc: "Duplicate communities definition",
 			crs: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
 						ObjectMeta: v1.ObjectMeta{Name: "pool1"},
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Protocol: "bgp",
 							Addresses: []string{
 								"10.20.0.0/16",
diff --git a/internal/config/validation_test.go b/internal/config/validation_test.go
index 47d489b9..3c0e6a17 100644
--- a/internal/config/validation_test.go
+++ b/internal/config/validation_test.go
@@ -52,9 +52,9 @@ func TestValidate(t *testing.T) {
 		{
 			desc: "v6 address",
 			config: ClusterResources{
-				Pools: []v1beta1.IPPool{
+				Pools: []v1beta1.IPAddressPool{
 					{
-						Spec: v1beta1.IPPoolSpec{
+						Spec: v1beta1.IPAddressPoolSpec{
 							Addresses: []string{"2001:db8::/64"},
 						},
 					},