Repository: kubernetes-sigs/cluster-api
Pull request #6371 (2022-04-04 13:29:34)

:seedling:  Update golangci-lint action
Signed-off-by: killianmuldoon <kmuldoon@vmware.com>

Add explicit version for the golangci lint go version to the release 1.1 branch. Mirrors changes made in #6356 





Patch:
diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml
index 7288be9a0..f96de0d35 100644
--- a/.github/workflows/golangci-lint.yml
+++ b/.github/workflows/golangci-lint.yml
@@ -13,9 +13,12 @@ jobs:
           - test
           - hack/tools
     steps:
-      - uses: actions/checkout@v2
+      - uses: actions/checkout@v3
+      - uses: actions/setup-go@v3
+        with:
+          go-version: 1.17
       - name: golangci-lint
-        uses: golangci/golangci-lint-action@v2
+        uses: golangci/golangci-lint-action@v3.1.0
         with:
           version: v1.43.0
           working-directory: ${{matrix.working-directory}}
diff --git a/.gitignore b/.gitignore
index 3fecc4d01..3672d0053 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,8 +61,6 @@ vendor
 # User-supplied Tiltfile extensions, settings, and builds
 tilt.d
 tilt-settings.json
-tilt-settings.yaml
-tilt_modules
 .tiltbuild
 
 # User-supplied clusterctl hacks settings
@@ -76,4 +74,4 @@ out
 _releasenotes
 
 # Helm
-.helm
+.helm
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index be050b267..4eaa7ca20 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -111,12 +111,11 @@ this should generally not be the case.
 
 Cluster API maintains the most recent release branch for all supported API and contract versions. Support for this section refers to the ability to backport and release patch versions.
 
-| API Version   | Branch      | Supported Until |
-| ------------- |-------------|-----------------|
-| **v1beta1**   | release-1.1 | current stable  |
-| **v1beta1**   | release-1.0 | 2022-02-02      |
-| **v1alpha4**  | release-0.4 | 2022-04-06      |
-| **v1alpha3**  | release-0.3 | 2022-02-23      |
+| API Version   | Branch | Supported Until |
+| ------------- | ----------- | ---------- |
+| **v1beta1**   | release-1.0 | current stable |
+| **v1alpha4**  | release-0.4 | 2022-04-06 |
+| **v1alpha3**  | release-0.3 | 2022-02-23 |
 
 - The API version is determined from the GroupVersion defined in the top-level `api/` package.
 - The EOL date is determined from the last release available once a new API version is published.
diff --git a/Makefile b/Makefile
index 63a7a96d9..1711e6e04 100644
--- a/Makefile
+++ b/Makefile
@@ -757,4 +757,4 @@ $(KUSTOMIZE): # Download kustomize using hack script into tools folder.
 $(GOLANGCI_LINT): .github/workflows/golangci-lint.yml # Download golanci-lint using hack script into tools folder.
 	hack/ensure-golangci-lint.sh \
 		-b $(TOOLS_DIR)/$(BIN_DIR) \
