Repository: kubernetes-sigs/cluster-api
Pull request #7491 (2022-11-03 22:22:03)

🌱 Add Jont828 to clusterctl reviewers
<!-- please add an icon to the title of this PR (see https://sigs.k8s.io/cluster-api/CONTRIBUTING.md#contributing-a-patch), and delete this line and similar ones -->
<!-- the icon will be either ⚠️ (:warning:, major or breaking changes), ✨ (:sparkles:, feature additions), 🐛 (:bug:, patch and bugfixes), 📖 (:book:, documentation or proposals), or 🌱 (:seedling:, minor or other) -->

**What this PR does / why we need it**:

**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
Fixes #


k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please assign fabriziopandini for approval by writing `/assign @fabriziopandini` in a comment. For more information see [the Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fcluster-api).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/cluster-api/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["fabriziopandini"]} -->
Jont828: /assign @fabriziopandini 
CecileRobertMichon: 🎉 

+1

Patch:
diff --git a/.golangci.yml b/.golangci.yml
index aa34d6e7a..903ee75b5 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -176,7 +176,7 @@ linters-settings:
       - name: errorf
       - name: empty-block
       - name: superfluous-else
-      - name: unused-parameter
+      #- name: unused-parameter  # TODO This is a recommended rule with many findings which may require it's own pr.
       - name: unreachable-code
       - name: redefines-builtin-id
       #
diff --git a/Makefile b/Makefile
index fefbb2eac..f4ba19a9f 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ SHELL:=/usr/bin/env bash
 #
 # Go.
 #
-GO_VERSION ?= 1.19.3
+GO_VERSION ?= 1.19.2
 GO_CONTAINER_IMAGE ?= docker.io/library/golang:$(GO_VERSION)
 
 # Use GOPROXY environment variable if set
@@ -46,9 +46,6 @@ export KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT ?= 60s
 # This option is for running docker manifest command
 export DOCKER_CLI_EXPERIMENTAL := enabled
 
-# Enables shell script tracing. Enable by running: TRACE=1 make <target>
-TRACE ?= 0
-
 #
 # Directories.
 #
@@ -130,7 +127,7 @@ ENVSUBST_BIN := envsubst
 ENVSUBST := $(abspath $(TOOLS_BIN_DIR)/$(ENVSUBST_BIN)-$(ENVSUBST_VER))
 ENVSUBST_PKG := github.com/drone/envsubst/v2/cmd/envsubst
 
-GO_APIDIFF_VER := v0.5.0
+GO_APIDIFF_VER := v0.4.0
 GO_APIDIFF_BIN := go-apidiff
 GO_APIDIFF := $(abspath $(TOOLS_BIN_DIR)/$(GO_APIDIFF_BIN)-$(GO_APIDIFF_VER))
 GO_APIDIFF_PKG := github.com/joelanford/go-apidiff
@@ -174,7 +171,7 @@ GOLANGCI_LINT := $(abspath $(TOOLS_BIN_DIR)/$(GOLANGCI_LINT_BIN))
 
 # Define Docker related variables. Releases should modify and double check these vars.
 REGISTRY ?= gcr.io/$(shell gcloud config get-value project)
-PROD_REGISTRY ?= registry.k8s.io/cluster-api
+PROD_REGISTRY ?= k8s.gcr.io/cluster-api
 
 STAGING_REGISTRY ?= gcr.io/k8s-staging-cluster-api
 STAGING_BUCKET ?= artifacts.k8s-staging-cluster-api.appspot.com
@@ -559,7 +556,7 @@ lint-fix: $(GOLANGCI_LINT) ## Lint the codebase and run auto-fixers if supported
 
 .PHONY: tiltfile-fix
 tiltfile-fix: ## Format the Tiltfile
-	TRACE=$(TRACE) ./hack/verify-starlark.sh fix
+	./hack/verify-starlark.sh fix
 
 APIDIFF_OLD_COMMIT ?= $(shell git rev-parse origin/main)
 
@@ -596,23 +593,23 @@ verify-conversions: $(CONVERSION_VERIFIER)  ## Verifies expected API conversion
 
 .PHONY: verify-doctoc
 verify-doctoc:
-	TRACE=$(TRACE) ./hack/verify-doctoc.sh
+	./hack/verify-doctoc.sh
 
 .PHONY: verify-capi-book-summary
 verify-capi-book-summary:
-	TRACE=$(TRACE) ./hack/verify-capi-book-summary.sh
+	./hack/verify-capi-book-summary.sh
 
 .PHONY: verify-boilerplate
 verify-boilerplate: ## Verify boilerplate text exists in each file
-	TRACE=$(TRACE) ./hack/verify-boilerplate.sh
+	./hack/verify-boilerplate.sh
 
 .PHONY: verify-shellcheck
 verify-shellcheck: ## Verify shell files
-	TRACE=$(TRACE) ./hack/verify-shellcheck.sh
+	./hack/verify-shellcheck.sh
 
 .PHONY: verify-tiltfile
 verify-tiltfile: ## Verify Tiltfile format
-	TRACE=$(TRACE) ./hack/verify-starlark.sh
+	./hack/verify-starlark.sh
 
 ## --------------------------------------
 ## Binaries
diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES
index a1239cc69..365caeffa 100644
--- a/OWNERS_ALIASES
+++ b/OWNERS_ALIASES
@@ -71,6 +71,7 @@ aliases:
 
   cluster-api-clusterctl-maintainers:
   cluster-api-clusterctl-reviewers:
+  - Jont828
   - ykakarap
 
   # -----------------------------------------------------------
