Repository: metal3-io/baremetal-operator
Pull request #1948 (2024-09-12 00:18:11)

:bug: Fix update check in PreprovisioningImage controller

metal3-io-bot: [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 ask for approval from [zaneb](https://github.com/zaneb). 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=metal3-io%2Fbaremetal-operator).

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

- **[OWNERS](https://github.com/metal3-io/baremetal-operator/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":["zaneb"]} -->

Patch:
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 4ef6b191..8c33d1a1 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -43,13 +43,13 @@ updates:
   labels:
   - "ok-to-test"
 ## Main branch config ends here
-## release-0.8 branch config starts here
+## release-0.6  branch config starts here
 - package-ecosystem: "github-actions"
   directory: "/" # Location of package manifests
   schedule:
     interval: "monthly"
     day: "saturday"
-  target-branch: release-0.8
+  target-branch: release-0.6
   ignore:
   # Ignore major and minor bumps for release branch
   - dependency-name: "*"
@@ -69,7 +69,7 @@ updates:
   schedule:
     interval: "weekly"
     day: "sunday"
-  target-branch: release-0.8
+  target-branch: release-0.6
   groups:
     kubernetes:
       patterns: ["k8s.io/*"]
@@ -83,14 +83,14 @@ updates:
     prefix: ":seedling:"
   labels:
   - "ok-to-test"
-## release-0.8 branch config ends here
-## release-0.6 branch config starts here
+## release-0.6 branch config ends here
+## release-0.5  branch config starts here
 - package-ecosystem: "github-actions"
   directory: "/" # Location of package manifests
   schedule:
     interval: "monthly"
     day: "saturday"
-  target-branch: release-0.6
+  target-branch: release-0.5
   ignore:
   # Ignore major and minor bumps for release branch
   - dependency-name: "*"
@@ -110,7 +110,7 @@ updates:
   schedule:
     interval: "weekly"
     day: "sunday"
-  target-branch: release-0.6
+  target-branch: release-0.5
   groups:
     kubernetes:
       patterns: ["k8s.io/*"]
@@ -124,4 +124,4 @@ updates:
     prefix: ":seedling:"
   labels:
   - "ok-to-test"
-## release-0.6 branch config ends here
+## release-0.5 branch config ends here
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index dd1e7be8..a22f7a3f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -84,35 +84,10 @@ Types and functions not in public APIs are not considered part of the guarantee.
 
 #### Backporting
 
-We generally do not accept PRs directly against release branches, while we might
-accept backports of fixes/changes already merged into the main branch.
-
-We generally allow backports of the following kinds of changes to all maintained
-branches:
-
-- Critical bug fixes, security issue fixes, or fixes for bugs without easy
-workarounds.
-- Dependency bumps for CVE (usually limited to CVE resolution; backports of
-non-CVE related version bumps are considered exceptions to be evaluated case by
-case)
-- Changes required to support new Kubernetes patch versions, when possible.
-- Changes to use the latest Go patch version to build controller images.
-- Changes to bump the Go minor version used to build controller images, if the
-Go minor version of a supported branch goes out of support (e.g. to pick up
-bug and CVE fixes). This has no impact on users importing Baremetal Operator
-as we won't modify the version in go.mod and the version in the Makefile
-does not affect them.
-- Improvements to existing docs
-- Improvements to the test framework
-
-Like any other activity in the project, backporting a fix/change is a
-community-driven effort and requires that someone volunteers to own the task.
-In most cases, the cherry-pick bot can (and should) be used to automate
-opening a cherry-pick PR.
-
-We generally do not accept backports to BMO release branches that are EOL (End
-of life). Check the [Version support](https://github.com/metal3-io/metal3-docs/blob/main/docs/user-guide/src/version_support.md#baremetal-operator)
-guide for reference.
+We only accept backports of critical bugs, security issues, or bugs without
+easy workarounds, any
+backport MUST not be breaking for either API or behavioral changes.
+We generally do not accept PRs against older release branches.
 
 ## Branches
 
diff --git a/Dockerfile b/Dockerfile
index 106a99a1..79d2ac8f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 # Support FROM override
-ARG BUILD_IMAGE=docker.io/golang:1.22.6@sha256:d5e49f92b9566b0ddfc59a0d9d85cd8a848e88c8dc40d97e29f306f07c3f8338
+ARG BUILD_IMAGE=docker.io/golang:1.22.5@sha256:f47a7952d08277f9816459d851319c9041637022f04517388d9f32e384fc2dab
 ARG BASE_IMAGE=gcr.io/distroless/static:nonroot@sha256:9ecc53c269509f63c69a266168e4a687c7eb8c0cfd753bd8bfcaa4f58a90876f
 
 # Build the manager binary
diff --git a/Makefile b/Makefile
index d22dd8ed..47ffb9a5 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ RUN_NAMESPACE = metal3
 GO_TEST_FLAGS = $(TEST_FLAGS)
 DEBUG = --debug
 COVER_PROFILE = cover.out
-GO_VERSION ?= 1.22.6
+GO_VERSION ?= 1.22.5
 
 ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
 
diff --git a/README.md b/README.md
index d5df1f67..74b3a639 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,7 @@ development. Here are the tests which run on different branches in BMO:
 **E2E tests:**
 
 - **/test metal3-bmo-e2e-test-pull** runs required BMO e2e tests on your PR.
+  Works for main and release-0.5 branches.
 - **/test metal3-bmo-e2e-test-optional-pull** runs optional BMO e2e tests on
   your PR. These are under active development currently.
 
@@ -55,15 +56,6 @@ For more details on the e2e tests, see [test/e2e/README.md](test/e2e/README.md).
 - **/test metal3-ubuntu-e2e-integration-test-main** runs ansible integration
   tests with CAPM3 main branch and BMO **main** branch on Ubuntu
 
-**Release-0.8 branch:**
-
-- **/test metal3-centos-e2e-integration-test-release-1-8** runs CAPM3 e2e
-  integration tests with CAPM3 release-1.8 branch and BMO **release-0.8**
-  branch on Centos
-- **/test metal3-ubuntu-e2e-integration-test-release-1-8** runs ansible
-  integration tests with CAPM3 release-1.8 branch and BMO **release-0.8**
-  branch on Ubuntu
-
 **Release-0.6 branch:**
 
 - **/test metal3-centos-e2e-integration-test-release-1-7** runs CAPM3 e2e
@@ -82,6 +74,15 @@ For more details on the e2e tests, see [test/e2e/README.md](test/e2e/README.md).
   integration tests with CAPM3 release-1.6 branch and BMO **release-0.5**
   branch on Ubuntu
 
+**Release-0.4 branch:**
+
+- **/test metal3-centos-e2e-integration-test-release-1-5** runs CAPM3 e2e
+  integration tests with CAPM3 release-1.5 branch and BMO **release-0.4**
+  branch on Centos
+- **/test metal3-ubuntu-e2e-integration-test-release-1-5** runs ansible
+  integration tests with CAPM3 release-1.5 branch and BMO **release-0.4**
+  branch on Ubuntu
+
 ### Important Notes
 
 Whenever there is a change in `config/` directory, please remember to run the
diff --git a/apis/go.mod b/apis/go.mod
index bc2d2351..37a097e6 100644
--- a/apis/go.mod
+++ b/apis/go.mod
@@ -6,9 +6,9 @@ require (
 	github.com/google/uuid v1.6.0
 	github.com/metal3-io/baremetal-operator/pkg/hardwareutils v0.5.1
 	github.com/stretchr/testify v1.9.0
-	k8s.io/api v0.29.8
-	k8s.io/apimachinery v0.29.8
-	sigs.k8s.io/controller-runtime v0.17.6
+	k8s.io/api v0.29.7
+	k8s.io/apimachinery v0.29.7
+	sigs.k8s.io/controller-runtime v0.16.6
 )
 
 require (
@@ -48,10 +48,10 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/client-go v0.29.8 // indirect
+	k8s.io/client-go v0.29.7 // indirect
 	k8s.io/klog/v2 v2.110.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
-	k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect
+	k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
 	sigs.k8s.io/yaml v1.4.0 // indirect
diff --git a/apis/go.sum b/apis/go.sum
index 068220f0..3845aae4 100644
--- a/apis/go.sum
+++ b/apis/go.sum
@@ -8,13 +8,13 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
 github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
-github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
-github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=
+github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
-github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
+github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo=
+github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA=
 github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
 github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
@@ -66,10 +66,10 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY=
-github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw=
-github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
-github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
+github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
+github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
+github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg=
+github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -99,8 +99,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
 go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
-go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
+go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
+go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -159,20 +159,20 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.29.8 h1:ZBKg9clWnIGtQ5yGhNwMw2zyyrsIAQaXhZACcYNflQE=
-k8s.io/api v0.29.8/go.mod h1:XlGIpmpzKGrtVca7GlgNryZJ19SvQdI808NN7fy1SgQ=
-k8s.io/apimachinery v0.29.8 h1:uBHc9WuKiTHClIspJqtR84WNpG0aOGn45HWqxgXkk8Y=
-k8s.io/apimachinery v0.29.8/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
-k8s.io/client-go v0.29.8 h1:QMRKcIzqE/qawknXcsi51GdIAYN8UP39S/M5KnFu/J0=
-k8s.io/client-go v0.29.8/go.mod h1:ZzrAAVrqO2jVXMb8My/jTke8n0a/mIynnA3y/1y1UB0=
+k8s.io/api v0.29.7 h1:Q2/thp7YYESgy0MGzxT9RvA/6doLJHBXSFH8GGLxSbc=
+k8s.io/api v0.29.7/go.mod h1:mPimdbyuIjwoLtBEVIGVUYb4BKOE+44XHt/n4IqKsLA=
+k8s.io/apimachinery v0.29.7 h1:ICXzya58Q7hyEEfnTrbmdfX1n1schSepX2KUfC2/ykc=
+k8s.io/apimachinery v0.29.7/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
+k8s.io/client-go v0.29.7 h1:vTtiFrGBKlcBhxaeZC4eDrqui1e108nsTyue/KU63IY=
+k8s.io/client-go v0.29.7/go.mod h1:69BvVqdRozgR/9TP45u/oO0tfrdbP+I8RqrcCJQshzg=
 k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
 k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/controller-runtime v0.17.6 h1:12IXsozEsIXWAMRpgRlYS1jjAHQXHtWEOMdULh3DbEw=
-sigs.k8s.io/controller-runtime v0.17.6/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY=
+k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
+k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/controller-runtime v0.16.6 h1:FiXwTuFF5ZJKmozfP2Z0j7dh6kmxP4Ou1KLfxgKKC3I=
+sigs.k8s.io/controller-runtime v0.16.6/go.mod h1:+dQzkZxnylD0u49e0a+7AR+vlibEBaThmPca7lTyUsI=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
diff --git a/apis/metal3.io/v1alpha1/baremetalhost_types.go b/apis/metal3.io/v1alpha1/baremetalhost_types.go
index 3eb5e83e..512b75c0 100644
--- a/apis/metal3.io/v1alpha1/baremetalhost_types.go
+++ b/apis/metal3.io/v1alpha1/baremetalhost_types.go
@@ -245,8 +245,8 @@ const (
 // the bare metal controller module on host.
 type BMCDetails struct {
 
-	// Address holds the URL for accessing the controller on the network.
-	// The scheme part designates the driver to use with the host.
+	// Address holds the URL for accessing the controller on the
+	// network.
 	Address string `json:"address"`
 
 	// The name of the secret containing the BMC credentials (requires
@@ -263,49 +263,43 @@ type BMCDetails struct {
 
 // HardwareRAIDVolume defines the desired configuration of volume in hardware RAID.
 type HardwareRAIDVolume struct {
-	// Size of the logical disk to be created in GiB. If unspecified or
-	// set be 0, the maximum capacity of disk will be used for logical
-	// disk.
+	// Size (Integer) of the logical disk to be created in GiB.
+	// If unspecified or set be 0, the maximum capacity of disk will be used for logical disk.
 	// +kubebuilder:validation:Minimum=0
 	SizeGibibytes *int `json:"sizeGibibytes,omitempty"`
 
-	// RAID level for the logical disk. The following levels are supported:
-	// 0, 1, 2, 5, 6, 1+0, 5+0, 6+0 (drivers may support only some of them).
+	// RAID level for the logical disk. The following levels are supported: 0;1;2;5;6;1+0;5+0;6+0.
 	// +kubebuilder:validation:Enum="0";"1";"2";"5";"6";"1+0";"5+0";"6+0"
 	Level string `json:"level" required:"true"`
 
-	// Name of the volume. Should be unique within the Node. If not
-	// specified, the name will be auto-generated.
+	// Name of the volume. Should be unique within the Node. If not specified, volume name will be auto-generated.
 	// +kubebuilder:validation:MaxLength=64
 	Name string `json:"name,omitempty"`
 
-	// Select disks with only rotational (if set to true) or solid-state
-	// (if set to false) storage. By default, any disks can be picked.
+	// Select disks with only rotational or solid-state storage
 	Rotational *bool `json:"rotational,omitempty"`
 
-	// Integer, number of physical disks to use for the logical disk.
-	// Defaults to minimum number of disks required for the particular RAID
-	// level.
+	// Integer, number of physical disks to use for the logical disk. Defaults to minimum number of disks required
+	// for the particular RAID level.
 	// +kubebuilder:validation:Minimum=1
 	NumberOfPhysicalDisks *int `json:"numberOfPhysicalDisks,omitempty"`
 
-	// The name of the RAID controller to use.
+	// The name of the RAID controller to use
 	Controller string `json:"controller,omitempty"`
 
-	// Optional list of physical disk names to be used for the hardware RAID volumes. The disk names are interpreted
-	// by the hardware RAID controller, and the format is hardware specific.
+	// Optional list of physical disk names to be used for the Hardware RAID volumes. The disk names are interpreted
+	// by the Hardware RAID controller, and the format is hardware specific.
 	PhysicalDisks []string `json:"physicalDisks,omitempty"`
 }
 
 // SoftwareRAIDVolume defines the desired configuration of volume in software RAID.
 type SoftwareRAIDVolume struct {
-	// Size of the logical disk to be created in GiB.
+	// Size (Integer) of the logical disk to be created in GiB.
 	// If unspecified or set be 0, the maximum capacity of disk will be used for logical disk.
 	// +kubebuilder:validation:Minimum=0
 	SizeGibibytes *int `json:"sizeGibibytes,omitempty"`
 
-	// RAID level for the logical disk. The following levels are supported:
-	// 0, 1 and 1+0.
+	// RAID level for the logical disk. The following levels are supported: 0;1;1+0.
 	// +kubebuilder:validation:Enum="0";"1";"1+0"
 	Level string `json:"level" required:"true"`
 
@@ -339,14 +333,17 @@ type RAIDConfig struct {
 // FirmwareConfig contains the configuration that you want to configure BIOS settings in Bare metal server.
 type FirmwareConfig struct {
 	// Supports the virtualization of platform hardware.
+	// This supports following options: true, false.
 	// +kubebuilder:validation:Enum=true;false
 	VirtualizationEnabled *bool `json:"virtualizationEnabled,omitempty"`
 
 	// Allows a single physical processor core to appear as several logical processors.
+	// This supports following options: true, false.
 	// +kubebuilder:validation:Enum=true;false
 	SimultaneousMultithreadingEnabled *bool `json:"simultaneousMultithreadingEnabled,omitempty"`
 
 	// SR-IOV support enables a hypervisor to create virtual instances of a PCI-express device, potentially increasing performance.
+	// This supports following options: true, false.
 	// +kubebuilder:validation:Enum=true;false
 	SriovEnabled *bool `json:"sriovEnabled,omitempty"`
 }
@@ -362,22 +359,13 @@ type BareMetalHostSpec struct {
 	// +optional
 	Taints []corev1.Taint `json:"taints,omitempty"`
 
-	// How do we connect to the BMC (Baseboard Management Controller) on
-	// the host?
+	// How do we connect to the BMC?
 	BMC BMCDetails `json:"bmc,omitempty"`
 
-	// RAID configuration for bare metal server. If set, the RAID settings
-	// will be applied before the host is provisioned. If not, the current
-	// settings will not be modified. Only one of the sub-fields
-	// hardwareRAIDVolumes and softwareRAIDVolumes can be set at the same
-	// time.
+	// RAID configuration for bare metal server
 	RAID *RAIDConfig `json:"raid,omitempty"`
 
-	// Firmware (BIOS) configuration for bare metal server. If set, the
-	// requested settings will be applied before the host is provisioned.
-	// Only some vendor drivers support this field. An alternative is to
-	// use HostFirmwareSettings resources that allow changing arbitrary
-	// values and support the generic Redfish-based drivers.
+	// BIOS configuration for bare metal server
 	Firmware *FirmwareConfig `json:"firmware,omitempty"`
 
 	// What is the name of the hardware profile for this host?
@@ -388,86 +376,70 @@ type BareMetalHostSpec struct {
 	HardwareProfile string `json:"hardwareProfile,omitempty"`
 
 	// Provide guidance about how to choose the device for the image
-	// being provisioned. The default is currently to use /dev/sda as
-	// the root device.
+	// being provisioned.
 	RootDeviceHints *RootDeviceHints `json:"rootDeviceHints,omitempty"`
 
-	// Select the method of initializing the hardware during boot.
-	// Defaults to UEFI. Legacy boot should only be used for hardware that
-	// does not support UEFI correctly. Set to UEFISecureBoot to turn
-	// secure boot on automatically after provisioning.
+	// Select the method of initializing the hardware during
+	// boot. Defaults to UEFI.
 	// +optional
 	BootMode BootMode `json:"bootMode,omitempty"`
 
-	// The MAC address of the NIC used for provisioning the host. In case
-	// of network boot, this is the MAC address of the PXE booting
-	// interface. The MAC address of the BMC must never be used here!
+	// Which MAC address will PXE boot? This is optional for some
+	// types, but required for libvirt VMs driven by vbmc.
 	// +kubebuilder:validation:Pattern=`[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}`
 	BootMACAddress string `json:"bootMACAddress,omitempty"`
 
-	// Should the host be powered on? Changing this value will trigger
-	// a change in power state of the host.
+	// Should the server be online?
 	Online bool `json:"online"`
 
 	// ConsumerRef can be used to store information about something
 	// that is using a host. When it is not empty, the host is
-	// considered "in use". The common use case is a link to a Machine
-	// resource when the host is used by Cluster API.
+	// considered "in use".
 	ConsumerRef *corev1.ObjectReference `json:"consumerRef,omitempty"`
 
-	// Image holds the details of the image to be provisioned. Populating
-	// the image will cause the host to start provisioning.
+	// Image holds the details of the image to be provisioned.
 	Image *Image `json:"image,omitempty"`
 
-	// UserData holds the reference to the Secret containing the user data
-	// which is passed to the Config Drive and interpreted by the
-	// first-boot software such as cloud-init. The format of user data is
-	// specific to the first-boot software.
+	// UserData holds the reference to the Secret containing the user
+	// data to be passed to the host before it boots.
 	UserData *corev1.SecretReference `json:"userData,omitempty"`
 
 	// PreprovisioningNetworkDataName is the name of the Secret in the
-	// local namespace containing network configuration which is passed to
-	// the preprovisioning image, and to the Config Drive if not overridden
-	// by specifying NetworkData.
+	// local namespace containing network configuration (e.g content of
+	// network_data.json) which is passed to the preprovisioning image, and to
+	// the Config Drive if not overridden by specifying NetworkData.
 	PreprovisioningNetworkDataName string `json:"preprovisioningNetworkDataName,omitempty"`
 
 	// NetworkData holds the reference to the Secret containing network
-	// configuration which is passed to the Config Drive and interpreted
-	// by the first boot software such as cloud-init.
+	// configuration (e.g content of network_data.json) which is passed
+	// to the Config Drive.
 	NetworkData *corev1.SecretReference `json:"networkData,omitempty"`
 
 	// MetaData holds the reference to the Secret containing host metadata
-	// which is passed to the Config Drive. By default, the operater will
-	// generate metadata for the host, so most users do not need to set
-	// this field.
+	// (e.g. meta_data.json) which is passed to the Config Drive.
 	MetaData *corev1.SecretReference `json:"metaData,omitempty"`
 
-	// Description is a human-entered text used to help identify the host.
+	// Description is a human-entered text used to help identify the host
 	Description string `json:"description,omitempty"`
 
-	// ExternallyProvisioned means something else has provisioned the
-	// image running on the host, and the operator should only manage
-	// the power status. This field is used for integration with already
-	// provisioned hosts and when pivoting hosts between clusters. If
-	// unsure, leave this field as false.
+	// ExternallyProvisioned means something else is managing the
+	// image running on the host and the operator should only manage
+	// the power status and hardware inventory inspection. If the
+	// Image field is filled in, this field is ignored.
 	ExternallyProvisioned bool `json:"externallyProvisioned,omitempty"`
 
-	// When set to disabled, automated cleaning will be skipped
+	// When set to disabled, automated cleaning will be avoided
 	// during provisioning and deprovisioning.
 	// +optional
 	// +kubebuilder:default:=metadata
 	// +kubebuilder:validation:Optional
 	AutomatedCleaningMode AutomatedCleaningMode `json:"automatedCleaningMode,omitempty"`
 
-	// A custom deploy procedure. This is an advanced feature that allows
-	// using a custom deploy step provided by a site-specific deployment
-	// ramdisk. Most users will want to use "image" instead. Settings this
-	// field triggers provisioning.
+	// A custom deploy procedure.
 	// +optional
 	CustomDeploy *CustomDeploy `json:"customDeploy,omitempty"`
 
-	// CPU architecture of the host, e.g. "x86_64" or "aarch64". If unset,
-	// eventually populated by inspection.
+	// CPU architecture of the host, e.g. "x86_64" or "aarch64". If unset, eventually populated by inspection.
 	// +optional
 	Architecture string `json:"architecture,omitempty"`
 }
@@ -506,8 +478,7 @@ type Image struct {
 	// URL is a location of an image to deploy.
 	URL string `json:"url"`
 
-	// Checksum is the checksum for the image. Required for all formats
-	// except for "live-iso".
+	// Checksum is the checksum for the image.
 	Checksum string `json:"checksum,omitempty"`
 
 	// ChecksumType is the checksum algorithm for the image, e.g md5, sha256 or sha512.
@@ -515,9 +486,11 @@ type Image struct {
 	// If missing, MD5 is used. If in doubt, use "auto".
 	ChecksumType ChecksumType `json:"checksumType,omitempty"`
 
-	// Format contains the format of the image (raw, qcow2, ...).
-	// When set to "live-iso", an ISO 9660 image referenced by the url will
-	// be live-booted and not deployed to disk.
+	// DiskFormat contains the format of the image (raw, qcow2, ...).
+	// Needs to be set to raw for raw images streaming.
+	// Note live-iso means an iso referenced by the url will be live-booted
+	// and not deployed to disk, and in this case the checksum options
+	// are not required and if specified will be ignored.
 	// +kubebuilder:validation:Enum=raw;qcow2;vdi;vmdk;live-iso
 	DiskFormat *string `json:"format,omitempty"`
 }
@@ -694,19 +667,13 @@ type BIOS struct {
 // HardwareDetails collects all of the information about hardware
 // discovered on the host.
 type HardwareDetails struct {
-	// System vendor information.
 	SystemVendor HardwareSystemVendor `json:"systemVendor,omitempty"`
-	// System firmware information.
-	Firmware Firmware `json:"firmware,omitempty"`
-	// The host's amount of memory in Mebibytes.
-	RAMMebibytes int `json:"ramMebibytes,omitempty"`
-	// List of network interfaces for the host.
-	NIC []NIC `json:"nics,omitempty"`
-	// List of storage (disk, SSD, etc.) available to the host.
-	Storage []Storage `json:"storage,omitempty"`
-	// Details of the CPU(s) in the system.
-	CPU      CPU    `json:"cpu,omitempty"`
-	Hostname string `json:"hostname,omitempty"`
+	Firmware     Firmware             `json:"firmware,omitempty"`
+	RAMMebibytes int                  `json:"ramMebibytes,omitempty"`
+	NIC          []NIC                `json:"nics,omitempty"`
+	Storage      []Storage            `json:"storage,omitempty"`
+	CPU          CPU                  `json:"cpu,omitempty"`
+	Hostname     string               `json:"hostname,omitempty"`
 }
 
 // HardwareSystemVendor stores details about the whole hardware system.
@@ -817,25 +784,21 @@ type BareMetalHostStatus struct {
 	HardwareProfile string `json:"hardwareProfile,omitempty"`
 
 	// The hardware discovered to exist on the host.
-	// This field will be removed in the next API version in favour of the
-	// separate HardwareData resource.
 	HardwareDetails *HardwareDetails `json:"hardware,omitempty"`
 
 	// Information tracked by the provisioner.
 	Provisioning ProvisionStatus `json:"provisioning"`
 
-	// The last credentials we were able to validate as working.
+	// the last credentials we were able to validate as working
 	GoodCredentials CredentialsStatus `json:"goodCredentials,omitempty"`
 
-	// The last credentials we sent to the provisioning backend.
+	// the last credentials we sent to the provisioning backend
 	TriedCredentials CredentialsStatus `json:"triedCredentials,omitempty"`
 
-	// The last error message reported by the provisioning subsystem.
+	// the last error message reported by the provisioning subsystem
 	ErrorMessage string `json:"errorMessage"`
 
-	// Whether or not the host is currently powered on. This field may get
-	// briefly out of sync with the actual state of the hardware while
-	// provisioning processes are running.
+	// indicator for whether or not the host is powered on
 	PoweredOn bool `json:"poweredOn"`
 
 	// OperationHistory holds information about operations performed
@@ -849,27 +812,26 @@ type BareMetalHostStatus struct {
 
 // ProvisionStatus holds the state information for a single target.
 type ProvisionStatus struct {
-	// An indicator for what the provisioner is doing with the host.
+	// An indiciator for what the provisioner is doing with the host.
 	State ProvisioningState `json:"state"`
 
-	// The hosts's ID from the underlying provisioning tool (e.g. the
-	// Ironic node UUID).
+	// The machine's UUID from the underlying provisioning tool
 	ID string `json:"ID"`
 
 	// Image holds the details of the last image successfully
 	// provisioned to the host.
 	Image Image `json:"image,omitempty"`
 
-	// The root device hints set by the user.
+	// The RootDevicehints set by the user
 	RootDeviceHints *RootDeviceHints `json:"rootDeviceHints,omitempty"`
 
 	// BootMode indicates the boot mode used to provision the node
 	BootMode BootMode `json:"bootMode,omitempty"`
 
-	// The RAID configuration that has been applied.
+	// The Raid set by the user
 	RAID *RAIDConfig `json:"raid,omitempty"`
 
-	// The firmware settings that have been applied.
+	// The Bios set by the user
 	Firmware *FirmwareConfig `json:"firmware,omitempty"`
 
 	// Custom deploy procedure applied to the host.
diff --git a/config/base/crds/bases/metal3.io_baremetalhosts.yaml b/config/base/crds/bases/metal3.io_baremetalhosts.yaml
index 61f0f158..0913f0e2 100644
--- a/config/base/crds/bases/metal3.io_baremetalhosts.yaml
+++ b/config/base/crds/bases/metal3.io_baremetalhosts.yaml
@@ -74,20 +74,18 @@ spec:
                 type: string
               automatedCleaningMode:
                 default: metadata
-                description: When set to disabled, automated cleaning will be skipped
+                description: When set to disabled, automated cleaning will be avoided
                   during provisioning and deprovisioning.
                 enum:
                 - metadata
                 - disabled
                 type: string
               bmc:
-                description: How do we connect to the BMC (Baseboard Management Controller)
-                  on the host?
+                description: How do we connect to the BMC?
                 properties:
                   address:
                     description: Address holds the URL for accessing the controller
-                      on the network. The scheme part designates the driver to use
-                      with the host.
+                      on the network.
                     type: string
                   credentialsName:
                     description: The name of the secret containing the BMC credentials
@@ -105,17 +103,13 @@ spec:
                 - credentialsName
                 type: object
               bootMACAddress:
-                description: The MAC address of the NIC used for provisioning the
-                  host. In case of network boot, this is the MAC address of the PXE
-                  booting interface. The MAC address of the BMC must never be used
-                  here!
+                description: Which MAC address will PXE boot? This is optional for
+                  some types, but required for libvirt VMs driven by vbmc.
                 pattern: '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'
                 type: string
               bootMode:
                 description: Select the method of initializing the hardware during
-                  boot. Defaults to UEFI. Legacy boot should only be used for hardware
-                  that does not support UEFI correctly. Set to UEFISecureBoot to turn
-                  secure boot on automatically after provisioning.
+                  boot. Defaults to UEFI.
                 enum:
                 - UEFI
                 - UEFISecureBoot
@@ -124,8 +118,7 @@ spec:
               consumerRef:
                 description: ConsumerRef can be used to store information about something
                   that is using a host. When it is not empty, the host is considered
-                  "in use". The common use case is a link to a Machine resource when
-                  the host is used by Cluster API.
+                  "in use".
                 properties:
                   apiVersion:
                     description: API version of the referent.
@@ -162,10 +155,7 @@ spec:
                 type: object
                 x-kubernetes-map-type: atomic
               customDeploy:
-                description: A custom deploy procedure. This is an advanced feature
-                  that allows using a custom deploy step provided by a site-specific
-                  deployment ramdisk. Most users will want to use "image" instead.
-                  Settings this field triggers provisioning.
+                description: A custom deploy procedure.
                 properties:
                   method:
                     description: Custom deploy method name. This name is specific
@@ -177,38 +167,36 @@ spec:
                 type: object
               description:
                 description: Description is a human-entered text used to help identify
-                  the host.
+                  the host
                 type: string
               externallyProvisioned:
-                description: ExternallyProvisioned means something else has provisioned
-                  the image running on the host, and the operator should only manage
-                  the power status. This field is used for integration with already
-                  provisioned hosts and when pivoting hosts between clusters. If unsure,
-                  leave this field as false.
+                description: ExternallyProvisioned means something else is managing
+                  the image running on the host and the operator should only manage
+                  the power status and hardware inventory inspection. If the Image
+                  field is filled in, this field is ignored.
                 type: boolean
               firmware:
-                description: Firmware (BIOS) configuration for bare metal server.
-                  If set, the requested settings will be applied before the host is
-                  provisioned. Only some vendor drivers support this field. An alternative
-                  is to use HostFirmwareSettings resources that allow changing arbitrary
-                  values and support the generic Redfish-based drivers.
+                description: BIOS configuration for bare metal server
                 properties:
                   simultaneousMultithreadingEnabled:
-                    description: Allows a single physical processor core to appear
-                      as several logical processors.
+                    description: 'Allows a single physical processor core to appear
+                      as several logical processors. This supports following options:
+                      true, false.'
                     enum:
                     - true
                     - false
                     type: boolean
                   sriovEnabled:
-                    description: SR-IOV support enables a hypervisor to create virtual
+                    description: 'SR-IOV support enables a hypervisor to create virtual
                       instances of a PCI-express device, potentially increasing performance.
+                      This supports following options: true, false.'
                     enum:
                     - true
                     - false
                     type: boolean
                   virtualizationEnabled:
-                    description: Supports the virtualization of platform hardware.
+                    description: 'Supports the virtualization of platform hardware.
+                      This supports following options: true, false.'
                     enum:
                     - true
                     - false
@@ -223,11 +211,9 @@ spec:
                 type: string
               image:
                 description: Image holds the details of the image to be provisioned.
-                  Populating the image will cause the host to start provisioning.
                 properties:
                   checksum:
-                    description: Checksum is the checksum for the image. Required
-                      for all formats except for "live-iso".
+                    description: Checksum is the checksum for the image.
                     type: string
                   checksumType:
                     description: ChecksumType is the checksum algorithm for the image,
@@ -241,9 +227,11 @@ spec:
                     - auto
                     type: string
                   format:
-                    description: Format contains the format of the image (raw, qcow2,
-                      ...). When set to "live-iso", an ISO 9660 image referenced by
-                      the url will be live-booted and not deployed to disk.
+                    description: DiskFormat contains the format of the image (raw,
+                      qcow2, ...). Needs to be set to raw for raw images streaming.
+                      Note live-iso means an iso referenced by the url will be live-booted
+                      and not deployed to disk, and in this case the checksum options
+                      are not required and if specified will be ignored.
                     enum:
                     - raw
                     - qcow2
@@ -259,9 +247,8 @@ spec:
                 type: object
               metaData:
                 description: MetaData holds the reference to the Secret containing
-                  host metadata which is passed to the Config Drive. By default, the
-                  operater will generate metadata for the host, so most users do not
-                  need to set this field.
+                  host metadata (e.g. meta_data.json) which is passed to the Config
+                  Drive.
                 properties:
                   name:
                     description: name is unique within a namespace to reference a
@@ -275,8 +262,8 @@ spec:
                 x-kubernetes-map-type: atomic
               networkData:
                 description: NetworkData holds the reference to the Secret containing
-                  network configuration which is passed to the Config Drive and interpreted
-                  by the first boot software such as cloud-init.
+                  network configuration (e.g content of network_data.json) which is
+                  passed to the Config Drive.
                 properties:
                   name:
                     description: name is unique within a namespace to reference a
@@ -289,21 +276,16 @@ spec:
                 type: object
                 x-kubernetes-map-type: atomic
               online:
-                description: Should the host be powered on? Changing this value will
-                  trigger a change in power state of the host.
+                description: Should the server be online?
                 type: boolean
               preprovisioningNetworkDataName:
                 description: PreprovisioningNetworkDataName is the name of the Secret
-                  in the local namespace containing network configuration which is
-                  passed to the preprovisioning image, and to the Config Drive if
-                  not overridden by specifying NetworkData.
+                  in the local namespace containing network configuration (e.g content
+                  of network_data.json) which is passed to the preprovisioning image,
+                  and to the Config Drive if not overridden by specifying NetworkData.
                 type: string
               raid:
-                description: RAID configuration for bare metal server. If set, the
-                  RAID settings will be applied before the host is provisioned. If
-                  not, the current settings will not be modified. Only one of the
-                  sub-fields hardwareRAIDVolumes and softwareRAIDVolumes can be set
-                  at the same time.
+                description: RAID configuration for bare metal server
                 properties:
                   hardwareRAIDVolumes:
                     description: The list of logical disks for hardware RAID, if rootDeviceHints
@@ -314,12 +296,11 @@ spec:
                         of volume in hardware RAID.
                       properties:
                         controller:
-                          description: The name of the RAID controller to use.
+                          description: The name of the RAID controller to use
                           type: string
                         level:
                           description: 'RAID level for the logical disk. The following
-                            levels are supported: 0, 1, 2, 5, 6, 1+0, 5+0, 6+0 (drivers
-                            may support only some of them).'
+                            levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
                           enum:
                           - "0"
                           - "1"
@@ -332,7 +313,7 @@ spec:
                           type: string
                         name:
                           description: Name of the volume. Should be unique within
-                            the Node. If not specified, the name will be auto-generated.
+                            the Node. If not specified, volume name will be auto-generated.
                           maxLength: 64
                           type: string
                         numberOfPhysicalDisks:
@@ -343,21 +324,20 @@ spec:
                           type: integer
                         physicalDisks:
                           description: Optional list of physical disk names to be
-                            used for the hardware RAID volumes. The disk names are
-                            interpreted by the hardware RAID controller, and the format
+                            used for the Hardware RAID volumes. The disk names are
+                            interpreted by the Hardware RAID controller, and the format
                             is hardware specific.
                           items:
                             type: string
                           type: array
                         rotational:
-                          description: Select disks with only rotational (if set to
-                            true) or solid-state (if set to false) storage. By default,
-                            any disks can be picked.
+                          description: Select disks with only rotational or solid-state
+                            storage
                           type: boolean
                         sizeGibibytes:
-                          description: Size of the logical disk to be created in GiB.
-                            If unspecified or set be 0, the maximum capacity of disk
-                            will be used for logical disk.
+                          description: Size (Integer) of the logical disk to be created
+                            in GiB. If unspecified or set be 0, the maximum capacity
+                            of disk will be used for logical disk.
                           minimum: 0
                           type: integer
                       required:
@@ -382,7 +362,7 @@ spec:
                       properties:
                         level:
                           description: 'RAID level for the logical disk. The following
-                            levels are supported: 0, 1 and 1+0.'
+                            levels are supported: 0;1;1+0.'
                           enum:
                           - "0"
                           - "1"
@@ -443,9 +423,9 @@ spec:
                           minItems: 2
                           type: array
                         sizeGibibytes:
-                          description: Size of the logical disk to be created in GiB.
-                            If unspecified or set be 0, the maximum capacity of disk
-                            will be used for logical disk.
+                          description: Size (Integer) of the logical disk to be created
+                            in GiB. If unspecified or set be 0, the maximum capacity
+                            of disk will be used for logical disk.
                           minimum: 0
                           type: integer
                       required:
@@ -457,8 +437,7 @@ spec:
                 type: object
               rootDeviceHints:
                 description: Provide guidance about how to choose the device for the
-                  image being provisioned. The default is currently to use /dev/sda
-                  as the root device.
+                  image being provisioned.
                 properties:
                   deviceName:
                     description: A Linux device name like "/dev/vda", or a by-path
@@ -533,9 +512,7 @@ spec:
                 type: array
               userData:
                 description: UserData holds the reference to the Secret containing
-                  the user data which is passed to the Config Drive and interpreted
-                  by the first-boot software such as cloud-init. The format of user
-                  data is specific to the first-boot software.
+                  the user data to be passed to the host before it boots.
                 properties:
                   name:
                     description: name is unique within a namespace to reference a
@@ -559,7 +536,7 @@ spec:
                   an error since the last successful operation
                 type: integer
               errorMessage:
-                description: The last error message reported by the provisioning subsystem.
+                description: the last error message reported by the provisioning subsystem
                 type: string
               errorType:
                 description: ErrorType indicates the type of failure encountered when
@@ -573,7 +550,7 @@ spec:
                 - power management error
                 type: string
               goodCredentials:
-                description: The last credentials we were able to validate as working.
+                description: the last credentials we were able to validate as working
                 properties:
                   credentials:
                     description: SecretReference represents a Secret Reference. It
@@ -593,12 +570,10 @@ spec:
                     type: string
                 type: object
               hardware:
-                description: The hardware discovered to exist on the host. This field
-                  will be removed in the next API version in favour of the separate
-                  HardwareData resource.
+                description: The hardware discovered to exist on the host.
                 properties:
                   cpu:
-                    description: Details of the CPU(s) in the system.
+                    description: CPU describes one processor on the host.
                     properties:
                       arch:
                         type: string
@@ -616,7 +591,7 @@ spec:
                         type: string
                     type: object
                   firmware:
-                    description: System firmware information.
+                    description: Firmware describes the firmware on the host.
                     properties:
                       bios:
                         description: The BIOS for this firmware
@@ -635,7 +610,6 @@ spec:
                   hostname:
                     type: string
                   nics:
-                    description: List of network interfaces for the host.
                     items:
                       description: NIC describes one network interface on the host.
                       properties:
@@ -686,11 +660,8 @@ spec:
                       type: object
                     type: array
                   ramMebibytes:
-                    description: The host's amount of memory in Mebibytes.
                     type: integer
                   storage:
-                    description: List of storage (disk, SSD, etc.) available to the
-                      host.
                     items:
                       description: Storage describes one storage device (disk, SSD,
                         etc.) on the host.
@@ -748,7 +719,8 @@ spec:
                       type: object
                     type: array
                   systemVendor:
-                    description: System vendor information.
+                    description: HardwareSystemVendor stores details about the whole
+                      hardware system.
                     properties:
                       manufacturer:
                         type: string
@@ -834,16 +806,14 @@ spec:
                 - detached
                 type: string
               poweredOn:
-                description: Whether or not the host is currently powered on. This
-                  field may get briefly out of sync with the actual state of the hardware
-                  while provisioning processes are running.
+                description: indicator for whether or not the host is powered on
                 type: boolean
               provisioning:
                 description: Information tracked by the provisioner.
                 properties:
                   ID:
-                    description: The hosts's ID from the underlying provisioning tool
-                      (e.g. the Ironic node UUID).
+                    description: The machine's UUID from the underlying provisioning
+                      tool
                     type: string
                   bootMode:
                     description: BootMode indicates the boot mode used to provision
@@ -865,25 +835,27 @@ spec:
                     - method
                     type: object
                   firmware:
-                    description: The firmware settings that have been applied.
+                    description: The Bios set by the user
                     properties:
                       simultaneousMultithreadingEnabled:
-                        description: Allows a single physical processor core to appear
-                          as several logical processors.
+                        description: 'Allows a single physical processor core to appear
+                          as several logical processors. This supports following options:
+                          true, false.'
                         enum:
                         - true
                         - false
                         type: boolean
                       sriovEnabled:
-                        description: SR-IOV support enables a hypervisor to create
+                        description: 'SR-IOV support enables a hypervisor to create
                           virtual instances of a PCI-express device, potentially increasing
-                          performance.
+                          performance. This supports following options: true, false.'
                         enum:
                         - true
                         - false
                         type: boolean
                       virtualizationEnabled:
-                        description: Supports the virtualization of platform hardware.
+                        description: 'Supports the virtualization of platform hardware.
+                          This supports following options: true, false.'
                         enum:
                         - true
                         - false
@@ -894,8 +866,7 @@ spec:
                       provisioned to the host.
                     properties:
                       checksum:
-                        description: Checksum is the checksum for the image. Required
-                          for all formats except for "live-iso".
+                        description: Checksum is the checksum for the image.
                         type: string
                       checksumType:
                         description: ChecksumType is the checksum algorithm for the
@@ -909,9 +880,12 @@ spec:
                         - auto
                         type: string
                       format:
-                        description: Format contains the format of the image (raw,
-                          qcow2, ...). When set to "live-iso", an ISO 9660 image referenced
-                          by the url will be live-booted and not deployed to disk.
+                        description: DiskFormat contains the format of the image (raw,
+                          qcow2, ...). Needs to be set to raw for raw images streaming.
+                          Note live-iso means an iso referenced by the url will be
+                          live-booted and not deployed to disk, and in this case the
+                          checksum options are not required and if specified will
+                          be ignored.
                         enum:
                         - raw
                         - qcow2
@@ -926,7 +900,7 @@ spec:
                     - url
                     type: object
                   raid:
-                    description: The RAID configuration that has been applied.
+                    description: The Raid set by the user
                     properties:
                       hardwareRAIDVolumes:
                         description: The list of logical disks for hardware RAID,
@@ -938,12 +912,11 @@ spec:
                             of volume in hardware RAID.
                           properties:
                             controller:
-                              description: The name of the RAID controller to use.
+                              description: The name of the RAID controller to use
                               type: string
                             level:
                               description: 'RAID level for the logical disk. The following
-                                levels are supported: 0, 1, 2, 5, 6, 1+0, 5+0, 6+0
-                                (drivers may support only some of them).'
+                                levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
                               enum:
                               - "0"
                               - "1"
@@ -956,7 +929,7 @@ spec:
                               type: string
                             name:
                               description: Name of the volume. Should be unique within
-                                the Node. If not specified, the name will be auto-generated.
+                                the Node. If not specified, volume name will be auto-generated.
                               maxLength: 64
                               type: string
                             numberOfPhysicalDisks:
@@ -967,21 +940,20 @@ spec:
                               type: integer
                             physicalDisks:
                               description: Optional list of physical disk names to
-                                be used for the hardware RAID volumes. The disk names
-                                are interpreted by the hardware RAID controller, and
+                                be used for the Hardware RAID volumes. The disk names
+                                are interpreted by the Hardware RAID controller, and
                                 the format is hardware specific.
                               items:
                                 type: string
                               type: array
                             rotational:
-                              description: Select disks with only rotational (if set
-                                to true) or solid-state (if set to false) storage.
-                                By default, any disks can be picked.
+                              description: Select disks with only rotational or solid-state
+                                storage
                               type: boolean
                             sizeGibibytes:
-                              description: Size of the logical disk to be created
-                                in GiB. If unspecified or set be 0, the maximum capacity
-                                of disk will be used for logical disk.
+                              description: Size (Integer) of the logical disk to be
+                                created in GiB. If unspecified or set be 0, the maximum
+                                capacity of disk will be used for logical disk.
                               minimum: 0
                               type: integer
                           required:
@@ -1007,7 +979,7 @@ spec:
                           properties:
                             level:
                               description: 'RAID level for the logical disk. The following
-                                levels are supported: 0, 1 and 1+0.'
+                                levels are supported: 0;1;1+0.'
                               enum:
                               - "0"
                               - "1"
@@ -1069,9 +1041,9 @@ spec:
                               minItems: 2
                               type: array
                             sizeGibibytes:
-                              description: Size of the logical disk to be created
-                                in GiB. If unspecified or set be 0, the maximum capacity
-                                of disk will be used for logical disk.
+                              description: Size (Integer) of the logical disk to be
+                                created in GiB. If unspecified or set be 0, the maximum
+                                capacity of disk will be used for logical disk.
                               minimum: 0
                               type: integer
                           required:
@@ -1082,7 +1054,7 @@ spec:
                         type: array
                     type: object
                   rootDeviceHints:
-                    description: The root device hints set by the user.
+                    description: The RootDevicehints set by the user
                     properties:
                       deviceName:
                         description: A Linux device name like "/dev/vda", or a by-path
@@ -1127,7 +1099,7 @@ spec:
                         type: string
                     type: object
                   state:
-                    description: An indicator for what the provisioner is doing with
+                    description: An indiciator for what the provisioner is doing with
                       the host.
                     type: string
                 required:
@@ -1135,7 +1107,7 @@ spec:
                 - state
                 type: object
               triedCredentials:
-                description: The last credentials we sent to the provisioning backend.
+                description: the last credentials we sent to the provisioning backend
                 properties:
                   credentials:
                     description: SecretReference represents a Secret Reference. It
diff --git a/config/base/crds/bases/metal3.io_hardwaredata.yaml b/config/base/crds/bases/metal3.io_hardwaredata.yaml
index 3e5f99c7..890ba639 100644
--- a/config/base/crds/bases/metal3.io_hardwaredata.yaml
+++ b/config/base/crds/bases/metal3.io_hardwaredata.yaml
@@ -45,7 +45,7 @@ spec:
                 description: The hardware discovered on the host during its inspection.
                 properties:
                   cpu:
-                    description: Details of the CPU(s) in the system.
+                    description: CPU describes one processor on the host.
                     properties:
                       arch:
                         type: string
@@ -63,7 +63,7 @@ spec:
                         type: string
                     type: object
                   firmware:
-                    description: System firmware information.
+                    description: Firmware describes the firmware on the host.
                     properties:
                       bios:
                         description: The BIOS for this firmware
@@ -82,7 +82,6 @@ spec:
                   hostname:
                     type: string
                   nics:
-                    description: List of network interfaces for the host.
                     items:
                       description: NIC describes one network interface on the host.
                       properties:
@@ -133,11 +132,8 @@ spec:
                       type: object
                     type: array
                   ramMebibytes:
-                    description: The host's amount of memory in Mebibytes.
                     type: integer
                   storage:
-                    description: List of storage (disk, SSD, etc.) available to the
-                      host.
                     items:
                       description: Storage describes one storage device (disk, SSD,
                         etc.) on the host.
@@ -195,7 +191,8 @@ spec:
                       type: object
                     type: array
                   systemVendor:
-                    description: System vendor information.
+                    description: HardwareSystemVendor stores details about the whole
+                      hardware system.
                     properties:
                       manufacturer:
                         type: string
diff --git a/config/render/capm3.yaml b/config/render/capm3.yaml
index df12f18b..38ec0dfe 100644
--- a/config/render/capm3.yaml
+++ b/config/render/capm3.yaml
@@ -74,20 +74,18 @@ spec:
                 type: string
               automatedCleaningMode:
                 default: metadata
-                description: When set to disabled, automated cleaning will be skipped
+                description: When set to disabled, automated cleaning will be avoided
                   during provisioning and deprovisioning.
                 enum:
                 - metadata
                 - disabled
                 type: string
               bmc:
-                description: How do we connect to the BMC (Baseboard Management Controller)
-                  on the host?
+                description: How do we connect to the BMC?
                 properties:
                   address:
                     description: Address holds the URL for accessing the controller
-                      on the network. The scheme part designates the driver to use
-                      with the host.
+                      on the network.
                     type: string
                   credentialsName:
                     description: The name of the secret containing the BMC credentials
@@ -105,17 +103,13 @@ spec:
                 - credentialsName
                 type: object
               bootMACAddress:
-                description: The MAC address of the NIC used for provisioning the
-                  host. In case of network boot, this is the MAC address of the PXE
-                  booting interface. The MAC address of the BMC must never be used
-                  here!
+                description: Which MAC address will PXE boot? This is optional for
+                  some types, but required for libvirt VMs driven by vbmc.
                 pattern: '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'
                 type: string
               bootMode:
                 description: Select the method of initializing the hardware during
-                  boot. Defaults to UEFI. Legacy boot should only be used for hardware
-                  that does not support UEFI correctly. Set to UEFISecureBoot to turn
-                  secure boot on automatically after provisioning.
+                  boot. Defaults to UEFI.
                 enum:
                 - UEFI
                 - UEFISecureBoot
@@ -124,8 +118,7 @@ spec:
               consumerRef:
                 description: ConsumerRef can be used to store information about something
                   that is using a host. When it is not empty, the host is considered
-                  "in use". The common use case is a link to a Machine resource when
-                  the host is used by Cluster API.
+                  "in use".
                 properties:
                   apiVersion:
                     description: API version of the referent.
@@ -162,10 +155,7 @@ spec:
                 type: object
                 x-kubernetes-map-type: atomic
               customDeploy:
-                description: A custom deploy procedure. This is an advanced feature
-                  that allows using a custom deploy step provided by a site-specific
-                  deployment ramdisk. Most users will want to use "image" instead.
-                  Settings this field triggers provisioning.
+                description: A custom deploy procedure.
                 properties:
                   method:
                     description: Custom deploy method name. This name is specific
@@ -177,38 +167,36 @@ spec:
                 type: object
               description:
                 description: Description is a human-entered text used to help identify
-                  the host.
+                  the host
                 type: string
               externallyProvisioned:
-                description: ExternallyProvisioned means something else has provisioned
-                  the image running on the host, and the operator should only manage
-                  the power status. This field is used for integration with already
-                  provisioned hosts and when pivoting hosts between clusters. If unsure,
-                  leave this field as false.
+                description: ExternallyProvisioned means something else is managing
+                  the image running on the host and the operator should only manage
+                  the power status and hardware inventory inspection. If the Image
+                  field is filled in, this field is ignored.
                 type: boolean
               firmware:
-                description: Firmware (BIOS) configuration for bare metal server.
-                  If set, the requested settings will be applied before the host is
-                  provisioned. Only some vendor drivers support this field. An alternative
-                  is to use HostFirmwareSettings resources that allow changing arbitrary
-                  values and support the generic Redfish-based drivers.
+                description: BIOS configuration for bare metal server
                 properties:
                   simultaneousMultithreadingEnabled:
-                    description: Allows a single physical processor core to appear
-                      as several logical processors.
+                    description: 'Allows a single physical processor core to appear
+                      as several logical processors. This supports following options:
+                      true, false.'
                     enum:
                     - true
                     - false
                     type: boolean
                   sriovEnabled:
-                    description: SR-IOV support enables a hypervisor to create virtual
+                    description: 'SR-IOV support enables a hypervisor to create virtual
                       instances of a PCI-express device, potentially increasing performance.
+                      This supports following options: true, false.'
                     enum:
                     - true
                     - false
                     type: boolean
                   virtualizationEnabled:
-                    description: Supports the virtualization of platform hardware.
+                    description: 'Supports the virtualization of platform hardware.
+                      This supports following options: true, false.'
                     enum:
                     - true
                     - false
@@ -223,11 +211,9 @@ spec:
                 type: string
               image:
                 description: Image holds the details of the image to be provisioned.
-                  Populating the image will cause the host to start provisioning.
                 properties:
                   checksum:
-                    description: Checksum is the checksum for the image. Required
-                      for all formats except for "live-iso".
+                    description: Checksum is the checksum for the image.
                     type: string
                   checksumType:
                     description: ChecksumType is the checksum algorithm for the image,
@@ -241,9 +227,11 @@ spec:
                     - auto
                     type: string
                   format:
-                    description: Format contains the format of the image (raw, qcow2,
-                      ...). When set to "live-iso", an ISO 9660 image referenced by
-                      the url will be live-booted and not deployed to disk.
+                    description: DiskFormat contains the format of the image (raw,
+                      qcow2, ...). Needs to be set to raw for raw images streaming.
+                      Note live-iso means an iso referenced by the url will be live-booted
+                      and not deployed to disk, and in this case the checksum options
+                      are not required and if specified will be ignored.
                     enum:
                     - raw
                     - qcow2
@@ -259,9 +247,8 @@ spec:
                 type: object
               metaData:
                 description: MetaData holds the reference to the Secret containing
-                  host metadata which is passed to the Config Drive. By default, the
-                  operater will generate metadata for the host, so most users do not
-                  need to set this field.
+                  host metadata (e.g. meta_data.json) which is passed to the Config
+                  Drive.
                 properties:
                   name:
                     description: name is unique within a namespace to reference a
@@ -275,8 +262,8 @@ spec:
                 x-kubernetes-map-type: atomic
               networkData:
                 description: NetworkData holds the reference to the Secret containing
-                  network configuration which is passed to the Config Drive and interpreted
-                  by the first boot software such as cloud-init.
+                  network configuration (e.g content of network_data.json) which is
+                  passed to the Config Drive.
                 properties:
                   name:
                     description: name is unique within a namespace to reference a
@@ -289,21 +276,16 @@ spec:
                 type: object
                 x-kubernetes-map-type: atomic
               online:
-                description: Should the host be powered on? Changing this value will
-                  trigger a change in power state of the host.
+                description: Should the server be online?
                 type: boolean
               preprovisioningNetworkDataName:
                 description: PreprovisioningNetworkDataName is the name of the Secret
-                  in the local namespace containing network configuration which is
-                  passed to the preprovisioning image, and to the Config Drive if
-                  not overridden by specifying NetworkData.
+                  in the local namespace containing network configuration (e.g content
+                  of network_data.json) which is passed to the preprovisioning image,
+                  and to the Config Drive if not overridden by specifying NetworkData.
                 type: string
               raid:
-                description: RAID configuration for bare metal server. If set, the
-                  RAID settings will be applied before the host is provisioned. If
-                  not, the current settings will not be modified. Only one of the
-                  sub-fields hardwareRAIDVolumes and softwareRAIDVolumes can be set
-                  at the same time.
+                description: RAID configuration for bare metal server
                 properties:
                   hardwareRAIDVolumes:
                     description: The list of logical disks for hardware RAID, if rootDeviceHints
@@ -314,12 +296,11 @@ spec:
                         of volume in hardware RAID.
                       properties:
                         controller:
-                          description: The name of the RAID controller to use.
+                          description: The name of the RAID controller to use
                           type: string
                         level:
                           description: 'RAID level for the logical disk. The following
-                            levels are supported: 0, 1, 2, 5, 6, 1+0, 5+0, 6+0 (drivers
-                            may support only some of them).'
+                            levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
                           enum:
                           - "0"
                           - "1"
@@ -332,7 +313,7 @@ spec:
                           type: string
                         name:
                           description: Name of the volume. Should be unique within
-                            the Node. If not specified, the name will be auto-generated.
+                            the Node. If not specified, volume name will be auto-generated.
                           maxLength: 64
                           type: string
                         numberOfPhysicalDisks:
@@ -343,21 +324,20 @@ spec:
                           type: integer
                         physicalDisks:
                           description: Optional list of physical disk names to be
-                            used for the hardware RAID volumes. The disk names are
-                            interpreted by the hardware RAID controller, and the format
+                            used for the Hardware RAID volumes. The disk names are
+                            interpreted by the Hardware RAID controller, and the format
                             is hardware specific.
                           items:
                             type: string
                           type: array
                         rotational:
-                          description: Select disks with only rotational (if set to
-                            true) or solid-state (if set to false) storage. By default,
-                            any disks can be picked.
+                          description: Select disks with only rotational or solid-state
+                            storage
                           type: boolean
                         sizeGibibytes:
-                          description: Size of the logical disk to be created in GiB.
-                            If unspecified or set be 0, the maximum capacity of disk
-                            will be used for logical disk.
+                          description: Size (Integer) of the logical disk to be created
+                            in GiB. If unspecified or set be 0, the maximum capacity
+                            of disk will be used for logical disk.
                           minimum: 0
                           type: integer
                       required:
@@ -382,7 +362,7 @@ spec:
                       properties:
                         level:
                           description: 'RAID level for the logical disk. The following
-                            levels are supported: 0, 1 and 1+0.'
+                            levels are supported: 0;1;1+0.'
                           enum:
                           - "0"
                           - "1"
@@ -443,9 +423,9 @@ spec:
                           minItems: 2
                           type: array
                         sizeGibibytes:
-                          description: Size of the logical disk to be created in GiB.
-                            If unspecified or set be 0, the maximum capacity of disk
-                            will be used for logical disk.
+                          description: Size (Integer) of the logical disk to be created
+                            in GiB. If unspecified or set be 0, the maximum capacity
+                            of disk will be used for logical disk.
                           minimum: 0
                           type: integer
                       required:
@@ -457,8 +437,7 @@ spec:
                 type: object
               rootDeviceHints:
                 description: Provide guidance about how to choose the device for the
-                  image being provisioned. The default is currently to use /dev/sda
-                  as the root device.
+                  image being provisioned.
                 properties:
                   deviceName:
                     description: A Linux device name like "/dev/vda", or a by-path
@@ -533,9 +512,7 @@ spec:
                 type: array
               userData:
                 description: UserData holds the reference to the Secret containing
-                  the user data which is passed to the Config Drive and interpreted
-                  by the first-boot software such as cloud-init. The format of user
-                  data is specific to the first-boot software.
+                  the user data to be passed to the host before it boots.
                 properties:
                   name:
                     description: name is unique within a namespace to reference a
@@ -559,7 +536,7 @@ spec:
                   an error since the last successful operation
                 type: integer
               errorMessage:
-                description: The last error message reported by the provisioning subsystem.
+                description: the last error message reported by the provisioning subsystem
                 type: string
               errorType:
                 description: ErrorType indicates the type of failure encountered when
@@ -573,7 +550,7 @@ spec:
                 - power management error
                 type: string
               goodCredentials:
-                description: The last credentials we were able to validate as working.
+                description: the last credentials we were able to validate as working
                 properties:
                   credentials:
                     description: SecretReference represents a Secret Reference. It
@@ -593,12 +570,10 @@ spec:
                     type: string
                 type: object
               hardware:
-                description: The hardware discovered to exist on the host. This field
-                  will be removed in the next API version in favour of the separate
-                  HardwareData resource.
+                description: The hardware discovered to exist on the host.
                 properties:
                   cpu:
-                    description: Details of the CPU(s) in the system.
+                    description: CPU describes one processor on the host.
                     properties:
                       arch:
                         type: string
@@ -616,7 +591,7 @@ spec:
                         type: string
                     type: object
                   firmware:
-                    description: System firmware information.
+                    description: Firmware describes the firmware on the host.
                     properties:
                       bios:
                         description: The BIOS for this firmware
@@ -635,7 +610,6 @@ spec:
                   hostname:
                     type: string
                   nics:
-                    description: List of network interfaces for the host.
                     items:
                       description: NIC describes one network interface on the host.
                       properties:
@@ -686,11 +660,8 @@ spec:
                       type: object
                     type: array
                   ramMebibytes:
-                    description: The host's amount of memory in Mebibytes.
                     type: integer
                   storage:
-                    description: List of storage (disk, SSD, etc.) available to the
-                      host.
                     items:
                       description: Storage describes one storage device (disk, SSD,
                         etc.) on the host.
@@ -748,7 +719,8 @@ spec:
                       type: object
                     type: array
                   systemVendor:
-                    description: System vendor information.
+                    description: HardwareSystemVendor stores details about the whole
+                      hardware system.
                     properties:
                       manufacturer:
                         type: string
@@ -834,16 +806,14 @@ spec:
                 - detached
                 type: string
               poweredOn:
-                description: Whether or not the host is currently powered on. This
-                  field may get briefly out of sync with the actual state of the hardware
-                  while provisioning processes are running.
+                description: indicator for whether or not the host is powered on
                 type: boolean
               provisioning:
                 description: Information tracked by the provisioner.
                 properties:
                   ID:
-                    description: The hosts's ID from the underlying provisioning tool
-                      (e.g. the Ironic node UUID).
+                    description: The machine's UUID from the underlying provisioning
+                      tool
                     type: string
                   bootMode:
                     description: BootMode indicates the boot mode used to provision
@@ -865,25 +835,27 @@ spec:
                     - method
                     type: object
                   firmware:
-                    description: The firmware settings that have been applied.
+                    description: The Bios set by the user
                     properties:
                       simultaneousMultithreadingEnabled:
-                        description: Allows a single physical processor core to appear
-                          as several logical processors.
+                        description: 'Allows a single physical processor core to appear
+                          as several logical processors. This supports following options:
+                          true, false.'
                         enum:
                         - true
                         - false
                         type: boolean
                       sriovEnabled:
-                        description: SR-IOV support enables a hypervisor to create
+                        description: 'SR-IOV support enables a hypervisor to create
                           virtual instances of a PCI-express device, potentially increasing
-                          performance.
+                          performance. This supports following options: true, false.'
                         enum:
                         - true
                         - false
                         type: boolean
                       virtualizationEnabled:
-                        description: Supports the virtualization of platform hardware.
+                        description: 'Supports the virtualization of platform hardware.
+                          This supports following options: true, false.'
                         enum:
                         - true
                         - false
@@ -894,8 +866,7 @@ spec:
                       provisioned to the host.
                     properties:
                       checksum:
-                        description: Checksum is the checksum for the image. Required
-                          for all formats except for "live-iso".
+                        description: Checksum is the checksum for the image.
                         type: string
                       checksumType:
                         description: ChecksumType is the checksum algorithm for the
@@ -909,9 +880,12 @@ spec:
                         - auto
                         type: string
                       format:
-                        description: Format contains the format of the image (raw,
-                          qcow2, ...). When set to "live-iso", an ISO 9660 image referenced
-                          by the url will be live-booted and not deployed to disk.
+                        description: DiskFormat contains the format of the image (raw,
+                          qcow2, ...). Needs to be set to raw for raw images streaming.
+                          Note live-iso means an iso referenced by the url will be
+                          live-booted and not deployed to disk, and in this case the
+                          checksum options are not required and if specified will
+                          be ignored.
                         enum:
                         - raw
                         - qcow2
@@ -926,7 +900,7 @@ spec:
                     - url
                     type: object
                   raid:
-                    description: The RAID configuration that has been applied.
+                    description: The Raid set by the user
                     properties:
                       hardwareRAIDVolumes:
                         description: The list of logical disks for hardware RAID,
@@ -938,12 +912,11 @@ spec:
                             of volume in hardware RAID.
                           properties:
                             controller:
-                              description: The name of the RAID controller to use.
+                              description: The name of the RAID controller to use
                               type: string
                             level:
                               description: 'RAID level for the logical disk. The following
-                                levels are supported: 0, 1, 2, 5, 6, 1+0, 5+0, 6+0
-                                (drivers may support only some of them).'
+                                levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
                               enum:
                               - "0"
                               - "1"
@@ -956,7 +929,7 @@ spec:
                               type: string
                             name:
                               description: Name of the volume. Should be unique within
-                                the Node. If not specified, the name will be auto-generated.
+                                the Node. If not specified, volume name will be auto-generated.
                               maxLength: 64
                               type: string
                             numberOfPhysicalDisks:
@@ -967,21 +940,20 @@ spec:
                               type: integer
                             physicalDisks:
                               description: Optional list of physical disk names to
-                                be used for the hardware RAID volumes. The disk names
-                                are interpreted by the hardware RAID controller, and
+                                be used for the Hardware RAID volumes. The disk names
+                                are interpreted by the Hardware RAID controller, and
                                 the format is hardware specific.
                               items:
                                 type: string
                               type: array
                             rotational:
-                              description: Select disks with only rotational (if set
-                                to true) or solid-state (if set to false) storage.
-                                By default, any disks can be picked.
+                              description: Select disks with only rotational or solid-state
+                                storage
                               type: boolean
                             sizeGibibytes:
-                              description: Size of the logical disk to be created
-                                in GiB. If unspecified or set be 0, the maximum capacity
-                                of disk will be used for logical disk.
+                              description: Size (Integer) of the logical disk to be
+                                created in GiB. If unspecified or set be 0, the maximum
+                                capacity of disk will be used for logical disk.
                               minimum: 0
                               type: integer
                           required:
@@ -1007,7 +979,7 @@ spec:
                           properties:
                             level:
                               description: 'RAID level for the logical disk. The following
-                                levels are supported: 0, 1 and 1+0.'
+                                levels are supported: 0;1;1+0.'
                               enum:
                               - "0"
                               - "1"
@@ -1069,9 +1041,9 @@ spec:
                               minItems: 2
                               type: array
                             sizeGibibytes:
-                              description: Size of the logical disk to be created
-                                in GiB. If unspecified or set be 0, the maximum capacity
-                                of disk will be used for logical disk.
+                              description: Size (Integer) of the logical disk to be
+                                created in GiB. If unspecified or set be 0, the maximum
+                                capacity of disk will be used for logical disk.
                               minimum: 0
                               type: integer
                           required:
@@ -1082,7 +1054,7 @@ spec:
                         type: array
                     type: object
                   rootDeviceHints:
-                    description: The root device hints set by the user.
+                    description: The RootDevicehints set by the user
                     properties:
                       deviceName:
                         description: A Linux device name like "/dev/vda", or a by-path
@@ -1127,7 +1099,7 @@ spec:
                         type: string
                     type: object
                   state:
-                    description: An indicator for what the provisioner is doing with
+                    description: An indiciator for what the provisioner is doing with
                       the host.
                     type: string
                 required:
@@ -1135,7 +1107,7 @@ spec:
                 - state
                 type: object
               triedCredentials:
-                description: The last credentials we sent to the provisioning backend.
+                description: the last credentials we sent to the provisioning backend
                 properties:
                   credentials:
                     description: SecretReference represents a Secret Reference. It
@@ -1459,7 +1431,7 @@ spec:
                 description: The hardware discovered on the host during its inspection.
                 properties:
                   cpu:
-                    description: Details of the CPU(s) in the system.
+                    description: CPU describes one processor on the host.
                     properties:
                       arch:
                         type: string
@@ -1477,7 +1449,7 @@ spec:
                         type: string
                     type: object
                   firmware:
-                    description: System firmware information.
+                    description: Firmware describes the firmware on the host.
                     properties:
                       bios:
                         description: The BIOS for this firmware
@@ -1496,7 +1468,6 @@ spec:
                   hostname:
                     type: string
                   nics:
-                    description: List of network interfaces for the host.
                     items:
                       description: NIC describes one network interface on the host.
                       properties:
@@ -1547,11 +1518,8 @@ spec:
                       type: object
                     type: array
                   ramMebibytes:
-                    description: The host's amount of memory in Mebibytes.
                     type: integer
                   storage:
-                    description: List of storage (disk, SSD, etc.) available to the
-                      host.
                     items:
                       description: Storage describes one storage device (disk, SSD,
                         etc.) on the host.
@@ -1609,7 +1577,8 @@ spec:
                       type: object
                     type: array
                   systemVendor:
-                    description: System vendor information.
+                    description: HardwareSystemVendor stores details about the whole
+                      hardware system.
                     properties:
                       manufacturer:
                         type: string
diff --git a/controllers/metal3.io/host_config_data.go b/controllers/metal3.io/host_config_data.go
index 037a0372..3fd92dad 100644
--- a/controllers/metal3.io/host_config_data.go
+++ b/controllers/metal3.io/host_config_data.go
@@ -4,7 +4,6 @@ import (
 	"github.com/go-logr/logr"
 	metal3api "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 	"github.com/metal3-io/baremetal-operator/pkg/secretutils"
-	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/types"
 )
@@ -21,10 +20,6 @@ type hostConfigData struct {
 // parameter to detirmine which data to return in case secret contins multiple
 // keys.
 func (hcd *hostConfigData) getSecretData(name, namespace, dataKey string) (string, error) {
-	if namespace != hcd.host.Namespace {
-		return "", errors.Errorf("%s secret must be in same namespace as host %s/%s", dataKey, hcd.host.Namespace, hcd.host.Name)
-	}
-
 	key := types.NamespacedName{
 		Name:      name,
 		Namespace: namespace,
diff --git a/controllers/metal3.io/preprovisioningimage_controller.go b/controllers/metal3.io/preprovisioningimage_controller.go
index 1dc3cfd0..e9a76540 100644
--- a/controllers/metal3.io/preprovisioningimage_controller.go
+++ b/controllers/metal3.io/preprovisioningimage_controller.go
@@ -304,7 +304,7 @@ func setImage(generation int64, status *metal3api.PreprovisioningImageStatus, im
 		metal3api.ConditionImageError, metav1.ConditionFalse,
 		time, reason, "")
 
-	changed := !apiequality.Semantic.DeepEqual(status, &newStatus)
+	changed := !apiequality.Semantic.DeepEqual(status, newStatus)
 	*status = *newStatus
 	return changed
 }
diff --git a/docs/api.md b/docs/api.md
index 6e6900e7..2f32efd3 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -3,12 +3,528 @@
 ## BareMetalHost
 
 **Metal³** introduces the concept of **BareMetalHost** resource, which
-defines a physical host and its properties. See [BareMetalHost
-CR](https://doc.crds.dev/github.com/metal3-io/baremetal-operator/metal3.io/BareMetalHost/v1alpha1)
-or check the source code at `apis/metal3.io/v1alpha1/baremetalhost_types.go`
-for a detailed API description. See the [user
-guide](https://book.metal3.io/bmo/introduction) for information on how to
-manage hosts.
+defines a physical host and its properties. The **BareMetalHost** embeds
+two well differentiated sections, the bare metal host specification
+and its current status.
+
+### BareMetalHost spec
+
+The *BareMetalHost's* *spec* defines the desire state of the host. It contains
+mainly, but not only, provisioning details.
+
+#### bmc
+
+The `bmc` fields contain the connection information for the BMC
+(Baseboard Management Controller) on the host.
+
+The sub-fields are
+
+* *address* -- The URL for communicating with the BMC controller, based
+  on the provider being used.
+* *credentialsName* -- A reference to a *secret* containing the
+  username and password for the BMC.
+* *disableCertificateVerification* -- A boolean to skip certificate
+    validation when true.
+
+BMC URLs vary based on the type of BMC and the protocol used to
+communicate with them. See [supported hardware
+guide](https://book.metal3.io/bmo/supported_hardware) for details.
+
+#### online
+
+A boolean indicating whether the host should be powered on (true) or
+off (false). Changing this value will trigger a change in power state
+on the physical host.
+
+#### bootMACAddress
+
+The MAC address of the NIC used for provisioning the host.
+
+#### bootMode
+
+The boot mode of the host, defaults to `UEFI`, can also be set
+to `legacy` for BIOS boot, or `UEFISecureBoot`.
+
+#### consumerRef
+
+A reference to another resource that is using the host, it could be
+empty if the host is not being currently used.  For example, a
+*Machine* resource when the host is being used by the
+[*machine-api*](https://github.com/kubernetes-sigs/cluster-api).
+
+#### externallyProvisioned
+
+A boolean indicating whether the host provisioning and deprovisioning
+are managed externally. When set:
+
+* Power status can still be managed using the `online` field.
+* Hardware inventory will be monitored, but no provisioning or deprovisioning
+  operations are performed on the host.
+
+#### image
+
+Holds details for the image to be deployed on a given host.
+
+The sub-fields are
+
+* *url* -- The URL of an image to deploy to the host.
+* *checksum* -- The actual checksum or a URL to a file containing
+  the checksum for the image at *image.url*.
+* *checksumType* -- Checksum algorithms can be specified. Currently
+  only `md5`, `sha256`, `sha512` are recognized. Use `auto` to auto-detect
+  the algorithm from the value. If nothing is specified, `md5` is assumed.
+* *format* -- This is the disk format of the image. It can be one of `raw`,
+  `qcow2`, `vdi`, `vmdk`, `live-iso` or be left unset.
+  Setting it to raw enables raw image streaming in Ironic agent for that image.
+  Setting it to live-iso enables iso images to live boot without deploying
+  to disk, in this case the checksum fields are ignored.
+
+Even though the image sub-fields are required by Ironic,
+when the host provisioning is managed externally via `externallyProvisioned: true`,
+and power control isn't needed, the fields can be left empty.
+
+#### userData
+
+A reference to the Secret containing the cloudinit user data and its
+namespace, so it can be attached to the host before it boots for
+configuring different aspects of the OS (like networking, storage,
+...).
+
+#### networkData
+
+A reference to the Secret containing the network configuration data
+(e.g. network\_data.json) and its namespace, so it can be attached to
+the host before it boots to set network up
+
+#### description
+
+A human-provided string to help identify the host.
+
+#### hardwareProfile
+
+**This field is deprecated. See rootDeviceHints instead.**
+
+The name of the hardware profile to use. The following are the current
+supported `hardwareProfile` settings and their corresponding root
+devices.
+
+| **hardwareProfile** | **Root Device** |
+|---------------------|-----------------|
+| `unknown`           | /dev/sda        |
+| `libvirt`           | /dev/vda        |
+| `dell`              | HCTL: 0:0:0:0   |
+| `dell-raid`         | HCTL: 0:2:0:0   |
+| `openstack`         | /dev/vdb        |
+
+**NOTE:** These are subject to change.
+
+#### raid
+
+This field contains the information about the RAID configuration for bare
+metal servers.
+
+The sub-fields are:
+
+* *hardwareRAIDVolumes* -- It contains the list of logical disks for hardware
+   RAID. If rootDeviceHints isn't used, the first volume is the root volume.
+   Furthermore, it defines the desired configuration of volume in hardware RAID.
+   * *level* -- RAID level for the logical disk. The following levels are
+     supported: `0`,`1`,`2`,`5`,`6`,`1+0`,`5+0`,`6+0`.
+   * *name* -- Name of the volume. Should be unique within the server. If not
+     specified, volume name will be auto-generated.
+   * *numberOfPhysicalDisks* -- Integer, number of physical disks to use for the
+     logical disk. Defaults to minimum number of disks required for the
+     particular RAID level.
+   * *physicalDisks* -- List of names of physical disks (Strings). This is an
+     optional field. If specified, the `controller` field must be specified too.
+   * *controller* -- String, Name of the RAID controller to be used in the
+      hardware RAID volume. Optional field.
+   * *rotational* -- If true, select only rotational disks, if false - only
+     solid-state and NVMe. Any disk types are used by default.
+   * *sizeGibibytes* -- Size (Integer) of the logical disk to be created in GiB.
+     If unspecified or set to 0, the maximum capacity of disk will be used for
+     logical disk.
+* *softwareRAIDVolumes* -- It contains the list of logical disks for software
+   RAID. If rootDeviceHints isn't used, the first volume is the root volume. If
+   HardwareRAIDVolumes is set this item will be invalid. The number of created
+   Software RAID devices must be 1 or 2. If there is only one Software RAID
+   device, it has to be a RAID-1. If there are two, the first one has to be a
+   RAID-1, while the RAID level for the second one can be 0, 1, or 1+0. As the
+   first RAID device will be the deployment device, enforcing a RAID-1 reduces
+   the risk of ending up with a non-booting node in case of a disk failure.
+   Furthermore, SoftwareRAIDVolume defines the desired configuration of volume
+   in software RAID.
+   * *level* -- RAID level for the logical disk. The following levels are
+     supported: `0`,`1`,`1+0`.
+   * *physicalDisks* -- A list of device hints, the number of items should be
+     greater than or equal to 2.
+   * *sizeGibibytes* -- Size (Integer) of the logical disk to be created in
+     GiB. If unspecified or set to 0, the maximum capacity of disk will be
+     used for logical disk.
+
+If you do not set the RAID field, we will keep the current RAID configuration.
+
+You can set the `hardwareRAIDVolume` as an empty slice to clear the hardware
+RAID configuration, for example:
+
+```yaml
+spec:
+   raid:
+     hardwareRAIDVolume: []
+```
+
+**NOTE:** Currently the 'raid' field is only supported by ilo5/idrac/irmc.
+
+**NOTE:** Do not try to simultaneously delete hardware RAID volumes and add
+software RAID volumes. Delete hardware RAID first, wait for the host to settle
+down, add software volumes afterwards.
+
+**NOTE:** If you got following error message:
+
+1. raid settings are defined, but the node's driver %s does not support RAID.
+2. node's driver %s does not support hardware RAID.
+
+You can solve it by:
+
+1. Keep raid field is nil.
+2. Keep hardwareRAIDVolumes field is nil.
+
+If the error message you get isn't included the above, you may need to check
+whether the BM has a RAID controller and keep the raid field blank.
+
+#### firmware
+
+This field contains the information about the BIOS configuration for bare
+metal servers.
+
+The sub-fields are:
+
+* *simultaneousMultithreadingEnabled* -- Allows a single physical processor
+  core to appear as several logical processors. This supports following
+  options: true, false.
+* *sriovEnabled* -- SR-IOV support enables a hypervisor to create virtual
+  instances of a PCI-express device, potentially increasing performance.
+  This supports following options: true, false.
+* *virtualizationEnabled* -- Supports the virtualization of platform
+  hardware. This supports following options: true, false.
+
+**NOTE:** Currently the `firmware` field is only supported by ilo4/ilo5/irmc
+/idrac.
+
+#### rootDeviceHints
+
+Guidance for how to choose the device to receive the image being
+provisioned. The storage devices are examined in the order they are
+discovered during inspection and the hint values are compared to the
+inspected values. The first discovered device that matches is
+used. Hints can be combined, and if multiple hints are provided then a
+device must match all hints in order to be selected.
+
+The sub-fields are
+
+* *deviceName* -- A string containing a Linux device name like
+  `/dev/vda`. The hint must match the actual value exactly.
+* *hctl* -- A string containing a SCSI bus address like
+  `0:0:0:0`. The hint must match the actual value exactly.
+* *model* -- A string containing a vendor-specific device
+  identifier. The hint can be a substring of the actual value.
+* *vendor* -- A string containing the name of the vendor or
+  manufacturer of the device. The hint can be a substring of the
+  actual value.
+* *serialNumber* -- A string contianing the device serial
+  number. The hint must match the actual value exactly.
+* *minSizeGigabytes* -- An integer representing the minimum size of the
+  device in Gigabytes.
+* *wwn* -- A string containing the unique storage identifier. The
+  hint must match the actual value exactly.
+* *wwnWithExtension* -- A string containing the unique storage
+  identifier with the vendor extension appended. The hint must match
+  the actual value exactly.
+* *wwnVendorExtension* -- A string containing the unique vendor
+  storage indentifier. The hint must match the actual value exactly.
+* *rotational* -- A boolean indicating whether the device should be
+  a rotating disk (`true`) or not (`false`).
+
+#### automatedCleaningMode
+
+An interface to enable/disable automated cleaning during provisioning
+and deprovisioning. When set to `disabled`, automated cleaning will be
+skipped, where `metadata`(default value) enables it.
+
+#### customDeploy
+
+An advanced alternative to using [image](#image). Set the subfield `method`
+to the name of a custom deploy step that is provided by your deployment
+ramdisk. Most users will want to use [image](#image) instead.
+
+NOTE: setting either `customDeploy.method` or `image.url` triggers provisioning
+of the host.
+
+### BareMetalHost status
+
+Moving onto the next block, the *BareMetalHost's* *status* which represents
+the host's current state. Including tested credentials, current hardware
+details, etc.
+
+#### goodCredentials
+
+A reference to the secret and its namespace holding the last set of
+BMC credentials the system was able to validate as working.
+
+#### triedCredentials
+
+A reference to the secret and its namespace holding the last set of
+BMC credentials that were sent to the provisioning backend.
+
+#### lastUpdated
+
+The timestamp of the last time the status of the host was updated.
+
+#### operationalStatus
+
+The status of the server. Value is one of the following:
+
+* *OK* -- Indicates all the details for the host are known and working,
+  meaning the host is correctly configured and manageable.
+* *discovered* -- Implies some of the host's details are either
+  not working correctly or missing. For example, the BMC address is known
+  but the login credentials are not.
+* *error* -- Indicates the system found some sort of irrecuperable error.
+  Refer to the *errorMessage* field in the status section for more details.
+
+#### errorMessage
+
+Details of the last error reported by the provisioning backend, if
+any.
+
+#### hardware
+
+The details for hardware capabilities discovered on the host. These
+are filled in by the provisioning agent when the host is registered.
+
+The sub-fields are
+
+* *nics* -- List of network interfaces for the host.
+   * *name* -- A string identifying the network device,
+     e.g. *nic-1*.
+   * *mac* -- The MAC address of the NIC.
+   * *ip* -- The IP address of the NIC, if one was assigned
+     when the discovery agent ran.
+   * *speedGbps* -- The speed of the device in Gbps.
+   * *vlans* -- A list holding all the VLANs available for this NIC.
+   * *vlanId* -- The untagged VLAN ID.
+   * *pxe* -- Whether the NIC is able to boot using PXE.
+* *storage* -- List of storage (disk, SSD, etc.) available to the host.
+   * *name* -- A string identifying the storage device,
+     e.g. *disk 1 (boot)*.
+   * *rotational* -- Either true or false, indicates whether the disk
+     is rotational.
+   * *sizeBytes* -- Size of the storage device.
+   * *serialNumber* -- The device's serial number.
+* *cpu* -- Details of the CPU(s) in the system.
+   * *arch* -- The architecture of the CPU.
+   * *model* -- The model string.
+   * *clockMegahertz* -- The speed in MHz of the CPU.
+   * *flags* -- List of CPU flags, e.g. 'mmx','sse','sse2','vmx', ...
+   * *count* -- Amount of these CPUs available in the system.
+* *firmware* -- Contains BIOS information like for instance its *vendor*
+  and *version*.
+* *systemVendor* -- Contains information about the host's *manufacturer*,
+  the *productName* and *serialNumber*.
+* *ramMebibytes* -- The host's amount of memory in Mebibytes.
+
+#### hardwareProfile (status)
+
+**This field is deprecated. See rootDeviceHints instead.**
+
+The name of the hardware profile that matches the hardware discovered
+on the host based on the details saved to the *Hardware* section. If
+the hardware does not match any known profile, the value `unknown`
+will be set on this field and is used by default. In practice, this
+only affects which device the OS image will be written to. The
+following are the current supported `hardwareProfile` settings and
+their corresponding root devices.
+
+| **hardwareProfile** | **Root Device** |
+|---------------------|-----------------|
+| `unknown`           | /dev/sda        |
+| `libvirt`           | /dev/vda        |
+| `dell`              | HCTL: 0:0:0:0   |
+| `dell-raid`         | HCTL: 0:2:0:0   |
+| `openstack`         | /dev/vdb        |
+
+**NOTE:** These are subject to change.
+
+#### poweredOn
+
+Boolean indicating whether the host is powered on.
+
+See *online* on the *BareMetalHost's* *Spec*.
+
+#### provisioning
+
+Settings related to deploying an image to the host.
+
+* *state* -- The current state of any ongoing provisioning operation.
+   The following are the currently supported ones:
+   * *\<empty string\>* -- There is no provisioning happening, at the moment.
+   * *unmanaged* -- There is an insufficient information available to register
+     the host.
+   * *registering* -- The host's BMC details are being checked.
+   * *match profile* -- The discovered hardware details on the host
+     are being compared against known profiles.
+   * *available* -- The host is available to be consumed. (This state was
+     previously known as *ready*.)
+   * *preparing* -- The existing configuration will be removed, and the new
+     configuration will be set on the host.
+   * *provisioning* -- An image is being written to the host's disk(s).
+   * *provisioned* -- An image has been completely written to the host's
+     disk(s).
+   * *externally provisioned* -- Metal³ does not manage the image on the host.
+   * *deprovisioning* -- The image is being wiped from the host's disk(s).
+   * *inspecting* -- The hardware details for the host are being collected
+     by an agent.
+   * *deleting* -- The host is being deleted from the cluster.
+* *id* -- The unique identifier for the service in the underlying
+  provisioning tool.
+* *image* -- The image most recently provisioned to the host.
+* *raid* -- The list of hardware or software RAID volumes recently set.
+* *firmware* -- The BIOS configuration for bare metal server.
+* *rootDeviceHints* -- The root device selection instructions used
+  for the most recent provisioning operation.
+
+### BareMetalHost Example
+
+The following is a complete example from a running cluster of a *BareMetalHost*
+resource (in YAML), it includes its specification and status sections:
+
+```yaml
+apiVersion: metal3.io/v1alpha1
+kind: BareMetalHost
+metadata:
+  creationTimestamp: "2019-09-20T06:33:35Z"
+  finalizers:
+  - baremetalhost.metal3.io
+  generation: 2
+  name: bmo-controlplane-0
+  namespace: bmo-project
+  resourceVersion: "22642"
+  selfLink: /apis/metal3.io/v1alpha1/namespaces/bmo-project/baremetalhosts/bmo-controlplane-0
+  uid: 92b2f77a-db70-11e9-9db1-525400764849
+spec:
+  bmc:
+    address: ipmi://10.10.57.19
+    credentialsName: bmo-controlplane-0-bmc-secret
+  bootMACAddress: 98:03:9b:61:80:48
+  consumerRef:
+    apiVersion: machine.openshift.io/v1beta1
+    kind: Machine
+    name: bmo-controlplane-0
+    namespace: bmo-project
+  externallyProvisioned: true
+  hardwareProfile: default
+  image:
+    checksum: http://172.16.1.100/images/myOSv1/myOS.qcow2.md5sum
+    url: http://172.16.1.100/images/myOSv1/myOS.qcow2
+  online: true
+  raid:
+    hardwareRAIDVolumes:
+    - level: "1"
+      sizeGibibytes: 200
+      rotational: true
+  firmware:
+    virtualizationEnabled: true
+  userData:
+    name: bmo-controlplane-user-data
+    namespace: bmo-project
+  networkData:
+    name: bmo-controlplane-network-data
+    namespace: bmo-project
+  metaData:
+    name: bmo-controlplane-meta-data
+    namespace: bmo-project
+status:
+  errorMessage: ""
+  goodCredentials:
+    credentials:
+      name: bmo-controlplane-0-bmc-secret
+      namespace: bmo-project
+    credentialsVersion: "5562"
+  hardware:
+    cpu:
+      arch: x86_64
+      clockMegahertz: 2000
+      count: 40
+      flags: []
+      model: Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz
+    firmware:
+      bios:
+        date: 12/17/2018
+        vendor: Dell Inc.
+        version: 1.6.13
+    hostname: bmo-controlplane-0.localdomain
+    nics:
+    - ip: 172.22.135.105
+      mac: "00:00:00:00:00:00"
+      model: unknown
+      name: eno1
+      pxe: true
+      speedGbps: 25
+      vlanId: 0
+    ramMebibytes: 0
+    storage: []
+    systemVendor:
+      manufacturer: Dell Inc.
+      productName: PowerEdge r460
+      serialNumber: ""
+  hardwareProfile: ""
+  lastUpdated: "2019-09-20T07:03:23Z"
+  operationalStatus: OK
+  poweredOn: true
+  provisioning:
+    ID: a4438010-3fc6-4c5c-b570-900bbe85da57
+    image:
+      checksum: ""
+      url: ""
+    state: externally provisioned
+  triedCredentials:
+    credentials:
+      name: bmo-controlplane-0-bmc-secret
+      namespace: bmo-project
+    credentialsVersion: "5562"
+```
+
+And here is the secret `bmo-controlplane-0-bmc-secret` holding the host's
+BMC credentials, base64 encoded:
+
+```console
+$echo -n 'admin' | base64
+
+YWRtaW4=
+
+$echo -n 'password' | base64
+
+cGFzc3dvcmQ=
+```
+
+Copy the above base64 encoded username and password pair and
+paste it into the yaml as mentioned below.
+
+```yaml
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: bmo-controlplane-0-bmc-secret
+type: Opaque
+data:
+  username: YWRtaW4=
+  password: cGFzc3dvcmQ=
+```
+
+NOTE: After decoding the secret content, whitespace is stripped from
+the beginning and end before the username and password values are
+used.
 
 ## Triggering Provisioning
 
@@ -41,6 +557,21 @@ sure that you remove the annotation  **only if the value of the annotation is
 not `metal3.io/capm3`, but another value that you have provided**. Removing the
 annotation will enable the reconciliation again.
 
+## Detaching hosts
+
+It is possible to prevent management of a BareMetalHost object by adding
+an annotation `baremetalhost.metal3.io/detached`. This removes the host from
+the provisioner, which prevents any management of the physical host (e.g
+changing power state, or deprovisioning), but still allows the BMH status
+to be updated unlike the `paused` annotation. While in this state the
+OperationalStatus field will be `detached` but the provisioning state will
+be unmodified.  This API only has any effect for BareMetalHost resources
+that are in either `Provisioned`, `ExternallyProvisioned` or `Ready`/`Available`
+state.
+
+Please note only the existence of the annotation is important to treat the BMH
+as detached and the value of the annotation is always ignored.
+
 ## HostFirmwareSettings
 
 A **HostFirmwareSettings** resource is used to manage BIOS settings for a host,
@@ -51,12 +582,104 @@ actual BIOS configuration names returned from the BMC, typically 100-200
 settings per host, as compared to the three vendor-independent fields stored in
 the **BareMetalHosts** `firmware` field.
 
-See [HostFirmwareSettings
-CR](https://doc.crds.dev/github.com/metal3-io/baremetal-operator/metal3.io/HostFirmwareSettings/v1alpha1)
-or check the source code at `apis/metal3.io/v1alpha1/hostfirmwaresettings_types.go`
-for a detailed API description. See the [firmware settings
-guide](https://book.metal3.io/bmo/firmware_settings) for information on how to
-change firmware settings.
+### HostFirmwareSettings spec
+
+The *HostFirmwareSettings's* *spec* defines the desired BIOS settings. These
+settings will be sent to Ironic as part of clean-steps for update to the BMC
+when the host goes through cleaning, i.e. when the **BareMetalHosts** go
+through the Preparing state.
+
+#### spec settings
+
+The `settings` are an array of name/value pairs for the BIOS settings.
+The names must match the names read from Ironic and stored in the `status`
+field. The values must be within the limits as defined in the *FirmwareSchema*.
+Only settings which are not defined as `ReadOnly` or `Unique` (such as
+SerialNumbers) will be accepted.
+
+### HostFirmwareSettings status
+
+The *HostFirmwareSettings's* *status* defines the actual BIOS settings read
+from Ironic.
+
+#### status schema
+
+`Schema` is a reference to a *FirmwareSchema* resource that describes each
+BIOS setting by type and configurable limits for the type.
+
+#### status settings
+
+The `settings` are an array of name/value pairs listing the complete set
+of BIOS settings retrieved from Ironic.
+
+#### status conditions
+
+`conditions` reflects the status of the fields in the *spec*. Possible
+conditions are:
+
+* *Valid* -- When set to *True* indicates that all *settings* in the *spec* are
+  correct for names and values. This is also set to *True* when nothing is set
+  in the *spec*. When set to *False* indicates that one or more names or values
+  in the *spec* are incorrect, the actual error will be shown in the *Events*
+  field.
+* *ChangeDetected* -- Indicates whether or not settings in the *spec* are
+  different than settings in the *status*. When set to *True* the settings that
+  are different will be included in the clean-steps that are written to Ironic
+  as part of cleaning.
+
+### HostFirmwareSettings Example
+
+The following is a complete example from a running cluster of a
+*HostFirmwareSettings* resource (in YAML), it includes its spec and status
+sections:
+
+```yaml
+apiVersion: metal3.io/v1alpha1
+kind: HostFirmwareSettings
+metadata:
+  creationTimestamp: "2021-11-03T21:21:02Z"
+  generation: 1
+  name: ostest-worker-0
+  namespace: openshift-machine-api
+  ownerReferences:
+  - apiVersion: metal3.io/v1alpha1
+    blockOwnerDeletion: true
+    controller: true
+    kind: BareMetalHost
+    name: ostest-worker-0
+    uid: 87b08d19-b94c-4a29-901a-67890d9eb843
+  resourceVersion: "24688"
+  uid: 293a351b-1743-437d-abed-da53d41d8804
+spec:
+  settings: {}
+status:
+  conditions:
+  - lastTransitionTime: "2021-11-03T21:21:54Z"
+    message: ""
+    observedGeneration: 1
+    reason: Success
+    status: "False"
+    type: ChangeDetected
+  - lastTransitionTime: "2021-11-03T21:21:54Z"
+    message: ""
+    observedGeneration: 1
+    reason: Success
+    status: "True"
+    type: Valid
+  schema:
+    name: schema-dc98d7c8
+    namespace: openshift-machine-api
+  settings:
+    BootMode: Uefi
+    EmbeddedSata: Raid
+    L2Cache: 10x256 KB
+    NicBoot1: NetworkBoot
+    NumCores: "10"
+    ProcTurboMode: Enabled
+    QuietBoot: "true"
+    SecureBootStatus: Enabled
+    SerialNumber: QPX12345
+```
 
 ## FirmwareSchema
 
@@ -69,10 +692,125 @@ have the same **FirmwareSchema** identifier so its likely that more than one
 **HostFirmwareSettings** reference the same **FirmwareSchema** when
 hardware of the same vendor and model are used.
 
-See [FirmwareSchema
-CR](https://doc.crds.dev/github.com/metal3-io/baremetal-operator/metal3.io/FirmwareSchema/v1alpha1)
-or check the source code at `apis/metal3.io/v1alpha1/firmwareschema_types.go`
-for a detailed API description.
+### FirmwareSchema spec
+
+#### spec schema
+
+A map of settings names and limits. The values returned in the limits depend
+on the type of the setting. The following fields are included:
+
+* *attribute_type* -- The type of setting - `Enumeration`, `Integer`, `String`,
+  `Boolean`, or `Password`
+* *allowable_values* -- A list of allowable values when the `attribute_type` is `Enumeration`
+* *lower_bound* -- The lowest allowed value when attribute_type is `Integer`
+* *upper_bound* -- The highest allowed value when attribute_type is `Integer`
+* *min_length* -- The shortest string length that the value can have when
+  attribute_type is `String`
+* *max_length* -- The longest string length that the value can have when
+  attribute_type is `String`
+* *read_only* -- The setting is ready only and cannot be modified
+* *unique* -- The setting is specific to this host
+
+#### hardwareVendor
+
+The name of the vendor that this schema corresponds to.
+
+#### hardwareModel
+
+The hardware model that this schema corresponds to.
+
+### FirmwareSchema Example
+
+```yaml
+apiVersion: metal3.io/v1alpha1
+kind: FirmwareSchema
+metadata:
+  creationTimestamp: "2021-11-03T21:21:54Z"
+  generation: 1
+  name: schema-dc98d7c8
+  namespace: openshift-machine-api
+  ownerReferences:
+  - apiVersion: metal3.io/v1alpha1
+    kind: HostFirmwareSettings
+    name: ostest-controlplane-1
+    uid: a991875d-9897-49f1-9d86-16ea9ed6c84f
+  - apiVersion: metal3.io/v1alpha1
+    kind: HostFirmwareSettings
+    name: ostest-worker-0
+    uid: 650c291c-3da7-4902-be6e-61979daea254
+  - apiVersion: metal3.io/v1alpha1
+    kind: HostFirmwareSettings
+    name: ostest-controlplane-0
+    uid: afc8f76c-0200-431c-ace0-9a6195d16fcd
+  - apiVersion: metal3.io/v1alpha1
+    kind: HostFirmwareSettings
+    name: ostest-controlplane-2
+    uid: f0c49fec-d493-40ac-9a86-56504cd47a74
+  - apiVersion: metal3.io/v1alpha1
+    kind: HostFirmwareSettings
+    name: ostest-worker-1
+    uid: 5fe2c773-5499-4a37-a26d-6f17dc02382f
+  resourceVersion: "19141"
+  uid: b442e01f-3724-4f14-a578-f0b99d296c95
+  spec:
+    hardwareModel: KVM (8.2.0)
+    hardwareVendor: Red Hat
+    schema:
+      BootMode:
+        allowable_values:
+        - Bios
+        - Uefi
+        attribute_type: Enumeration
+        read_only: false
+      EmbeddedSata:
+        allowable_values:
+        - Ata
+        - Ahci
+        - Raid
+        - "Off"
+        attribute_type: Enumeration
+        read_only: false
+     L2Cache:
+        attribute_type: String
+        max_length: 16
+        min_length: 0
+        read_only: false
+        unique: false
+      NicBoot1:
+        allowable_values:
+        - NetworkBoot
+        - Disabled
+        attribute_type: Enumeration
+        read_only: false
+      NumCores:
+        attribute_type: Integer
+        lower_bound: 10
+        read_only: true
+        unique: false
+        upper_bound: 20
+      ProcTurboMode:
+        allowable_values:
+        - Enabled
+        - Disabled
+        attribute_type: Enumeration
+        read_only: false
+      QuietBoot:
+        attribute_type: Boolean
+        read_only: false
+        unique: false
+      SecureBootStatus:
+        allowable_values:
+        - Enabled
+        - Disabled
+        attribute_type: Enumeration
+        read_only: true
+      SerialNumber:
+        attribute_type: String
+        max_length: 16
+        min_length: 0
+        read_only: false
+        unique: true
+```
 
 ## HardwareData
 
@@ -88,12 +826,17 @@ deletion of HardwareData, but during next provisioning it can be
 re-created (with the same name and namespace) with the latest inspection
 data retrieved from Ironic. HardwareData holds the same name and
 namespace as its corresponding BareMetalHost resource. Currently,
-HardwareData doesn't have *Status* subresource but only the *Spec*.
+HardwareData doesn't have *Status* subresource but only the *Spec*,
+which we cover next.
+
+### HardwareData spec
 
-See [HardwareData
-CR](https://doc.crds.dev/github.com/metal3-io/baremetal-operator/metal3.io/HardwareData/v1alpha1)
-or check the source code at `apis/metal3.io/v1alpha1/hardwaredata_types.go`
-for a detailed API description.
+As you probably already noticed, the *Spec* of HardwareData is the same
+as [.Status.hardware](#hardware) of the BareMetalHost. However, this
+behaviour is temporary and eventually we will drop
+[.Status.hardware](#hardware) from BareMetalHost and only rely on
+HardwareData *Spec*. The reason for having duplication of inspection
+data at the  moment is to avoid breaking the existing deployments.
 
 ## PreprovisioningImage
 
@@ -111,7 +854,37 @@ variables `DEPLOY_ISO_URL` and `DEPLOY_RAMDISK_URL`. More sophisticated
 controllers may be written downstream (for example, the OpenShift
 [image-customization-controller](https://github.com/openshift/image-customization-controller)).
 
-See [PreprovisioningImage
-CR](https://doc.crds.dev/github.com/metal3-io/baremetal-operator/metal3.io/PreprovisioningImage/v1alpha1)
-or check the source code at `apis/metal3.io/v1alpha1/preprovisioningimage_types.go`
-for a detailed API description.
+### PreprovisioningImage spec
+
+The PreprovisioningImage's spec provides input for the image building process.
+
+* `acceptFormats`: a list of accepted image formats: `iso` or `initrd`.
+
+* `architecture`: the CPU architecture to build the image for, e.g. `x86_64`.
+  The default PreprovisioningImage controller does not use this field.
+
+* `networkData`: the name of a *Secret* with the network configuration
+  for the image. The default PreprovisioningImage controller does not
+  use this field.
+
+### PreprovisioningImage status
+
+The PreprovisioningImage's status provides information about the resulting image.
+
+* `architecture`: the CPU architecture of the image, e.g. `x86_64`.
+
+* `extraKernelParams`: additional kernel parameters that
+  baremetal-operator will add to the node when PXE booting the initramfs
+  image. Has no meaning for ISO images.
+
+* `format`: format of the image: `iso` or `initrd`. Must be one of the
+  formats provided in `acceptFormats`.
+
+* `imageUrl`: the URL of the resulting image.
+
+* `kernelUrl`: the URL of the kernel to use together with the initramfs
+  image. If not provided, baremetal-operator uses the default kernel
+  image from the environment variables. Has no meaning for ISO images.
+
+* `networkData`: the name of a *Secret* with the network configuration
+  of the image.
diff --git a/go.mod b/go.mod
index 3137f835..098e0db4 100644
--- a/go.mod
+++ b/go.mod
@@ -5,28 +5,28 @@ go 1.22
 require (
 	github.com/go-logr/logr v1.4.2
 	github.com/google/safetext v0.0.0-20230106111101-7156a760e523
-	github.com/gophercloud/gophercloud/v2 v2.1.0
+	github.com/gophercloud/gophercloud/v2 v2.0.0
 	github.com/metal3-io/baremetal-operator/apis v0.5.1
 	github.com/metal3-io/baremetal-operator/pkg/hardwareutils v0.5.1
-	github.com/onsi/gomega v1.34.2
+	github.com/onsi/gomega v1.34.1
 	github.com/pkg/errors v0.9.1
-	github.com/prometheus/client_golang v1.20.3
+	github.com/prometheus/client_golang v1.19.1
 	github.com/stretchr/testify v1.9.0
 	go.etcd.io/etcd/client/pkg/v3 v3.5.15
 	go.uber.org/zap v1.27.0
-	k8s.io/api v0.29.8
-	k8s.io/apimachinery v0.29.8
-	k8s.io/client-go v0.29.8
-	k8s.io/component-base v0.29.8
+	k8s.io/api v0.29.7
+	k8s.io/apimachinery v0.29.7
+	k8s.io/client-go v0.29.7
+	k8s.io/component-base v0.29.7
 	k8s.io/klog/v2 v2.110.1
-	k8s.io/utils v0.0.0-20231127182322-b307cd553661
-	sigs.k8s.io/controller-runtime v0.17.6
+	k8s.io/utils v0.0.0-20230726121419-3b25d923346b
+	sigs.k8s.io/controller-runtime v0.16.6
 	sigs.k8s.io/yaml v1.4.0
 )
 
 require (
 	github.com/beorn7/perks v1.0.1 // indirect
-	github.com/cespare/xxhash/v2 v2.3.0 // indirect
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
 	github.com/evanphx/json-patch v5.6.0+incompatible // indirect
@@ -47,28 +47,27 @@ require (
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/klauspost/compress v1.17.9 // indirect
-	github.com/kylelemons/godebug v1.1.0 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
-	github.com/prometheus/client_model v0.6.1 // indirect
-	github.com/prometheus/common v0.55.0 // indirect
-	github.com/prometheus/procfs v0.15.1 // indirect
+	github.com/prometheus/client_model v0.5.0 // indirect
+	github.com/prometheus/common v0.48.0 // indirect
+	github.com/prometheus/procfs v0.12.0 // indirect
 	github.com/spf13/cobra v1.7.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
 	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
-	golang.org/x/net v0.28.0 // indirect
-	golang.org/x/oauth2 v0.21.0 // indirect
-	golang.org/x/sys v0.24.0 // indirect
-	golang.org/x/term v0.23.0 // indirect
-	golang.org/x/text v0.17.0 // indirect
+	golang.org/x/net v0.27.0 // indirect
+	golang.org/x/oauth2 v0.16.0 // indirect
+	golang.org/x/sys v0.22.0 // indirect
+	golang.org/x/term v0.22.0 // indirect
+	golang.org/x/text v0.16.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
-	google.golang.org/protobuf v1.34.2 // indirect
+	google.golang.org/appengine v1.6.7 // indirect
+	google.golang.org/protobuf v1.34.1 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index 8bd92241..b656ed1b 100644
--- a/go.sum
+++ b/go.sum
@@ -1,7 +1,7 @@
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
-github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -33,6 +33,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
@@ -43,14 +44,14 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA=
-github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg=
+github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
 github.com/google/safetext v0.0.0-20230106111101-7156a760e523 h1:i4NsbmB9pD5+Ggp5GZKyvYY6MkjvPE8CIMlkvXFF8gA=
 github.com/google/safetext v0.0.0-20230106111101-7156a760e523/go.mod h1:mJNEy0r5YPHC7ChQffpOszlGB4L1iqjXWpIEKcFpr9s=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/gophercloud/gophercloud/v2 v2.1.0 h1:91p6c+uMckXyx39nSIYjDirDBnPVFQq0q1njLNPX+NY=
-github.com/gophercloud/gophercloud/v2 v2.1.0/go.mod h1:f2hMRC7Kakbv5vM7wSGHrIPZh6JZR60GVHryJlF/K44=
+github.com/gophercloud/gophercloud/v2 v2.0.0 h1:iH0x0Ji79a/ULzmq95fvOBAyie7+M+wUAEu+JrRMsCk=
+github.com/gophercloud/gophercloud/v2 v2.0.0/go.mod h1:ZKbcGNjxFTSaP5wlvtLDdsppllD/UGGvXBPqcjeqA8Y=
 github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
 github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@@ -61,8 +62,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
-github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
@@ -70,8 +69,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
-github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -81,22 +78,22 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo=
-github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
-github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
-github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
+github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
+github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4=
-github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
-github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
-github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
-github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
+github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
+github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
+github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
+github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
+github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
+github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
+github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -131,43 +128,47 @@ golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbR
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
-golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
+golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
+golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=
+golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
-golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
-golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
+golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
+golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
+golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
-golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
+golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
 golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
-golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
+golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
+golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
 gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
-google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
+google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -180,24 +181,24 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.29.8 h1:ZBKg9clWnIGtQ5yGhNwMw2zyyrsIAQaXhZACcYNflQE=
-k8s.io/api v0.29.8/go.mod h1:XlGIpmpzKGrtVca7GlgNryZJ19SvQdI808NN7fy1SgQ=
+k8s.io/api v0.29.7 h1:Q2/thp7YYESgy0MGzxT9RvA/6doLJHBXSFH8GGLxSbc=
+k8s.io/api v0.29.7/go.mod h1:mPimdbyuIjwoLtBEVIGVUYb4BKOE+44XHt/n4IqKsLA=
 k8s.io/apiextensions-apiserver v0.29.3 h1:9HF+EtZaVpFjStakF4yVufnXGPRppWFEQ87qnO91YeI=
 k8s.io/apiextensions-apiserver v0.29.3/go.mod h1:po0XiY5scnpJfFizNGo6puNU6Fq6D70UJY2Cb2KwAVc=
-k8s.io/apimachinery v0.29.8 h1:uBHc9WuKiTHClIspJqtR84WNpG0aOGn45HWqxgXkk8Y=
-k8s.io/apimachinery v0.29.8/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
-k8s.io/client-go v0.29.8 h1:QMRKcIzqE/qawknXcsi51GdIAYN8UP39S/M5KnFu/J0=
-k8s.io/client-go v0.29.8/go.mod h1:ZzrAAVrqO2jVXMb8My/jTke8n0a/mIynnA3y/1y1UB0=
-k8s.io/component-base v0.29.8 h1:4LJ94/eOJpDFZFbGbRH4CEyk29a7PZr8noVe9tBJUUY=
-k8s.io/component-base v0.29.8/go.mod h1:FYOQSsKgh9/+FNleq8m6cXH2Cq8fNiUnJzDROowLaqU=
+k8s.io/apimachinery v0.29.7 h1:ICXzya58Q7hyEEfnTrbmdfX1n1schSepX2KUfC2/ykc=
+k8s.io/apimachinery v0.29.7/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
+k8s.io/client-go v0.29.7 h1:vTtiFrGBKlcBhxaeZC4eDrqui1e108nsTyue/KU63IY=
+k8s.io/client-go v0.29.7/go.mod h1:69BvVqdRozgR/9TP45u/oO0tfrdbP+I8RqrcCJQshzg=
+k8s.io/component-base v0.29.7 h1:zXLJvZjvvDWdYmZCwZYk95E1Fd2oRXUz71mQukkRk5I=
+k8s.io/component-base v0.29.7/go.mod h1:ddLTpIrjazaRI1EG83M41GNcYEAdskuQmx4JOOSXCOg=
 k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
 k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/controller-runtime v0.17.6 h1:12IXsozEsIXWAMRpgRlYS1jjAHQXHtWEOMdULh3DbEw=
-sigs.k8s.io/controller-runtime v0.17.6/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY=
+k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
+k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/controller-runtime v0.16.6 h1:FiXwTuFF5ZJKmozfP2Z0j7dh6kmxP4Ou1KLfxgKKC3I=
+sigs.k8s.io/controller-runtime v0.16.6/go.mod h1:+dQzkZxnylD0u49e0a+7AR+vlibEBaThmPca7lTyUsI=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
diff --git a/hack/generate.sh b/hack/generate.sh
index 173ab254..2ab52ffc 100755
--- a/hack/generate.sh
+++ b/hack/generate.sh
@@ -25,7 +25,6 @@ if [ "${IS_CONTAINER}" != "false" ]; then
 
 else
     "${CONTAINER_RUNTIME}" run --rm \
-        --pull=always \
         --env IS_CONTAINER=TRUE \
         --env DEPLOY_KERNEL_URL=http://172.22.0.1/images/ironic-python-agent.kernel \
         --env DEPLOY_RAMDISK_URL=http://172.22.0.1/images/ironic-python-agent.initramfs \
@@ -34,5 +33,6 @@ else
         --entrypoint sh \
         --workdir "${WORKDIR}" \
         quay.io/metal3-io/basic-checks:golang-1.22 \
+        --pull=always \
         "${WORKDIR}"/hack/generate.sh "$@"
 fi
diff --git a/hack/gomod.sh b/hack/gomod.sh
index 4ac5ede8..51144bb6 100755
--- a/hack/gomod.sh
+++ b/hack/gomod.sh
@@ -37,11 +37,11 @@ if [ "${IS_CONTAINER}" != "false" ]; then
 
 else
     "${CONTAINER_RUNTIME}" run --rm \
-        --pull=always \
         --env IS_CONTAINER=TRUE \
-        --volume "${PWD}:${WORKDIR}:ro,z" \
+        --volume "${PWD}:{WORKDIR}:ro,z" \
         --entrypoint sh \
         --workdir "${WORKDIR}" \
         quay.io/metal3-io/basic-checks:golang-1.22 \
+        --pull=always \
         "${WORKDIR}"/hack/gomod.sh "$@"
 fi
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index c24b0f05..79aa5300 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -53,7 +53,7 @@ require (
 	k8s.io/apimachinery v0.27.16 // indirect
 	k8s.io/klog/v2 v2.90.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
-	k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect
+	k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 	sigs.k8s.io/kustomize/api v0.17.3 // indirect
 	sigs.k8s.io/kustomize/cmd/config v0.14.2 // indirect
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index eb686cdf..4506dda9 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -180,8 +180,8 @@ k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
 k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
+k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 sigs.k8s.io/controller-tools v0.12.1 h1:GyQqxzH5wksa4n3YDIJdJJOopztR5VDM+7qsyg5yE4U=
 sigs.k8s.io/controller-tools v0.12.1/go.mod h1:rXlpTfFHZMpZA8aGq9ejArgZiieHd+fkk/fTatY8A2M=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
diff --git a/hack/verify-release.sh b/hack/verify-release.sh
index 65a74af2..0c02e0ef 100755
--- a/hack/verify-release.sh
+++ b/hack/verify-release.sh
@@ -639,7 +639,7 @@ _mutate_gomod_files_for_osv_scanner()
         <(_get_golang_version_from_dockerfile)
 
     for modfile in **/go.mod; do
-        sed -i.bak -e "s/^go .*$/go ${tag}/" "${modfile}"
+        sed -i.bak -e "s/^go [[:digit:]]\.[[:digit:]]\+/go ${tag}/" "${modfile}"
     done
 }
 


Test patch:
diff --git a/.github/workflows/e2e-fixture-test.yml b/.github/workflows/e2e-fixture-test.yml
index 041fe7b0..6c36511f 100644
--- a/.github/workflows/e2e-fixture-test.yml
+++ b/.github/workflows/e2e-fixture-test.yml
@@ -40,7 +40,7 @@ jobs:
       run: make test-e2e
 
     - name: Upload artifacts
-      uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
+      uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029 # v4.3.5
       with:
         name: artifacts-fixture.tar.gz
         path: test/e2e/_artifacts
diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml
index 96f95cf1..46a0c9e8 100644
--- a/.github/workflows/e2e-test.yml
+++ b/.github/workflows/e2e-test.yml
@@ -46,7 +46,7 @@ jobs:
 
     - name: Upload artifacts
       if: ${{ !cancelled() }}
-      uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
+      uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029 # v4.3.5
       with:
         name: artifacts-${{ inputs.bmc-protocol }}.tar.gz
         path: test/e2e/_artifacts
diff --git a/controllers/metal3.io/baremetalhost_controller_test.go b/controllers/metal3.io/baremetalhost_controller_test.go
index e0b5eba0..cba36eb4 100644
--- a/controllers/metal3.io/baremetalhost_controller_test.go
+++ b/controllers/metal3.io/baremetalhost_controller_test.go
@@ -37,10 +37,6 @@ const (
 )
 
 func newSecret(name string, data map[string]string) *corev1.Secret {
-	return newSecretInNamespace(name, namespace, data)
-}
-
-func newSecretInNamespace(name, namespace string, data map[string]string) *corev1.Secret {
 	secretData := make(map[string][]byte)
 	for k, v := range data {
 		secretData[k] = []byte(base64.StdEncoding.EncodeToString([]byte(v)))
diff --git a/controllers/metal3.io/host_config_data_test.go b/controllers/metal3.io/host_config_data_test.go
index f7d9ac4a..dd3e4ac9 100644
--- a/controllers/metal3.io/host_config_data_test.go
+++ b/controllers/metal3.io/host_config_data_test.go
@@ -323,54 +323,6 @@ func TestProvisionWithHostConfig(t *testing.T) {
 			ExpectedNetworkData: "",
 			ErrNetworkData:      true,
 		},
-		{
-			Scenario: "user-data secret in different namespace",
-			Host: newHost("host-user-data",
-				&metal3api.BareMetalHostSpec{
-					BMC: metal3api.BMCDetails{
-						Address:         "ipmi://192.168.122.1:6233",
-						CredentialsName: defaultSecretName,
-					},
-					UserData: &corev1.SecretReference{
-						Name:      "user-data",
-						Namespace: "other-namespace",
-					},
-				}),
-			UserDataSecret: newSecretInNamespace("user-data", "other-namespace", map[string]string{"userData": "somedata"}),
-			ErrUserData:    true,
-		},
-		{
-			Scenario: "meta-data secret in different namespace",
-			Host: newHost("host-user-data",
-				&metal3api.BareMetalHostSpec{
-					BMC: metal3api.BMCDetails{
-						Address:         "ipmi://192.168.122.1:6233",
-						CredentialsName: defaultSecretName,
-					},
-					MetaData: &corev1.SecretReference{
-						Name:      "meta-data",
-						Namespace: "other-namespace",
-					},
-				}),
-			NetworkDataSecret: newSecretInNamespace("meta-data", "other-namespace", map[string]string{"metaData": "key: value"}),
-			ErrMetaData:       true,
-		},
-		{
-			Scenario: "network-data secret in different namespace",
-			Host: newHost("host-user-data",
-				&metal3api.BareMetalHostSpec{
-					BMC: metal3api.BMCDetails{
-						Address:         "ipmi://192.168.122.1:6233",
-						CredentialsName: defaultSecretName,
-					},
-					NetworkData: &corev1.SecretReference{
-						Name:      "net-data",
-						Namespace: "other-namespace",
-					},
-				}),
-			NetworkDataSecret: newSecretInNamespace("net-data", "other-namespace", map[string]string{"networkData": "key: value"}),
-			ErrNetworkData:    true,
-		},
 	}
 
 	for _, tc := range testCases {
@@ -426,7 +378,7 @@ func TestProvisionWithHostConfig(t *testing.T) {
 			}
 
 			if actualMetaData != tc.ExpectedMetaData {
-				t.Fatal(fmt.Errorf("Failed to assert MetaData. Expected '%s' got '%s'", tc.ExpectedMetaData, actualMetaData))
+				t.Fatal(fmt.Errorf("Failed to assert MetaData. Expected '%s' got '%s'", actualMetaData, tc.ExpectedMetaData))
 			}
 		})
 	}
diff --git a/controllers/metal3.io/hostfirmwaresettings_test.go b/controllers/metal3.io/hostfirmwaresettings_test.go
index 8b7aa387..bd1d3abb 100644
--- a/controllers/metal3.io/hostfirmwaresettings_test.go
+++ b/controllers/metal3.io/hostfirmwaresettings_test.go
@@ -59,6 +59,9 @@ func getMockProvisioner(host *metal3api.BareMetalHost, settings metal3api.Settin
 
 func getSchema() *metal3api.FirmwareSchema {
 	schema := &metal3api.FirmwareSchema{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       "FirmwareSchema",
+			APIVersion: "metal3.io/v1alpha1"},
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      schemaName,
 			Namespace: hostNamespace,
diff --git a/hack/e2e/ensure_go.sh b/hack/e2e/ensure_go.sh
index 99c7e512..e772f7ef 100755
--- a/hack/e2e/ensure_go.sh
+++ b/hack/e2e/ensure_go.sh
@@ -2,7 +2,7 @@
 
 set -eux
 
-MINIMUM_GO_VERSION=go1.22.6
+MINIMUM_GO_VERSION=go1.22.5
 
 # Ensure the go tool exists and is a viable version, or installs it
 verify_go_version()
diff --git a/test/e2e/common.go b/test/e2e/common.go
index 26acc946..ef275aec 100644
--- a/test/e2e/common.go
+++ b/test/e2e/common.go
@@ -328,10 +328,8 @@ func (input *BuildAndApplyKustomizationInput) validate() error {
 // BuildAndApplyKustomization takes input from BuildAndApplyKustomizationInput. It builds the provided kustomization
 // and apply it to the cluster provided by clusterProxy.
 func BuildAndApplyKustomization(ctx context.Context, input *BuildAndApplyKustomizationInput) error {
+	Expect(input.validate()).To(Succeed())
 	var err error
-	if err = input.validate(); err != nil {
-		return err
-	}
 	kustomization := input.Kustomization
 	clusterProxy := input.ClusterProxy
 	manifest, err := BuildKustomizeManifest(kustomization)
diff --git a/test/go.mod b/test/go.mod
index dd209717..94f3b559 100644
--- a/test/go.mod
+++ b/test/go.mod
@@ -7,19 +7,19 @@ require (
 	github.com/dypflying/go-qcow2lib v1.0.0
 	github.com/metal3-io/baremetal-operator/apis v0.5.1
 	github.com/metal3-io/baremetal-operator/pkg/hardwareutils v0.5.1
-	github.com/onsi/ginkgo/v2 v2.20.2
-	github.com/onsi/gomega v1.34.2
+	github.com/onsi/ginkgo/v2 v2.19.0
+	github.com/onsi/gomega v1.34.1
 	github.com/pkg/errors v0.9.1
-	golang.org/x/crypto v0.27.0
+	golang.org/x/crypto v0.25.0
 	gopkg.in/yaml.v2 v2.4.0
-	k8s.io/api v0.29.8
-	k8s.io/apimachinery v0.29.8
+	k8s.io/api v0.29.7
+	k8s.io/apimachinery v0.29.7
 	k8s.io/klog/v2 v2.110.1
 	k8s.io/utils v0.0.0-20231127182322-b307cd553661
-	libvirt.org/go/libvirt v1.10006.0
-	sigs.k8s.io/cluster-api v1.7.5
-	sigs.k8s.io/cluster-api/test v1.7.5
-	sigs.k8s.io/controller-runtime v0.17.6
+	libvirt.org/go/libvirt v1.10003.0
+	sigs.k8s.io/cluster-api v1.7.4
+	sigs.k8s.io/cluster-api/test v1.7.4
+	sigs.k8s.io/controller-runtime v0.17.5
 	sigs.k8s.io/kustomize/api v0.17.3
 	sigs.k8s.io/kustomize/kyaml v0.17.2
 )
@@ -53,7 +53,7 @@ require (
 	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/go-errors/errors v1.4.2 // indirect
-	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
 	github.com/go-openapi/jsonreference v0.20.2 // indirect
@@ -69,7 +69,7 @@ require (
 	github.com/google/go-github/v53 v53.2.0 // indirect
 	github.com/google/go-querystring v1.1.0 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 // indirect
+	github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect
 	github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect
 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
 	github.com/google/uuid v1.6.0 // indirect
@@ -118,15 +118,15 @@ require (
 	go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
 	go.uber.org/multierr v1.11.0 // indirect
 	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
-	golang.org/x/mod v0.20.0 // indirect
-	golang.org/x/net v0.28.0 // indirect
+	golang.org/x/mod v0.19.0 // indirect
+	golang.org/x/net v0.27.0 // indirect
 	golang.org/x/oauth2 v0.18.0 // indirect
-	golang.org/x/sync v0.8.0 // indirect
-	golang.org/x/sys v0.25.0 // indirect
-	golang.org/x/term v0.24.0 // indirect
-	golang.org/x/text v0.18.0 // indirect
+	golang.org/x/sync v0.7.0 // indirect
+	golang.org/x/sys v0.22.0 // indirect
+	golang.org/x/term v0.22.0 // indirect
+	golang.org/x/text v0.16.0 // indirect
 	golang.org/x/time v0.5.0 // indirect
-	golang.org/x/tools v0.24.0 // indirect
+	golang.org/x/tools v0.23.0 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
 	google.golang.org/appengine v1.6.8 // indirect
 	google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
@@ -139,9 +139,9 @@ require (
 	gotest.tools/v3 v3.5.0 // indirect
 	k8s.io/apiextensions-apiserver v0.29.3 // indirect
 	k8s.io/apiserver v0.29.3 // indirect
-	k8s.io/client-go v0.29.8 // indirect
+	k8s.io/client-go v0.29.7 // indirect
 	k8s.io/cluster-bootstrap v0.29.3 // indirect
-	k8s.io/component-base v0.29.8 // indirect
+	k8s.io/component-base v0.29.7 // indirect
 	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
 	sigs.k8s.io/gateway-api v0.5.0 // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
diff --git a/test/go.sum b/test/go.sum
index 8a286a1c..f9fde56a 100644
--- a/test/go.sum
+++ b/test/go.sum
@@ -91,8 +91,8 @@ github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxI
 github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
@@ -148,8 +148,8 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA=
-github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg=
+github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
 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/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
@@ -214,10 +214,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
 github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
-github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
-github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
-github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
+github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
+github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
@@ -333,8 +333,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
-golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
+golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
+golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
@@ -344,8 +344,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
-golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
+golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -357,8 +357,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
-golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
+golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
+golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI=
 golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
@@ -368,8 +368,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -383,21 +383,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
-golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
+golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
-golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
+golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
+golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
-golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
+golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
 golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
 golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -409,8 +409,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
-golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
+golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
+golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -469,36 +469,36 @@ gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY=
 gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-k8s.io/api v0.29.8 h1:ZBKg9clWnIGtQ5yGhNwMw2zyyrsIAQaXhZACcYNflQE=
-k8s.io/api v0.29.8/go.mod h1:XlGIpmpzKGrtVca7GlgNryZJ19SvQdI808NN7fy1SgQ=
+k8s.io/api v0.29.7 h1:Q2/thp7YYESgy0MGzxT9RvA/6doLJHBXSFH8GGLxSbc=
+k8s.io/api v0.29.7/go.mod h1:mPimdbyuIjwoLtBEVIGVUYb4BKOE+44XHt/n4IqKsLA=
 k8s.io/apiextensions-apiserver v0.29.3 h1:9HF+EtZaVpFjStakF4yVufnXGPRppWFEQ87qnO91YeI=
 k8s.io/apiextensions-apiserver v0.29.3/go.mod h1:po0XiY5scnpJfFizNGo6puNU6Fq6D70UJY2Cb2KwAVc=
-k8s.io/apimachinery v0.29.8 h1:uBHc9WuKiTHClIspJqtR84WNpG0aOGn45HWqxgXkk8Y=
-k8s.io/apimachinery v0.29.8/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
+k8s.io/apimachinery v0.29.7 h1:ICXzya58Q7hyEEfnTrbmdfX1n1schSepX2KUfC2/ykc=
+k8s.io/apimachinery v0.29.7/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
 k8s.io/apiserver v0.29.3 h1:xR7ELlJ/BZSr2n4CnD3lfA4gzFivh0wwfNfz9L0WZcE=
 k8s.io/apiserver v0.29.3/go.mod h1:hrvXlwfRulbMbBgmWRQlFru2b/JySDpmzvQwwk4GUOs=
-k8s.io/client-go v0.29.8 h1:QMRKcIzqE/qawknXcsi51GdIAYN8UP39S/M5KnFu/J0=
-k8s.io/client-go v0.29.8/go.mod h1:ZzrAAVrqO2jVXMb8My/jTke8n0a/mIynnA3y/1y1UB0=
+k8s.io/client-go v0.29.7 h1:vTtiFrGBKlcBhxaeZC4eDrqui1e108nsTyue/KU63IY=
+k8s.io/client-go v0.29.7/go.mod h1:69BvVqdRozgR/9TP45u/oO0tfrdbP+I8RqrcCJQshzg=
 k8s.io/cluster-bootstrap v0.29.3 h1:DIMDZSN8gbFMy9CS2mAS2Iqq/fIUG783WN/1lqi5TF8=
 k8s.io/cluster-bootstrap v0.29.3/go.mod h1:aPAg1VtXx3uRrx5qU2jTzR7p1rf18zLXWS+pGhiqPto=
-k8s.io/component-base v0.29.8 h1:4LJ94/eOJpDFZFbGbRH4CEyk29a7PZr8noVe9tBJUUY=
-k8s.io/component-base v0.29.8/go.mod h1:FYOQSsKgh9/+FNleq8m6cXH2Cq8fNiUnJzDROowLaqU=
+k8s.io/component-base v0.29.7 h1:zXLJvZjvvDWdYmZCwZYk95E1Fd2oRXUz71mQukkRk5I=
+k8s.io/component-base v0.29.7/go.mod h1:ddLTpIrjazaRI1EG83M41GNcYEAdskuQmx4JOOSXCOg=
 k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
 k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
 k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
 k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI=
 k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-libvirt.org/go/libvirt v1.10006.0 h1:VzbLKReneWBIiplgOvZHxMiLLJ0HxAyp4MMPcYTHJjY=
-libvirt.org/go/libvirt v1.10006.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ=
+libvirt.org/go/libvirt v1.10003.0 h1:LEoawzuggD6IL5R/XtnBE8wWJx49i7UZ1HcB7p9glwE=
+libvirt.org/go/libvirt v1.10003.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0 h1:TgtAeesdhpm2SGwkQasmbeqDo8th5wOBA5h/AjTKA4I=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0/go.mod h1:VHVDI/KrK4fjnV61bE2g3sA7tiETLn8sooImelsCx3Y=
-sigs.k8s.io/cluster-api v1.7.5 h1:FNg2av2yX4eegJzoZAqV7VfhCKdbyl/I+8tuyhA8xLc=
-sigs.k8s.io/cluster-api v1.7.5/go.mod h1:V9ZhKLvQtsDODwjXOKgbitjyCmC71yMBwDcMyNNIov0=
-sigs.k8s.io/cluster-api/test v1.7.5 h1:aCDN/o2MMO3ZRkJb5F3K9QLH/dnI6AgUtKcG4F3bKes=
-sigs.k8s.io/cluster-api/test v1.7.5/go.mod h1:duCbyppQEogtpqA8PupIRX1O2b7qh6xrwrpFTexr1DY=
-sigs.k8s.io/controller-runtime v0.17.6 h1:12IXsozEsIXWAMRpgRlYS1jjAHQXHtWEOMdULh3DbEw=
-sigs.k8s.io/controller-runtime v0.17.6/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY=
+sigs.k8s.io/cluster-api v1.7.4 h1:gT9WGbLXKE19pNR6s/cTLRqK2G0EbwxxQrUrw7/w5P4=
+sigs.k8s.io/cluster-api v1.7.4/go.mod h1:V9ZhKLvQtsDODwjXOKgbitjyCmC71yMBwDcMyNNIov0=
+sigs.k8s.io/cluster-api/test v1.7.4 h1:yBeWaQoPcAbLMF/ddgz0IWJiFgfJe+QfZJ4QWexMVOw=
+sigs.k8s.io/cluster-api/test v1.7.4/go.mod h1:KbK8+zZEmSopCm6IGd9Vk+573sQ+HL6hnPvqelJEYi4=
+sigs.k8s.io/controller-runtime v0.17.5 h1:1FI9Lm7NiOOmBsgTV36/s2XrEFXnO2C4sbg/Zme72Rw=
+sigs.k8s.io/controller-runtime v0.17.5/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY=
 sigs.k8s.io/gateway-api v0.5.0 h1:ze+k9fJqvmL8s1t3e4q1ST8RnN+f09dEv+gfacahlAE=
 sigs.k8s.io/gateway-api v0.5.0/go.mod h1:x0AP6gugkFV8fC/oTlnOMU0pnmuzIR8LfIPRVUjxSqA=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=