-		$(shell cat .github/workflows/golangci-lint.yml | grep version | sed 's/.*version: //')
+		$(shell cat .github/workflows/golangci-lint.yml | grep [[:space:]]version | sed 's/.*version: //')
diff --git a/cmd/clusterctl/client/cluster/components.go b/cmd/clusterctl/client/cluster/components.go
index 09be0b827..3b56bae49 100644
--- a/cmd/clusterctl/client/cluster/components.go
+++ b/cmd/clusterctl/client/cluster/components.go
@@ -212,18 +212,12 @@ func (p *providerComponents) Delete(options DeleteOptions) error {
 
 		// Otherwise delete the object
 		log.V(5).Info("Deleting", logf.UnstructuredToValues(obj)...)
-		deleteBackoff := newWriteBackoff()
-		if err := retryWithExponentialBackoff(deleteBackoff, func() error {
-			if err := cs.Delete(ctx, &obj); err != nil {
-				if apierrors.IsNotFound(err) {
-					// Tolerate IsNotFound error that might happen because we are not enforcing a deletion order
-					// that considers relation across objects (e.g. Deployments -> ReplicaSets -> Pods)
-					return nil
-				}
-				return err
+		if err := cs.Delete(ctx, &obj); err != nil {
+			if apierrors.IsNotFound(err) {
+				// Tolerate IsNotFound error that might happen because we are not enforcing a deletion order
+				// that considers relation across objects (e.g. Deployments -> ReplicaSets -> Pods)
+				continue
 			}
-			return nil
-		}); err != nil {
 			errList = append(errList, errors.Wrapf(err, "Error deleting object %s, %s/%s", obj.GroupVersionKind(), obj.GetNamespace(), obj.GetName()))
 		}
 	}
diff --git a/cmd/clusterctl/client/cluster/proxy.go b/cmd/clusterctl/client/cluster/proxy.go
index dc7329a1a..cfd834eae 100644
--- a/cmd/clusterctl/client/cluster/proxy.go
+++ b/cmd/clusterctl/client/cluster/proxy.go
@@ -23,6 +23,7 @@ import (
 
 	"github.com/pkg/errors"
 	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime/schema"
@@ -358,13 +359,11 @@ func listObjByGVK(c client.Client, groupVersion, kind string, options []client.L
 	objList.SetAPIVersion(groupVersion)
 	objList.SetKind(kind)
 
-	resourceListBackoff := newReadBackoff()
-	if err := retryWithExponentialBackoff(resourceListBackoff, func() error {
-		return c.List(ctx, objList, options...)
-	}); err != nil {
-		return nil, errors.Wrapf(err, "failed to list objects for the %q GroupVersionKind", objList.GroupVersionKind())
+	if err := c.List(ctx, objList, options...); err != nil {
+		if !apierrors.IsNotFound(err) {
+			return nil, errors.Wrapf(err, "failed to list objects for the %q GroupVersionKind", objList.GroupVersionKind())
+		}
 	}
-
 	return objList, nil
 }
 
diff --git a/cmd/clusterctl/client/cluster/topology.go b/cmd/clusterctl/client/cluster/topology.go
index b8df88d72..40ca1fa1d 100644
--- a/cmd/clusterctl/client/cluster/topology.go
+++ b/cmd/clusterctl/client/cluster/topology.go
@@ -222,12 +222,6 @@ func (t *topologyClient) Plan(in *TopologyPlanInput) (*TopologyPlanOutput, error
 // - no more than 1 cluster in the input.
 // - no more than 1 clusterclass in the input.
 func (t *topologyClient) validateInput(in *TopologyPlanInput) error {
-	// Check if objects of the same Group.Kind are using the same version.
-	// Note: This is because the dryrun client does not guarantee any coversions.
-	if !hasUniqueVersionPerGroupKind(in.Objs) {
-		return fmt.Errorf("objects of the same Group.Kind should use the same apiVersion")
-	}
-
 	// Check all the objects in the input belong to the same namespace.
 	// Note: It is okay if all the objects in the input do not have any namespace.
 	// In such case, the list of unique namespaces will be [""].
@@ -286,10 +280,8 @@ func (t *topologyClient) setMissingNamespaces(currentNamespace string, objs []*u
 		}
 	}
 	// Set namespace on objects that do not have namespace value.
-	// Skip Namespace objects, as they are non-namespaced.
 	for i := range objs {
-		isNamespace := objs[i].GroupVersionKind().Kind == namespaceKind
-		if objs[i].GetNamespace() == "" && !isNamespace {
+		if objs[i].GetNamespace() == "" {
 			objs[i].SetNamespace(currentNamespace)
 		}
 	}
@@ -507,7 +499,6 @@ func (t *topologyClient) generateCRDs(objs []*unstructured.Unstructured) []*apie
 	crds := []*apiextensionsv1.CustomResourceDefinition{}
 	crdMap := map[string]bool{}
 	var gvk schema.GroupVersionKind
-
 	for _, obj := range objs {
 		gvk = obj.GroupVersionKind()
 		if strings.HasSuffix(gvk.Group, ".cluster.x-k8s.io") && !crdMap[gvk.String()] {
@@ -519,8 +510,7 @@ func (t *topologyClient) generateCRDs(objs []*unstructured.Unstructured) []*apie
 				ObjectMeta: metav1.ObjectMeta{
 					Name: fmt.Sprintf("%s.%s", flect.Pluralize(strings.ToLower(gvk.Kind)), gvk.Group),
 					Labels: map[string]string{
-						// Here we assume that all the versions are compatible with the Cluster API contract version.
-						clusterv1.GroupVersion.String(): gvk.Version,
+						clusterv1.GroupVersion.String(): clusterv1.GroupVersion.Version,
 					},
 				},
 			}
@@ -528,7 +518,6 @@ func (t *topologyClient) generateCRDs(objs []*unstructured.Unstructured) []*apie
 			crdMap[gvk.String()] = true
 		}
 	}
-
 	return crds
 }
 
@@ -692,14 +681,6 @@ func clusterClassUsesTemplate(cc *clusterv1.ClusterClass, templateRef *corev1.Ob
 func uniqueNamespaces(objs []*unstructured.Unstructured) []string {
 	ns := sets.NewString()
 	for _, obj := range objs {
-		// Namespace objects do not have metadata.namespace set, but we can add the
-		// name of the obj to the namespace list, as it is another unique namespace.
-		isNamespace := obj.GroupVersionKind().Kind == namespaceKind
-		if isNamespace {
-			ns.Insert(obj.GetName())
-			continue
-		}
-
 		// Note: treat empty namespace (namespace not set) as a unique namespace.
 		// If some have a namespace set and some do not. It is safer to consider them as
 		// objects from different namespaces.
@@ -707,16 +688,3 @@ func uniqueNamespaces(objs []*unstructured.Unstructured) []string {
 	}
 	return ns.List()
 }
-
-func hasUniqueVersionPerGroupKind(objs []*unstructured.Unstructured) bool {
-	versionMap := map[string]string{}
-	for _, obj := range objs {
-		gvk := obj.GroupVersionKind()
-		gk := gvk.GroupKind().String()
-		if ver, ok := versionMap[gk]; ok && ver != gvk.Version {
-			return false
-		}
-		versionMap[gk] = gvk.Version
-	}
-	return true
-}
diff --git a/cmd/clusterctl/client/config/providers_client.go b/cmd/clusterctl/client/config/providers_client.go
index a34e52ced..5d1b5404e 100644
--- a/cmd/clusterctl/client/config/providers_client.go
+++ b/cmd/clusterctl/client/config/providers_client.go
@@ -45,7 +45,6 @@ const (
 	IBMCloudProviderName  = "ibmcloud"
 	Metal3ProviderName    = "metal3"
 	NestedProviderName    = "nested"
-	OCIProviderName       = "oci"
 	OpenStackProviderName = "openstack"
 	PacketProviderName    = "packet"
 	SideroProviderName    = "sidero"
@@ -156,11 +155,6 @@ func (p *providersClient) defaults() []Provider {
 			url:          "https://github.com/kubernetes-sigs/cluster-api-provider-nested/releases/latest/infrastructure-components.yaml",
 			providerType: clusterctlv1.InfrastructureProviderType,
 		},
-		&provider{
-			name:         OCIProviderName,
-			url:          "https://github.com/oracle/cluster-api-provider-oci/releases/latest/infrastructure-components.yaml",
-			providerType: clusterctlv1.InfrastructureProviderType,
-		},
 		&provider{
 			name:         OpenStackProviderName,
 			url:          "https://github.com/kubernetes-sigs/cluster-api-provider-openstack/releases/latest/infrastructure-components.yaml",
@@ -168,7 +162,7 @@ func (p *providersClient) defaults() []Provider {
 		},
 		&provider{
 			name:         SideroProviderName,
-			url:          "https://github.com/siderolabs/sidero/releases/latest/infrastructure-components.yaml",
+			url:          "https://github.com/talos-systems/sidero/releases/latest/infrastructure-components.yaml",
 			providerType: clusterctlv1.InfrastructureProviderType,
 		},
 		&provider{
@@ -205,7 +199,7 @@ func (p *providersClient) defaults() []Provider {
 		},
 		&provider{
 			name:         TalosBootstrapProviderName,
-			url:          "https://github.com/siderolabs/cluster-api-bootstrap-provider-talos/releases/latest/bootstrap-components.yaml",
+			url:          "https://github.com/talos-systems/cluster-api-bootstrap-provider-talos/releases/latest/bootstrap-components.yaml",
 			providerType: clusterctlv1.BootstrapProviderType,
 		},
 		&provider{
@@ -221,7 +215,7 @@ func (p *providersClient) defaults() []Provider {
 		},
 		&provider{
 			name:         TalosControlPlaneProviderName,
-			url:          "https://github.com/siderolabs/cluster-api-control-plane-provider-talos/releases/latest/control-plane-components.yaml",
+			url:          "https://github.com/talos-systems/cluster-api-control-plane-provider-talos/releases/latest/control-plane-components.yaml",
 			providerType: clusterctlv1.ControlPlaneProviderType,
 		},
 		&provider{
diff --git a/docs/book/src/clusterctl/commands/alpha-topology-plan.md b/docs/book/src/clusterctl/commands/alpha-topology-plan.md
index ffa86a621..3b28cec73 100644
--- a/docs/book/src/clusterctl/commands/alpha-topology-plan.md
+++ b/docs/book/src/clusterctl/commands/alpha-topology-plan.md
@@ -424,17 +424,6 @@ or validation on these objects. Defaulting and validation is only run on Cluster
 
 </aside>
 
-<aside class="note warning">
-
-<h1>API Versions and Contract compatibility</h1>
-
-All the objects in the input of the same `Group.Kind` should have the same `apiVersion`. 
-Example: Two `InfraMachineTemplate`s with `apiVersion`s `infrastructure.cluster.x-k8s.io/v1beta1` and `infrastructure.cluster.x-k8s.io/v1alpha4` are not allowed.
-
-The API version of resource in the input should be compatible with the current version of Cluster API contract.
-
-</aside>
-
 ### `--output-directory`, `-o` (REQUIRED)
 
 Information about the objects that are created and updated is written to this directory.
diff --git a/docs/book/src/clusterctl/provider-contract.md b/docs/book/src/clusterctl/provider-contract.md
index 8bdcaafc6..fcb02587a 100644
--- a/docs/book/src/clusterctl/provider-contract.md
+++ b/docs/book/src/clusterctl/provider-contract.md
@@ -198,7 +198,6 @@ providers.
 |CAPN          | cluster.x-k8s.io/provider=infrastructure-nested        |
 |CAPP          | cluster.x-k8s.io/provider=infrastructure-packet        |
 |CAPZ          | cluster.x-k8s.io/provider=infrastructure-azure         |
-|CAPOCI        | cluster.x-k8s.io/provider=infrastructure-oci           |
 |CAPO          | cluster.x-k8s.io/provider=infrastructure-openstack     |
 |CAPDO         | cluster.x-k8s.io/provider=infrastructure-digitalocean  |
 |CAPG          | cluster.x-k8s.io/provider=infrastructure-gcp           |
diff --git a/docs/book/src/developer/architecture/controllers/cluster-topology.md b/docs/book/src/developer/architecture/controllers/cluster-topology.md
index b1dd4bdfe..6f9eb1404 100644
--- a/docs/book/src/developer/architecture/controllers/cluster-topology.md
+++ b/docs/book/src/developer/architecture/controllers/cluster-topology.md
@@ -16,4 +16,4 @@ The high level workflow of ClusterTopology reconciliation is shown below.
 
 ### Additional information
 
-* See ClusterClass [proposal](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210526-cluster-class-and-managed-topologies.md#basic-behaviors)
+* See ClusterClass [proposal](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/202105256-cluster-class-and-managed-topologies.md#basic-behaviors)
diff --git a/docs/book/src/developer/providers/implementers-guide/configure.md b/docs/book/src/developer/providers/implementers-guide/configure.md
index 6cecdc634..5b8d03e77 100644
--- a/docs/book/src/developer/providers/implementers-guide/configure.md
+++ b/docs/book/src/developer/providers/implementers-guide/configure.md
@@ -46,7 +46,7 @@ patchesStrategicMerge
 - manager_config.yaml
 ```
 
-[kustomizeyaml]: https://kubectl.docs.kubernetes.io/references/kustomize/kustomization
+[kustomizeyaml]: https://github.com/kubernetes-sigs/kustomize/blob/master/docs/glossary.md#kustomization
 [patch]: https://git.k8s.io/community/contributors/devel/sig-api-machinery/strategic-merge-patch.md
 
 ## Our configuration
diff --git a/docs/book/src/reference/glossary.md b/docs/book/src/reference/glossary.md
index 2d9cdb8b4..874ac15bb 100644
--- a/docs/book/src/reference/glossary.md
+++ b/docs/book/src/reference/glossary.md
@@ -59,9 +59,6 @@ Cluster API Provider Nested
 ### CAPO
 Cluster API Provider OpenStack
 
-### CAPOCI
-Cluster API Provider Oracle Cloud Infrastructure (OCI)
-
 ### CAPV
 Cluster API Provider vSphere
 
diff --git a/docs/book/src/reference/providers.md b/docs/book/src/reference/providers.md
index 855c56707..a2f0820cd 100644
--- a/docs/book/src/reference/providers.md
+++ b/docs/book/src/reference/providers.md
@@ -7,7 +7,7 @@ updated info about which API version they are supporting.
 
 ## Bootstrap
 - [Kubeadm](https://github.com/kubernetes-sigs/cluster-api/tree/main/bootstrap/kubeadm)
-- [Talos](https://github.com/siderolabs/cluster-api-bootstrap-provider-talos)
+- [Talos](https://github.com/talos-systems/cluster-api-bootstrap-provider-talos)
 - [EKS](https://github.com/kubernetes-sigs/cluster-api-provider-aws/tree/main/bootstrap/eks)
 
 ## Infrastructure
@@ -28,7 +28,7 @@ updated info about which API version they are supporting.
 - [Nested](https://github.com/kubernetes-sigs/cluster-api-provider-nested)
 - [OpenStack](https://github.com/kubernetes-sigs/cluster-api-provider-openstack)
 - [Equinix Metal (formerly Packet)](https://github.com/kubernetes-sigs/cluster-api-provider-packet)
-- [Sidero](https://github.com/siderolabs/sidero)
+- [Sidero](https://github.com/talos-systems/sidero)
 - [Tencent Cloud](https://github.com/TencentCloud/cluster-api-provider-tencent)
 - [vSphere](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere)
 
diff --git a/docs/book/src/tasks/experimental-features/cluster-class/change-clusterclass.md b/docs/book/src/tasks/experimental-features/cluster-class/change-clusterclass.md
index fb8eda732..ea1c7b534 100644
--- a/docs/book/src/tasks/experimental-features/cluster-class/change-clusterclass.md
+++ b/docs/book/src/tasks/experimental-features/cluster-class/change-clusterclass.md
@@ -114,7 +114,7 @@ potentially dangerous changes on those objects.
 
 </aside>
 
-For additional info see [compatibility rules](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210526-cluster-class-and-managed-topologies.md#clusterclass-compatibility)
+For additional info see [compatibility rules](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/202105256-cluster-class-and-managed-topologies.md#clusterclass-compatibility)
 defined in the ClusterClass proposal.
 
 ## Planning ClusterClass changes
diff --git a/docs/book/src/tasks/experimental-features/cluster-class/index.md b/docs/book/src/tasks/experimental-features/cluster-class/index.md
index 60851406a..063b5d923 100644
--- a/docs/book/src/tasks/experimental-features/cluster-class/index.md
+++ b/docs/book/src/tasks/experimental-features/cluster-class/index.md
@@ -8,7 +8,7 @@ ClusterClass is a powerful abstraction implemented on top of existing interfaces
 **Variable name to enable/disable the feature gate**: `CLUSTER_TOPOLOGY`
 
 Additional documentation:
-* Background information:  [ClusterClass and Managed Topologies CAEP](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210526-cluster-class-and-managed-topologies.md)
+* Background information:  [ClusterClass and Managed Topologies CAEP](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/202105256-cluster-class-and-managed-topologies.md)
 * For ClusterClass authors:
     * [Writing a ClusterClass](./write-clusterclass.md)
     * [Changing a ClusterClass](./change-clusterclass.md)
diff --git a/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md b/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md
index a8d5136d5..3017c41e7 100644
--- a/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md
+++ b/docs/book/src/tasks/experimental-features/cluster-class/write-clusterclass.md
@@ -382,7 +382,6 @@ In addition to variables specified in the ClusterClass, the following builtin va
 referenced in patches:
 - `builtin.cluster.{name,namespace}`
 - `builtin.cluster.topology.{version,class}`
-- `builtin.cluster.network.{serviceDomain,services,pods,ipFamily}`
 - `builtin.controlPlane.{replicas,version,name}`
     - Please note, these variables are only available when patching control plane or control plane 
       machine templates.
diff --git a/docs/book/src/user/quick-start.md b/docs/book/src/user/quick-start.md
index a58a7c4d6..333486456 100644
--- a/docs/book/src/user/quick-start.md
+++ b/docs/book/src/user/quick-start.md
@@ -185,7 +185,7 @@ Additional documentation about experimental features can be found in [Experiment
 Depending on the infrastructure provider you are planning to use, some additional prerequisites should be satisfied
 before getting started with Cluster API. See below for the expected settings for common providers.
 
-{{#tabs name:"tab-installation-infrastructure" tabs:"AWS,Azure,DigitalOcean,Docker,Equinix Metal,GCP,Hetzner,Metal3,OCI,OpenStack,vSphere"}}
+{{#tabs name:"tab-installation-infrastructure" tabs:"AWS,Azure,DigitalOcean,Docker,Equinix Metal,GCP,Hetzner,Metal3,OpenStack,vSphere"}}
 {{#tab AWS}}
 
 Download the latest binary of `clusterawsadm` from the [AWS provider releases] and make sure to place it in your path.
@@ -312,11 +312,6 @@ Please visit the [Hetzner project][Hetzner provider].
 
 Please visit the [Metal3 project][Metal3 provider].
 
-{{#/tab }}
-{{#tab OCI}}
-
-Please follow the Cluster API Provider for [Oracle Cloud Infrastructure (OCI) Getting Started Guide][oci-provider]
-
 {{#/tab }}
 {{#tab OpenStack}}
 
@@ -840,7 +835,6 @@ See the [clusterctl] documentation for more detail about clusterctl supported ac
 [management cluster]: ../reference/glossary.md#management-cluster
 [Metal3 getting started guide]: https://github.com/metal3-io/cluster-api-provider-metal3/blob/master/docs/getting-started.md
 [Metal3 provider]: https://github.com/metal3-io/cluster-api-provider-metal3/
-[oci-provider]: https://oracle.github.io/cluster-api-provider-oci/#getting-started
 [Equinix Metal getting started guide]: https://github.com/kubernetes-sigs/cluster-api-provider-packet#using
 [provider]:../reference/providers.md
 [provider components]: ../reference/glossary.md#provider-components
diff --git a/docs/proposals/202105256-cluster-class-and-managed-topologies.md b/docs/proposals/202105256-cluster-class-and-managed-topologies.md
index 3809f8082..d10296b69 100644
--- a/docs/proposals/202105256-cluster-class-and-managed-topologies.md
+++ b/docs/proposals/202105256-cluster-class-and-managed-topologies.md
@@ -649,7 +649,6 @@ Note: Builtin variables are defined in [Builtin variables](#builtin-variables) b
 It’s also possible to use so-called builtin variables in addition to user-defined variables. The following builtin variables are available:
 - `builtin.cluster.{name,namespace}`
 - `builtin.cluster.topology.{version,class}`
-- `builtin.cluster.network.{serviceDomain,services,pods,ipFamily}`
 - `builtin.controlPlane.{replicas,version,name}`
     - **Note**: these variables are only available when patching control plane or control plane machine templates.
 - `builtin.controlPlane.machineTemplate.infrastructureRef.name`
diff --git a/exp/api/v1beta1/machinepool_webhook.go b/exp/api/v1beta1/machinepool_webhook.go
index 73cb9bc48..32b3bba54 100644
--- a/exp/api/v1beta1/machinepool_webhook.go
+++ b/exp/api/v1beta1/machinepool_webhook.go
@@ -18,7 +18,6 @@ package v1beta1
 
 import (
 	"fmt"
-	"strings"
 
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -28,7 +27,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook"
 
 	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
-	"sigs.k8s.io/cluster-api/util/version"
 )
 
 func (m *MachinePool) SetupWebhookWithManager(mgr ctrl.Manager) error {
@@ -65,12 +63,6 @@ func (m *MachinePool) Default() {
 	if m.Spec.Template.Spec.InfrastructureRef.Namespace == "" {
 		m.Spec.Template.Spec.InfrastructureRef.Namespace = m.Namespace
 	}
-
-	// tolerate version strings without a "v" prefix: prepend it if it's not there.
-	if m.Spec.Template.Spec.Version != nil && !strings.HasPrefix(*m.Spec.Template.Spec.Version, "v") {
-		normalizedVersion := "v" + *m.Spec.Template.Spec.Version
-		m.Spec.Template.Spec.Version = &normalizedVersion
-	}
 }
 
 // ValidateCreate implements webhook.Validator so a webhook will be registered for the type.
@@ -133,12 +125,6 @@ func (m *MachinePool) validate(old *MachinePool) error {
 		)
 	}
 
-	if m.Spec.Template.Spec.Version != nil {
-		if !version.KubeSemver.MatchString(*m.Spec.Template.Spec.Version) {
-			allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "template", "spec", "version"), *m.Spec.Template.Spec.Version, "must be a valid semantic version"))
-		}
-	}
-
 	if len(allErrs) == 0 {
 		return nil
 	}
diff --git a/exp/internal/controllers/machinepool_controller_noderef.go b/exp/internal/controllers/machinepool_controller_noderef.go
index 7b749c8b4..466f8c33d 100644
--- a/exp/internal/controllers/machinepool_controller_noderef.go
+++ b/exp/internal/controllers/machinepool_controller_noderef.go
@@ -68,7 +68,7 @@ func (r *MachinePoolReconciler) reconcileNodeRefs(ctx context.Context, cluster *
 	log = log.WithValues("cluster", cluster.Name)
 
 	// Check that the MachinePool has valid ProviderIDList.
-	if len(mp.Spec.ProviderIDList) == 0 && (mp.Spec.Replicas == nil || *mp.Spec.Replicas != 0) {
+	if len(mp.Spec.ProviderIDList) == 0 {
 		log.V(2).Info("MachinePool doesn't have any ProviderIDs yet")
 		return ctrl.Result{}, nil
 	}
diff --git a/exp/internal/controllers/machinepool_controller_phases.go b/exp/internal/controllers/machinepool_controller_phases.go
index ea0748d8c..4f8921842 100644
--- a/exp/internal/controllers/machinepool_controller_phases.go
+++ b/exp/internal/controllers/machinepool_controller_phases.go
@@ -274,8 +274,11 @@ func (r *MachinePoolReconciler) reconcileInfrastructure(ctx context.Context, clu
 
 	var providerIDList []string
 	// Get Spec.ProviderIDList from the infrastructure provider.
-	if err := util.UnstructuredUnmarshalField(infraConfig, &providerIDList, "spec", "providerIDList"); err != nil && !errors.Is(err, util.ErrUnstructuredFieldNotFound) {
+	if err := util.UnstructuredUnmarshalField(infraConfig, &providerIDList, "spec", "providerIDList"); err != nil {
 		return ctrl.Result{}, errors.Wrapf(err, "failed to retrieve data from infrastructure provider for MachinePool %q in namespace %q", mp.Name, mp.Namespace)
+	} else if len(providerIDList) == 0 {
+		log.Info("Retrieved empty Spec.ProviderIDList from infrastructure provider")
+		return ctrl.Result{RequeueAfter: externalReadyWait}, nil
 	}
 
 	// Get and set Status.Replicas from the infrastructure provider.
@@ -284,10 +287,8 @@ func (r *MachinePoolReconciler) reconcileInfrastructure(ctx context.Context, clu
 		if err != util.ErrUnstructuredFieldNotFound {
 			return ctrl.Result{}, errors.Wrapf(err, "failed to retrieve replicas from infrastructure provider for MachinePool %q in namespace %q", mp.Name, mp.Namespace)
 		}
-	}
-
-	if len(providerIDList) == 0 && mp.Status.Replicas != 0 {
-		log.Info("Retrieved empty Spec.ProviderIDList from infrastructure provider but Status.Replicas is not zero.", "replicas", mp.Status.Replicas)
+	} else if mp.Status.Replicas == 0 {
+		log.Info("Retrieved unset Status.Replicas from infrastructure provider")
 		return ctrl.Result{RequeueAfter: externalReadyWait}, nil
 	}
 
diff --git a/go.mod b/go.mod
index e7aee991b..d456abf0e 100644
--- a/go.mod
+++ b/go.mod
@@ -29,20 +29,20 @@ require (
 	github.com/valyala/fastjson v1.6.3
 	go.etcd.io/etcd/api/v3 v3.5.1
 	go.etcd.io/etcd/client/v3 v3.5.1
-	golang.org/x/net v0.0.0-20211209124913-491a49abca63
+	golang.org/x/net v0.0.0-20210825183410-e898025ed96a
 	golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
 	google.golang.org/grpc v1.42.0
-	k8s.io/api v0.23.5
-	k8s.io/apiextensions-apiserver v0.23.5
-	k8s.io/apimachinery v0.23.5
-	k8s.io/apiserver v0.23.5
-	k8s.io/client-go v0.23.5
+	k8s.io/api v0.23.0
+	k8s.io/apiextensions-apiserver v0.23.0
+	k8s.io/apimachinery v0.23.0
+	k8s.io/apiserver v0.23.0
+	k8s.io/client-go v0.23.0
 	k8s.io/cluster-bootstrap v0.23.0
-	k8s.io/component-base v0.23.5
+	k8s.io/component-base v0.23.0
 	k8s.io/klog/v2 v2.30.0
 	k8s.io/kubectl v0.23.0
-	k8s.io/utils v0.0.0-20211116205334-6203023598ed
-	sigs.k8s.io/controller-runtime v0.11.2
+	k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b
+	sigs.k8s.io/controller-runtime v0.11.1
 	sigs.k8s.io/yaml v1.3.0
 )
 
@@ -156,5 +156,5 @@ require (
 	sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
 	sigs.k8s.io/kustomize/api v0.10.1 // indirect
 	sigs.k8s.io/kustomize/kyaml v0.13.0 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect
 )
diff --git a/go.sum b/go.sum
index f41be9a4d..7944b9a02 100644
--- a/go.sum
+++ b/go.sum
@@ -812,9 +812,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210825183410-e898025ed96a h1:bRuuGXV8wwSdGTB+CtJf+FjgO1APK1CoO39T4BN/XBw=
 golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY=
-golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1190,28 +1189,23 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+k8s.io/api v0.23.0 h1:WrL1gb73VSC8obi8cuYETJGXEoFNEh3LU0Pt+Sokgro=
 k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg=
-k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA=
-k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8=
-k8s.io/apiextensions-apiserver v0.23.5 h1:5SKzdXyvIJKu+zbfPc3kCbWpbxi+O+zdmAJBm26UJqI=
-k8s.io/apiextensions-apiserver v0.23.5/go.mod h1:ntcPWNXS8ZPKN+zTXuzYMeg731CP0heCTl6gYBxLcuQ=
+k8s.io/apiextensions-apiserver v0.23.0 h1:uii8BYmHYiT2ZTAJxmvc3X8UhNYMxl2A0z0Xq3Pm+WY=
+k8s.io/apiextensions-apiserver v0.23.0/go.mod h1:xIFAEEDlAZgpVBl/1VSjGDmLoXAWRG40+GsWhKhAxY4=
+k8s.io/apimachinery v0.23.0 h1:mIfWRMjBuMdolAWJ3Fd+aPTMv3X9z+waiARMpvvb0HQ=
 k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc=
-k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0=
-k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
-k8s.io/apiserver v0.23.5 h1:2Ly8oUjz5cnZRn1YwYr+aFgDZzUmEVL9RscXbnIeDSE=
-k8s.io/apiserver v0.23.5/go.mod h1:7wvMtGJ42VRxzgVI7jkbKvMbuCbVbgsWFT7RyXiRNTw=
+k8s.io/apiserver v0.23.0 h1:Ds/QveXWi9aJ8ISB0CJa4zBNc5njxAs5u3rmMIexqCY=
+k8s.io/apiserver v0.23.0/go.mod h1:Cec35u/9zAepDPPFyT+UMrgqOCjgJ5qtfVJDxjZYmt4=
 k8s.io/cli-runtime v0.23.0 h1:UONt0BV2+edjUVAXuR1nnOAL2CB9r+Gl9yk4UBQpKfs=
 k8s.io/cli-runtime v0.23.0/go.mod h1:B5N3YH0KP1iKr6gEuJ/RRmGjO0mJQ/f/JrsmEiPQAlU=
+k8s.io/client-go v0.23.0 h1:vcsOqyPq7XV3QmQRCBH/t9BICJM9Q1M18qahjv+rebY=
 k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA=
-k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8=
-k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4=
 k8s.io/cluster-bootstrap v0.23.0 h1:8pZuuAWPoygewSNB4IddX3HBwXcQkPDXL/ca7GtGf4o=
 k8s.io/cluster-bootstrap v0.23.0/go.mod h1:VltEnKWfrRTiKgOXp3ts3vh7yqNlH6KFKFflo9GtCBg=
 k8s.io/code-generator v0.23.0/go.mod h1:vQvOhDXhuzqiVfM/YHp+dmg10WDZCchJVObc9MvowsE=
-k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk=
+k8s.io/component-base v0.23.0 h1:UAnyzjvVZ2ZR1lF35YwtNY6VMN94WtOnArcXBu34es8=
 k8s.io/component-base v0.23.0/go.mod h1:DHH5uiFvLC1edCpvcTDV++NKULdYYU6pR9Tt3HIKMKI=
-k8s.io/component-base v0.23.5 h1:8qgP5R6jG1BBSXmRYW+dsmitIrpk8F/fPEvgDenMCCE=
-k8s.io/component-base v0.23.5/go.mod h1:c5Nq44KZyt1aLl0IpHX82fhsn84Sb0jjzwjpcA42bY0=
 k8s.io/component-helpers v0.23.0/go.mod h1:liXMh6FZS4qamKtMJQ7uLHnFe3tlC86RX5mJEk/aerg=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
@@ -1226,15 +1220,14 @@ k8s.io/kubectl v0.23.0 h1:WABWfj+Z4tC3SfKBCtZr5sIVHsFtkU9Azii4DR9IT6Y=
 k8s.io/kubectl v0.23.0/go.mod h1:TfcGEs3u4dkmoC2eku1GYymdGaMtPMcaLLFrX/RB2kI=
 k8s.io/metrics v0.23.0/go.mod h1:NDiZTwppEtAuKJ1Rxt3S4dhyRzdp6yUcJf0vo023dPo=
 k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs=
 k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE=
-k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
-sigs.k8s.io/controller-runtime v0.11.2 h1:H5GTxQl0Mc9UjRJhORusqfJCIjBO8UtUxGggCwL1rLA=
-sigs.k8s.io/controller-runtime v0.11.2/go.mod h1:P6QCzrEjLaZGqHsfd+os7JQ+WFZhvB8MRFsn4dWF7O4=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.25/go.mod h1:Mlj9PNLmG9bZ6BHFwFKDo5afkpWyUISkb9Me0GnK66I=
+sigs.k8s.io/controller-runtime v0.11.1 h1:7YIHT2QnHJArj/dk9aUkYhfqfK5cIxPOX5gPECfdZLU=
+sigs.k8s.io/controller-runtime v0.11.1/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
 sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
 sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
 sigs.k8s.io/kustomize/api v0.10.1 h1:KgU7hfYoscuqag84kxtzKdEC3mKMb99DPI3a0eaV1d0=
@@ -1245,8 +1238,8 @@ sigs.k8s.io/kustomize/kyaml v0.13.0 h1:9c+ETyNfSrVhxvphs+K2dzT3dh5oVPPEqPOE/cUpS
 sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLCK30D47m4E=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.0 h1:kDvPBbnPk+qYmkHmSo8vKGp438IASWofnbbUKDE/bv0=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index 067a5f0ee..601109698 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -14,17 +14,17 @@ require (
 	github.com/onsi/ginkgo v1.16.5
 	github.com/pkg/errors v0.9.1
 	github.com/spf13/pflag v1.0.5
-	golang.org/x/net v0.0.0-20211209124913-491a49abca63
+	golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4
 	golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023
 	gotest.tools/gotestsum v1.6.4
-	k8s.io/api v0.23.5
-	k8s.io/apimachinery v0.23.5
-	k8s.io/client-go v0.23.5
-	k8s.io/code-generator v0.23.5
+	k8s.io/api v0.23.0
+	k8s.io/apimachinery v0.23.0
+	k8s.io/client-go v0.23.0
+	k8s.io/code-generator v0.23.0
 	k8s.io/klog/v2 v2.30.0
 	sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000
 	sigs.k8s.io/cluster-api/test v0.0.0-00010101000000-000000000000
-	sigs.k8s.io/controller-runtime v0.11.2
+	sigs.k8s.io/controller-runtime v0.11.1
 	sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20211110210527-619e6b92dab9
 	sigs.k8s.io/controller-tools v0.8.0
 	sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d
@@ -169,16 +169,16 @@ require (
 	gopkg.in/warnings.v0 v0.1.2 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
-	k8s.io/apiextensions-apiserver v0.23.5 // indirect
-	k8s.io/apiserver v0.23.5 // indirect
+	k8s.io/apiextensions-apiserver v0.23.0 // indirect
+	k8s.io/apiserver v0.23.0 // indirect
 	k8s.io/cluster-bootstrap v0.23.0 // indirect
-	k8s.io/component-base v0.23.5 // indirect
+	k8s.io/component-base v0.23.0 // indirect
 	k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c // indirect
 	k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect
-	k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect
+	k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect
 	sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
 	sigs.k8s.io/release-sdk v0.5.0 // indirect
 	sigs.k8s.io/release-utils v0.3.0 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect
 	sigs.k8s.io/yaml v1.3.0 // indirect
 )
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index 8b3de9cb5..972691e0f 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -1387,9 +1387,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4 h1:DZshvxDdVoeKIbudAdFEKi+f70l51luSy/7b76ibTY0=
 golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY=
-golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1878,25 +1877,21 @@ honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
 k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
 k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
 k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
+k8s.io/api v0.23.0 h1:WrL1gb73VSC8obi8cuYETJGXEoFNEh3LU0Pt+Sokgro=
 k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg=
-k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA=
-k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8=
+k8s.io/apiextensions-apiserver v0.23.0 h1:uii8BYmHYiT2ZTAJxmvc3X8UhNYMxl2A0z0Xq3Pm+WY=
 k8s.io/apiextensions-apiserver v0.23.0/go.mod h1:xIFAEEDlAZgpVBl/1VSjGDmLoXAWRG40+GsWhKhAxY4=
-k8s.io/apiextensions-apiserver v0.23.5 h1:5SKzdXyvIJKu+zbfPc3kCbWpbxi+O+zdmAJBm26UJqI=
-k8s.io/apiextensions-apiserver v0.23.5/go.mod h1:ntcPWNXS8ZPKN+zTXuzYMeg731CP0heCTl6gYBxLcuQ=
 k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc=
+k8s.io/apimachinery v0.23.0 h1:mIfWRMjBuMdolAWJ3Fd+aPTMv3X9z+waiARMpvvb0HQ=
 k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc=
-k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0=
-k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
 k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU=
 k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM=
 k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
+k8s.io/apiserver v0.23.0 h1:Ds/QveXWi9aJ8ISB0CJa4zBNc5njxAs5u3rmMIexqCY=
 k8s.io/apiserver v0.23.0/go.mod h1:Cec35u/9zAepDPPFyT+UMrgqOCjgJ5qtfVJDxjZYmt4=
-k8s.io/apiserver v0.23.5 h1:2Ly8oUjz5cnZRn1YwYr+aFgDZzUmEVL9RscXbnIeDSE=
-k8s.io/apiserver v0.23.5/go.mod h1:7wvMtGJ42VRxzgVI7jkbKvMbuCbVbgsWFT7RyXiRNTw=
 k8s.io/cli-runtime v0.23.0/go.mod h1:B5N3YH0KP1iKr6gEuJ/RRmGjO0mJQ/f/JrsmEiPQAlU=
 k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
 k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
@@ -1904,20 +1899,17 @@ k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
 k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
 k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
 k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
+k8s.io/client-go v0.23.0 h1:vcsOqyPq7XV3QmQRCBH/t9BICJM9Q1M18qahjv+rebY=
 k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA=
-k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8=
-k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4=
 k8s.io/cluster-bootstrap v0.23.0 h1:8pZuuAWPoygewSNB4IddX3HBwXcQkPDXL/ca7GtGf4o=
 k8s.io/cluster-bootstrap v0.23.0/go.mod h1:VltEnKWfrRTiKgOXp3ts3vh7yqNlH6KFKFflo9GtCBg=
+k8s.io/code-generator v0.23.0 h1:lhyd2KJVCEmpjaCpuoooGs+e3xhPwpYvupnNRidO0Ds=
 k8s.io/code-generator v0.23.0/go.mod h1:vQvOhDXhuzqiVfM/YHp+dmg10WDZCchJVObc9MvowsE=
-k8s.io/code-generator v0.23.5 h1:xn3a6J5pUL49AoH6SPrOFtnB5cvdMl76f/bEY176R3c=
-k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk=
 k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
 k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
 k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
+k8s.io/component-base v0.23.0 h1:UAnyzjvVZ2ZR1lF35YwtNY6VMN94WtOnArcXBu34es8=
 k8s.io/component-base v0.23.0/go.mod h1:DHH5uiFvLC1edCpvcTDV++NKULdYYU6pR9Tt3HIKMKI=
-k8s.io/component-base v0.23.5 h1:8qgP5R6jG1BBSXmRYW+dsmitIrpk8F/fPEvgDenMCCE=
-k8s.io/component-base v0.23.5/go.mod h1:c5Nq44KZyt1aLl0IpHX82fhsn84Sb0jjzwjpcA42bY0=
 k8s.io/component-helpers v0.23.0/go.mod h1:liXMh6FZS4qamKtMJQ7uLHnFe3tlC86RX5mJEk/aerg=
 k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
 k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
@@ -1943,18 +1935,16 @@ k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210305010621-2afb4311ab10/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs=
 k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE=
-k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.25/go.mod h1:Mlj9PNLmG9bZ6BHFwFKDo5afkpWyUISkb9Me0GnK66I=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
-sigs.k8s.io/controller-runtime v0.11.2 h1:H5GTxQl0Mc9UjRJhORusqfJCIjBO8UtUxGggCwL1rLA=
-sigs.k8s.io/controller-runtime v0.11.2/go.mod h1:P6QCzrEjLaZGqHsfd+os7JQ+WFZhvB8MRFsn4dWF7O4=
+sigs.k8s.io/controller-runtime v0.11.1 h1:7YIHT2QnHJArj/dk9aUkYhfqfK5cIxPOX5gPECfdZLU=
+sigs.k8s.io/controller-runtime v0.11.1/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
 sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20211110210527-619e6b92dab9 h1:ylYUI5uaq/guUFerFRVG81FHSA5/3+fERCE1RQbQUZ4=
 sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20211110210527-619e6b92dab9/go.mod h1:+sJcI1F0QI0Cv+8fp5rH5B2fK1LxzrAQqYnaPx9nY8I=
 sigs.k8s.io/controller-tools v0.8.0 h1:uUkfTGEwrguqYYfcI2RRGUnC8mYdCFDqfwPKUcNJh1o=
@@ -1977,8 +1967,8 @@ sigs.k8s.io/release-utils v0.3.0/go.mod h1:J9xpziRNRI4mAeMZxPRryDodQMoMudMu6yC1a
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.0 h1:kDvPBbnPk+qYmkHmSo8vKGp438IASWofnbbUKDE/bv0=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
diff --git a/internal/controllers/topology/cluster/patches/variables/variables.go b/internal/controllers/topology/cluster/patches/variables/variables.go
index 2140163e8..15ce62b0b 100644
--- a/internal/controllers/topology/cluster/patches/variables/variables.go
+++ b/internal/controllers/topology/cluster/patches/variables/variables.go
@@ -51,9 +51,6 @@ type ClusterBuiltins struct {
 
 	// Topology represents the cluster topology variables.
 	Topology *ClusterTopologyBuiltins `json:"topology,omitempty"`
-
-	// Network represents the cluster network variables.
-	Network *ClusterNetworkBuiltins `json:"network,omitempty"`
 }
 
 // ClusterTopologyBuiltins represents builtin cluster topology variables.
@@ -67,18 +64,6 @@ type ClusterTopologyBuiltins struct {
 	Class string `json:"class,omitempty"`
 }
 
-// ClusterNetworkBuiltins represents builtin cluster network variables.
-type ClusterNetworkBuiltins struct {
-	// ServiceDomain is the domain name for services.
-	ServiceDomain *string `json:"serviceDomain,omitempty"`
-	// Services is the network ranges from which service VIPs are allocated.
-	Services []string `json:"services,omitempty"`
-	// Pods is the network ranges from which Pod networks are allocated.
-	Pods []string `json:"pods,omitempty"`
-	// IPFamily is the IPFamily the Cluster is operating in. One of Invalid, IPv4, IPv6, DualStack.
-	IPFamily string `json:"ipFamily,omitempty"`
-}
-
 // ControlPlaneBuiltins represents builtin ControlPlane variables.
 // NOTE: These variables are only set for templates belonging to the ControlPlane object.
 type ControlPlaneBuiltins struct {
@@ -191,24 +176,6 @@ func Global(clusterTopology *clusterv1.Topology, cluster *clusterv1.Cluster) (Va
 			},
 		},
 	}
-	if cluster.Spec.ClusterNetwork != nil {
-		clusterNetworkIPFamily, err := cluster.GetIPFamily()
-		if err != nil {
-			return nil, err
-		}
-		builtin.Cluster.Network = &ClusterNetworkBuiltins{
-			IPFamily: ipFamilyToString(clusterNetworkIPFamily),
-		}
-		if cluster.Spec.ClusterNetwork.ServiceDomain != "" {
-			builtin.Cluster.Network.ServiceDomain = &cluster.Spec.ClusterNetwork.ServiceDomain
-		}
-		if cluster.Spec.ClusterNetwork.Services != nil && cluster.Spec.ClusterNetwork.Services.CIDRBlocks != nil {
-			builtin.Cluster.Network.Services = cluster.Spec.ClusterNetwork.Services.CIDRBlocks
-		}
-		if cluster.Spec.ClusterNetwork.Pods != nil && cluster.Spec.ClusterNetwork.Pods.CIDRBlocks != nil {
-			builtin.Cluster.Network.Pods = cluster.Spec.ClusterNetwork.Pods.CIDRBlocks
-		}
-	}
 
 	// Add builtin variables derived from the cluster object.
 	if err := setVariable(variables, BuiltinsName, builtin); err != nil {
@@ -317,16 +284,3 @@ func setVariable(variables VariableMap, name string, value interface{}) error {
 	variables[name] = apiextensionsv1.JSON{Raw: marshalledValue}
 	return nil
 }
-
-func ipFamilyToString(ipFamily clusterv1.ClusterIPFamily) string {
-	switch ipFamily {
-	case clusterv1.DualStackIPFamily:
-		return "DualStack"
-	case clusterv1.IPv4IPFamily:
-		return "IPv4"
-	case clusterv1.IPv6IPFamily:
-		return "IPv6"
-	default:
-		return "Invalid"
-	}
-}
diff --git a/internal/webhooks/patch_validation.go b/internal/webhooks/patch_validation.go
index 8b2544f2f..e0fbf6bd7 100644
--- a/internal/webhooks/patch_validation.go
+++ b/internal/webhooks/patch_validation.go
@@ -336,13 +336,6 @@ var builtinVariables = sets.NewString(
 	"builtin.cluster.topology.class",
 	"builtin.cluster.topology.version",
 
-	// ClusterNetwork builtins
-	"builtin.cluster.network",
-	"builtin.cluster.network.serviceDomain",
-	"builtin.cluster.network.services",
-	"builtin.cluster.network.pods",
-	"builtin.cluster.network.ipFamily",
-
 	// ControlPlane builtins.
 	"builtin.controlPlane",
 	"builtin.controlPlane.name",


Test patch:
diff --git a/cmd/clusterctl/client/cluster/assets/topology-test/new-clusterclass-and-cluster.yaml b/cmd/clusterctl/client/cluster/assets/topology-test/new-clusterclass-and-cluster.yaml
index 7d3ea571b..07d17d5b5 100644
--- a/cmd/clusterctl/client/cluster/assets/topology-test/new-clusterclass-and-cluster.yaml
+++ b/cmd/clusterctl/client/cluster/assets/topology-test/new-clusterclass-and-cluster.yaml
@@ -1,9 +1,3 @@
-apiVersion: v1
-kind: Namespace
-metadata:
-  name: default
-spec: {}
----
 apiVersion: cluster.x-k8s.io/v1beta1
 kind: ClusterClass
 metadata:
diff --git a/cmd/clusterctl/client/config_test.go b/cmd/clusterctl/client/config_test.go
index e066b28ff..83d03272f 100644
--- a/cmd/clusterctl/client/config_test.go
+++ b/cmd/clusterctl/client/config_test.go
@@ -74,7 +74,6 @@ func Test_clusterctlClient_GetProvidersConfig(t *testing.T) {
 				config.MAASProviderName,
 				config.Metal3ProviderName,
 				config.NestedProviderName,
-				config.OCIProviderName,
 				config.OpenStackProviderName,
 				config.PacketProviderName,
 				config.SideroProviderName,
@@ -109,7 +108,6 @@ func Test_clusterctlClient_GetProvidersConfig(t *testing.T) {
 				config.MAASProviderName,
 				config.Metal3ProviderName,
 				config.NestedProviderName,
-				config.OCIProviderName,
 				config.OpenStackProviderName,
 				config.PacketProviderName,
 				config.SideroProviderName,
diff --git a/cmd/clusterctl/cmd/config_repositories_test.go b/cmd/clusterctl/cmd/config_repositories_test.go
index 941b18ded..c19c6341c 100644
--- a/cmd/clusterctl/cmd/config_repositories_test.go
+++ b/cmd/clusterctl/cmd/config_repositories_test.go
@@ -99,33 +99,32 @@ providers:
     type: "CoreProvider"
 `
 
-var expectedOutputText = `NAME                TYPE                     URL                                                                                       FILE
-cluster-api         CoreProvider             https://github.com/myorg/myforkofclusterapi/releases/latest/                              core_components.yaml
-another-provider    BootstrapProvider        ./                                                                                        bootstrap-components.yaml
-aws-eks             BootstrapProvider        https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/latest/              eks-bootstrap-components.yaml
-kubeadm             BootstrapProvider        https://github.com/kubernetes-sigs/cluster-api/releases/latest/                           bootstrap-components.yaml
-talos               BootstrapProvider        https://github.com/siderolabs/cluster-api-bootstrap-provider-talos/releases/latest/       bootstrap-components.yaml
-aws-eks             ControlPlaneProvider     https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/latest/              eks-controlplane-components.yaml
-kubeadm             ControlPlaneProvider     https://github.com/kubernetes-sigs/cluster-api/releases/latest/                           control-plane-components.yaml
-nested              ControlPlaneProvider     https://github.com/kubernetes-sigs/cluster-api-provider-nested/releases/latest/           control-plane-components.yaml
-talos               ControlPlaneProvider     https://github.com/siderolabs/cluster-api-control-plane-provider-talos/releases/latest/   control-plane-components.yaml
-aws                 InfrastructureProvider                                                                                             my-aws-infrastructure-components.yaml
-azure               InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-azure/releases/latest/            infrastructure-components.yaml
-byoh                InfrastructureProvider   https://github.com/vmware-tanzu/cluster-api-provider-bringyourownhost/releases/latest/    infrastructure-components.yaml
-digitalocean        InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-digitalocean/releases/latest/     infrastructure-components.yaml
-docker              InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api/releases/latest/                           infrastructure-components-development.yaml
-gcp                 InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-gcp/releases/latest/              infrastructure-components.yaml
-hetzner             InfrastructureProvider   https://github.com/syself/cluster-api-provider-hetzner/releases/latest/                   infrastructure-components.yaml
-ibmcloud            InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/releases/latest/         infrastructure-components.yaml
-maas                InfrastructureProvider   https://github.com/spectrocloud/cluster-api-provider-maas/releases/latest/                infrastructure-components.yaml
-metal3              InfrastructureProvider   https://github.com/metal3-io/cluster-api-provider-metal3/releases/latest/                 infrastructure-components.yaml
-my-infra-provider   InfrastructureProvider   /home/.cluster-api/overrides/infrastructure-docker/latest/                                infrastructure-components.yaml
-nested              InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-nested/releases/latest/           infrastructure-components.yaml
-oci                 InfrastructureProvider   https://github.com/oracle/cluster-api-provider-oci/releases/latest/                       infrastructure-components.yaml
-openstack           InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-openstack/releases/latest/        infrastructure-components.yaml
-packet              InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-packet/releases/latest/           infrastructure-components.yaml
-sidero              InfrastructureProvider   https://github.com/siderolabs/sidero/releases/latest/                                     infrastructure-components.yaml
-vsphere             InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/releases/latest/          infrastructure-components.yaml
+var expectedOutputText = `NAME                TYPE                     URL                                                                                          FILE
+cluster-api         CoreProvider             https://github.com/myorg/myforkofclusterapi/releases/latest/                                 core_components.yaml
+another-provider    BootstrapProvider        ./                                                                                           bootstrap-components.yaml
+aws-eks             BootstrapProvider        https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/latest/                 eks-bootstrap-components.yaml
+kubeadm             BootstrapProvider        https://github.com/kubernetes-sigs/cluster-api/releases/latest/                              bootstrap-components.yaml
+talos               BootstrapProvider        https://github.com/talos-systems/cluster-api-bootstrap-provider-talos/releases/latest/       bootstrap-components.yaml
+aws-eks             ControlPlaneProvider     https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/latest/                 eks-controlplane-components.yaml
+kubeadm             ControlPlaneProvider     https://github.com/kubernetes-sigs/cluster-api/releases/latest/                              control-plane-components.yaml
+nested              ControlPlaneProvider     https://github.com/kubernetes-sigs/cluster-api-provider-nested/releases/latest/              control-plane-components.yaml
+talos               ControlPlaneProvider     https://github.com/talos-systems/cluster-api-control-plane-provider-talos/releases/latest/   control-plane-components.yaml
+aws                 InfrastructureProvider                                                                                                my-aws-infrastructure-components.yaml
+azure               InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-azure/releases/latest/               infrastructure-components.yaml
+byoh                InfrastructureProvider   https://github.com/vmware-tanzu/cluster-api-provider-bringyourownhost/releases/latest/       infrastructure-components.yaml
+digitalocean        InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-digitalocean/releases/latest/        infrastructure-components.yaml
+docker              InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api/releases/latest/                              infrastructure-components-development.yaml
+gcp                 InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-gcp/releases/latest/                 infrastructure-components.yaml
+hetzner             InfrastructureProvider   https://github.com/syself/cluster-api-provider-hetzner/releases/latest/                      infrastructure-components.yaml
+ibmcloud            InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/releases/latest/            infrastructure-components.yaml
+maas                InfrastructureProvider   https://github.com/spectrocloud/cluster-api-provider-maas/releases/latest/                   infrastructure-components.yaml
+metal3              InfrastructureProvider   https://github.com/metal3-io/cluster-api-provider-metal3/releases/latest/                    infrastructure-components.yaml
+my-infra-provider   InfrastructureProvider   /home/.cluster-api/overrides/infrastructure-docker/latest/                                   infrastructure-components.yaml
+nested              InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-nested/releases/latest/              infrastructure-components.yaml
+openstack           InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-openstack/releases/latest/           infrastructure-components.yaml
+packet              InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-packet/releases/latest/              infrastructure-components.yaml
+sidero              InfrastructureProvider   https://github.com/talos-systems/sidero/releases/latest/                                     infrastructure-components.yaml
+vsphere             InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/releases/latest/             infrastructure-components.yaml
 `
 
 var expectedOutputYaml = `- File: core_components.yaml
@@ -147,7 +146,7 @@ var expectedOutputYaml = `- File: core_components.yaml
 - File: bootstrap-components.yaml
   Name: talos
   ProviderType: BootstrapProvider
-  URL: https://github.com/siderolabs/cluster-api-bootstrap-provider-talos/releases/latest/
+  URL: https://github.com/talos-systems/cluster-api-bootstrap-provider-talos/releases/latest/
 - File: eks-controlplane-components.yaml
   Name: aws-eks
   ProviderType: ControlPlaneProvider
@@ -163,7 +162,7 @@ var expectedOutputYaml = `- File: core_components.yaml
 - File: control-plane-components.yaml
   Name: talos
   ProviderType: ControlPlaneProvider
-  URL: https://github.com/siderolabs/cluster-api-control-plane-provider-talos/releases/latest/
+  URL: https://github.com/talos-systems/cluster-api-control-plane-provider-talos/releases/latest/
 - File: my-aws-infrastructure-components.yaml
   Name: aws
   ProviderType: InfrastructureProvider
@@ -212,10 +211,6 @@ var expectedOutputYaml = `- File: core_components.yaml
   Name: nested
   ProviderType: InfrastructureProvider
   URL: https://github.com/kubernetes-sigs/cluster-api-provider-nested/releases/latest/
-- File: infrastructure-components.yaml
-  Name: oci
-  ProviderType: InfrastructureProvider
-  URL: https://github.com/oracle/cluster-api-provider-oci/releases/latest/
 - File: infrastructure-components.yaml
   Name: openstack
   ProviderType: InfrastructureProvider
@@ -227,7 +222,7 @@ var expectedOutputYaml = `- File: core_components.yaml
 - File: infrastructure-components.yaml
   Name: sidero
   ProviderType: InfrastructureProvider
-  URL: https://github.com/siderolabs/sidero/releases/latest/
+  URL: https://github.com/talos-systems/sidero/releases/latest/
 - File: infrastructure-components.yaml
   Name: vsphere
   ProviderType: InfrastructureProvider
diff --git a/exp/api/v1beta1/machinepool_webhook_test.go b/exp/api/v1beta1/machinepool_webhook_test.go
index 784a21ded..6308cb935 100644
--- a/exp/api/v1beta1/machinepool_webhook_test.go
+++ b/exp/api/v1beta1/machinepool_webhook_test.go
@@ -39,7 +39,6 @@ func TestMachinePoolDefault(t *testing.T) {
 			Template: clusterv1.MachineTemplateSpec{
 				Spec: clusterv1.MachineSpec{
 					Bootstrap: clusterv1.Bootstrap{ConfigRef: &corev1.ObjectReference{}},
-					Version:   pointer.StringPtr("1.20.0"),
 				},
 			},
 		},
@@ -52,7 +51,6 @@ func TestMachinePoolDefault(t *testing.T) {
 	g.Expect(m.Spec.MinReadySeconds).To(Equal(pointer.Int32Ptr(0)))
 	g.Expect(m.Spec.Template.Spec.Bootstrap.ConfigRef.Namespace).To(Equal(m.Namespace))
 	g.Expect(m.Spec.Template.Spec.InfrastructureRef.Namespace).To(Equal(m.Namespace))
-	g.Expect(m.Spec.Template.Spec.Version).To(Equal(pointer.StringPtr("v1.20.0")))
 }
 
 func TestMachinePoolBootstrapValidation(t *testing.T) {
@@ -221,57 +219,3 @@ func TestMachinePoolClusterNameImmutable(t *testing.T) {
 		})
 	}
 }
-
-func TestMachinePoolVersionValidation(t *testing.T) {
-	tests := []struct {
-		name      string
-		expectErr bool
-		version   string
-	}{
-		{
-			name:      "should succeed version is a valid kube semver",
-			expectErr: false,
-			version:   "v1.23.3",
-		},
-		{
-			name:      "should succeed version is a valid pre-release",
-			expectErr: false,
-			version:   "v1.19.0-alpha.1",
-		},
-		{
-			name:      "should fail if version is not a valid semver",
-			expectErr: true,
-			version:   "v1.1",
-		},
-		{
-			name:      "should fail if version is missing a v prefix",
-			expectErr: true,
-			version:   "1.20.0",
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			g := NewWithT(t)
-
-			m := &MachinePool{
-				Spec: MachinePoolSpec{
-					Template: clusterv1.MachineTemplateSpec{
-						Spec: clusterv1.MachineSpec{
-							Bootstrap: clusterv1.Bootstrap{ConfigRef: &corev1.ObjectReference{}},
-							Version:   &tt.version,
-						},
-					},
-				},
-			}
-
-			if tt.expectErr {
-				g.Expect(m.ValidateCreate()).NotTo(Succeed())
-				g.Expect(m.ValidateUpdate(m)).NotTo(Succeed())
-			} else {
-				g.Expect(m.ValidateCreate()).To(Succeed())
-				g.Expect(m.ValidateUpdate(m)).To(Succeed())
-			}
-		})
-	}
-}
diff --git a/exp/internal/controllers/machinepool_controller_phases_test.go b/exp/internal/controllers/machinepool_controller_phases_test.go
index 624be1461..f228f08cc 100644
--- a/exp/internal/controllers/machinepool_controller_phases_test.go
+++ b/exp/internal/controllers/machinepool_controller_phases_test.go
@@ -22,14 +22,11 @@ import (
 
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/types"
-	"k8s.io/client-go/tools/record"
 	"k8s.io/utils/pointer"
 	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
 	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -896,87 +893,6 @@ func TestReconcileMachinePoolInfrastructure(t *testing.T) {
 				g.Expect(m.Status.InfrastructureReady).To(BeFalse())
 			},
 		},
-		{
-			name: "ready bootstrap, infra, and nodeRef, machinepool is running, replicas 0, providerIDList not set",
-			machinepool: &expv1.MachinePool{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:      "machinepool-test",
-					Namespace: metav1.NamespaceDefault,
-				},
-				Spec: expv1.MachinePoolSpec{
-					Replicas: pointer.Int32Ptr(0),
-					Template: clusterv1.MachineTemplateSpec{
-						Spec: clusterv1.MachineSpec{
-							Bootstrap: clusterv1.Bootstrap{
-								ConfigRef: &corev1.ObjectReference{
-									APIVersion: "bootstrap.cluster.x-k8s.io/v1beta1",
-									Kind:       "BootstrapConfig",
-									Name:       "bootstrap-config1",
-								},
-							},
-							InfrastructureRef: corev1.ObjectReference{
-								APIVersion: "infrastructure.cluster.x-k8s.io/v1beta1",
-								Kind:       "InfrastructureConfig",
-								Name:       "infra-config1",
-							},
-						},
-					},
-				},
-				Status: expv1.MachinePoolStatus{
-					BootstrapReady:      true,
-					InfrastructureReady: true,
-					NodeRefs:            []corev1.ObjectReference{{Kind: "Node", Name: "machinepool-test-node"}},
-				},
-			},
-			bootstrapConfig: map[string]interface{}{
-				"kind":       "BootstrapConfig",
-				"apiVersion": "bootstrap.cluster.x-k8s.io/v1beta1",
-				"metadata": map[string]interface{}{
-					"name":      "bootstrap-config1",
-					"namespace": metav1.NamespaceDefault,
-				},
-				"spec": map[string]interface{}{},
-				"status": map[string]interface{}{
-					"ready":          true,
-					"dataSecretName": "secret-data",
-				},
-			},
-			infraConfig: map[string]interface{}{
-				"kind":       "InfrastructureConfig",
-				"apiVersion": "infrastructure.cluster.x-k8s.io/v1beta1",
-				"metadata": map[string]interface{}{
-					"name":      "infra-config1",
-					"namespace": metav1.NamespaceDefault,
-				},
-				"spec": map[string]interface{}{
-					"providerIDList": []interface{}{},
-				},
-				"status": map[string]interface{}{
-					"ready": true,
-					"addresses": []interface{}{
-						map[string]interface{}{
-							"type":    "InternalIP",
-							"address": "10.0.0.1",
-						},
-						map[string]interface{}{
-							"type":    "InternalIP",
-							"address": "10.0.0.2",
-						},
-					},
-				},
-			},
-			expectError:        false,
-			expectRequeueAfter: false,
-			expected: func(g *WithT, m *expv1.MachinePool) {
-				g.Expect(m.Status.InfrastructureReady).To(BeTrue())
-				g.Expect(m.Status.ReadyReplicas).To(Equal(int32(0)))
-				g.Expect(m.Status.AvailableReplicas).To(Equal(int32(0)))
-				g.Expect(m.Status.UnavailableReplicas).To(Equal(int32(0)))
-				g.Expect(m.Status.FailureMessage).To(BeNil())
-				g.Expect(m.Status.FailureReason).To(BeNil())
-				g.Expect(m.Status.GetTypedPhase()).To(Equal(expv1.MachinePoolPhaseRunning))
-			},
-		},
 	}
 
 	for _, tc := range testCases {
@@ -995,8 +911,6 @@ func TestReconcileMachinePoolInfrastructure(t *testing.T) {
 			res, err := r.reconcileInfrastructure(ctx, defaultCluster, tc.machinepool)
 			if tc.expectRequeueAfter {
 				g.Expect(res.RequeueAfter).To(BeNumerically(">=", 0))
-			} else {
-				g.Expect(res.RequeueAfter).To(Equal(time.Duration(0)))
 			}
 			r.reconcilePhase(tc.machinepool)
 			if tc.expectError {
@@ -1011,324 +925,3 @@ func TestReconcileMachinePoolInfrastructure(t *testing.T) {
 		})
 	}
 }
-
-func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
-	g := NewWithT(t)
-
-	ns, err := env.CreateNamespace(ctx, "machinepool-scale-zero")
-	g.Expect(err).ToNot(HaveOccurred())
-
-	// Set up cluster to test against.
-	testCluster := &clusterv1.Cluster{
-		ObjectMeta: metav1.ObjectMeta{
-			GenerateName: "machinepool-scale-zero-",
-			Namespace:    ns.Name,
-		},
-	}
-	g.Expect(env.Create(ctx, testCluster)).To(BeNil())
-	g.Expect(env.CreateKubeconfigSecret(ctx, testCluster)).To(Succeed())
-	defer func(do ...client.Object) {
-		g.Expect(env.Cleanup(ctx, do...)).To(Succeed())
-	}(ns, testCluster)
-
-	defaultMachinePool := expv1.MachinePool{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "machinepool-test",
-			Namespace: ns.Name,
-		},
-		Spec: expv1.MachinePoolSpec{
-			ClusterName: testCluster.Name,
-			Template: clusterv1.MachineTemplateSpec{
-				Spec: clusterv1.MachineSpec{
-					Bootstrap: clusterv1.Bootstrap{
-						ConfigRef: &corev1.ObjectReference{
-							APIVersion: "bootstrap.cluster.x-k8s.io/v1beta1",
-							Kind:       "BootstrapConfig",
-							Name:       "bootstrap-config1",
-						},
-					},
-					InfrastructureRef: corev1.ObjectReference{
-						APIVersion: "infrastructure.cluster.x-k8s.io/v1beta1",
-						Kind:       "InfrastructureConfig",
-						Name:       "infra-config1",
-					},
-				},
-			},
-		},
-		Status: expv1.MachinePoolStatus{},
-	}
-
-	defaultBootstrap := &unstructured.Unstructured{
-		Object: map[string]interface{}{
-			"kind":       "BootstrapConfig",
-			"apiVersion": "bootstrap.cluster.x-k8s.io/v1beta1",
-			"metadata": map[string]interface{}{
-				"name":      "bootstrap-config1",
-				"namespace": ns.Name,
-			},
-			"spec": map[string]interface{}{},
-			"status": map[string]interface{}{
-				"ready":          true,
-				"dataSecretName": "secret-data",
-			},
-		},
-	}
-
-	defaultInfra := &unstructured.Unstructured{
-		Object: map[string]interface{}{
-			"kind":       "InfrastructureConfig",
-			"apiVersion": "infrastructure.cluster.x-k8s.io/v1beta1",
-			"metadata": map[string]interface{}{
-				"name":      "infra-config1",
-				"namespace": ns.Name,
-			},
-			"spec": map[string]interface{}{},
-			"status": map[string]interface{}{
-				"ready": true,
-			},
-		},
-	}
-
-	t.Run("Should set `ScalingDown` when scaling to zero", func(t *testing.T) {
-		g := NewWithT(t)
-
-		node := &corev1.Node{
-			ObjectMeta: metav1.ObjectMeta{
-				Name: "machinepool-test-node",
-			},
-			Spec: corev1.NodeSpec{
-				ProviderID: "test://machinepool-test-node",
-			},
-			Status: corev1.NodeStatus{
-				Conditions: []corev1.NodeCondition{
-					{Type: corev1.NodeReady, Status: corev1.ConditionTrue},
-				},
-			},
-		}
-		g.Expect(env.Create(ctx, node)).To(BeNil())
-		defer func(do ...client.Object) {
-			g.Expect(env.Cleanup(ctx, do...)).To(Succeed())
-		}(node)
-
-		kubeconfigSecret := kubeconfig.GenerateSecret(testCluster, kubeconfig.FromEnvTestConfig(env.Config, testCluster))
-		machinepool := defaultMachinePool.DeepCopy()
-		bootstrapConfig := defaultBootstrap.DeepCopy()
-		infraConfig := defaultInfra.DeepCopy()
-
-		// Setup prerequisites - a running MachinePool with one instance and user sets Replicas to 0
-
-		// set replicas to 0
-		machinepool.Spec.Replicas = pointer.Int32(0)
-
-		// set nodeRefs to one instance
-		machinepool.Status.NodeRefs = []corev1.ObjectReference{{Kind: "Node", Name: "machinepool-test-node"}}
-
-		// set infra providerIDList
-		err = unstructured.SetNestedStringSlice(infraConfig.Object, []string{"test://machinepool-test-node"}, "spec", "providerIDList")
-		g.Expect(err).NotTo(HaveOccurred())
-
-		// set infra replicas
-		err = unstructured.SetNestedField(infraConfig.Object, int64(1), "status", "replicas")
-		g.Expect(err).NotTo(HaveOccurred())
-
-		r := &MachinePoolReconciler{
-			Client:   fake.NewClientBuilder().WithObjects(testCluster, kubeconfigSecret, machinepool, bootstrapConfig, infraConfig).Build(),
-			recorder: record.NewFakeRecorder(32),
-		}
-
-		res, err := r.reconcile(ctx, testCluster, machinepool)
-		g.Expect(err).NotTo(HaveOccurred())
-		g.Expect(res.Requeue).To(BeFalse())
-
-		r.reconcilePhase(machinepool)
-
-		g.Expect(machinepool.Status.GetTypedPhase()).To(Equal(expv1.MachinePoolPhaseScalingDown))
-
-		delNode := &corev1.Node{}
-		g.Expect(env.Get(ctx, client.ObjectKeyFromObject(node), delNode)).To(BeNil())
-	})
-
-	t.Run("Should delete retired nodes when scaled to zero", func(t *testing.T) {
-		g := NewWithT(t)
-
-		node := &corev1.Node{
-			ObjectMeta: metav1.ObjectMeta{
-				Name: "machinepool-test-node",
-			},
-			Spec: corev1.NodeSpec{
-				ProviderID: "test://machinepool-test-node",
-			},
-			Status: corev1.NodeStatus{
-				Conditions: []corev1.NodeCondition{
-					{Type: corev1.NodeReady, Status: corev1.ConditionTrue},
-				},
-			},
-		}
-		g.Expect(env.Create(ctx, node)).To(BeNil())
-		defer func(do ...client.Object) {
-			g.Expect(env.Cleanup(ctx, do...)).To(Succeed())
-		}(node)
-
-		kubeconfigSecret := kubeconfig.GenerateSecret(testCluster, kubeconfig.FromEnvTestConfig(env.Config, testCluster))
-		machinepool := defaultMachinePool.DeepCopy()
-		bootstrapConfig := defaultBootstrap.DeepCopy()
-		infraConfig := defaultInfra.DeepCopy()
-
-		// Setup prerequisites - a running MachinePool with one instance and user sets Replicas to 0
-
-		// set replicas to 0
-		machinepool.Spec.Replicas = pointer.Int32(0)
-
-		// set nodeRefs to one instance
-		machinepool.Status.NodeRefs = []corev1.ObjectReference{{Kind: "Node", Name: "machinepool-test-node"}}
-
-		// set infra replicas
-		err = unstructured.SetNestedField(infraConfig.Object, int64(0), "status", "replicas")
-		g.Expect(err).NotTo(HaveOccurred())
-
-		r := &MachinePoolReconciler{
-			Client:   fake.NewClientBuilder().WithObjects(testCluster, kubeconfigSecret, machinepool, bootstrapConfig, infraConfig).Build(),
-			recorder: record.NewFakeRecorder(32),
-		}
-
-		res, err := r.reconcile(ctx, testCluster, machinepool)
-		g.Expect(err).NotTo(HaveOccurred())
-		g.Expect(res.Requeue).To(BeFalse())
-
-		r.reconcilePhase(machinepool)
-
-		g.Expect(machinepool.Status.GetTypedPhase()).To(Equal(expv1.MachinePoolPhaseRunning))
-
-		delNode := &corev1.Node{}
-		err = env.Get(ctx, client.ObjectKeyFromObject(node), delNode)
-		g.Expect(err).ToNot(BeNil())
-		g.Expect(apierrors.IsNotFound(err)).To(BeTrue())
-	})
-
-	t.Run("Should set `Running` when scaled to zero", func(t *testing.T) {
-		g := NewWithT(t)
-
-		kubeconfigSecret := kubeconfig.GenerateSecret(testCluster, kubeconfig.FromEnvTestConfig(env.Config, testCluster))
-		machinepool := defaultMachinePool.DeepCopy()
-		bootstrapConfig := defaultBootstrap.DeepCopy()
-		infraConfig := defaultInfra.DeepCopy()
-
-		// Setup prerequisites - a running MachinePool with no instances and replicas set to 0
-
-		// set replicas to 0
-		machinepool.Spec.Replicas = pointer.Int32(0)
-
-		// set nodeRefs to no instance
-		machinepool.Status.NodeRefs = []corev1.ObjectReference{}
-
-		// set infra replicas
-		err := unstructured.SetNestedField(infraConfig.Object, int64(0), "status", "replicas")
-		g.Expect(err).NotTo(HaveOccurred())
-
-		r := &MachinePoolReconciler{
-			Client:   fake.NewClientBuilder().WithObjects(testCluster, kubeconfigSecret, machinepool, bootstrapConfig, infraConfig).Build(),
-			recorder: record.NewFakeRecorder(32),
-		}
-
-		res, err := r.reconcile(ctx, testCluster, machinepool)
-		g.Expect(err).NotTo(HaveOccurred())
-		g.Expect(res.Requeue).To(BeFalse())
-
-		r.reconcilePhase(machinepool)
-
-		g.Expect(machinepool.Status.GetTypedPhase()).To(Equal(expv1.MachinePoolPhaseRunning))
-	})
-
-	t.Run("Should set `ScalingUp` when scaling from zero to one", func(t *testing.T) {
-		g := NewWithT(t)
-
-		kubeconfigSecret := kubeconfig.GenerateSecret(testCluster, kubeconfig.FromEnvTestConfig(env.Config, testCluster))
-		machinepool := defaultMachinePool.DeepCopy()
-		bootstrapConfig := defaultBootstrap.DeepCopy()
-		infraConfig := defaultInfra.DeepCopy()
-
-		// Setup prerequisites - a running MachinePool with no instances and replicas set to 1
-
-		// set replicas to 1
-		machinepool.Spec.Replicas = pointer.Int32(1)
-
-		// set nodeRefs to no instance
-		machinepool.Status.NodeRefs = []corev1.ObjectReference{}
-
-		// set infra replicas
-		err := unstructured.SetNestedField(infraConfig.Object, int64(0), "status", "replicas")
-		g.Expect(err).NotTo(HaveOccurred())
-
-		r := &MachinePoolReconciler{
-			Client:   fake.NewClientBuilder().WithObjects(testCluster, kubeconfigSecret, machinepool, bootstrapConfig, infraConfig).Build(),
-			recorder: record.NewFakeRecorder(32),
-		}
-
-		res, err := r.reconcile(ctx, testCluster, machinepool)
-		g.Expect(err).NotTo(HaveOccurred())
-		g.Expect(res.Requeue).To(BeFalse())
-
-		r.reconcilePhase(machinepool)
-
-		g.Expect(machinepool.Status.GetTypedPhase()).To(Equal(expv1.MachinePoolPhaseScalingUp))
-	})
-
-	t.Run("Should set `Running` when scaled from zero to one", func(t *testing.T) {
-		g := NewWithT(t)
-
-		node := &corev1.Node{
-			ObjectMeta: metav1.ObjectMeta{
-				Name: "machinepool-test-node",
-			},
-			Spec: corev1.NodeSpec{
-				ProviderID: "test://machinepool-test-node",
-			},
-			Status: corev1.NodeStatus{
-				Conditions: []corev1.NodeCondition{
-					{Type: corev1.NodeReady, Status: corev1.ConditionTrue},
-				},
-			},
-		}
-		g.Expect(env.Create(ctx, node)).To(BeNil())
-		defer func(do ...client.Object) {
-			g.Expect(env.Cleanup(ctx, do...)).To(Succeed())
-		}(node)
-
-		kubeconfigSecret := kubeconfig.GenerateSecret(testCluster, kubeconfig.FromEnvTestConfig(env.Config, testCluster))
-		machinepool := defaultMachinePool.DeepCopy()
-		bootstrapConfig := defaultBootstrap.DeepCopy()
-		infraConfig := defaultInfra.DeepCopy()
-
-		// Setup prerequisites - a running MachinePool with no refs but providerIDList and replicas set to 1
-
-		// set replicas to 1
-		machinepool.Spec.Replicas = pointer.Int32(1)
-
-		// set nodeRefs to no instance
-		machinepool.Status.NodeRefs = []corev1.ObjectReference{}
-
-		// set infra providerIDList
-		err = unstructured.SetNestedStringSlice(infraConfig.Object, []string{"test://machinepool-test-node"}, "spec", "providerIDList")
-		g.Expect(err).NotTo(HaveOccurred())
-
-		// set infra replicas
-		err = unstructured.SetNestedField(infraConfig.Object, int64(1), "status", "replicas")
-		g.Expect(err).NotTo(HaveOccurred())
-
-		r := &MachinePoolReconciler{
-			Client:   fake.NewClientBuilder().WithObjects(testCluster, kubeconfigSecret, machinepool, bootstrapConfig, infraConfig).Build(),
-			recorder: record.NewFakeRecorder(32),
-		}
-
-		res, err := r.reconcile(ctx, testCluster, machinepool)
-		g.Expect(err).NotTo(HaveOccurred())
-		g.Expect(res.Requeue).To(BeFalse())
-
-		r.reconcilePhase(machinepool)
-
-		g.Expect(machinepool.Status.GetTypedPhase()).To(Equal(expv1.MachinePoolPhaseRunning))
-
-		delNode := &corev1.Node{}
-		g.Expect(env.Get(ctx, client.ObjectKeyFromObject(node), delNode)).To(BeNil())
-	})
-}
diff --git a/internal/controllers/topology/cluster/patches/engine_test.go b/internal/controllers/topology/cluster/patches/engine_test.go
index 3903d2a48..5deb20ca2 100644
--- a/internal/controllers/topology/cluster/patches/engine_test.go
+++ b/internal/controllers/topology/cluster/patches/engine_test.go
@@ -476,19 +476,6 @@ func setupTestObjects() (*scope.ClusterBlueprint, *scope.ClusterState) {
 			Namespace: metav1.NamespaceDefault,
 		},
 		Spec: clusterv1.ClusterSpec{
-			Paused: false,
-			ClusterNetwork: &clusterv1.ClusterNetwork{
-				APIServerPort: pointer.Int32(8),
-				Services: &clusterv1.NetworkRanges{
-					CIDRBlocks: []string{"10.10.10.1/24"},
-				},
-				Pods: &clusterv1.NetworkRanges{
-					CIDRBlocks: []string{"11.10.10.1/24"},
-				},
-				ServiceDomain: "lark",
-			},
-			ControlPlaneRef:   nil,
-			InfrastructureRef: nil,
 			Topology: &clusterv1.Topology{
 				Version: "v1.21.2",
 				Class:   clusterClass.Name,
diff --git a/internal/controllers/topology/cluster/patches/variables/variables_test.go b/internal/controllers/topology/cluster/patches/variables/variables_test.go
index b37527649..7da024101 100644
--- a/internal/controllers/topology/cluster/patches/variables/variables_test.go
+++ b/internal/controllers/topology/cluster/patches/variables/variables_test.go
@@ -68,75 +68,6 @@ func TestGlobal(t *testing.T) {
 						Class:   "clusterClass1",
 						Version: "v1.21.1",
 					},
-					ClusterNetwork: &clusterv1.ClusterNetwork{
-						Services: &clusterv1.NetworkRanges{
-							CIDRBlocks: []string{"10.10.10.1/24"},
-						},
-						Pods: &clusterv1.NetworkRanges{
-							CIDRBlocks: []string{"11.10.10.1/24"},
-						},
-						ServiceDomain: "cluster.local",
-					},
-				},
-			},
-			want: VariableMap{
-				"location": toJSON("\"us-central\""),
-				"cpu":      toJSON("8"),
-				BuiltinsName: toJSONCompact(`{
-					"cluster":{
-						"name": "cluster1",
-  						"namespace": "default",
- 						 "topology":{
-  						  	"version": "v1.21.1",
- 						   	"class": "clusterClass1"
-  						},
-  						"network":{
-							"serviceDomain":"cluster.local",
-  						 	"services":["10.10.10.1/24"],
-   							"pods":["11.10.10.1/24"],
-    						"ipFamily": "IPv4"
-						}}}`,
-				),
-			},
-		},
-		{
-			name: "Should calculate when serviceDomain is not set",
-			clusterTopology: &clusterv1.Topology{
-				Variables: []clusterv1.ClusterVariable{
-					{
-						Name:  "location",
-						Value: toJSON("\"us-central\""),
-					},
-					{
-						Name:  "cpu",
-						Value: toJSON("8"),
-					},
-					{
-						// This is blocked by a webhook, but let's make sure that the user-defined
-						// variable is overwritten by the builtin variable anyway.
-						Name:  "builtin",
-						Value: toJSON("8"),
-					},
-				},
-			},
-			cluster: &clusterv1.Cluster{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:      "cluster1",
-					Namespace: metav1.NamespaceDefault,
-				},
-				Spec: clusterv1.ClusterSpec{
-					Topology: &clusterv1.Topology{
-						Class:   "clusterClass1",
-						Version: "v1.21.1",
-					},
-					ClusterNetwork: &clusterv1.ClusterNetwork{
-						Services: &clusterv1.NetworkRanges{
-							CIDRBlocks: []string{"10.10.10.1/24"},
-						},
-						Pods: &clusterv1.NetworkRanges{
-							CIDRBlocks: []string{"11.10.10.1/24"},
-						},
-					},
 				},
 			},
 			want: VariableMap{
@@ -145,117 +76,11 @@ func TestGlobal(t *testing.T) {
 				BuiltinsName: toJSONCompact(`{
 					"cluster":{
 						"name": "cluster1",
-  						"namespace": "default",
- 						 "topology":{
-  						  	"version": "v1.21.1",
- 						   	"class": "clusterClass1"
-  						},
-  						"network":{
-  						 	"services":["10.10.10.1/24"],
-   							"pods":["11.10.10.1/24"],
-    						"ipFamily": "IPv4"
-						}}}`,
-				),
-			},
-		},
-		{
-			name: "Should calculate where some variables  are nil",
-			clusterTopology: &clusterv1.Topology{
-				Variables: []clusterv1.ClusterVariable{
-					{
-						Name:  "location",
-						Value: toJSON("\"us-central\""),
-					},
-					{
-						Name:  "cpu",
-						Value: toJSON("8"),
-					},
-					{
-						// This is blocked by a webhook, but let's make sure that the user-defined
-						// variable is overwritten by the builtin variable anyway.
-						Name:  "builtin",
-						Value: toJSON("8"),
-					},
-				},
-			},
-			cluster: &clusterv1.Cluster{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:      "cluster1",
-					Namespace: metav1.NamespaceDefault,
-				},
-				Spec: clusterv1.ClusterSpec{
-					Topology: &clusterv1.Topology{
-						Class:   "clusterClass1",
-						Version: "v1.21.1",
-					},
-					ClusterNetwork: &clusterv1.ClusterNetwork{
-						Services:      nil,
-						Pods:          &clusterv1.NetworkRanges{},
-						ServiceDomain: "cluster.local",
-					},
-				},
-			},
-			want: VariableMap{
-				"location": toJSON("\"us-central\""),
-				"cpu":      toJSON("8"),
-				BuiltinsName: toJSONCompact(`{
-					"cluster":{
-  						"name": "cluster1",
-  						"namespace": "default",
- 						"topology":{
-    						"version": "v1.21.1",
-    						"class": "clusterClass1"
-  						},
-  						"network":{
-    						"serviceDomain":"cluster.local",
-    						"ipFamily": "IPv4"
-						}}}`),
-			},
-		},
-		{
-			name: "Should calculate where ClusterNetwork is nil",
-			clusterTopology: &clusterv1.Topology{
-				Variables: []clusterv1.ClusterVariable{
-					{
-						Name:  "location",
-						Value: toJSON("\"us-central\""),
-					},
-					{
-						Name:  "cpu",
-						Value: toJSON("8"),
-					},
-					{
-						// This is blocked by a webhook, but let's make sure that the user-defined
-						// variable is overwritten by the builtin variable anyway.
-						Name:  "builtin",
-						Value: toJSON("8"),
-					},
-				},
-			},
-			cluster: &clusterv1.Cluster{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:      "cluster1",
-					Namespace: metav1.NamespaceDefault,
-				},
-				Spec: clusterv1.ClusterSpec{
-					Topology: &clusterv1.Topology{
-						Class:   "clusterClass1",
-						Version: "v1.21.1",
-					},
-					ClusterNetwork: nil,
-				},
-			},
-			want: VariableMap{
-				"location": toJSON("\"us-central\""),
-				"cpu":      toJSON("8"),
-				BuiltinsName: toJSONCompact(`{
-					"cluster":{
-  						"name": "cluster1",
-  						"namespace": "default",
-  						"topology":{
-						"version": "v1.21.1",
-   						 "class": "clusterClass1"
-					}
+						"namespace": "default",
+						"topology":{
+							"version": "v1.21.1",
+							"class": "clusterClass1"
+						}
 					}}`),
 			},
 		},
@@ -592,6 +417,7 @@ func toJSON(value string) apiextensionsv1.JSON {
 	return apiextensionsv1.JSON{Raw: []byte(value)}
 }
 
+// toJSONCompact is used to be able to write JSON values in a readable manner.
 func toJSONCompact(value string) apiextensionsv1.JSON {
 	var compactValue bytes.Buffer
 	if err := json.Compact(&compactValue, []byte(value)); err != nil {
diff --git a/test/e2e/cluster_upgrade.go b/test/e2e/cluster_upgrade.go
index 39cf0fc44..52f473dda 100644
--- a/test/e2e/cluster_upgrade.go
+++ b/test/e2e/cluster_upgrade.go
@@ -154,19 +154,10 @@ func ClusterUpgradeConformanceSpec(ctx context.Context, inputGetter func() Clust
 		} else {
 			// Cluster is not using ClusterClass, upgrade via individual resources.
 			By("Upgrading the Kubernetes control-plane")
-			var (
-				upgradeCPMachineTemplateTo      *string
-				upgradeWorkersMachineTemplateTo *string
-			)
-
-			if input.E2EConfig.HasVariable(CPMachineTemplateUpgradeTo) {
-				upgradeCPMachineTemplateTo = pointer.StringPtr(input.E2EConfig.GetVariable(CPMachineTemplateUpgradeTo))
+			var upgradeMachineTemplateTo *string
+			if input.E2EConfig.HasVariable(MachineTemplateUpgradeTo) {
+				upgradeMachineTemplateTo = pointer.StringPtr(input.E2EConfig.GetVariable(MachineTemplateUpgradeTo))
 			}
-
-			if input.E2EConfig.HasVariable(WorkersMachineTemplateUpgradeTo) {
-				upgradeWorkersMachineTemplateTo = pointer.StringPtr(input.E2EConfig.GetVariable(WorkersMachineTemplateUpgradeTo))
-			}
-
 			framework.UpgradeControlPlaneAndWaitForUpgrade(ctx, framework.UpgradeControlPlaneAndWaitForUpgradeInput{
 				ClusterProxy:                input.BootstrapClusterProxy,
 				Cluster:                     clusterResources.Cluster,
@@ -174,7 +165,7 @@ func ClusterUpgradeConformanceSpec(ctx context.Context, inputGetter func() Clust
 				EtcdImageTag:                input.E2EConfig.GetVariable(EtcdVersionUpgradeTo),
 				DNSImageTag:                 input.E2EConfig.GetVariable(CoreDNSVersionUpgradeTo),
 				KubernetesUpgradeVersion:    input.E2EConfig.GetVariable(KubernetesVersionUpgradeTo),
-				UpgradeMachineTemplate:      upgradeCPMachineTemplateTo,
+				UpgradeMachineTemplate:      upgradeMachineTemplateTo,
 				WaitForMachinesToBeUpgraded: input.E2EConfig.GetIntervals(specName, "wait-machine-upgrade"),
 				WaitForKubeProxyUpgrade:     input.E2EConfig.GetIntervals(specName, "wait-machine-upgrade"),
 				WaitForDNSUpgrade:           input.E2EConfig.GetIntervals(specName, "wait-machine-upgrade"),
@@ -187,7 +178,7 @@ func ClusterUpgradeConformanceSpec(ctx context.Context, inputGetter func() Clust
 					ClusterProxy:                input.BootstrapClusterProxy,
 					Cluster:                     clusterResources.Cluster,
 					UpgradeVersion:              input.E2EConfig.GetVariable(KubernetesVersionUpgradeTo),
-					UpgradeMachineTemplate:      upgradeWorkersMachineTemplateTo,
+					UpgradeMachineTemplate:      upgradeMachineTemplateTo,
 					MachineDeployments:          clusterResources.MachineDeployments,
 					WaitForMachinesToBeUpgraded: input.E2EConfig.GetIntervals(specName, "wait-worker-nodes"),
 				})
diff --git a/test/e2e/common.go b/test/e2e/common.go
index 213a58780..99fc830f7 100644
--- a/test/e2e/common.go
+++ b/test/e2e/common.go
@@ -33,17 +33,16 @@ import (
 
 // Test suite constants for e2e config variables.
 const (
-	KubernetesVersionManagement     = "KUBERNETES_VERSION_MANAGEMENT"
-	KubernetesVersion               = "KUBERNETES_VERSION"
-	CNIPath                         = "CNI"
-	CNIResources                    = "CNI_RESOURCES"
-	KubernetesVersionUpgradeFrom    = "KUBERNETES_VERSION_UPGRADE_FROM"
-	KubernetesVersionUpgradeTo      = "KUBERNETES_VERSION_UPGRADE_TO"
-	CPMachineTemplateUpgradeTo      = "CONTROL_PLANE_MACHINE_TEMPLATE_UPGRADE_TO"
-	WorkersMachineTemplateUpgradeTo = "WORKERS_MACHINE_TEMPLATE_UPGRADE_TO"
-	EtcdVersionUpgradeTo            = "ETCD_VERSION_UPGRADE_TO"
-	CoreDNSVersionUpgradeTo         = "COREDNS_VERSION_UPGRADE_TO"
-	IPFamily                        = "IP_FAMILY"
+	KubernetesVersionManagement  = "KUBERNETES_VERSION_MANAGEMENT"
+	KubernetesVersion            = "KUBERNETES_VERSION"
+	CNIPath                      = "CNI"
+	CNIResources                 = "CNI_RESOURCES"
+	KubernetesVersionUpgradeFrom = "KUBERNETES_VERSION_UPGRADE_FROM"
+	KubernetesVersionUpgradeTo   = "KUBERNETES_VERSION_UPGRADE_TO"
+	MachineTemplateUpgradeTo     = "MACHINE_TEMPLATE_UPGRADE_TO"
+	EtcdVersionUpgradeTo         = "ETCD_VERSION_UPGRADE_TO"
+	CoreDNSVersionUpgradeTo      = "COREDNS_VERSION_UPGRADE_TO"
+	IPFamily                     = "IP_FAMILY"
 )
 
 func Byf(format string, a ...interface{}) {
diff --git a/test/e2e/machine_pool.go b/test/e2e/machine_pool.go
index 4203393b2..d4e392630 100644
--- a/test/e2e/machine_pool.go
+++ b/test/e2e/machine_pool.go
@@ -113,15 +113,6 @@ func MachinePoolSpec(ctx context.Context, inputGetter func() MachinePoolInput) {
 			WaitForMachinePoolToScale: input.E2EConfig.GetIntervals(specName, "wait-machine-pool-nodes"),
 		})
 
-		By("Scaling the machine pool to zero")
-		framework.ScaleMachinePoolAndWait(ctx, framework.ScaleMachinePoolAndWaitInput{
-			ClusterProxy:              input.BootstrapClusterProxy,
-			Cluster:                   clusterResources.Cluster,
-			Replicas:                  0,
-			MachinePools:              clusterResources.MachinePools,
-			WaitForMachinePoolToScale: input.E2EConfig.GetIntervals(specName, "wait-machine-pool-nodes"),
-		})
-
 		By("PASSED!")
 	})
 
diff --git a/test/framework/machinepool_helpers.go b/test/framework/machinepool_helpers.go
index 51875ccd2..03db3fd4d 100644
--- a/test/framework/machinepool_helpers.go
+++ b/test/framework/machinepool_helpers.go
@@ -69,7 +69,7 @@ func WaitForMachinePoolNodesToExist(ctx context.Context, input WaitForMachinePoo
 	Expect(input.Getter).ToNot(BeNil(), "Invalid argument. input.Getter can't be nil when calling WaitForMachinePoolNodesToExist")
 	Expect(input.MachinePool).ToNot(BeNil(), "Invalid argument. input.MachinePool can't be nil when calling WaitForMachinePoolNodesToExist")
 
-	By("Waiting for the machine pool workload nodes")
+	By("Waiting for the machine pool workload nodes to exist")
 	Eventually(func() (int, error) {
 		nn := client.ObjectKey{
 			Namespace: input.MachinePool.Namespace,
diff --git a/test/go.mod b/test/go.mod
index 9f7ea47eb..9565da76f 100644
--- a/test/go.mod
+++ b/test/go.mod
@@ -15,15 +15,15 @@ require (
 	github.com/pkg/errors v0.9.1
 	github.com/spf13/pflag v1.0.5
 	github.com/vincent-petithory/dataurl v1.0.0
-	k8s.io/api v0.23.5
-	k8s.io/apiextensions-apiserver v0.23.5
-	k8s.io/apimachinery v0.23.5
-	k8s.io/client-go v0.23.5
-	k8s.io/component-base v0.23.5
+	k8s.io/api v0.23.0
+	k8s.io/apiextensions-apiserver v0.23.0
+	k8s.io/apimachinery v0.23.0
+	k8s.io/client-go v0.23.0
+	k8s.io/component-base v0.23.0
 	k8s.io/klog/v2 v2.30.0
-	k8s.io/utils v0.0.0-20211116205334-6203023598ed
+	k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b
 	sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000
-	sigs.k8s.io/controller-runtime v0.11.2
+	sigs.k8s.io/controller-runtime v0.11.1
 	sigs.k8s.io/kind v0.11.1
 	sigs.k8s.io/yaml v1.3.0
 )
@@ -104,7 +104,7 @@ require (
 	github.com/subosito/gotenv v1.2.0 // indirect
 	github.com/valyala/fastjson v1.6.3 // indirect
 	golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
-	golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect
+	golang.org/x/net v0.0.0-20210825183410-e898025ed96a // indirect
 	golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
 	golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8 // indirect
 	golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
@@ -120,9 +120,9 @@ require (
 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
-	k8s.io/apiserver v0.23.5 // indirect
+	k8s.io/apiserver v0.23.0 // indirect
 	k8s.io/cluster-bootstrap v0.23.0 // indirect
 	k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect
 	sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect
 )
diff --git a/test/go.sum b/test/go.sum
index 7ab71f753..9edb3d338 100644
--- a/test/go.sum
+++ b/test/go.sum
@@ -1098,9 +1098,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210825183410-e898025ed96a h1:bRuuGXV8wwSdGTB+CtJf+FjgO1APK1CoO39T4BN/XBw=
 golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY=
-golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1523,40 +1522,35 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
 k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
 k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
 k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
+k8s.io/api v0.23.0 h1:WrL1gb73VSC8obi8cuYETJGXEoFNEh3LU0Pt+Sokgro=
 k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg=
-k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA=
-k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8=
-k8s.io/apiextensions-apiserver v0.23.5 h1:5SKzdXyvIJKu+zbfPc3kCbWpbxi+O+zdmAJBm26UJqI=
-k8s.io/apiextensions-apiserver v0.23.5/go.mod h1:ntcPWNXS8ZPKN+zTXuzYMeg731CP0heCTl6gYBxLcuQ=
+k8s.io/apiextensions-apiserver v0.23.0 h1:uii8BYmHYiT2ZTAJxmvc3X8UhNYMxl2A0z0Xq3Pm+WY=
+k8s.io/apiextensions-apiserver v0.23.0/go.mod h1:xIFAEEDlAZgpVBl/1VSjGDmLoXAWRG40+GsWhKhAxY4=
 k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc=
+k8s.io/apimachinery v0.23.0 h1:mIfWRMjBuMdolAWJ3Fd+aPTMv3X9z+waiARMpvvb0HQ=
 k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc=
-k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0=
-k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
 k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU=
 k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM=
 k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
-k8s.io/apiserver v0.23.5 h1:2Ly8oUjz5cnZRn1YwYr+aFgDZzUmEVL9RscXbnIeDSE=
-k8s.io/apiserver v0.23.5/go.mod h1:7wvMtGJ42VRxzgVI7jkbKvMbuCbVbgsWFT7RyXiRNTw=
+k8s.io/apiserver v0.23.0 h1:Ds/QveXWi9aJ8ISB0CJa4zBNc5njxAs5u3rmMIexqCY=
+k8s.io/apiserver v0.23.0/go.mod h1:Cec35u/9zAepDPPFyT+UMrgqOCjgJ5qtfVJDxjZYmt4=
 k8s.io/cli-runtime v0.23.0/go.mod h1:B5N3YH0KP1iKr6gEuJ/RRmGjO0mJQ/f/JrsmEiPQAlU=
 k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
 k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
 k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
+k8s.io/client-go v0.23.0 h1:vcsOqyPq7XV3QmQRCBH/t9BICJM9Q1M18qahjv+rebY=
 k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA=
-k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8=
-k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4=
 k8s.io/cluster-bootstrap v0.23.0 h1:8pZuuAWPoygewSNB4IddX3HBwXcQkPDXL/ca7GtGf4o=
 k8s.io/cluster-bootstrap v0.23.0/go.mod h1:VltEnKWfrRTiKgOXp3ts3vh7yqNlH6KFKFflo9GtCBg=
 k8s.io/code-generator v0.23.0/go.mod h1:vQvOhDXhuzqiVfM/YHp+dmg10WDZCchJVObc9MvowsE=
-k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk=
 k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
 k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
 k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
+k8s.io/component-base v0.23.0 h1:UAnyzjvVZ2ZR1lF35YwtNY6VMN94WtOnArcXBu34es8=
 k8s.io/component-base v0.23.0/go.mod h1:DHH5uiFvLC1edCpvcTDV++NKULdYYU6pR9Tt3HIKMKI=
-k8s.io/component-base v0.23.5 h1:8qgP5R6jG1BBSXmRYW+dsmitIrpk8F/fPEvgDenMCCE=
-k8s.io/component-base v0.23.5/go.mod h1:c5Nq44KZyt1aLl0IpHX82fhsn84Sb0jjzwjpcA42bY0=
 k8s.io/component-helpers v0.23.0/go.mod h1:liXMh6FZS4qamKtMJQ7uLHnFe3tlC86RX5mJEk/aerg=
 k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
 k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
@@ -1578,17 +1572,16 @@ k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
 k8s.io/metrics v0.23.0/go.mod h1:NDiZTwppEtAuKJ1Rxt3S4dhyRzdp6yUcJf0vo023dPo=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs=
 k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE=
-k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
-sigs.k8s.io/controller-runtime v0.11.2 h1:H5GTxQl0Mc9UjRJhORusqfJCIjBO8UtUxGggCwL1rLA=
-sigs.k8s.io/controller-runtime v0.11.2/go.mod h1:P6QCzrEjLaZGqHsfd+os7JQ+WFZhvB8MRFsn4dWF7O4=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.25/go.mod h1:Mlj9PNLmG9bZ6BHFwFKDo5afkpWyUISkb9Me0GnK66I=
+sigs.k8s.io/controller-runtime v0.11.1 h1:7YIHT2QnHJArj/dk9aUkYhfqfK5cIxPOX5gPECfdZLU=
+sigs.k8s.io/controller-runtime v0.11.1/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
 sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
 sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
 sigs.k8s.io/kind v0.11.1 h1:pVzOkhUwMBrCB0Q/WllQDO3v14Y+o2V0tFgjTqIUjwA=
@@ -1600,8 +1593,8 @@ sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLC
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.0 h1:kDvPBbnPk+qYmkHmSo8vKGp438IASWofnbbUKDE/bv0=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=