diff --git a/Tiltfile b/Tiltfile
index 0eb9cde41..d70db49a4 100644
--- a/Tiltfile
+++ b/Tiltfile
@@ -167,7 +167,7 @@ def load_provider_tiltfiles():
 
 tilt_helper_dockerfile_header = """
 # Tilt image
-FROM golang:1.19.3 as tilt-helper
+FROM golang:1.19.2 as tilt-helper
 # Support live reloading with Tilt
 RUN go install github.com/go-delve/delve/cmd/dlv@latest
 RUN wget --output-document /restart.sh --quiet https://raw.githubusercontent.com/tilt-dev/rerun-process-wrapper/master/restart.sh  && \
diff --git a/api/v1alpha3/conversion.go b/api/v1alpha3/conversion.go
index 2f2df22f1..59a442204 100644
--- a/api/v1alpha3/conversion.go
+++ b/api/v1alpha3/conversion.go
@@ -277,13 +277,13 @@ func (dst *MachineHealthCheckList) ConvertFrom(srcRaw conversion.Hub) error {
 	return Convert_v1beta1_MachineHealthCheckList_To_v1alpha3_MachineHealthCheckList(src, dst, nil)
 }
 
-func Convert_v1beta1_MachineSetStatus_To_v1alpha3_MachineSetStatus(in *clusterv1.MachineSetStatus, out *MachineSetStatus, _ apiconversion.Scope) error {
+func Convert_v1beta1_MachineSetStatus_To_v1alpha3_MachineSetStatus(in *clusterv1.MachineSetStatus, out *MachineSetStatus, s apiconversion.Scope) error {
 	// Status.Conditions was introduced in v1alpha4, thus requiring a custom conversion function; the values is going to be preserved in an annotation thus allowing roundtrip without loosing informations
 	return autoConvert_v1beta1_MachineSetStatus_To_v1alpha3_MachineSetStatus(in, out, nil)
 }
 
 func Convert_v1beta1_ClusterSpec_To_v1alpha3_ClusterSpec(in *clusterv1.ClusterSpec, out *ClusterSpec, s apiconversion.Scope) error {
-	// NOTE: custom conversion func is required because spec.Topology does not exist in v1alpha3
+	// NOTE: custom conversion func is required because spec.Topology does not exists in v1alpha3
 	return autoConvert_v1beta1_ClusterSpec_To_v1alpha3_ClusterSpec(in, out, s)
 }
 
diff --git a/api/v1alpha4/conversion.go b/api/v1alpha4/conversion.go
index df357d49f..6106280b1 100644
--- a/api/v1alpha4/conversion.go
+++ b/api/v1alpha4/conversion.go
@@ -70,7 +70,6 @@ func (src *Cluster) ConvertTo(dstRaw conversion.Hub) error {
 				dst.Spec.Topology.Workers.MachineDeployments[i].NodeVolumeDetachTimeout = restored.Spec.Topology.Workers.MachineDeployments[i].NodeVolumeDetachTimeout
 				dst.Spec.Topology.Workers.MachineDeployments[i].NodeDeletionTimeout = restored.Spec.Topology.Workers.MachineDeployments[i].NodeDeletionTimeout
 				dst.Spec.Topology.Workers.MachineDeployments[i].MinReadySeconds = restored.Spec.Topology.Workers.MachineDeployments[i].MinReadySeconds
-				dst.Spec.Topology.Workers.MachineDeployments[i].Strategy = restored.Spec.Topology.Workers.MachineDeployments[i].Strategy
 				dst.Spec.Topology.Workers.MachineDeployments[i].MachineHealthCheck = restored.Spec.Topology.Workers.MachineDeployments[i].MachineHealthCheck
 			}
 		}
diff --git a/api/v1alpha4/zz_generated.conversion.go b/api/v1alpha4/zz_generated.conversion.go
index 4f7e6f5a3..7a4ddcaa5 100644
--- a/api/v1alpha4/zz_generated.conversion.go
+++ b/api/v1alpha4/zz_generated.conversion.go
@@ -1245,7 +1245,6 @@ func autoConvert_v1beta1_MachineDeploymentTopology_To_v1alpha4_MachineDeployment
 	// WARNING: in.NodeVolumeDetachTimeout requires manual conversion: does not exist in peer-type
 	// WARNING: in.NodeDeletionTimeout requires manual conversion: does not exist in peer-type
 	// WARNING: in.MinReadySeconds requires manual conversion: does not exist in peer-type
-	// WARNING: in.Strategy requires manual conversion: does not exist in peer-type
 	// WARNING: in.Variables requires manual conversion: does not exist in peer-type
 	return nil
 }
diff --git a/api/v1beta1/cluster_types.go b/api/v1beta1/cluster_types.go
index 4647c1af9..569fcfc2f 100644
--- a/api/v1beta1/cluster_types.go
+++ b/api/v1beta1/cluster_types.go
@@ -206,11 +206,6 @@ type MachineDeploymentTopology struct {
 	// +optional
 	MinReadySeconds *int32 `json:"minReadySeconds,omitempty"`
 
-	// The deployment strategy to use to replace existing machines with
-	// new ones.
-	// +optional
-	Strategy *MachineDeploymentStrategy `json:"strategy,omitempty"`
-
 	// Variables can be used to customize the MachineDeployment through patches.
 	// +optional
 	Variables *MachineDeploymentVariables `json:"variables,omitempty"`
diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go
index f3f9b905a..aa350d205 100644
--- a/api/v1beta1/zz_generated.deepcopy.go
+++ b/api/v1beta1/zz_generated.deepcopy.go
@@ -1020,11 +1020,6 @@ func (in *MachineDeploymentTopology) DeepCopyInto(out *MachineDeploymentTopology
 		*out = new(int32)
 		**out = **in
 	}
-	if in.Strategy != nil {
-		in, out := &in.Strategy, &out.Strategy
-		*out = new(MachineDeploymentStrategy)
-		(*in).DeepCopyInto(*out)
-	}
 	if in.Variables != nil {
 		in, out := &in.Variables, &out.Variables
 		*out = new(MachineDeploymentVariables)
diff --git a/api/v1beta1/zz_generated.openapi.go b/api/v1beta1/zz_generated.openapi.go
index ad2c4dc6b..8c1adb414 100644
--- a/api/v1beta1/zz_generated.openapi.go
+++ b/api/v1beta1/zz_generated.openapi.go
@@ -1751,12 +1751,6 @@ func schema_sigsk8sio_cluster_api_api_v1beta1_MachineDeploymentTopology(ref comm
 							Format:      "int32",
 						},
 					},
-					"strategy": {
-						SchemaProps: spec.SchemaProps{
-							Description: "The deployment strategy to use to replace existing machines with new ones.",
-							Ref:         ref("sigs.k8s.io/cluster-api/api/v1beta1.MachineDeploymentStrategy"),
-						},
-					},
 					"variables": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Variables can be used to customize the MachineDeployment through patches.",
@@ -1768,7 +1762,7 @@ func schema_sigsk8sio_cluster_api_api_v1beta1_MachineDeploymentTopology(ref comm
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "sigs.k8s.io/cluster-api/api/v1beta1.MachineDeploymentStrategy", "sigs.k8s.io/cluster-api/api/v1beta1.MachineDeploymentVariables", "sigs.k8s.io/cluster-api/api/v1beta1.MachineHealthCheckTopology", "sigs.k8s.io/cluster-api/api/v1beta1.ObjectMeta"},
+			"k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "sigs.k8s.io/cluster-api/api/v1beta1.MachineDeploymentVariables", "sigs.k8s.io/cluster-api/api/v1beta1.MachineHealthCheckTopology", "sigs.k8s.io/cluster-api/api/v1beta1.ObjectMeta"},
 	}
 }
 
diff --git a/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_webhook.go b/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_webhook.go
index f718f7ec2..c77d6b594 100644
--- a/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_webhook.go
+++ b/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_webhook.go
@@ -70,7 +70,7 @@ func (c *KubeadmConfig) ValidateCreate() error {
 }
 
 // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
-func (c *KubeadmConfig) ValidateUpdate(_ runtime.Object) error {
+func (c *KubeadmConfig) ValidateUpdate(old runtime.Object) error {
 	return c.Spec.validate(c.Name)
 }
 
diff --git a/bootstrap/kubeadm/api/v1beta1/kubeadmconfigtemplate_webhook.go b/bootstrap/kubeadm/api/v1beta1/kubeadmconfigtemplate_webhook.go
index a1c581fa6..e5fb051a8 100644
--- a/bootstrap/kubeadm/api/v1beta1/kubeadmconfigtemplate_webhook.go
+++ b/bootstrap/kubeadm/api/v1beta1/kubeadmconfigtemplate_webhook.go
@@ -49,7 +49,7 @@ func (r *KubeadmConfigTemplate) ValidateCreate() error {
 }
 
 // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
-func (r *KubeadmConfigTemplate) ValidateUpdate(_ runtime.Object) error {
+func (r *KubeadmConfigTemplate) ValidateUpdate(old runtime.Object) error {
 	return r.Spec.validate(r.Name)
 }
 
diff --git a/cmd/clusterctl/client/cluster/internal/dryrun/client.go b/cmd/clusterctl/client/cluster/internal/dryrun/client.go
index bb76ab0ab..6640178db 100644
--- a/cmd/clusterctl/client/cluster/internal/dryrun/client.go
+++ b/cmd/clusterctl/client/cluster/internal/dryrun/client.go
@@ -248,7 +248,7 @@ func (c *Client) Delete(ctx context.Context, obj client.Object, opts ...client.D
 
 // Update updates the given obj in the internal object tracker.
 // NOTE: Topology reconciler does not use update, so we are skipping implementation for now.
-func (c *Client) Update(_ context.Context, _ client.Object, _ ...client.UpdateOption) error {
+func (c *Client) Update(ctx context.Context, obj client.Object, opts ...client.UpdateOption) error {
 	panic("Update method is not supported by the dryrun client")
 }
 
@@ -284,7 +284,7 @@ func (c *Client) Patch(ctx context.Context, obj client.Object, patch client.Patc
 
 // DeleteAllOf deletes all objects of the given type matching the given options.
 // NOTE: Topology reconciler does not use DeleteAllOf, so we are skipping implementation for now.
-func (c *Client) DeleteAllOf(_ context.Context, _ client.Object, _ ...client.DeleteAllOfOption) error {
+func (c *Client) DeleteAllOf(ctx context.Context, obj client.Object, opts ...client.DeleteAllOfOption) error {
 	panic("DeleteAllOf method is not supported by the dryrun client")
 }
 
diff --git a/cmd/clusterctl/client/cluster/mover.go b/cmd/clusterctl/client/cluster/mover.go
index 7a05ab711..f01b4d8f7 100644
--- a/cmd/clusterctl/client/cluster/mover.go
+++ b/cmd/clusterctl/client/cluster/mover.go
@@ -473,7 +473,7 @@ func (o *objectMover) fromDirectory(graph *objectGraph, toProxy Proxy) error {
 	}
 
 	// Resume reconciling the Clusters after being restored from a directory.
-	// By default, when moved to a directory, Clusters are paused, so they must be unpaused to be used again.
+	// By default, when moved to a directory , Clusters are paused, so they must be unpaused to be used again.
 	log.V(1).Info("Resuming the target cluster")
 	return setClusterPause(toProxy, clusters, false, o.dryRun)
 }
diff --git a/cmd/clusterctl/client/cluster/topology.go b/cmd/clusterctl/client/cluster/topology.go
index 045f433cd..1ff67671b 100644
--- a/cmd/clusterctl/client/cluster/topology.go
+++ b/cmd/clusterctl/client/cluster/topology.go
@@ -631,9 +631,9 @@ func filterObjects(objs []*unstructured.Unstructured, gvks ...schema.GroupVersio
 
 type noOpRecorder struct{}
 
-func (nr *noOpRecorder) Event(_ runtime.Object, _, _, _ string)                    {}
-func (nr *noOpRecorder) Eventf(_ runtime.Object, _, _, _ string, _ ...interface{}) {}
-func (nr *noOpRecorder) AnnotatedEventf(_ runtime.Object, _ map[string]string, _, _, _ string, _ ...interface{}) {
+func (nr *noOpRecorder) Event(_ runtime.Object, _, _, _ string)                       {}
+func (nr *noOpRecorder) Eventf(_ runtime.Object, _, _, _ string, args ...interface{}) {}
+func (nr *noOpRecorder) AnnotatedEventf(_ runtime.Object, _ map[string]string, _, _, _ string, args ...interface{}) {
 }
 
 func objToRef(o *unstructured.Unstructured) *corev1.ObjectReference {
diff --git a/cmd/clusterctl/log/logger.go b/cmd/clusterctl/log/logger.go
index a64e2bb65..71ade25e1 100644
--- a/cmd/clusterctl/log/logger.go
+++ b/cmd/clusterctl/log/logger.go
@@ -67,7 +67,7 @@ type logger struct {
 
 var _ logr.LogSink = &logger{}
 
-func (l *logger) Init(_ logr.RuntimeInfo) {
+func (l *logger) Init(info logr.RuntimeInfo) {
 }
 
 // Enabled tests whether this Logger is enabled.
diff --git a/config/crd/bases/cluster.x-k8s.io_clusters.yaml b/config/crd/bases/cluster.x-k8s.io_clusters.yaml
index d80982e2e..4f52e6dc2 100644
--- a/config/crd/bases/cluster.x-k8s.io_clusters.yaml
+++ b/config/crd/bases/cluster.x-k8s.io_clusters.yaml
@@ -1256,75 +1256,6 @@ spec:
                                 of this value.
                               format: int32
                               type: integer
-                            strategy:
-                              description: The deployment strategy to use to replace
-                                existing machines with new ones.
-                              properties:
-                                rollingUpdate:
-                                  description: Rolling update config params. Present
-                                    only if MachineDeploymentStrategyType = RollingUpdate.
-                                  properties:
-                                    deletePolicy:
-                                      description: DeletePolicy defines the policy
-                                        used by the MachineDeployment to identify
-                                        nodes to delete when downscaling. Valid values
-                                        are "Random, "Newest", "Oldest" When no value
-                                        is supplied, the default DeletePolicy of MachineSet
-                                        is used
-                                      enum:
-                                      - Random
-                                      - Newest
-                                      - Oldest
-                                      type: string
-                                    maxSurge:
-                                      anyOf:
-                                      - type: integer
-                                      - type: string
-                                      description: 'The maximum number of machines
-                                        that can be scheduled above the desired number
-                                        of machines. Value can be an absolute number
-                                        (ex: 5) or a percentage of desired machines
-                                        (ex: 10%). This can not be 0 if MaxUnavailable
-                                        is 0. Absolute number is calculated from percentage
-                                        by rounding up. Defaults to 1. Example: when
-                                        this is set to 30%, the new MachineSet can
-                                        be scaled up immediately when the rolling
-                                        update starts, such that the total number
-                                        of old and new machines do not exceed 130%
-                                        of desired machines. Once old machines have
-                                        been killed, new MachineSet can be scaled
-                                        up further, ensuring that total number of
-                                        machines running at any time during the update
-                                        is at most 130% of desired machines.'
-                                      x-kubernetes-int-or-string: true
-                                    maxUnavailable:
-                                      anyOf:
-                                      - type: integer
-                                      - type: string
-                                      description: 'The maximum number of machines
-                                        that can be unavailable during the update.
-                                        Value can be an absolute number (ex: 5) or
-                                        a percentage of desired machines (ex: 10%).
-                                        Absolute number is calculated from percentage
-                                        by rounding down. This can not be 0 if MaxSurge
-                                        is 0. Defaults to 0. Example: when this is
-                                        set to 30%, the old MachineSet can be scaled
-                                        down to 70% of desired machines immediately
-                                        when the rolling update starts. Once new machines
-                                        are ready, old MachineSet can be scaled down
-                                        further, followed by scaling up the new MachineSet,
-                                        ensuring that the total number of machines
-                                        available at all times during the update is
-                                        at least 70% of desired machines.'
-                                      x-kubernetes-int-or-string: true
-                                  type: object
-                                type:
-                                  description: Type of deployment. Default is RollingUpdate.
-                                  enum:
-                                  - RollingUpdate
-                                  - OnDelete
-                                  type: string
-                              type: object
                             variables:
                               description: Variables can be used to customize the
                                 MachineDeployment through patches.
diff --git a/controllers/remote/fake/cluster.go b/controllers/remote/fake/cluster.go
index 7247d8fd0..237ce2503 100644
--- a/controllers/remote/fake/cluster.go
+++ b/controllers/remote/fake/cluster.go
@@ -25,6 +25,6 @@ import (
 
 // NewClusterClient returns the same client passed as input, as output. It is assumed that the client is a
 // fake controller-runtime client.
-func NewClusterClient(_ context.Context, _ string, c client.Client, _ client.ObjectKey) (client.Client, error) {
+func NewClusterClient(_ context.Context, sourceName string, c client.Client, _ client.ObjectKey) (client.Client, error) {
 	return c, nil
 }
diff --git a/controlplane/kubeadm/internal/proxy/dial.go b/controlplane/kubeadm/internal/proxy/dial.go
index e4c1024ff..87467ea36 100644
--- a/controlplane/kubeadm/internal/proxy/dial.go
+++ b/controlplane/kubeadm/internal/proxy/dial.go
@@ -84,7 +84,7 @@ func (d *Dialer) DialContextWithAddr(ctx context.Context, addr string) (net.Conn
 
 // DialContext creates proxied port-forwarded connections.
 // ctx is currently unused, but fulfils the type signature used by GRPC.
-func (d *Dialer) DialContext(_ context.Context, _ string, addr string) (net.Conn, error) {
+func (d *Dialer) DialContext(_ context.Context, network string, addr string) (net.Conn, error) {
 	req := d.clientset.CoreV1().RESTClient().
 		Post().
 		Resource(d.proxy.Kind).
diff --git a/controlplane/kubeadm/internal/workload_cluster_conditions.go b/controlplane/kubeadm/internal/workload_cluster_conditions.go
index bdb960e4d..6fd2b5ff5 100644
--- a/controlplane/kubeadm/internal/workload_cluster_conditions.go
+++ b/controlplane/kubeadm/internal/workload_cluster_conditions.go
@@ -47,7 +47,7 @@ func (w *Workload) UpdateEtcdConditions(ctx context.Context, controlPlane *Contr
 	w.updateExternalEtcdConditions(ctx, controlPlane)
 }
 
-func (w *Workload) updateExternalEtcdConditions(_ context.Context, controlPlane *ControlPlane) {
+func (w *Workload) updateExternalEtcdConditions(ctx context.Context, controlPlane *ControlPlane) { //nolint:unparam
 	// When KCP is not responsible for external etcd, we are reporting only health at KCP level.
 	conditions.MarkTrue(controlPlane.KCP, controlplanev1.EtcdClusterHealthyCondition)
 
diff --git a/controlplane/kubeadm/internal/workload_cluster_coredns.go b/controlplane/kubeadm/internal/workload_cluster_coredns.go
index a105a61a8..ce75b2086 100644
--- a/controlplane/kubeadm/internal/workload_cluster_coredns.go
+++ b/controlplane/kubeadm/internal/workload_cluster_coredns.go
@@ -231,9 +231,7 @@ func (w *Workload) getCoreDNSInfo(ctx context.Context, clusterConfig *bootstrapv
 		return nil, err
 	}
 
-	// Handle the renaming of the upstream image from:
-	// * "registry.k8s.io/coredns" to "registry.k8s.io/coredns/coredns" or
-	// * "k8s.gcr.io/coredns" to "k8s.gcr.io/coredns/coredns"
+	// Handle the renaming of the upstream image from "k8s.gcr.io/coredns" to "k8s.gcr.io/coredns/coredns"
 	toImageName := parsedImage.Name
 	if (toImageRepository == oldKubernetesImageRepository || toImageRepository == kubernetesImageRepository) &&
 		toImageName == oldCoreDNSImageName && targetMajorMinorPatch.GTE(semver.MustParse("1.8.0")) {
diff --git a/docs/book/src/SUMMARY.md b/docs/book/src/SUMMARY.md
index 2f8e2b26c..3fa1612a3 100644
--- a/docs/book/src/SUMMARY.md
+++ b/docs/book/src/SUMMARY.md
@@ -109,4 +109,3 @@
     - [Code Review in Cluster API](./REVIEWING.md)
     - [Version Support](./reference/versions.md)
     - [Roadmap](./roadmap.md)
-    - [Supported Labels and Annotations](./reference/labels_and_annotations.md)
diff --git a/docs/book/src/clusterctl/commands/delete.md b/docs/book/src/clusterctl/commands/delete.md
index 66ee49e2f..b7b9fb0c1 100644
--- a/docs/book/src/clusterctl/commands/delete.md
+++ b/docs/book/src/clusterctl/commands/delete.md
@@ -33,7 +33,7 @@ the aws provider, it deletes all the `AWSCluster`, `AWSMachine` etc.
 
 </aside>
 
-If you want to delete all the providers in a single operation, you can use the `--all` flag.
+If you want to delete all the providers in a single operation , you can use the `--all` flag.
 
 ```bash
 clusterctl delete --all
diff --git a/docs/book/src/clusterctl/configuration.md b/docs/book/src/clusterctl/configuration.md
index f1975a122..dea982fcf 100644
--- a/docs/book/src/clusterctl/configuration.md
+++ b/docs/book/src/clusterctl/configuration.md
@@ -105,7 +105,7 @@ You may want to migrate to a user-managed cert-manager further down the line, af
 
 `clusterctl` looks for the label `clusterctl.cluster.x-k8s.io/core=cert-manager` on all api resources in the `cert-manager` namespace. If it finds the label, `clusterctl` will manage the cert-manager deployment. You can list all the resources with that label by running:
 ```bash
-kubectl api-resources --verbs=list -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -A --selector=clusterctl.cluster.x-k8s.io/core=cert-manager
+kubectl get all -A --selector=clusterctl.cluster.x-k8s.io/core=cert-manager
 ```
 
 If you want to manage and install your own cert-manager, you'll need to remove this label from all API resources.
diff --git a/docs/book/src/developer/providers/v1.2-to-v1.3.md b/docs/book/src/developer/providers/v1.2-to-v1.3.md
index 57e43d00a..1f0a24559 100644
--- a/docs/book/src/developer/providers/v1.2-to-v1.3.md
+++ b/docs/book/src/developer/providers/v1.2-to-v1.3.md
@@ -14,11 +14,10 @@ in Cluster API are kept in sync with the versions used by `sigs.k8s.io/controlle
 
 - sigs.k8s.io/controller-runtime: v0.12.x => v0.13.x
 - sigs.k8s.io/controller-tools: v0.9.x => v0.10.x
-- sigs.k8s.io/kind: v0.14.x => v0.17.x
+- sigs.k8s.io/kind: v0.14.x => v0.16.x
 - k8s.io/*: v0.24.x => v0.25.x (derived from controller-runtime)
 - github.com/onsi/ginkgo: v1.x => v2.x (derived from controller-runtime)
 - k8s.io/kubectl: v0.24.x => 0.25.x
-- github.com/joelanford/go-apidiff: 0.4.0 => 0.5.0
 
 ## Changes by Kind
 
@@ -45,8 +44,6 @@ The default value is 0, meaning that the volume can be detached without any time
 
 ### Other
 
-- The Kubernetes default registry has been changed from `k8s.gcr.io` to `registry.k8s.io`. Kubernetes image promotion currently publishes to both registries. Please
-  consider publishing manifests which reference the controller images from the new registry (for reference [Cluster API PR](https://github.com/kubernetes-sigs/cluster-api/pull/7478)).
 - e2e tests are upgraded to use Ginkgo v2 (v2.2.0) and Gomega v1.20.1. Providers who use the test framework from this release will also need to upgrade, because Ginkgo v2 can't be imported alongside v1. Please see the [Ginkgo upgrade guide](https://onsi.github.io/ginkgo/MIGRATING_TO_V2), and note:
   * the default test timeout has been [changed to 1h](https://onsi.github.io/ginkgo/MIGRATING_TO_V2#timeout-behavior)
   * the `--junit-report` argument [replaces JUnit custom reporter](https://onsi.github.io/ginkgo/MIGRATING_TO_V2#improved-reporting-infrastructure) code
diff --git a/docs/book/src/developer/tilt.md b/docs/book/src/developer/tilt.md
index 9939fbcf6..2444f8cb5 100644
--- a/docs/book/src/developer/tilt.md
+++ b/docs/book/src/developer/tilt.md
@@ -8,7 +8,7 @@ workflow that offers easy deployments and rapid iterative builds.
 ## Prerequisites
 
 1. [Docker](https://docs.docker.com/install/): v19.03 or newer
-1. [kind](https://kind.sigs.k8s.io): v0.17 or newer
+1. [kind](https://kind.sigs.k8s.io): v0.16 or newer
 1. [Tilt](https://docs.tilt.dev/install.html): v0.22.2 or newer
 1. [kustomize](https://github.com/kubernetes-sigs/kustomize): provided via `make kustomize`
 1. [envsubst](https://github.com/drone/envsubst): provided via `make envsubst`
diff --git a/docs/book/src/reference/api_reference.md b/docs/book/src/reference/api_reference.md
index 8d2f81417..536b528e2 100644
--- a/docs/book/src/reference/api_reference.md
+++ b/docs/book/src/reference/api_reference.md
@@ -5,5 +5,3 @@ Cluster API currently exposes the following APIs:
 * the Cluster API Custom Resource Definitions (CRDs): [documentation](https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api)
 
 * Golang APIs: [godoc](https://pkg.go.dev/sigs.k8s.io/cluster-api)
-
-* Supported Labels and Annotations: [documentation](./labels_and_annotations.md)
\ No newline at end of file
diff --git a/docs/book/src/reference/labels_and_annotations.md b/docs/book/src/reference/labels_and_annotations.md
deleted file mode 100644
index efc23dffb..000000000
--- a/docs/book/src/reference/labels_and_annotations.md
+++ /dev/null
@@ -1,47 +0,0 @@
-**Supported Labels:**
-
-
-| Label     | Note     |
-|:--------|:--------|
-| cluster.x-k8s.io/cluster-name| It is set on machines linked to a cluster and external objects(bootstrap and infrastructure providers). |
-| topology.cluster.x-k8s.io/owned| It is set on all the object which are managed as part of a ClusterTopology. |
-|topology.cluster.x-k8s.io/deployment-name | It is set on the generated MachineDeployment objects to track the name of the MachineDeployment topology it represents. |
-| cluster.x-k8s.io/provider| It is set on components in the provider manifest. The label allows one to easily identify all the components belonging to a provider. The clusterctl tool uses this label for implementing provider's lifecycle operations. |
-| cluster.x-k8s.io/watch-filter | It can be applied to any Cluster API object. Controllers which allow for selective reconciliation may check this label and proceed with reconciliation of the object only if this label and a configured value is present. |
-| cluster.x-k8s.io/interruptible| It is used to mark the nodes that run on interruptible instances. |
-|cluster.x-k8s.io/control-plane | It is set on machines or related objects that are part of a control plane. |
-| cluster.x-k8s.io/set-name| It is set on machines if they're controlled by MachineSet. |
-| cluster.x-k8s.io/deployment-name| It is set on machines if they're controlled by a MachineDeployment. |
-| machine-template-hash| It is applied to Machines in a MachineDeployment containing the hash of the template. |
-<br>
-
-
-**Supported Annotations:**
-
-| Annotation     | Note     |
-|:--------|:--------|
-| unsafe.topology.cluster.x-k8s.io/disable-update-class-name-check   | It can be used to disable the webhook check on update that disallows a pre-existing Cluster to be populated with Topology information and Class.  |
-| cluster.x-k8s.io/cluster-name   | It is set on nodes identifying the name of the cluster the node belongs to.  |
-|cluster.x-k8s.io/cluster-namespace    | It is set on nodes identifying the namespace of the cluster the node belongs to.   |
-| cluster.x-k8s.io/machine   | It is set on nodes identifying the machine the node belongs to.   |
-|  cluster.x-k8s.io/owner-kind  |  It is set on nodes identifying the owner kind.   |
-| cluster.x-k8s.io/owner-name   | It is set on nodes identifying the owner name.   |
-| cluster.x-k8s.io/paused   | It can be applied to any Cluster API object to prevent a controller from processing a resource. Controllers working with Cluster API objects must check the existence of this annotation on the reconciled object. |
-|   cluster.x-k8s.io/disable-machine-create | It can be used to signal a MachineSet to stop creating new machines. It is utilized in the OnDelete MachineDeploymentStrategy to allow the MachineDeployment controller to scale down older MachineSets when Machines are deleted and add the new replicas to the latest MachineSet.    |
-|  cluster.x-k8s.io/delete-machine  | It marks control plane and worker nodes that will be given priority for deletion when KCP or a MachineSet scales down. It is given top priority on all delete policies.    |
-|  cluster.x-k8s.io/cloned-from-name  | It is the infrastructure machine annotation that stores the name of the infrastructure template resource that was cloned for the machine. This annotation is set only during cloning a template. Older/adopted machines will not have this annotation.   |
-| cluster.x-k8s.io/cloned-from-groupkind   | It is the infrastructure machine annotation that stores the group-kind of the infrastructure template resource that was cloned for the machine. This annotation is set only during cloning a template. Older/adopted machines will not have this annotation.   |
-|  cluster.x-k8s.io/skip-remediation  | It is used to mark the machines that should not be considered for remediation by MachineHealthCheck reconciler.   |
-|  cluster.x-k8s.io/managed-by  | It can be applied to InfraCluster resources to signify that some external system is managing the cluster infrastructure. Provider InfraCluster controllers will ignore resources with this annotation. An external controller must fulfill the contract of the InfraCluster resource. External infrastructure providers should ensure that the annotation, once set, cannot be removed.  |
-|  topology.cluster.x-k8s.io/dry-run  | It is an annotation that gets set on objects by the topology controller only during a server side dry run apply operation. It is used for validating update webhooks for objects which get updated by template rotation (e.g. InfrastructureMachineTemplate). When the annotation is set and the admission request is a dry run, the webhook should deny validation due to immutability. By that the request will succeed (without any changes to the actual object because it is a dry run) and the topology controller will receive the resulting object. |
-|  machine.cluster.x-k8s.io/exclude-node-draining  | It explicitly skips node draining if set.  |
-|  machine.cluster.x-k8s.io/exclude-wait-for-node-volume-detach  | It explicitly skips the waiting for node volume detaching if set. |
-|  pre-drain.delete.hook.machine.cluster.x-k8s.io  | It specifies the prefix we search each annotation for during the pre-drain.delete lifecycle hook to pause reconciliation of deletion. These hooks will prevent removal of draining the associated node until all are removed. |
-| pre-terminate.delete.hook.machine.cluster.x-k8s.io   | It specifies the prefix we search each annotation for during the pre-terminate.delete lifecycle hook to pause reconciliation of deletion. These hooks will prevent removal of an instance from an infrastructure provider until all are removed. |
-|  machinedeployment.clusters.x-k8s.io/revision  | It is the revision annotation of a machine deployment's machine sets which records its rollout sequence.   |
-|  machinedeployment.clusters.x-k8s.io/revision-history  | It maintains the history of all old revisions that a machine set has served for a machine deployment.   |
-|  machinedeployment.clusters.x-k8s.io/desired-replicas  | It is the desired replicas for a machine deployment recorded as an annotation in its machine sets. Helps in separating scaling events from the rollout process and for determining if the new machine set for a deployment is really saturated.   |
-|  machinedeployment.clusters.x-k8s.io/max-replicas  | It is the maximum replicas a deployment can have at a given point, which is machinedeployment.spec.replicas + maxSurge. Used by the underlying machine sets to estimate their proportions in case the deployment has surge replicas. |
-| controlplane.cluster.x-k8s.io/skip-coredns | It explicitly skips reconciling CoreDNS if set. |
-|controlplane.cluster.x-k8s.io/skip-kube-proxy | It explicitly skips reconciling kube-proxy if set.|
-| controlplane.cluster.x-k8s.io/kubeadm-cluster-configuration| It is a machine annotation that stores the json-marshalled string of KCP ClusterConfiguration. This annotation is used to detect any changes in ClusterConfiguration and trigger machine rollout in KCP.|
\ No newline at end of file
diff --git a/docs/book/src/tasks/experimental-features/cluster-class/operate-cluster.md b/docs/book/src/tasks/experimental-features/cluster-class/operate-cluster.md
index 05f9a88a2..5bc89a9cb 100644
--- a/docs/book/src/tasks/experimental-features/cluster-class/operate-cluster.md
+++ b/docs/book/src/tasks/experimental-features/cluster-class/operate-cluster.md
@@ -199,7 +199,7 @@ Running the patch makes the following change to the Cluster yaml:
      topology:
        variables:
        - name: imageRepository
-         value: registry.k8s.io
+         value: k8s.gcr.io
        - name: etcdImageTag
          value: ""
        - name: coreDNSImageTag
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 fdef08630..89f9b935a 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
@@ -206,8 +206,8 @@ spec:
       openAPIV3Schema:
         type: string
         description: ImageRepository is the container registry to pull images from.
-        default: registry.k8s.io
-        example: registry.k8s.io
+        default: k8s.gcr.io
+        example: k8s.gcr.io
 ```
 
 <aside class="note">
diff --git a/docs/book/src/tasks/experimental-features/runtime-sdk/implement-extensions.md b/docs/book/src/tasks/experimental-features/runtime-sdk/implement-extensions.md
index 4bb38f06a..1db6286ea 100644
--- a/docs/book/src/tasks/experimental-features/runtime-sdk/implement-extensions.md
+++ b/docs/book/src/tasks/experimental-features/runtime-sdk/implement-extensions.md
@@ -212,7 +212,7 @@ synchronously.
 ### Availability
 
 Runtime Extension failure could result in errors in handling the workload clusters lifecycle, and so the implementation
-should be robust, have proper error handling, avoid panics, etc. Failure policies can be set up to mitigate the
+should be robust, have proper error handling, avoid panics, etc.. . Failure policies can be set up to mitigate the
 negative impact of a Runtime Extension on the Cluster API Runtime, but this option can’t be used in all cases
 (see [Error Management](#error-management)).
 
diff --git a/docs/book/src/user/quick-start.md b/docs/book/src/user/quick-start.md
index 56e1f1fcc..c47a5b770 100644
--- a/docs/book/src/user/quick-start.md
+++ b/docs/book/src/user/quick-start.md
@@ -45,7 +45,7 @@ a target [management cluster] on the selected [infrastructure provider].
 
    [kind] is not designed for production use.
 
-   **Minimum [kind] supported version**: v0.17.0
+   **Minimum [kind] supported version**: v0.16.0
 
    **Help with common issues can be found in the [Troubleshooting Guide](./troubleshooting.md).**
 
diff --git a/docs/developer/release-cycle.md b/docs/developer/release-cycle.md
index 5cbd1fc2b..12489dd13 100644
--- a/docs/developer/release-cycle.md
+++ b/docs/developer/release-cycle.md
@@ -108,6 +108,6 @@ style: [Kubernetes 1.26 Release Team](https://github.com/kubernetes/sig-release/
 
 | **Role**                                  | **Lead Name** (**GitHub / Slack ID**) | **Shadow Name(s) (GitHub / Slack ID)** |
 |-------------------------------------------|---------------------------------------|----------------------------------------|
-| Release Lead                              |  Yuvaraj Kakaraparthi ([@ykakarap](https://github.com/ykakarap)/Slack:`@Yuvaraj Kakaraparthi`)  | Jim Ntosas ([@dntosas](https://github.com/dntosas)/ Slack:`@dntosas`), Carlos Panato ([@cpanato](https://github.com/cpanato)/ Slack:`@cpanato`), Amit Kumar ([@hackeramitkumar](https://github.com/hackeramitkumar)/ Slack:`@Amit Kumar`) |
-| Communications/Docs/Release Notes Manager |  Oscar Utbult ([@oscr](https://github.com/oscr)/ Slack:`@oscar`) | Sayantani Saha ([@sayantani11](https://github.com/sayantani11)/ Slack:`@sayantani`), Vibhor Chinda ([@VibhorChinda](https://github.com/VibhorChinda)/ Slack:`@Vibhor Chinda`) |
-| CI Signal/Bug Triage/Automation Manager   |  Furkat Gofurov ([@furkatgofurov7](https://github.com/furkatgofurov7)/ Slack: `@Furkat Gofurov`) | Nawaz Khazielakha ([@nawazkh](https://github.com/nawazkh)/ Slack: `@nawaz`), Aniruddha Basak ([@aniruddha2000](https://github.com/aniruddha2000/)/ Slack: `@aniruddha`), Alexander Demicev ([@alexander-demicev](https://github.com/alexander-demicev)/ Slack:`@Alexander Demicev`) |
+| Release Lead                              |                                       |                                        |
+| Communications/Docs/Release Notes Manager |                                       |                                        |
+| CI Signal/Bug Triage/Automation Manager   |                                       |                                        |
diff --git a/docs/developer/releasing.md b/docs/developer/releasing.md
index 7a0526aa9..19f149ada 100644
--- a/docs/developer/releasing.md
+++ b/docs/developer/releasing.md
@@ -12,7 +12,7 @@
    - `git push origin ${RELEASE_TAG}`
    - `git push origin test/${RELEASE_TAG}`
 
-## Promote images from the staging repo to `registry.k8s.io/cluster-api`
+## Promote images from the staging repo to `k8s.gcr.io/cluster-api`
 
 Images are built by the [post push images job](https://testgrid.k8s.io/sig-cluster-lifecycle-image-pushes#post-cluster-api-push-images). This will push the image to a [staging repository](https://console.cloud.google.com/gcr/images/k8s-staging-cluster-api).
 
diff --git a/exp/addons/internal/controllers/predicates/resource_predicates.go b/exp/addons/internal/controllers/predicates/resource_predicates.go
index 7db6a76b7..517832aa7 100644
--- a/exp/addons/internal/controllers/predicates/resource_predicates.go
+++ b/exp/addons/internal/controllers/predicates/resource_predicates.go
@@ -24,7 +24,7 @@ import (
 )
 
 // ResourceCreate returns a predicate that returns true for a create event.
-func ResourceCreate(_ logr.Logger) predicate.Funcs {
+func ResourceCreate(logger logr.Logger) predicate.Funcs {
 	return predicate.Funcs{
 		CreateFunc:  func(e event.CreateEvent) bool { return true },
 		UpdateFunc:  func(e event.UpdateEvent) bool { return false },
diff --git a/exp/ipam/internal/webhooks/ipaddress.go b/exp/ipam/internal/webhooks/ipaddress.go
index 45c4f5cf0..b2478d959 100644
--- a/exp/ipam/internal/webhooks/ipaddress.go
+++ b/exp/ipam/internal/webhooks/ipaddress.go
@@ -62,7 +62,7 @@ func (webhook *IPAddress) ValidateCreate(ctx context.Context, obj runtime.Object
 }
 
 // ValidateUpdate implements webhook.CustomValidator.
-func (webhook *IPAddress) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) error {
+func (webhook *IPAddress) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) error {
 	oldIP, ok := oldObj.(*ipamv1.IPAddress)
 	if !ok {
 		return apierrors.NewBadRequest(fmt.Sprintf("expected an IPAddress but got a %T", oldObj))
@@ -79,7 +79,7 @@ func (webhook *IPAddress) ValidateUpdate(_ context.Context, oldObj, newObj runti
 }
 
 // ValidateDelete implements webhook.CustomValidator.
-func (webhook *IPAddress) ValidateDelete(_ context.Context, _ runtime.Object) error {
+func (webhook *IPAddress) ValidateDelete(ctx context.Context, obj runtime.Object) error {
 	return nil
 }
 
diff --git a/exp/ipam/internal/webhooks/ipaddressclaim.go b/exp/ipam/internal/webhooks/ipaddressclaim.go
index c009eb239..5daf69cc4 100644
--- a/exp/ipam/internal/webhooks/ipaddressclaim.go
+++ b/exp/ipam/internal/webhooks/ipaddressclaim.go
@@ -47,7 +47,7 @@ type IPAddressClaim struct {
 var _ webhook.CustomValidator = &IPAddressClaim{}
 
 // ValidateCreate implements webhook.CustomValidator.
-func (webhook *IPAddressClaim) ValidateCreate(_ context.Context, obj runtime.Object) error {
+func (webhook *IPAddressClaim) ValidateCreate(ctx context.Context, obj runtime.Object) error {
 	claim, ok := obj.(*ipamv1.IPAddressClaim)
 	if !ok {
 		return apierrors.NewBadRequest(fmt.Sprintf("expected an IPAddressClaim but got a %T", obj))
@@ -64,7 +64,7 @@ func (webhook *IPAddressClaim) ValidateCreate(_ context.Context, obj runtime.Obj
 }
 
 // ValidateUpdate implements webhook.CustomValidator.
-func (webhook *IPAddressClaim) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) error {
+func (webhook *IPAddressClaim) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) error {
 	oldClaim, ok := oldObj.(*ipamv1.IPAddressClaim)
 	if !ok {
 		return apierrors.NewBadRequest(fmt.Sprintf("expected an IPAddressClaim but got a %T", oldObj))
@@ -84,6 +84,6 @@ func (webhook *IPAddressClaim) ValidateUpdate(_ context.Context, oldObj, newObj
 }
 
 // ValidateDelete implements webhook.CustomValidator.
-func (webhook *IPAddressClaim) ValidateDelete(_ context.Context, _ runtime.Object) error {
+func (webhook *IPAddressClaim) ValidateDelete(ctx context.Context, obj runtime.Object) error {
 	return nil
 }
diff --git a/go.mod b/go.mod
index cfc265b15..1fb728712 100644
--- a/go.mod
+++ b/go.mod
@@ -42,7 +42,7 @@ require (
 	k8s.io/klog/v2 v2.80.1
 	k8s.io/kubectl v0.25.0
 	k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73
-	sigs.k8s.io/controller-runtime v0.13.1
+	sigs.k8s.io/controller-runtime v0.13.0
 	sigs.k8s.io/yaml v1.3.0
 )
 
diff --git a/go.sum b/go.sum
index 539a3ab59..6f2f47c74 100644
--- a/go.sum
+++ b/go.sum
@@ -1200,8 +1200,8 @@ k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/
 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/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg=
-sigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
+sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ=
+sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
 sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
 sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM=
diff --git a/hack/ensure-go.sh b/hack/ensure-go.sh
index c2288c9ec..fbccbb3d9 100755
--- a/hack/ensure-go.sh
+++ b/hack/ensure-go.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 # Ensure the go tool exists and is a viable version.
 verify_go_version() {
   if [[ -z "$(command -v go)" ]]; then
diff --git a/hack/ensure-golangci-lint.sh b/hack/ensure-golangci-lint.sh
index 85164228e..66d22401e 100755
--- a/hack/ensure-golangci-lint.sh
+++ b/hack/ensure-golangci-lint.sh
@@ -18,10 +18,6 @@
 
 set -e
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 usage() {
   this=$1
   cat <<EOF
@@ -46,11 +42,12 @@ parse_args() {
   # over-ridden by flag below
 
   BINDIR=${BINDIR:-./bin}
-  while getopts "b:dh?" arg; do
+  while getopts "b:dh?x" arg; do
     case "$arg" in
       b) BINDIR="$OPTARG" ;;
       d) log_set_priority 10 ;;
       h | \?) usage "$0" ;;
+      x) set -x ;;
     esac
   done
   shift $((OPTIND - 1))
diff --git a/hack/ensure-kind.sh b/hack/ensure-kind.sh
index dc3cd008f..f2f04a2f3 100755
--- a/hack/ensure-kind.sh
+++ b/hack/ensure-kind.sh
@@ -18,12 +18,10 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
+set -x
 
 GOPATH_BIN="$(go env GOPATH)/bin"
-MINIMUM_KIND_VERSION=v0.17.0
+MINIMUM_KIND_VERSION=v0.16.0
 goarch="$(go env GOARCH)"
 goos="$(go env GOOS)"
 
diff --git a/hack/ensure-kubectl.sh b/hack/ensure-kubectl.sh
index b1a031c52..afe62a39d 100755
--- a/hack/ensure-kubectl.sh
+++ b/hack/ensure-kubectl.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 GOPATH_BIN="$(go env GOPATH)/bin/"
 MINIMUM_KUBECTL_VERSION=v1.19.0
 goarch="$(go env GOARCH)"
diff --git a/hack/get-project-maintainers.sh b/hack/get-project-maintainers.sh
index 935befdeb..469f93595 100755
--- a/hack/get-project-maintainers.sh
+++ b/hack/get-project-maintainers.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 REPO_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
 
 YQ_BIN=yq
diff --git a/hack/kind-install-for-capd.sh b/hack/kind-install-for-capd.sh
index 5c938142e..63a614181 100755
--- a/hack/kind-install-for-capd.sh
+++ b/hack/kind-install-for-capd.sh
@@ -26,10 +26,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 KIND_CLUSTER_NAME=${CAPI_KIND_CLUSTER_NAME:-"capi-test"}
 
 if [[ "$(kind get clusters)" =~ .*"${KIND_CLUSTER_NAME}".* ]]; then
diff --git a/hack/pin-dependency.sh b/hack/pin-dependency.sh
index 0fbb0760a..a7ac52dce 100755
--- a/hack/pin-dependency.sh
+++ b/hack/pin-dependency.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
 
 # Usage:
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index 515d2656e..a02c5c306 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -25,7 +25,7 @@ require (
 	k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73
 	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.13.1
+	sigs.k8s.io/controller-runtime v0.13.0
 	sigs.k8s.io/controller-tools v0.10.0
 	sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d
 	sigs.k8s.io/kustomize/api v0.12.1
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index c448b68d7..bd83d6600 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -1067,8 +1067,8 @@ oras.land/oras-go v1.2.0/go.mod h1:pFNs7oHp2dYsYMSS82HaX5l4mpnGO7hbpPN6EWH2ltc=
 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/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg=
-sigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
+sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ=
+sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
 sigs.k8s.io/controller-tools v0.10.0 h1:0L5DTDTFB67jm9DkfrONgTGmfc/zYow0ZaHyppizU2U=
 sigs.k8s.io/controller-tools v0.10.0/go.mod h1:uvr0EW6IsprfB0jpQq6evtKy+hHyHCXNfdWI5ONPx94=
 sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
diff --git a/hack/tools/runtime-openapi-gen/vendored_openapi.go b/hack/tools/runtime-openapi-gen/vendored_openapi.go
index c8d69f0b9..dbc38bb11 100644
--- a/hack/tools/runtime-openapi-gen/vendored_openapi.go
+++ b/hack/tools/runtime-openapi-gen/vendored_openapi.go
@@ -168,7 +168,7 @@ func schema_pkg_apis_meta_v1_ObjectMeta(ref common.ReferenceCallback) common.Ope
 					},
 					"resourceVersion": {
 						SchemaProps: spec.SchemaProps{
-							Description: "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency",
+							Description: "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency",
 							Type:        []string{"string"},
 							Format:      "",
 						},
diff --git a/hack/tools/tilt-prepare/main.go b/hack/tools/tilt-prepare/main.go
index bac2144d7..1225d89f3 100644
--- a/hack/tools/tilt-prepare/main.go
+++ b/hack/tools/tilt-prepare/main.go
@@ -82,12 +82,8 @@ type tiltSettings struct {
 }
 
 type providerSettings struct {
-	Name   string          `json:"name,omitempty"`
-	Config *providerConfig `json:"config,omitempty"`
-}
-
-type providerConfig struct {
-	Context *string `json:"context,omitempty"`
+	Name    string  `json:"name,omitempty"`
+	Context *string `json:"context"`
 }
 
 type debugConfig struct {
@@ -313,8 +309,8 @@ func loadProviders(r string) (map[string]string, error) {
 
 	providerContexts := map[string]string{}
 	for _, p := range providerData {
-		if p.Config != nil && p.Config.Context != nil {
-			contextPath = r + "/" + *p.Config.Context
+		if p.Context != nil {
+			contextPath = r + "/" + *p.Context
 		} else {
 			contextPath = r
 		}
diff --git a/hack/verify-boilerplate.sh b/hack/verify-boilerplate.sh
index 25a8592b5..19283371c 100755
--- a/hack/verify-boilerplate.sh
+++ b/hack/verify-boilerplate.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
 
 boilerDir="${KUBE_ROOT}/hack/boilerplate"
diff --git a/hack/verify-capi-book-summary.sh b/hack/verify-capi-book-summary.sh
index f59923db3..1f620e6b9 100755
--- a/hack/verify-capi-book-summary.sh
+++ b/hack/verify-capi-book-summary.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 RESULT=0
 SUMMARY=$(cat ./docs/book/src/SUMMARY.md)
 
diff --git a/hack/verify-doctoc.sh b/hack/verify-doctoc.sh
index 0c510fb9d..f9824ae3f 100755
--- a/hack/verify-doctoc.sh
+++ b/hack/verify-doctoc.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 command -v doctoc || echo "doctoc is not available on your system, skipping verification" && exit 0
 
 doctoc_files="README.md \
diff --git a/hack/verify-shellcheck.sh b/hack/verify-shellcheck.sh
index b3e9ca25c..a2bf9ac7f 100755
--- a/hack/verify-shellcheck.sh
+++ b/hack/verify-shellcheck.sh
@@ -17,10 +17,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 VERSION="v0.8.0"
 
 OS="unknown"
diff --git a/hack/verify-starlark.sh b/hack/verify-starlark.sh
index bc6d7c028..c2ba3e8ff 100755
--- a/hack/verify-starlark.sh
+++ b/hack/verify-starlark.sh
@@ -17,10 +17,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")"
 ROOT_PATH="$(cd "${SCRIPT_DIR}"/.. && pwd)"
 
diff --git a/hack/version.sh b/hack/version.sh
index 4c40b23e1..7f22394af 100755
--- a/hack/version.sh
+++ b/hack/version.sh
@@ -17,10 +17,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 version::get_version_vars() {
     # shellcheck disable=SC1083
     GIT_COMMIT="$(git rev-parse HEAD^{commit})"
diff --git a/internal/contract/bootstrap.go b/internal/contract/bootstrap.go
deleted file mode 100644
index d042d1a5e..000000000
--- a/internal/contract/bootstrap.go
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-Copyright 2022 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package contract
-
-import "sync"
-
-// BootstrapContract encodes information about the Cluster API contract for bootstrap objects.
-type BootstrapContract struct{}
-
-var bootstrap *BootstrapContract
-var onceBootstrap sync.Once
-
-// Bootstrap provide access to the information about the Cluster API contract for bootstrap objects.
-func Bootstrap() *BootstrapContract {
-	onceBootstrap.Do(func() {
-		bootstrap = &BootstrapContract{}
-	})
-	return bootstrap
-}
-
-// Ready provide access to status.ready field in a bootstrap object.
-func (b *BootstrapContract) Ready() *Bool {
-	return &Bool{
-		path: []string{"status", "ready"},
-	}
-}
-
-// DataSecretName provide access to status.dataSecretName field in a bootstrap object.
-func (b *BootstrapContract) DataSecretName() *String {
-	return &String{
-		path: []string{"status", "dataSecretName"},
-	}
-}
-
-// FailureReason provides access to the status.failureReason field in an bootstrap object. Note that this field is optional.
-func (b *BootstrapContract) FailureReason() *String {
-	return &String{
-		path: []string{"status", "failureReason"},
-	}
-}
-
-// FailureMessage provides access to the status.failureMessage field in an bootstrap object. Note that this field is optional.
-func (b *BootstrapContract) FailureMessage() *String {
-	return &String{
-		path: []string{"status", "failureMessage"},
-	}
-}
diff --git a/internal/contract/controlplane.go b/internal/contract/controlplane.go
index 788e0e476..f51dff644 100644
--- a/internal/contract/controlplane.go
+++ b/internal/contract/controlplane.go
@@ -49,7 +49,7 @@ func (c *ControlPlaneContract) MachineTemplate() *ControlPlaneMachineTemplate {
 	return &ControlPlaneMachineTemplate{}
 }
 
-// Version provide access to version field in a ControlPlane object, if any.
+// Version provide access to version field  in a ControlPlane object, if any.
 // NOTE: When working with unstructured there is no way to understand if the ControlPlane provider
 // do support a field in the type definition from the fact that a field is not set in a given instance.
 // This is why in we are deriving if version is required from the ClusterClass in the topology reconciler code.
@@ -59,28 +59,14 @@ func (c *ControlPlaneContract) Version() *String {
 	}
 }
 
-// StatusVersion provide access to the version field in a ControlPlane object status, if any.
+// StatusVersion provide access to version field  in a ControlPlane object status, if any.
 func (c *ControlPlaneContract) StatusVersion() *String {
 	return &String{
 		path: []string{"status", "version"},
 	}
 }
 
-// Ready provide access to the status.ready field in a ControlPlane object.
-func (c *ControlPlaneContract) Ready() *Bool {
-	return &Bool{
-		path: []string{"status", "ready"},
-	}
-}
-
-// Initialized provide access to status.initialized field in a ControlPlane object.
-func (c *ControlPlaneContract) Initialized() *Bool {
-	return &Bool{
-		path: []string{"status", "initialized"},
-	}
-}
-
-// Replicas provide access to replicas field in a ControlPlane object, if any.
+// Replicas provide access to replicas field  in a ControlPlane object, if any.
 // NOTE: When working with unstructured there is no way to understand if the ControlPlane provider
 // do support a field in the type definition from the fact that a field is not set in a given instance.
 // This is why in we are deriving if replicas is required from the ClusterClass in the topology reconciler code.
@@ -90,63 +76,27 @@ func (c *ControlPlaneContract) Replicas() *Int64 {
 	}
 }
 
-// StatusReplicas provide access to the status.replicas field in a ControlPlane object, if any. Applies to implementations using replicas.
+// StatusReplicas provide access to status.replicas field  in a ControlPlane object, if any.
 func (c *ControlPlaneContract) StatusReplicas() *Int64 {
 	return &Int64{
 		path: []string{"status", "replicas"},
 	}
 }
 
-// UpdatedReplicas provide access to the status.updatedReplicas field in a ControlPlane object, if any. Applies to implementations using replicas.
+// UpdatedReplicas provide access to status.updatedReplicas field  in a ControlPlane object, if any.
 func (c *ControlPlaneContract) UpdatedReplicas() *Int64 {
 	return &Int64{
 		path: []string{"status", "updatedReplicas"},
 	}
 }
 
-// ReadyReplicas provide access to the status.readyReplicas field in a ControlPlane object, if any. Applies to implementations using replicas.
+// ReadyReplicas provide access to status.readyReplicas field  in a ControlPlane object, if any.
 func (c *ControlPlaneContract) ReadyReplicas() *Int64 {
 	return &Int64{
 		path: []string{"status", "readyReplicas"},
 	}
 }
 
-// UnavailableReplicas provide access to the status.unavailableReplicas field in a ControlPlane object, if any. Applies to implementations using replicas.
-func (c *ControlPlaneContract) UnavailableReplicas() *Int64 {
-	return &Int64{
-		path: []string{"status", "unavailableReplicas"},
-	}
-}
-
-// Selector provide access to the status.selector field in a ControlPlane object, if any. Applies to implementations using replicas.
-func (c *ControlPlaneContract) Selector() *String {
-	return &String{
-		path: []string{"status", "selector"},
-	}
-}
-
-// FailureReason provides access to the status.failureReason field in an ControlPlane object. Note that this field is optional.
-func (c *ControlPlaneContract) FailureReason() *String {
-	return &String{
-		path: []string{"status", "failureReason"},
-	}
-}
-
-// FailureMessage provides access to the status.failureMessage field in an ControlPlane object. Note that this field is optional.
-func (c *ControlPlaneContract) FailureMessage() *String {
-	return &String{
-		path: []string{"status", "failureMessage"},
-	}
-}
-
-// ExternalManagedControlPlane provides access to the status.externalManagedControlPlane field in an ControlPlane object.
-// Note that this field is optional.
-func (c *ControlPlaneContract) ExternalManagedControlPlane() *Bool {
-	return &Bool{
-		path: []string{"status", "externalManagedControlPlane"},
-	}
-}
-
 // IsProvisioning returns true if the control plane is being created for the first time.
 // Returns false, if the control plane was already previously provisioned.
 func (c *ControlPlaneContract) IsProvisioning(obj *unstructured.Unstructured) (bool, error) {
diff --git a/internal/contract/infrastructure_cluster.go b/internal/contract/infrastructure_cluster.go
index e1055fea3..60710fc1c 100644
--- a/internal/contract/infrastructure_cluster.go
+++ b/internal/contract/infrastructure_cluster.go
@@ -17,18 +17,14 @@ limitations under the License.
 package contract
 
 import (
-	"encoding/json"
-	"strings"
 	"sync"
 
 	"github.com/pkg/errors"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-
-	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
 )
 
 // InfrastructureClusterContract encodes information about the Cluster API contract for InfrastructureCluster objects
-// like DockerClusters, AWS Clusters, etc.
+// like e.g the DockerCluster, AWS Cluster etc.
 type InfrastructureClusterContract struct{}
 
 var infrastructureCluster *InfrastructureClusterContract
@@ -65,34 +61,6 @@ func (c *InfrastructureClusterControlPlaneEndpoint) Port() *Int64 {
 	}
 }
 
-// Ready provides access to the status.ready field in an InfrastructureCluster object.
-func (c *InfrastructureClusterContract) Ready() *Bool {
-	return &Bool{
-		path: []string{"status", "ready"},
-	}
-}
-
-// FailureReason provides access to the status.failureReason field in an InfrastructureCluster object. Note that this field is optional.
-func (c *InfrastructureClusterContract) FailureReason() *String {
-	return &String{
-		path: []string{"status", "failureReason"},
-	}
-}
-
-// FailureMessage provides access to the status.failureMessage field in an InfrastructureCluster object. Note that this field is optional.
-func (c *InfrastructureClusterContract) FailureMessage() *String {
-	return &String{
-		path: []string{"status", "failureMessage"},
-	}
-}
-
-// FailureDomains provides access to the status.failureDomains field in an InfrastructureCluster object. Note that this field is optional.
-func (c *InfrastructureClusterContract) FailureDomains() *FailureDomains {
-	return &FailureDomains{
-		path: []string{"status", "failureDomains"},
-	}
-}
-
 // IgnorePaths returns a list of paths to be ignored when reconciling an InfrastructureCluster.
 // NOTE: The controlPlaneEndpoint struct currently contains two mandatory fields (host and port).
 // As the host and port fields are not using omitempty, they are automatically set to their zero values
@@ -119,54 +87,3 @@ func (c *InfrastructureClusterContract) IgnorePaths(infrastructureCluster *unstr
 
 	return ignorePaths, nil
 }
-
-// FailureDomains represents an accessor to a clusterv1.FailureDomains path value.
-type FailureDomains struct {
-	path Path
-}
-
-// Path returns the path to the clusterv1.FailureDomains value.
-func (d *FailureDomains) Path() Path {
-	return d.path
-}
-
-// Get gets the metav1.MachineAddressList value.
-func (d *FailureDomains) Get(obj *unstructured.Unstructured) (*clusterv1.FailureDomains, error) {
-	domainMap, ok, err := unstructured.NestedMap(obj.UnstructuredContent(), d.path...)
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to get %s from object", "."+strings.Join(d.path, "."))
-	}
-	if !ok {
-		return nil, errors.Wrapf(errNotFound, "path %s", "."+strings.Join(d.path, "."))
-	}
-
-	domains := make(clusterv1.FailureDomains, len(domainMap))
-	s, err := json.Marshal(domainMap)
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to marshall field at %s to json", "."+strings.Join(d.path, "."))
-	}
-	err = json.Unmarshal(s, &domains)
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to unmarshall field at %s to json", "."+strings.Join(d.path, "."))
-	}
-
-	return &domains, nil
-}
-
-// Set sets the clusterv1.FailureDomains value in the path.
-func (d *FailureDomains) Set(obj *unstructured.Unstructured, values clusterv1.FailureDomains) error {
-	domains := make(map[string]interface{}, len(values))
-	s, err := json.Marshal(values)
-	if err != nil {
-		return errors.Wrapf(err, "failed to marshall supplied values to json for path %s", "."+strings.Join(d.path, "."))
-	}
-	err = json.Unmarshal(s, &domains)
-	if err != nil {
-		return errors.Wrapf(err, "failed to unmarshall supplied values to json for path %s", "."+strings.Join(d.path, "."))
-	}
-
-	if err := unstructured.SetNestedField(obj.UnstructuredContent(), domains, d.path...); err != nil {
-		return errors.Wrapf(err, "failed to set path %s of object %v", "."+strings.Join(d.path, "."), obj.GroupVersionKind())
-	}
-	return nil
-}
diff --git a/internal/contract/infrastructure_machine.go b/internal/contract/infrastructure_machine.go
deleted file mode 100644
index 7a19bf13c..000000000
--- a/internal/contract/infrastructure_machine.go
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
-Copyright 2022 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package contract
-
-import (
-	"encoding/json"
-	"strings"
-	"sync"
-
-	"github.com/pkg/errors"
-	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-
-	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
-)
-
-// InfrastructureMachineContract encodes information about the Machine API contract for InfrastructureMachine objects
-// like DockerMachines, AWS Machines, etc.
-type InfrastructureMachineContract struct{}
-
-var infrastructureMachine *InfrastructureMachineContract
-var onceInfrastructureMachine sync.Once
-
-// InfrastructureMachine provide access to the information about the Machine API contract for InfrastructureMachine objects.
-func InfrastructureMachine() *InfrastructureMachineContract {
-	onceInfrastructureMachine.Do(func() {
-		infrastructureMachine = &InfrastructureMachineContract{}
-	})
-	return infrastructureMachine
-}
-
-// Ready provides access to status.ready field in an InfrastructureMachine object.
-func (m *InfrastructureMachineContract) Ready() *Bool {
-	return &Bool{
-		path: []string{"status", "ready"},
-	}
-}
-
-// FailureReason provides access to the status.failureReason field in an InfrastructureMachine object. Note that this field is optional.
-func (m *InfrastructureMachineContract) FailureReason() *String {
-	return &String{
-		path: []string{"status", "failureReason"},
-	}
-}
-
-// FailureMessage provides access to the status.failureMessage field in an InfrastructureMachine object. Note that this field is optional.
-func (m *InfrastructureMachineContract) FailureMessage() *String {
-	return &String{
-		path: []string{"status", "failureMessage"},
-	}
-}
-
-// Addresses provides access to the status.addresses field in an InfrastructureMachine object. Note that this field is optional.
-func (m *InfrastructureMachineContract) Addresses() *MachineAddresses {
-	return &MachineAddresses{
-		path: []string{"status", "addresses"},
-	}
-}
-
-// ProviderID provides access to the spec.providerID field in an InfrastructureMachine object.
-func (m *InfrastructureMachineContract) ProviderID() *String {
-	return &String{
-		path: []string{"spec", "providerID"},
-	}
-}
-
-// FailureDomain provides access to the spec.failureDomain field in an InfrastructureMachine object. Note that this field is optional.
-func (m *InfrastructureMachineContract) FailureDomain() *String {
-	return &String{
-		path: []string{"spec", "failureDomain"},
-	}
-}
-
-// MachineAddresses represents an accessor to a []clusterv1.MachineAddress path value.
-type MachineAddresses struct {
-	path Path
-}
-
-// Path returns the path to the []clusterv1.MachineAddress value.
-func (m *MachineAddresses) Path() Path {
-	return m.path
-}
-
-// Get gets the metav1.MachineAddressList value.
-func (m *MachineAddresses) Get(obj *unstructured.Unstructured) (*[]clusterv1.MachineAddress, error) {
-	slice, ok, err := unstructured.NestedSlice(obj.UnstructuredContent(), m.path...)
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to get %s from object", "."+strings.Join(m.path, "."))
-	}
-	if !ok {
-		return nil, errors.Wrapf(errNotFound, "path %s", "."+strings.Join(m.path, "."))
-	}
-
-	addresses := make([]clusterv1.MachineAddress, len(slice))
-	s, err := json.Marshal(slice)
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to marshall field at %s to json", "."+strings.Join(m.path, "."))
-	}
-	err = json.Unmarshal(s, &addresses)
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to unmarshall field at %s to json", "."+strings.Join(m.path, "."))
-	}
-
-	return &addresses, nil
-}
-
-// Set sets the []clusterv1.MachineAddress value in the path.
-func (m *MachineAddresses) Set(obj *unstructured.Unstructured, values []clusterv1.MachineAddress) error {
-	slice := make([]interface{}, len(values))
-	s, err := json.Marshal(values)
-	if err != nil {
-		return errors.Wrapf(err, "failed to marshall supplied values to json for path %s", "."+strings.Join(m.path, "."))
-	}
-	err = json.Unmarshal(s, &slice)
-	if err != nil {
-		return errors.Wrapf(err, "failed to unmarshall supplied values to json for path %s", "."+strings.Join(m.path, "."))
-	}
-
-	if err := unstructured.SetNestedField(obj.UnstructuredContent(), slice, m.path...); err != nil {
-		return errors.Wrapf(err, "failed to set path %s of object %v", "."+strings.Join(m.path, "."), obj.GroupVersionKind())
-	}
-	return nil
-}
diff --git a/internal/contract/types.go b/internal/contract/types.go
index a7a2b28fb..c93b93ede 100644
--- a/internal/contract/types.go
+++ b/internal/contract/types.go
@@ -101,36 +101,6 @@ func (i *Int64) Set(obj *unstructured.Unstructured, value int64) error {
 	return nil
 }
 
-// Bool represents an accessor to an bool path value.
-type Bool struct {
-	path Path
-}
-
-// Path returns the path to the bool value.
-func (b *Bool) Path() Path {
-	return b.path
-}
-
-// Get gets the bool value.
-func (b *Bool) Get(obj *unstructured.Unstructured) (*bool, error) {
-	value, ok, err := unstructured.NestedBool(obj.UnstructuredContent(), b.path...)
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to get %s from object", "."+strings.Join(b.path, "."))
-	}
-	if !ok {
-		return nil, errors.Wrapf(errNotFound, "path %s", "."+strings.Join(b.path, "."))
-	}
-	return &value, nil
-}
-
-// Set sets the bool value in the path.
-func (b *Bool) Set(obj *unstructured.Unstructured, value bool) error {
-	if err := unstructured.SetNestedField(obj.UnstructuredContent(), value, b.path...); err != nil {
-		return errors.Wrapf(err, "failed to set path %s of object %v", "."+strings.Join(b.path, "."), obj.GroupVersionKind())
-	}
-	return nil
-}
-
 // String represents an accessor to a string path value.
 type String struct {
 	path Path
diff --git a/internal/controllers/machinehealthcheck/machinehealthcheck_controller.go b/internal/controllers/machinehealthcheck/machinehealthcheck_controller.go
index ef9db6b19..01b8f2209 100644
--- a/internal/controllers/machinehealthcheck/machinehealthcheck_controller.go
+++ b/internal/controllers/machinehealthcheck/machinehealthcheck_controller.go
@@ -117,6 +117,7 @@ func (r *Reconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, opt
 
 func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Result, reterr error) {
 	log := ctrl.LoggerFrom(ctx)
+	log.Info("Reconciling")
 
 	// Fetch the MachineHealthCheck instance
 	m := &clusterv1.MachineHealthCheck{}
diff --git a/internal/controllers/topology/cluster/desired_state.go b/internal/controllers/topology/cluster/desired_state.go
index 8e2a89cec..8fb7f608d 100644
--- a/internal/controllers/topology/cluster/desired_state.go
+++ b/internal/controllers/topology/cluster/desired_state.go
@@ -603,7 +603,6 @@ func computeMachineDeployment(_ context.Context, s *scope.Scope, desiredControlP
 		Spec: clusterv1.MachineDeploymentSpec{
 			ClusterName:     s.Current.Cluster.Name,
 			MinReadySeconds: machineDeploymentTopology.MinReadySeconds,
-			Strategy:        machineDeploymentTopology.Strategy,
 			Template: clusterv1.MachineTemplateSpec{
 				ObjectMeta: clusterv1.ObjectMeta{
 					Labels:      mergeMap(machineDeploymentTopology.Metadata.Labels, machineDeploymentBlueprint.Metadata.Labels),
diff --git a/internal/runtime/client/fake/fake_client.go b/internal/runtime/client/fake/fake_client.go
index 09b913911..114d34dcd 100644
--- a/internal/runtime/client/fake/fake_client.go
+++ b/internal/runtime/client/fake/fake_client.go
@@ -92,7 +92,7 @@ type RuntimeClient struct {
 }
 
 // CallAllExtensions implements Client.
-func (fc *RuntimeClient) CallAllExtensions(ctx context.Context, hook runtimecatalog.Hook, _ metav1.Object, _ runtime.Object, response runtimehooksv1.ResponseObject) error {
+func (fc *RuntimeClient) CallAllExtensions(ctx context.Context, hook runtimecatalog.Hook, forObject metav1.Object, request runtime.Object, response runtimehooksv1.ResponseObject) error {
 	defer func() {
 		fc.callAllTracker[runtimecatalog.HookName(hook)]++
 	}()
@@ -120,7 +120,7 @@ func (fc *RuntimeClient) CallAllExtensions(ctx context.Context, hook runtimecata
 }
 
 // CallExtension implements Client.
-func (fc *RuntimeClient) CallExtension(ctx context.Context, _ runtimecatalog.Hook, _ metav1.Object, name string, _ runtime.Object, response runtimehooksv1.ResponseObject) error {
+func (fc *RuntimeClient) CallExtension(ctx context.Context, _ runtimecatalog.Hook, _ metav1.Object, name string, request runtime.Object, response runtimehooksv1.ResponseObject) error {
 	expectedResponse, ok := fc.callResponses[name]
 	if !ok {
 		// This should actually panic because an error here would mean a mistake in the test setup.
@@ -150,17 +150,17 @@ func (fc *RuntimeClient) IsReady() bool {
 }
 
 // Register implements Client.
-func (fc *RuntimeClient) Register(_ *runtimev1.ExtensionConfig) error {
+func (fc *RuntimeClient) Register(extensionConfig *runtimev1.ExtensionConfig) error {
 	panic("unimplemented")
 }
 
 // Unregister implements Client.
-func (fc *RuntimeClient) Unregister(_ *runtimev1.ExtensionConfig) error {
+func (fc *RuntimeClient) Unregister(extensionConfig *runtimev1.ExtensionConfig) error {
 	panic("unimplemented")
 }
 
 // WarmUp implements Client.
-func (fc *RuntimeClient) WarmUp(_ *runtimev1.ExtensionConfigList) error {
+func (fc *RuntimeClient) WarmUp(extensionConfigList *runtimev1.ExtensionConfigList) error {
 	panic("unimplemented")
 }
 
diff --git a/internal/webhooks/cluster.go b/internal/webhooks/cluster.go
index a4b66481c..b50f99beb 100644
--- a/internal/webhooks/cluster.go
+++ b/internal/webhooks/cluster.go
@@ -142,7 +142,7 @@ func (webhook *Cluster) ValidateUpdate(ctx context.Context, oldObj, newObj runti
 }
 
 // ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type.
-func (webhook *Cluster) ValidateDelete(_ context.Context, _ runtime.Object) error {
+func (webhook *Cluster) ValidateDelete(_ context.Context, obj runtime.Object) error {
 	return nil
 }
 
diff --git a/internal/webhooks/runtime/extensionconfig_webhook.go b/internal/webhooks/runtime/extensionconfig_webhook.go
index d9e49adcb..2112404ae 100644
--- a/internal/webhooks/runtime/extensionconfig_webhook.go
+++ b/internal/webhooks/runtime/extensionconfig_webhook.go
@@ -53,7 +53,7 @@ var _ webhook.CustomValidator = &ExtensionConfig{}
 var _ webhook.CustomDefaulter = &ExtensionConfig{}
 
 // Default implements webhook.Defaulter so a webhook will be registered for the type.
-func (webhook *ExtensionConfig) Default(_ context.Context, obj runtime.Object) error {
+func (webhook *ExtensionConfig) Default(ctx context.Context, obj runtime.Object) error {
 	extensionConfig, ok := obj.(*runtimev1.ExtensionConfig)
 	if !ok {
 		return apierrors.NewBadRequest(fmt.Sprintf("expected an ExtensionConfig but got a %T", obj))


Test patch:
diff --git a/bootstrap/kubeadm/api/v1alpha3/conversion_test.go b/bootstrap/kubeadm/api/v1alpha3/conversion_test.go
index cac6e82f4..67a5e7e4d 100644
--- a/bootstrap/kubeadm/api/v1alpha3/conversion_test.go
+++ b/bootstrap/kubeadm/api/v1alpha3/conversion_test.go
@@ -82,12 +82,12 @@ func clusterConfigurationFuzzer(obj *upstreamv1beta1.ClusterConfiguration, c fuz
 	obj.UseHyperKubeImage = false
 }
 
-func kubeadmBootstrapTokenStringFuzzerV1UpstreamBeta1(in *upstreamv1beta1.BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzerV1UpstreamBeta1(in *upstreamv1beta1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = "abcdef"
 	in.Secret = "abcdef0123456789"
 }
 
-func kubeadmBootstrapTokenStringFuzzerV1Beta1(in *bootstrapv1.BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzerV1Beta1(in *bootstrapv1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = "abcdef"
 	in.Secret = "abcdef0123456789"
 }
diff --git a/bootstrap/kubeadm/api/v1alpha4/conversion_test.go b/bootstrap/kubeadm/api/v1alpha4/conversion_test.go
index 714fd051d..3e37138ab 100644
--- a/bootstrap/kubeadm/api/v1alpha4/conversion_test.go
+++ b/bootstrap/kubeadm/api/v1alpha4/conversion_test.go
@@ -80,17 +80,17 @@ func clusterConfigurationFuzzer(obj *upstreamv1beta1.ClusterConfiguration, c fuz
 	obj.UseHyperKubeImage = false
 }
 
-func kubeadmBootstrapTokenStringFuzzerV1UpstreamBeta1(in *upstreamv1beta1.BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzerV1UpstreamBeta1(in *upstreamv1beta1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = fakeID
 	in.Secret = fakeSecret
 }
 
-func kubeadmBootstrapTokenStringFuzzerV1Beta1(in *bootstrapv1.BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzerV1Beta1(in *bootstrapv1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = fakeID
 	in.Secret = fakeSecret
 }
 
-func kubeadmBootstrapTokenStringFuzzerV1Alpha4(in *BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzerV1Alpha4(in *BootstrapTokenString, c fuzz.Continue) {
 	in.ID = fakeID
 	in.Secret = fakeSecret
 }
diff --git a/cmd/clusterctl/client/client_test.go b/cmd/clusterctl/client/client_test.go
index 6da604f0e..6407986b7 100644
--- a/cmd/clusterctl/client/client_test.go
+++ b/cmd/clusterctl/client/client_test.go
@@ -38,7 +38,7 @@ import (
 )
 
 // TestNewFakeClient is a fake test to document fakeClient usage.
-func TestNewFakeClient(_ *testing.T) {
+func TestNewFakeClient(t *testing.T) {
 	// create a fake config with a provider named P1 and a variable named var
 	repository1Config := config.NewProvider("p1", "url", clusterctlv1.CoreProviderType)
 
diff --git a/cmd/clusterctl/client/cluster/inventory_test.go b/cmd/clusterctl/client/cluster/inventory_test.go
index 92916358c..a589d2ed9 100644
--- a/cmd/clusterctl/client/cluster/inventory_test.go
+++ b/cmd/clusterctl/client/cluster/inventory_test.go
@@ -31,7 +31,7 @@ import (
 	"sigs.k8s.io/cluster-api/cmd/clusterctl/internal/test"
 )
 
-func fakePollImmediateWaiter(_, _ time.Duration, _ wait.ConditionFunc) error {
+func fakePollImmediateWaiter(interval, timeout time.Duration, condition wait.ConditionFunc) error {
 	return nil
 }
 
diff --git a/cmd/clusterctl/client/cluster/topology_test.go b/cmd/clusterctl/client/cluster/topology_test.go
index c7ef04161..e8a5e4a38 100644
--- a/cmd/clusterctl/client/cluster/topology_test.go
+++ b/cmd/clusterctl/client/cluster/topology_test.go
@@ -349,11 +349,11 @@ func (m *topologyPlanOutputItemMatcher) Match(actual interface{}) (bool, error)
 	return true, nil
 }
 
-func (m *topologyPlanOutputItemMatcher) FailureMessage(_ interface{}) string {
+func (m *topologyPlanOutputItemMatcher) FailureMessage(actual interface{}) string {
 	return fmt.Sprintf("Expected item Kind=%s, Namespace=%s, Name(prefix)=%s to be present", m.kind, m.namespace, m.namePrefix)
 }
 
-func (m *topologyPlanOutputItemMatcher) NegatedFailureMessage(_ interface{}) string {
+func (m *topologyPlanOutputItemMatcher) NegatedFailureMessage(actual interface{}) string {
 	return fmt.Sprintf("Expected item Kind=%s, Namespace=%s, Name(prefix)=%s not to be present", m.kind, m.namespace, m.namePrefix)
 }
 
diff --git a/cmd/clusterctl/client/clusterclass_test.go b/cmd/clusterctl/client/clusterclass_test.go
index 0ab79e732..3d3e207d7 100644
--- a/cmd/clusterctl/client/clusterclass_test.go
+++ b/cmd/clusterctl/client/clusterclass_test.go
@@ -258,10 +258,10 @@ func (cm *clusterClassMatcher) Match(actual interface{}) (bool, error) {
 	return true, nil
 }
 
-func (cm *clusterClassMatcher) FailureMessage(_ interface{}) string {
+func (cm *clusterClassMatcher) FailureMessage(actual interface{}) string {
 	return fmt.Sprintf("Expected ClusterClass of name %v in namespace %v to be present", cm.name, cm.namespace)
 }
 
-func (cm *clusterClassMatcher) NegatedFailureMessage(_ interface{}) string {
+func (cm *clusterClassMatcher) NegatedFailureMessage(actual interface{}) string {
 	return fmt.Sprintf("Expected ClusterClass of name %v in namespace %v not to be present", cm.name, cm.namespace)
 }
diff --git a/cmd/clusterctl/client/config_test.go b/cmd/clusterctl/client/config_test.go
index fbc549c0b..bb8202840 100644
--- a/cmd/clusterctl/client/config_test.go
+++ b/cmd/clusterctl/client/config_test.go
@@ -1046,6 +1046,6 @@ v3: default3`,
 // errReader returns a non-EOF error on the first read.
 type errReader struct{}
 
-func (e *errReader) Read(_ []byte) (n int, err error) {
+func (e *errReader) Read(p []byte) (n int, err error) {
 	return 0, errors.New("read error")
 }
diff --git a/cmd/clusterctl/client/init_test.go b/cmd/clusterctl/client/init_test.go
index 8b3e72c55..b2e06b526 100644
--- a/cmd/clusterctl/client/init_test.go
+++ b/cmd/clusterctl/client/init_test.go
@@ -81,7 +81,7 @@ func Test_clusterctlClient_InitImages(t *testing.T) {
 				kubeconfigContext:      "mgmt-context",
 			},
 			expectedImages: []string{
-				"registry.k8s.io/cluster-api-aws/cluster-api-aws-controller:v0.5.3",
+				"k8s.gcr.io/cluster-api-aws/cluster-api-aws-controller:v0.5.3",
 			},
 			wantErr: false,
 		},
@@ -854,7 +854,7 @@ spec:
   template:
     spec:
       containers:
-      - image: registry.k8s.io/cluster-api-aws/cluster-api-aws-controller:v0.5.3
+      - image: k8s.gcr.io/cluster-api-aws/cluster-api-aws-controller:v0.5.3
         name: manager
         volumeMounts:
         - mountPath: /home/.aws
diff --git a/cmd/clusterctl/client/move_test.go b/cmd/clusterctl/client/move_test.go
index 3b9245cf2..8c2c82fbf 100644
--- a/cmd/clusterctl/client/move_test.go
+++ b/cmd/clusterctl/client/move_test.go
@@ -298,22 +298,22 @@ type fakeObjectMover struct {
 	fromDirectoryErr error
 }
 
-func (f *fakeObjectMover) Move(_ string, _ cluster.Client, _ bool) error {
+func (f *fakeObjectMover) Move(namespace string, toCluster cluster.Client, dryRun bool) error {
 	return f.moveErr
 }
 
-func (f *fakeObjectMover) ToDirectory(_ string, _ string) error {
+func (f *fakeObjectMover) ToDirectory(namespace string, directory string) error {
 	return f.toDirectoryErr
 }
 
-func (f *fakeObjectMover) Backup(_ string, _ string) error {
+func (f *fakeObjectMover) Backup(namespace string, directory string) error {
 	return f.toDirectoryErr
 }
 
-func (f *fakeObjectMover) FromDirectory(_ cluster.Client, _ string) error {
+func (f *fakeObjectMover) FromDirectory(toCluster cluster.Client, directory string) error {
 	return f.fromDirectoryErr
 }
 
-func (f *fakeObjectMover) Restore(_ cluster.Client, _ string) error {
+func (f *fakeObjectMover) Restore(toCluster cluster.Client, directory string) error {
 	return f.fromDirectoryErr
 }
diff --git a/cmd/clusterctl/internal/test/fake_processor.go b/cmd/clusterctl/internal/test/fake_processor.go
index 92a5dd229..376a24ed8 100644
--- a/cmd/clusterctl/internal/test/fake_processor.go
+++ b/cmd/clusterctl/internal/test/fake_processor.go
@@ -44,22 +44,22 @@ func (fp *FakeProcessor) WithProcessErr(e error) *FakeProcessor {
 	return fp
 }
 
-func (fp *FakeProcessor) GetTemplateName(_, _ string) string {
+func (fp *FakeProcessor) GetTemplateName(version, flavor string) string {
 	return fp.artifactName
 }
 
-func (fp *FakeProcessor) GetClusterClassTemplateName(_, name string) string {
+func (fp *FakeProcessor) GetClusterClassTemplateName(version, name string) string {
 	return fmt.Sprintf("clusterclass-%s.yaml", name)
 }
 
-func (fp *FakeProcessor) GetVariables(_ []byte) ([]string, error) {
+func (fp *FakeProcessor) GetVariables(raw []byte) ([]string, error) {
 	return nil, fp.errGetVariables
 }
 
-func (fp *FakeProcessor) GetVariableMap(_ []byte) (map[string]*string, error) {
+func (fp *FakeProcessor) GetVariableMap(raw []byte) (map[string]*string, error) {
 	return nil, fp.errGetVariableMap
 }
 
-func (fp *FakeProcessor) Process(_ []byte, _ func(string) (string, error)) ([]byte, error) {
+func (fp *FakeProcessor) Process(raw []byte, variablesGetter func(string) (string, error)) ([]byte, error) {
 	return nil, fp.errProcess
 }
diff --git a/cmd/clusterctl/internal/test/fake_proxy.go b/cmd/clusterctl/internal/test/fake_proxy.go
index 79ffe5c23..c3273f4f1 100644
--- a/cmd/clusterctl/internal/test/fake_proxy.go
+++ b/cmd/clusterctl/internal/test/fake_proxy.go
@@ -136,11 +136,11 @@ func (f *FakeProxy) ListResources(labels map[string]string, namespaces ...string
 	return ret, nil
 }
 
-func (f *FakeProxy) GetContexts(_ string) ([]string, error) {
+func (f *FakeProxy) GetContexts(prefix string) ([]string, error) {
 	return nil, nil
 }
 
-func (f *FakeProxy) GetResourceNames(_, _ string, _ []client.ListOption, _ string) ([]string, error) {
+func (f *FakeProxy) GetResourceNames(groupVersion, kind string, options []client.ListOption, prefix string) ([]string, error) {
 	return nil, nil
 }
 
diff --git a/cmd/clusterctl/internal/test/fake_reader.go b/cmd/clusterctl/internal/test/fake_reader.go
index 3fd8ea4c9..f33c672ca 100644
--- a/cmd/clusterctl/internal/test/fake_reader.go
+++ b/cmd/clusterctl/internal/test/fake_reader.go
@@ -55,7 +55,7 @@ type imageMeta struct {
 	Tag        string `json:"tag,omitempty"`
 }
 
-func (f *FakeReader) Init(_ string) error {
+func (f *FakeReader) Init(config string) error {
 	f.initialized = true
 	return nil
 }
diff --git a/controlplane/kubeadm/api/v1alpha3/conversion_test.go b/controlplane/kubeadm/api/v1alpha3/conversion_test.go
index 2d8217c19..0a2dc0a79 100644
--- a/controlplane/kubeadm/api/v1alpha3/conversion_test.go
+++ b/controlplane/kubeadm/api/v1alpha3/conversion_test.go
@@ -56,11 +56,11 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
 	}
 }
 
-func kubeadmBootstrapTokenStringFuzzer(in *upstreamv1beta1.BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzer(in *upstreamv1beta1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = "abcdef"
 	in.Secret = "abcdef0123456789"
 }
-func cabpkBootstrapTokenStringFuzzer(in *bootstrapv1.BootstrapTokenString, _ fuzz.Continue) {
+func cabpkBootstrapTokenStringFuzzer(in *bootstrapv1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = "abcdef"
 	in.Secret = "abcdef0123456789"
 }
diff --git a/controlplane/kubeadm/api/v1alpha4/conversion_test.go b/controlplane/kubeadm/api/v1alpha4/conversion_test.go
index 0c9bed520..40e2821d3 100644
--- a/controlplane/kubeadm/api/v1alpha4/conversion_test.go
+++ b/controlplane/kubeadm/api/v1alpha4/conversion_test.go
@@ -71,12 +71,12 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
 	}
 }
 
-func kubeadmBootstrapTokenStringFuzzer(in *upstreamv1beta1.BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzer(in *upstreamv1beta1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = fakeID
 	in.Secret = fakeSecret
 }
 
-func cabpkBootstrapTokenStringFuzzer(in *bootstrapv1.BootstrapTokenString, _ fuzz.Continue) {
+func cabpkBootstrapTokenStringFuzzer(in *bootstrapv1.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = fakeID
 	in.Secret = fakeSecret
 }
@@ -84,11 +84,11 @@ func cabpkBootstrapTokenStringFuzzer(in *bootstrapv1.BootstrapTokenString, _ fuz
 func dnsFuzzer(obj *upstreamv1beta1.DNS, c fuzz.Continue) {
 	c.FuzzNoCustom(obj)
 
-	// DNS.Type does not exist in v1alpha4, so setting it to empty string in order to avoid v1alpha3 --> v1alpha4 --> v1alpha3 round trip errors.
+	// DNS.Type does not exists in v1alpha4, so setting it to empty string in order to avoid v1alpha3 --> v1alpha4 --> v1alpha3 round trip errors.
 	obj.Type = ""
 }
 
-func kubeadmBootstrapTokenStringFuzzerV1Alpha4(in *bootstrapv1alpha4.BootstrapTokenString, _ fuzz.Continue) {
+func kubeadmBootstrapTokenStringFuzzerV1Alpha4(in *bootstrapv1alpha4.BootstrapTokenString, c fuzz.Continue) {
 	in.ID = fakeID
 	in.Secret = fakeSecret
 }
diff --git a/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook_test.go b/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook_test.go
index d8c52f7ce..686dacb53 100644
--- a/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook_test.go
+++ b/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook_test.go
@@ -298,7 +298,7 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) {
 					ClusterName: "test",
 					DNS: bootstrapv1.DNS{
 						ImageMeta: bootstrapv1.ImageMeta{
-							ImageRepository: "registry.k8s.io/coredns",
+							ImageRepository: "k8s.gcr.io/coredns",
 							ImageTag:        "1.6.5",
 						},
 					},
diff --git a/controlplane/kubeadm/internal/cluster_test.go b/controlplane/kubeadm/internal/cluster_test.go
index 6fb7fb9a7..e01c3238e 100644
--- a/controlplane/kubeadm/internal/cluster_test.go
+++ b/controlplane/kubeadm/internal/cluster_test.go
@@ -291,7 +291,7 @@ type fakeClient struct {
 	listErr      error
 }
 
-func (f *fakeClient) Get(_ context.Context, key client.ObjectKey, obj client.Object, _ ...client.GetOption) error {
+func (f *fakeClient) Get(_ context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
 	f.getCalled = true
 	if f.getErr != nil {
 		return f.getErr
diff --git a/controlplane/kubeadm/internal/controllers/controller_test.go b/controlplane/kubeadm/internal/controllers/controller_test.go
index 069d90e1f..a34e93345 100644
--- a/controlplane/kubeadm/internal/controllers/controller_test.go
+++ b/controlplane/kubeadm/internal/controllers/controller_test.go
@@ -1039,7 +1039,7 @@ func TestReconcileInitializeControlPlane(t *testing.T) {
 			"ClusterConfiguration": `apiServer:
 dns:
   type: CoreDNS
-imageRepository: registry.k8s.io
+imageRepository: k8s.gcr.io
 kind: ClusterConfiguration
 kubernetesVersion: metav1.16.1`,
 		},
@@ -1057,7 +1057,7 @@ kubernetesVersion: metav1.16.1`,
 				Spec: corev1.PodSpec{
 					Containers: []corev1.Container{{
 						Name:  "coredns",
-						Image: "registry.k8s.io/coredns:1.6.2",
+						Image: "k8s.gcr.io/coredns:1.6.2",
 					}},
 				},
 			},
@@ -1163,7 +1163,7 @@ func TestKubeadmControlPlaneReconciler_updateCoreDNS(t *testing.T) {
 				ClusterConfiguration: &bootstrapv1.ClusterConfiguration{
 					DNS: bootstrapv1.DNS{
 						ImageMeta: bootstrapv1.ImageMeta{
-							ImageRepository: "registry.k8s.io",
+							ImageRepository: "k8s.gcr.io",
 							ImageTag:        "1.7.2",
 						},
 					},
@@ -1184,7 +1184,7 @@ func TestKubeadmControlPlaneReconciler_updateCoreDNS(t *testing.T) {
 				Spec: corev1.PodSpec{
 					Containers: []corev1.Container{{
 						Name:  "coredns",
-						Image: "registry.k8s.io/coredns:1.6.2",
+						Image: "k8s.gcr.io/coredns:1.6.2",
 					}},
 					Volumes: []corev1.Volume{{
 						Name: "config-volume",
@@ -1224,7 +1224,7 @@ func TestKubeadmControlPlaneReconciler_updateCoreDNS(t *testing.T) {
 			"ClusterConfiguration": `apiServer:
 dns:
   type: CoreDNS
-imageRepository: registry.k8s.io
+imageRepository: k8s.gcr.io
 kind: ClusterConfiguration
 kubernetesVersion: metav1.16.1`,
 		},
@@ -1282,7 +1282,7 @@ kubernetesVersion: metav1.16.1`,
 		}
 		var actualCoreDNSDeployment appsv1.Deployment
 		g.Expect(fakeClient.Get(ctx, client.ObjectKey{Name: "coredns", Namespace: metav1.NamespaceSystem}, &actualCoreDNSDeployment)).To(Succeed())
-		g.Expect(actualCoreDNSDeployment.Spec.Template.Spec.Containers[0].Image).To(Equal("registry.k8s.io/coredns:1.7.2"))
+		g.Expect(actualCoreDNSDeployment.Spec.Template.Spec.Containers[0].Image).To(Equal("k8s.gcr.io/coredns:1.7.2"))
 		g.Expect(actualCoreDNSDeployment.Spec.Template.Spec.Volumes).To(ConsistOf(expectedVolume))
 	})
 
diff --git a/controlplane/kubeadm/internal/controllers/fakes_test.go b/controlplane/kubeadm/internal/controllers/fakes_test.go
index 7f5a962e2..e83cfc9aa 100644
--- a/controlplane/kubeadm/internal/controllers/fakes_test.go
+++ b/controlplane/kubeadm/internal/controllers/fakes_test.go
@@ -80,7 +80,7 @@ func (f fakeWorkloadCluster) ForwardEtcdLeadership(_ context.Context, _ *cluster
 	return nil
 }
 
-func (f fakeWorkloadCluster) ReconcileEtcdMembers(_ context.Context, _ []string, _ semver.Version) ([]string, error) {
+func (f fakeWorkloadCluster) ReconcileEtcdMembers(ctx context.Context, nodeNames []string, version semver.Version) ([]string, error) {
 	return nil, nil
 }
 
@@ -92,35 +92,35 @@ func (f fakeWorkloadCluster) GetAPIServerCertificateExpiry(_ context.Context, _
 	return f.APIServerCertificateExpiry, nil
 }
 
-func (f fakeWorkloadCluster) AllowBootstrapTokensToGetNodes(_ context.Context) error {
+func (f fakeWorkloadCluster) AllowBootstrapTokensToGetNodes(ctx context.Context) error {
 	return nil
 }
 
-func (f fakeWorkloadCluster) ReconcileKubeletRBACRole(_ context.Context, _ semver.Version) error {
+func (f fakeWorkloadCluster) ReconcileKubeletRBACRole(ctx context.Context, version semver.Version) error {
 	return nil
 }
 
-func (f fakeWorkloadCluster) ReconcileKubeletRBACBinding(_ context.Context, _ semver.Version) error {
+func (f fakeWorkloadCluster) ReconcileKubeletRBACBinding(ctx context.Context, version semver.Version) error {
 	return nil
 }
 
-func (f fakeWorkloadCluster) UpdateKubernetesVersionInKubeadmConfigMap(_ context.Context, _ semver.Version) error {
+func (f fakeWorkloadCluster) UpdateKubernetesVersionInKubeadmConfigMap(ctx context.Context, version semver.Version) error {
 	return nil
 }
 
-func (f fakeWorkloadCluster) UpdateEtcdVersionInKubeadmConfigMap(_ context.Context, _, _ string, _ semver.Version) error {
+func (f fakeWorkloadCluster) UpdateEtcdVersionInKubeadmConfigMap(ctx context.Context, imageRepository, imageTag string, version semver.Version) error {
 	return nil
 }
 
-func (f fakeWorkloadCluster) UpdateKubeletConfigMap(_ context.Context, _ semver.Version) error {
+func (f fakeWorkloadCluster) UpdateKubeletConfigMap(ctx context.Context, version semver.Version) error {
 	return nil
 }
 
-func (f fakeWorkloadCluster) RemoveEtcdMemberForMachine(_ context.Context, _ *clusterv1.Machine) error {
+func (f fakeWorkloadCluster) RemoveEtcdMemberForMachine(ctx context.Context, machine *clusterv1.Machine) error {
 	return nil
 }
 
-func (f fakeWorkloadCluster) RemoveMachineFromKubeadmConfigMap(_ context.Context, _ *clusterv1.Machine, _ semver.Version) error {
+func (f fakeWorkloadCluster) RemoveMachineFromKubeadmConfigMap(ctx context.Context, machine *clusterv1.Machine, version semver.Version) error {
 	return nil
 }
 
@@ -134,7 +134,7 @@ type fakeMigrator struct {
 	migratedCorefile string
 }
 
-func (m *fakeMigrator) Migrate(_, _, _ string, _ bool) (string, error) {
+func (m *fakeMigrator) Migrate(current, to, corefile string, deprecations bool) (string, error) {
 	m.migrateCalled = true
 	if m.migrateErr != nil {
 		return "", m.migrateErr
diff --git a/controlplane/kubeadm/internal/webhooks/scale_test.go b/controlplane/kubeadm/internal/webhooks/scale_test.go
index f074dcf20..6aca59a79 100644
--- a/controlplane/kubeadm/internal/webhooks/scale_test.go
+++ b/controlplane/kubeadm/internal/webhooks/scale_test.go
@@ -85,7 +85,7 @@ func TestKubeadmControlPlaneValidateScale(t *testing.T) {
 					ClusterName: "kcp-managed-etcd",
 					DNS: bootstrapv1.DNS{
 						ImageMeta: bootstrapv1.ImageMeta{
-							ImageRepository: "registry.k8s.io/coredns",
+							ImageRepository: "k8s.gcr.io/coredns",
 							ImageTag:        "1.6.5",
 						},
 					},
diff --git a/controlplane/kubeadm/internal/workload_cluster_coredns_test.go b/controlplane/kubeadm/internal/workload_cluster_coredns_test.go
index 242aeb33c..c0bae6931 100644
--- a/controlplane/kubeadm/internal/workload_cluster_coredns_test.go
+++ b/controlplane/kubeadm/internal/workload_cluster_coredns_test.go
@@ -1639,7 +1639,7 @@ type fakeMigrator struct {
 	migratedCorefile string
 }
 
-func (m *fakeMigrator) Migrate(_, _, _ string, _ bool) (string, error) {
+func (m *fakeMigrator) Migrate(current, to, corefile string, deprecations bool) (string, error) {
 	m.migrateCalled = true
 	if m.migrateErr != nil {
 		return "", m.migrateErr
diff --git a/hack/setup-envtest-with-kind.sh b/hack/setup-envtest-with-kind.sh
index 4fd66286b..7f4f4e48c 100755
--- a/hack/setup-envtest-with-kind.sh
+++ b/hack/setup-envtest-with-kind.sh
@@ -18,10 +18,6 @@ set -o errexit
 set -o nounset
 set -o pipefail
 
-if [[ "${TRACE-0}" == "1" ]]; then
-    set -o xtrace
-fi
-
 os="unknown"
 if [[ "${OSTYPE}" == "linux"* ]]; then
   os="linux"
diff --git a/internal/contract/bootstrap_test.go b/internal/contract/bootstrap_test.go
deleted file mode 100644
index ab23468b5..000000000
--- a/internal/contract/bootstrap_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-Copyright 2022 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package contract
-
-import (
-	"testing"
-
-	. "github.com/onsi/gomega"
-	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-)
-
-func TestBootstrap(t *testing.T) {
-	obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
-
-	t.Run("Manages status.ready", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(Bootstrap().Ready().Path()).To(Equal(Path{"status", "ready"}))
-
-		err := Bootstrap().Ready().Set(obj, true)
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := Bootstrap().Ready().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(true))
-	})
-	t.Run("Manages status.dataSecretName", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(Bootstrap().DataSecretName().Path()).To(Equal(Path{"status", "dataSecretName"}))
-
-		err := Bootstrap().DataSecretName().Set(obj, "fake-data-secret-name")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := Bootstrap().DataSecretName().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-data-secret-name"))
-	})
-	t.Run("Manages optional status.failureReason", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(Bootstrap().FailureReason().Path()).To(Equal(Path{"status", "failureReason"}))
-
-		err := Bootstrap().FailureReason().Set(obj, "fake-reason")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := Bootstrap().FailureReason().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-reason"))
-	})
-	t.Run("Manages optional status.failureMessage", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(Bootstrap().FailureMessage().Path()).To(Equal(Path{"status", "failureMessage"}))
-
-		err := Bootstrap().FailureMessage().Set(obj, "fake-message")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := Bootstrap().FailureMessage().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-message"))
-	})
-}
diff --git a/internal/contract/controlplane_test.go b/internal/contract/controlplane_test.go
index 4080cb837..48d5352bb 100644
--- a/internal/contract/controlplane_test.go
+++ b/internal/contract/controlplane_test.go
@@ -56,32 +56,6 @@ func TestControlPlane(t *testing.T) {
 		g.Expect(got).ToNot(BeNil())
 		g.Expect(*got).To(Equal("1.2.3"))
 	})
-	t.Run("Manages status.ready", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(ControlPlane().Ready().Path()).To(Equal(Path{"status", "ready"}))
-
-		err := ControlPlane().Ready().Set(obj, true)
-		g.Expect(err).NotTo(HaveOccurred())
-
-		got, err := ControlPlane().Ready().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(true))
-	})
-	t.Run("Manages status.initialized", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(ControlPlane().Initialized().Path()).To(Equal(Path{"status", "initialized"}))
-
-		err := ControlPlane().Initialized().Set(obj, true)
-		g.Expect(err).NotTo(HaveOccurred())
-
-		got, err := ControlPlane().Initialized().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(true))
-	})
 	t.Run("Manages spec.replicas", func(t *testing.T) {
 		g := NewWithT(t)
 
@@ -134,32 +108,6 @@ func TestControlPlane(t *testing.T) {
 		g.Expect(got).ToNot(BeNil())
 		g.Expect(*got).To(Equal(int64(3)))
 	})
-	t.Run("Manages status.unavailableReplicas", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(ControlPlane().UnavailableReplicas().Path()).To(Equal(Path{"status", "unavailableReplicas"}))
-
-		err := ControlPlane().UnavailableReplicas().Set(obj, int64(3))
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := ControlPlane().UnavailableReplicas().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(int64(3)))
-	})
-	t.Run("Manages status.selector", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(ControlPlane().Selector().Path()).To(Equal(Path{"status", "selector"}))
-
-		err := ControlPlane().Selector().Set(obj, "my-selector")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := ControlPlane().Selector().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("my-selector"))
-	})
 	t.Run("Manages spec.machineTemplate.infrastructureRef", func(t *testing.T) {
 		g := NewWithT(t)
 
diff --git a/internal/contract/infrastructure_cluster_test.go b/internal/contract/infrastructure_cluster_test.go
index b642944c5..2dece3dd9 100644
--- a/internal/contract/infrastructure_cluster_test.go
+++ b/internal/contract/infrastructure_cluster_test.go
@@ -21,84 +21,9 @@ import (
 
 	. "github.com/onsi/gomega"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-
-	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
 )
 
 func TestInfrastructureCluster(t *testing.T) {
-	obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
-
-	t.Run("Manages status.ready", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureCluster().Ready().Path()).To(Equal(Path{"status", "ready"}))
-
-		err := InfrastructureCluster().Ready().Set(obj, true)
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureCluster().Ready().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(true))
-	})
-	t.Run("Manages optional status.failureReason", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureCluster().FailureReason().Path()).To(Equal(Path{"status", "failureReason"}))
-
-		err := InfrastructureCluster().FailureReason().Set(obj, "fake-reason")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureCluster().FailureReason().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-reason"))
-	})
-	t.Run("Manages optional status.failureMessage", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureCluster().FailureMessage().Path()).To(Equal(Path{"status", "failureMessage"}))
-
-		err := InfrastructureCluster().FailureMessage().Set(obj, "fake-message")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureCluster().FailureMessage().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-message"))
-	})
-	t.Run("Manages optional status.failureDomains", func(t *testing.T) {
-		g := NewWithT(t)
-
-		failureDomains := clusterv1.FailureDomains{
-			"domain1": clusterv1.FailureDomainSpec{
-				ControlPlane: true,
-				Attributes: map[string]string{
-					"key1": "value1",
-					"key2": "value2",
-				},
-			},
-			"domain2": clusterv1.FailureDomainSpec{
-				ControlPlane: false,
-				Attributes: map[string]string{
-					"key3": "value3",
-					"key4": "value4",
-				},
-			},
-		}
-		g.Expect(InfrastructureCluster().FailureDomains().Path()).To(Equal(Path{"status", "failureDomains"}))
-
-		err := InfrastructureCluster().FailureDomains().Set(obj, failureDomains)
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureCluster().FailureDomains().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(failureDomains))
-	})
-}
-
-func TestInfrastructureClusterControlPlaneEndpoint(t *testing.T) {
 	tests := []struct {
 		name                  string
 		infrastructureCluster *unstructured.Unstructured
diff --git a/internal/contract/infrastructure_machine_test.go b/internal/contract/infrastructure_machine_test.go
deleted file mode 100644
index ba1d7ee61..000000000
--- a/internal/contract/infrastructure_machine_test.go
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
-Copyright 2022 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package contract
-
-import (
-	"testing"
-
-	. "github.com/onsi/gomega"
-	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-
-	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
-)
-
-func TestInfrastructureMachine(t *testing.T) {
-	obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
-
-	t.Run("Manages spec.providerID", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureMachine().ProviderID().Path()).To(Equal(Path{"spec", "providerID"}))
-
-		err := InfrastructureMachine().ProviderID().Set(obj, "fake-provider-id")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureMachine().ProviderID().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-provider-id"))
-	})
-	t.Run("Manages status.ready", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureMachine().Ready().Path()).To(Equal(Path{"status", "ready"}))
-
-		err := InfrastructureMachine().Ready().Set(obj, true)
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureMachine().Ready().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(true))
-	})
-	t.Run("Manages optional status.failureReason", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureMachine().FailureReason().Path()).To(Equal(Path{"status", "failureReason"}))
-
-		err := InfrastructureMachine().FailureReason().Set(obj, "fake-reason")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureMachine().FailureReason().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-reason"))
-	})
-	t.Run("Manages optional status.failureMessage", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureMachine().FailureMessage().Path()).To(Equal(Path{"status", "failureMessage"}))
-
-		err := InfrastructureMachine().FailureMessage().Set(obj, "fake-message")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureMachine().FailureMessage().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-message"))
-	})
-	t.Run("Manages optional status.addresses", func(t *testing.T) {
-		g := NewWithT(t)
-
-		addresses := []clusterv1.MachineAddress{
-			{
-				Type:    clusterv1.MachineHostName,
-				Address: "fake-address-1",
-			},
-			{
-				Type:    clusterv1.MachineInternalIP,
-				Address: "fake-address-2",
-			},
-		}
-		g.Expect(InfrastructureMachine().Addresses().Path()).To(Equal(Path{"status", "addresses"}))
-
-		err := InfrastructureMachine().Addresses().Set(obj, addresses)
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureMachine().Addresses().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal(addresses))
-	})
-	t.Run("Manages optional spec.failureDomain", func(t *testing.T) {
-		g := NewWithT(t)
-
-		g.Expect(InfrastructureMachine().FailureDomain().Path()).To(Equal(Path{"spec", "failureDomain"}))
-
-		err := InfrastructureMachine().FailureDomain().Set(obj, "fake-failure-domain")
-		g.Expect(err).ToNot(HaveOccurred())
-
-		got, err := InfrastructureMachine().FailureDomain().Get(obj)
-		g.Expect(err).ToNot(HaveOccurred())
-		g.Expect(got).ToNot(BeNil())
-		g.Expect(*got).To(Equal("fake-failure-domain"))
-	})
-}
diff --git a/internal/controllers/topology/cluster/desired_state_test.go b/internal/controllers/topology/cluster/desired_state_test.go
index 562128504..db64ce894 100644
--- a/internal/controllers/topology/cluster/desired_state_test.go
+++ b/internal/controllers/topology/cluster/desired_state_test.go
@@ -1329,9 +1329,6 @@ func TestComputeMachineDeployment(t *testing.T) {
 	nodeVolumeDetachTimeout := metav1.Duration{Duration: 10 * time.Second}
 	nodeDeletionTimeout := metav1.Duration{Duration: 10 * time.Second}
 	minReadySeconds := int32(5)
-	strategy := clusterv1.MachineDeploymentStrategy{
-		Type: clusterv1.OnDeleteMachineDeploymentStrategyType,
-	}
 	mdTopology := clusterv1.MachineDeploymentTopology{
 		Metadata: clusterv1.ObjectMeta{
 			Labels: map[string]string{"foo": "baz"},
@@ -1344,7 +1341,6 @@ func TestComputeMachineDeployment(t *testing.T) {
 		NodeVolumeDetachTimeout: &nodeVolumeDetachTimeout,
 		NodeDeletionTimeout:     &nodeDeletionTimeout,
 		MinReadySeconds:         &minReadySeconds,
-		Strategy:                &strategy,
 	}
 
 	t.Run("Generates the machine deployment and the referenced templates", func(t *testing.T) {
@@ -1372,7 +1368,6 @@ func TestComputeMachineDeployment(t *testing.T) {
 		actualMd := actual.Object
 		g.Expect(*actualMd.Spec.Replicas).To(Equal(replicas))
 		g.Expect(*actualMd.Spec.MinReadySeconds).To(Equal(minReadySeconds))
-		g.Expect(*actualMd.Spec.Strategy).To(Equal(strategy))
 		g.Expect(*actualMd.Spec.Template.Spec.FailureDomain).To(Equal(failureDomain))
 		g.Expect(*actualMd.Spec.Template.Spec.NodeDrainTimeout).To(Equal(nodeDrainTimeout))
 		g.Expect(*actualMd.Spec.Template.Spec.NodeDeletionTimeout).To(Equal(nodeDeletionTimeout))
diff --git a/internal/runtime/client/client_test.go b/internal/runtime/client/client_test.go
index bfce5c718..876fcffba 100644
--- a/internal/runtime/client/client_test.go
+++ b/internal/runtime/client/client_test.go
@@ -208,7 +208,7 @@ func TestClient_httpCall(t *testing.T) {
 	}
 }
 
-func fakeHookHandler(w http.ResponseWriter, _ *http.Request) {
+func fakeHookHandler(w http.ResponseWriter, r *http.Request) {
 	response := &fakev1alpha1.FakeResponse{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       "FakeHookResponse",
diff --git a/test/e2e/common.go b/test/e2e/common.go
index 19cd3fb38..fb95c909a 100644
--- a/test/e2e/common.go
+++ b/test/e2e/common.go
@@ -104,17 +104,17 @@ func HaveValidVersion(version string) types.GomegaMatcher {
 
 type validVersionMatcher struct{ version string }
 
-func (m *validVersionMatcher) Match(_ interface{}) (success bool, err error) {
+func (m *validVersionMatcher) Match(actual interface{}) (success bool, err error) {
 	if _, err := semver.ParseTolerant(m.version); err != nil {
 		return false, err
 	}
 	return true, nil
 }
 
-func (m *validVersionMatcher) FailureMessage(_ interface{}) (message string) {
+func (m *validVersionMatcher) FailureMessage(actual interface{}) (message string) {
 	return fmt.Sprintf("Expected\n%s\n%s", m.version, " to be a valid version ")
 }
 
-func (m *validVersionMatcher) NegatedFailureMessage(_ interface{}) (message string) {
+func (m *validVersionMatcher) NegatedFailureMessage(actual interface{}) (message string) {
 	return fmt.Sprintf("Expected\n%s\n%s", m.version, " not to be a valid version ")
 }
diff --git a/test/e2e/data/infrastructure-docker/v1beta1/main/bases/cluster-with-topology.yaml b/test/e2e/data/infrastructure-docker/v1beta1/main/bases/cluster-with-topology.yaml
index b54e06498..ab8a2664b 100644
--- a/test/e2e/data/infrastructure-docker/v1beta1/main/bases/cluster-with-topology.yaml
+++ b/test/e2e/data/infrastructure-docker/v1beta1/main/bases/cluster-with-topology.yaml
@@ -29,10 +29,6 @@ spec:
         minReadySeconds: 5
         replicas: ${WORKER_MACHINE_COUNT}
         failureDomain: fd4
-        strategy:
-          rollingUpdate:
-            maxSurge: "20%"
-            maxUnavailable: 0
     variables:
       # We set an empty value to use the default tag kubeadm init is using.
     - name: etcdImageTag
diff --git a/test/e2e/data/infrastructure-docker/v1beta1/main/clusterclass-quick-start-runtimesdk.yaml b/test/e2e/data/infrastructure-docker/v1beta1/main/clusterclass-quick-start-runtimesdk.yaml
index 3713630a0..33a3131c9 100644
--- a/test/e2e/data/infrastructure-docker/v1beta1/main/clusterclass-quick-start-runtimesdk.yaml
+++ b/test/e2e/data/infrastructure-docker/v1beta1/main/clusterclass-quick-start-runtimesdk.yaml
@@ -44,9 +44,9 @@ spec:
     schema:
       openAPIV3Schema:
         type: string
-        default: "registry.k8s.io"
-        example: "registry.k8s.io"
-        description: "imageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default."
+        default: "k8s.gcr.io"
+        example: "k8s.gcr.io"
+        description: "imageRepository sets the container registry to pull images from. If empty, `k8s.gcr.io` will be used by default."
   - name: kubeadmControlPlaneMaxSurge
     required: false
     schema:
diff --git a/test/framework/clusterctl/e2e_config.go b/test/framework/clusterctl/e2e_config.go
index 3603b1bdf..263feb13a 100644
--- a/test/framework/clusterctl/e2e_config.go
+++ b/test/framework/clusterctl/e2e_config.go
@@ -49,7 +49,7 @@ type LoadE2EConfigInput struct {
 }
 
 // LoadE2EConfig loads the configuration for the e2e test environment.
-func LoadE2EConfig(_ context.Context, input LoadE2EConfigInput) *E2EConfig {
+func LoadE2EConfig(ctx context.Context, input LoadE2EConfigInput) *E2EConfig {
 	configData, err := os.ReadFile(input.ConfigPath)
 	Expect(err).ToNot(HaveOccurred(), "Failed to read the e2e test config file")
 	Expect(configData).ToNot(BeEmpty(), "The e2e test config file should not be empty")
diff --git a/test/framework/clusterctl/logger/logger.go b/test/framework/clusterctl/logger/logger.go
index 67d5482b8..857152afa 100644
--- a/test/framework/clusterctl/logger/logger.go
+++ b/test/framework/clusterctl/logger/logger.go
@@ -35,14 +35,14 @@ type logger struct {
 
 var _ logr.LogSink = &logger{}
 
-func (l *logger) Init(_ logr.RuntimeInfo) {
+func (l *logger) Init(info logr.RuntimeInfo) {
 }
 
-func (l *logger) Enabled(_ int) bool {
+func (l *logger) Enabled(level int) bool {
 	return true
 }
 
-func (l *logger) Info(_ int, msg string, kvs ...interface{}) {
+func (l *logger) Info(level int, msg string, kvs ...interface{}) {
 	values := copySlice(l.values)
 	values = append(values, kvs...)
 	values = append(values, "msg", msg)
@@ -53,16 +53,16 @@ func (l *logger) Info(_ int, msg string, kvs ...interface{}) {
 	fmt.Fprintln(l.writer, f)
 }
 
-func (l *logger) Error(_ error, _ string, _ ...interface{}) {
+func (l *logger) Error(err error, msg string, kvs ...interface{}) {
 	panic("using log.Error is deprecated in clusterctl")
 }
 
-func (l *logger) V(_ int) logr.LogSink {
+func (l *logger) V(level int) logr.LogSink {
 	nl := l.clone()
 	return nl
 }
 
-func (l *logger) WithName(_ string) logr.LogSink {
+func (l *logger) WithName(name string) logr.LogSink {
 	panic("using log.WithName is deprecated in clusterctl")
 }
 
diff --git a/test/framework/docker_logcollector.go b/test/framework/docker_logcollector.go
index 0d3f80ddb..4d69338b0 100644
--- a/test/framework/docker_logcollector.go
+++ b/test/framework/docker_logcollector.go
@@ -46,7 +46,7 @@ func machineContainerName(cluster, machine string) string {
 	return fmt.Sprintf("%s-%s", cluster, machine)
 }
 
-func (k DockerLogCollector) CollectMachineLog(ctx context.Context, _ client.Client, m *clusterv1.Machine, outputPath string) error {
+func (k DockerLogCollector) CollectMachineLog(ctx context.Context, managementClusterClient client.Client, m *clusterv1.Machine, outputPath string) error {
 	containerName := machineContainerName(m.Spec.ClusterName, m.Name)
 	containerRuntime, err := container.NewDockerClient()
 	if err != nil {
@@ -56,7 +56,7 @@ func (k DockerLogCollector) CollectMachineLog(ctx context.Context, _ client.Clie
 	return k.collectLogsFromNode(ctx, outputPath, containerName)
 }
 
-func (k DockerLogCollector) CollectMachinePoolLog(ctx context.Context, _ client.Client, m *expv1.MachinePool, outputPath string) error {
+func (k DockerLogCollector) CollectMachinePoolLog(ctx context.Context, managementClusterClient client.Client, m *expv1.MachinePool, outputPath string) error {
 	containerRuntime, err := container.NewDockerClient()
 	if err != nil {
 		return err
diff --git a/test/framework/kubetest/run.go b/test/framework/kubetest/run.go
index 6d911f86a..5326bd53a 100644
--- a/test/framework/kubetest/run.go
+++ b/test/framework/kubetest/run.go
@@ -40,7 +40,7 @@ import (
 )
 
 const (
-	standardImage   = "registry.k8s.io/conformance"
+	standardImage   = "k8s.gcr.io/conformance"
 	ciArtifactImage = "gcr.io/k8s-staging-ci-images/conformance"
 )
 
diff --git a/test/go.mod b/test/go.mod
index a0cb070ec..45a19777c 100644
--- a/test/go.mod
+++ b/test/go.mod
@@ -24,8 +24,8 @@ require (
 	k8s.io/klog/v2 v2.80.1
 	k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73
 	sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000
-	sigs.k8s.io/controller-runtime v0.13.1
-	sigs.k8s.io/kind v0.17.0
+	sigs.k8s.io/controller-runtime v0.13.0
+	sigs.k8s.io/kind v0.16.0
 	sigs.k8s.io/yaml v1.3.0
 )
 
@@ -69,7 +69,6 @@ require (
 	github.com/google/go-github/v45 v45.2.0 // indirect
 	github.com/google/go-querystring v1.1.0 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect
 	github.com/google/uuid v1.3.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/huandu/xstrings v1.3.2 // indirect
diff --git a/test/go.sum b/test/go.sum
index d1dac8e24..baafa444c 100644
--- a/test/go.sum
+++ b/test/go.sum
@@ -302,8 +302,6 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe
 github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 h1:SJ+NtwL6QaZ21U+IrK7d0gGgpjGGvd2kz+FzTHVzdqI=
-github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC9t8wNnpPdctvtSUOPUUg4SHeE6vR1Ir2hmg=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
@@ -430,7 +428,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
@@ -1066,7 +1063,6 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
@@ -1124,12 +1120,12 @@ k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/
 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/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg=
-sigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
+sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ=
+sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
 sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
 sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
-sigs.k8s.io/kind v0.17.0 h1:CScmGz/wX66puA06Gj8OZb76Wmk7JIjgWf5JDvY7msM=
-sigs.k8s.io/kind v0.17.0/go.mod h1:Qqp8AiwOlMZmJWs37Hgs31xcbiYXjtXlRBSftcnZXQk=
+sigs.k8s.io/kind v0.16.0 h1:GFXyyxtPnHFKqXr3ZG8/X0+0K9sl69lejStlPn2WQyM=
+sigs.k8s.io/kind v0.16.0/go.mod h1:cKTqagdRyUQmihhBOd+7p43DpOPRn9rHsUC08K1Jbsk=
 sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
 sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
 sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
diff --git a/test/infrastructure/container/docker.go b/test/infrastructure/container/docker.go
index ca91467d3..9d8eeaa2e 100644
--- a/test/infrastructure/container/docker.go
+++ b/test/infrastructure/container/docker.go
@@ -161,7 +161,7 @@ func (d *dockerRuntime) GetHostPort(ctx context.Context, containerName, portAndP
 }
 
 // ExecContainer executes a command in a running container and writes any output to the provided writer.
-func (d *dockerRuntime) ExecContainer(_ context.Context, containerName string, config *ExecContainerInput, command string, args ...string) error {
+func (d *dockerRuntime) ExecContainer(ctxd context.Context, containerName string, config *ExecContainerInput, command string, args ...string) error {
 	ctx := context.Background() // Let the command finish, even if it takes longer than the default timeout
 	execConfig := types.ExecConfig{
 		// Run with privileges so we can remount etc..
diff --git a/test/infrastructure/container/fake.go b/test/infrastructure/container/fake.go
index 7b777a759..022d6fc3e 100644
--- a/test/infrastructure/container/fake.go
+++ b/test/infrastructure/container/fake.go
@@ -55,34 +55,34 @@ func NewFakeClient() (Runtime, error) {
 }
 
 // SaveContainerImage saves a Docker image to the file specified by dest.
-func (f *FakeRuntime) SaveContainerImage(_ context.Context, _, _ string) error {
+func (f *FakeRuntime) SaveContainerImage(ctx context.Context, image, dest string) error {
 	return nil
 }
 
 // PullContainerImageIfNotExists triggers the Docker engine to pull an image, but only if it doesn't
 // already exist. This is important when we're using locally built images in CI which
 // do not exist remotely.
-func (f *FakeRuntime) PullContainerImageIfNotExists(_ context.Context, _ string) error {
+func (f *FakeRuntime) PullContainerImageIfNotExists(ctx context.Context, image string) error {
 	return nil
 }
 
 // PullContainerImage triggers the Docker engine to pull an image.
-func (f *FakeRuntime) PullContainerImage(_ context.Context, _ string) error {
+func (f *FakeRuntime) PullContainerImage(ctx context.Context, image string) error {
 	return nil
 }
 
 // ImageExistsLocally returns if the specified image exists in local container image cache.
-func (f *FakeRuntime) ImageExistsLocally(_ context.Context, _ string) (bool, error) {
+func (f *FakeRuntime) ImageExistsLocally(ctx context.Context, image string) (bool, error) {
 	return false, nil
 }
 
 // GetHostPort looks up the host port bound for the port and protocol (e.g. "6443/tcp").
-func (f *FakeRuntime) GetHostPort(_ context.Context, _, _ string) (string, error) {
+func (f *FakeRuntime) GetHostPort(ctx context.Context, containerName, portAndProtocol string) (string, error) {
 	return "", nil
 }
 
 // ExecContainer executes a command in a running container and writes any output to the provided writer.
-func (f *FakeRuntime) ExecContainer(_ context.Context, containerName string, config *ExecContainerInput, command string, args ...string) error {
+func (f *FakeRuntime) ExecContainer(ctx context.Context, containerName string, config *ExecContainerInput, command string, args ...string) error {
 	execContainerCallLog = append(execContainerCallLog, ExecContainerArgs{
 		ContainerName: containerName,
 		Config:        config,
@@ -104,12 +104,12 @@ func (f *FakeRuntime) ResetExecContainerCallLogs() {
 }
 
 // ListContainers returns a list of all containers.
-func (f *FakeRuntime) ListContainers(_ context.Context, _ FilterBuilder) ([]Container, error) {
+func (f *FakeRuntime) ListContainers(ctx context.Context, filters FilterBuilder) ([]Container, error) {
 	return []Container{}, nil
 }
 
 // DeleteContainer will remove a container, forcing removal if still running.
-func (f *FakeRuntime) DeleteContainer(_ context.Context, containerName string) error {
+func (f *FakeRuntime) DeleteContainer(ctx context.Context, containerName string) error {
 	deleteContainerCallLog = append(deleteContainerCallLog, containerName)
 	return nil
 }
@@ -125,7 +125,7 @@ func (f *FakeRuntime) ResetDeleteContainerCallLogs() {
 }
 
 // KillContainer will kill a running container with the specified signal.
-func (f *FakeRuntime) KillContainer(_ context.Context, containerName, signal string) error {
+func (f *FakeRuntime) KillContainer(ctx context.Context, containerName, signal string) error {
 	killContainerCallLog = append(killContainerCallLog, KillContainerArgs{
 		Container: containerName,
 		Signal:    signal,
@@ -146,17 +146,17 @@ func (f *FakeRuntime) ResetKillContainerCallLogs() {
 // GetContainerIPs inspects a container to get its IPv4 and IPv6 IP addresses.
 // Will not error if there is no IP address assigned. Calling code will need to
 // determine whether that is an issue or not.
-func (f *FakeRuntime) GetContainerIPs(_ context.Context, containerName string) (string, string, error) {
+func (f *FakeRuntime) GetContainerIPs(ctx context.Context, containerName string) (string, string, error) {
 	return containerName + "IPv4", containerName + "IPv6", nil
 }
 
 // ContainerDebugInfo gets the container metadata and logs from the runtime (docker inspect, docker logs).
-func (f *FakeRuntime) ContainerDebugInfo(_ context.Context, _ string, _ io.Writer) error {
+func (f *FakeRuntime) ContainerDebugInfo(ctx context.Context, containerName string, w io.Writer) error {
 	return nil
 }
 
 // RunContainer will run a docker container with the given settings and arguments, returning any errors.
-func (f *FakeRuntime) RunContainer(_ context.Context, runConfig *RunContainerInput, output io.Writer) error {
+func (f *FakeRuntime) RunContainer(ctx context.Context, runConfig *RunContainerInput, output io.Writer) error {
 	runContainerCallLog = append(runContainerCallLog, RunContainerArgs{runConfig, output})
 	return nil
 }
diff --git a/test/infrastructure/docker/api/v1beta1/dockercluster_webhook.go b/test/infrastructure/docker/api/v1beta1/dockercluster_webhook.go
index 9cfeb6db7..95e801e10 100644
--- a/test/infrastructure/docker/api/v1beta1/dockercluster_webhook.go
+++ b/test/infrastructure/docker/api/v1beta1/dockercluster_webhook.go
@@ -52,7 +52,7 @@ func (c *DockerCluster) ValidateCreate() error {
 }
 
 // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
-func (c *DockerCluster) ValidateUpdate(_ runtime.Object) error {
+func (c *DockerCluster) ValidateUpdate(old runtime.Object) error {
 	return nil
 }
 
@@ -61,8 +61,8 @@ func (c *DockerCluster) ValidateDelete() error {
 	return nil
 }
 
-func defaultDockerClusterSpec(_ *DockerClusterSpec) {}
+func defaultDockerClusterSpec(s *DockerClusterSpec) {}
 
-func validateDockerClusterSpec(_ DockerClusterSpec) field.ErrorList {
+func validateDockerClusterSpec(s DockerClusterSpec) field.ErrorList {
 	return nil
 }
diff --git a/test/infrastructure/docker/api/v1beta1/dockermachinetemplate_webhook.go b/test/infrastructure/docker/api/v1beta1/dockermachinetemplate_webhook.go
index adbbb231c..7a32da49f 100644
--- a/test/infrastructure/docker/api/v1beta1/dockermachinetemplate_webhook.go
+++ b/test/infrastructure/docker/api/v1beta1/dockermachinetemplate_webhook.go
@@ -49,7 +49,7 @@ type DockerMachineTemplateWebhook struct{}
 var _ webhook.CustomValidator = &DockerMachineTemplateWebhook{}
 
 // ValidateCreate implements webhook.Validator so a webhook will be registered for the type.
-func (*DockerMachineTemplateWebhook) ValidateCreate(_ context.Context, _ runtime.Object) error {
+func (*DockerMachineTemplateWebhook) ValidateCreate(ctx context.Context, _ runtime.Object) error {
 	return nil
 }
 
@@ -81,6 +81,6 @@ func (*DockerMachineTemplateWebhook) ValidateUpdate(ctx context.Context, oldRaw
 }
 
 // ValidateDelete implements webhook.Validator so a webhook will be registered for the type.
-func (*DockerMachineTemplateWebhook) ValidateDelete(_ context.Context, _ runtime.Object) error {
+func (*DockerMachineTemplateWebhook) ValidateDelete(ctx context.Context, _ runtime.Object) error {
 	return nil
 }
diff --git a/test/infrastructure/docker/internal/docker/kind_manager.go b/test/infrastructure/docker/internal/docker/kind_manager.go
index 9d3cd01a1..1b86711d8 100644
--- a/test/infrastructure/docker/internal/docker/kind_manager.go
+++ b/test/infrastructure/docker/internal/docker/kind_manager.go
@@ -106,7 +106,7 @@ func (m *Manager) CreateWorkerNode(ctx context.Context, name, image, clusterName
 }
 
 // CreateExternalLoadBalancerNode will create a new container to act as the load balancer for external access.
-func (m *Manager) CreateExternalLoadBalancerNode(ctx context.Context, name, image, clusterName, listenAddress string, port int32, _ clusterv1.ClusterIPFamily) (*types.Node, error) {
+func (m *Manager) CreateExternalLoadBalancerNode(ctx context.Context, name, image, clusterName, listenAddress string, port int32, ipFamily clusterv1.ClusterIPFamily) (*types.Node, error) {
 	// gets a random host port for control-plane load balancer
 	// gets a random host port for the API server
 	if port == 0 {
diff --git a/test/infrastructure/docker/internal/docker/machine.go b/test/infrastructure/docker/internal/docker/machine.go
index 077da6751..3654ef6f9 100644
--- a/test/infrastructure/docker/internal/docker/machine.go
+++ b/test/infrastructure/docker/internal/docker/machine.go
@@ -297,19 +297,19 @@ func (m *Machine) PreloadLoadImages(ctx context.Context, images []string) error
 
 		err = containerRuntime.SaveContainerImage(ctx, image, imageTarPath)
 		if err != nil {
-			return errors.Wrapf(err, "failed to save image %q to %q", image, imageTarPath)
+			return errors.Wrap(err, "failed to save image")
 		}
 
 		f, err := os.Open(imageTarPath)
 		if err != nil {
-			return errors.Wrapf(err, "failed to open image %q from %q", image, imageTarPath)
+			return errors.Wrap(err, "failed to open image")
 		}
 		defer f.Close() //nolint:gocritic // No resource leak.
 
 		ps := m.container.Commander.Command("ctr", "--namespace=k8s.io", "images", "import", "-")
 		ps.SetStdin(f)
 		if err := ps.Run(ctx); err != nil {
-			return errors.Wrapf(err, "failed to load image %q", image)
+			return errors.Wrap(err, "failed to load image")
 		}
 	}
 	return nil
diff --git a/util/container/image_test.go b/util/container/image_test.go
index ddb6a9a6e..b0cd6ec00 100644
--- a/util/container/image_test.go
+++ b/util/container/image_test.go
@@ -36,8 +36,8 @@ func TestParseImageName(t *testing.T) {
 	}{
 		{
 			name:      "input with path and tag",
-			input:     "registry.k8s.io/dev/coredns:1.6.2",
-			repo:      "registry.k8s.io/dev",
+			input:     "k8s.gcr.io/dev/coredns:1.6.2",
+			repo:      "k8s.gcr.io/dev",
 			imageName: "coredns",
 			tag:       "1.6.2",
 			wantError: false,