Repository: metal3-io/baremetal-operator
Pull request #806 (2021-03-03 14:37:53)

update controller-runtime to v0.7
This PR updates to controller-runtime v0.7,
I needed to push this because on the installer project the providers ported to v0.7, but because baremetal-operator didn't then we hit a dependency problem when updating the installer dependencies, see openshift/installer#4700.

metal3-io-bot: Hi @Gal-Zaidman. Thanks for your PR.

I'm waiting for a [metal3-io](https://github.com/orgs/metal3-io/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://github.com/orgs/metal3-io/people) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=metal3-io%2Fbaremetal-operator).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

Gal-Zaidman: /assign @dhellmann @russellb
metal3-io-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/metal3-io/baremetal-operator/pull/806#" title="Author self-approved">Gal-Zaidman</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **maelk**
You can assign the PR to them by writing `/assign @maelk` in a comment when ready.

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/master/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":["maelk"]} -->
s3rj1k: @Gal-Zaidman I do not think that vendor is needed
metal3-io-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/metal3-io/baremetal-operator/pull/806#" title="Author self-approved">Gal-Zaidman</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **dhellmann**
You can assign the PR to them by writing `/assign @dhellmann` in a comment when ready.

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/master/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":["dhellmann"]} -->
Gal-Zaidman: > @Gal-Zaidman I do not think that vendor is needed

Thanks, I didn't know that you don't use vendor
dhellmann: It looks like the travis job has uncovered some API changes that we will have to make to the reconciler to support the new version of controller-runtime.

/cc @andfasano 
dhellmann: /ok-to-test
metal3-io-bot: @Gal-Zaidman: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367127824489517064) | `/test unit`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367127824489517071) | `/test unit`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367127824489517071) | `/test unit`
govet | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367127824489517058) | `/test govet`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367127824489517071) | `/test unit`
govet | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367127824489517058) | `/test govet`
golint | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367127824489517057) | `/test golint`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367127824489517071) | `/test unit`
golint | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367127824489517057) | `/test golint`
govet | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367127824489517069) | `/test govet`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367127824489517071) | `/test unit`
govet | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367127824489517069) | `/test govet`
golint | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367127824489517068) | `/test golint`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
Gal-Zaidman: > It looks like the travis job has uncovered some API changes that we will have to make to the reconciler to support the new version of controller-runtime.
> 
> /cc @andfasano

Made some minor changes to fit to the new API, I manged to build locally but please give that a good review because I don't know the project :)
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
govet | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367127824489517069) | `/test govet`
golint | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367127824489517068) | `/test golint`
unit | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367132355625488384) | `/test unit`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
govet | 5cd894b74b1cf1981a4a70d2c495e6173852827d | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367127824489517069) | `/test govet`
unit | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367132355625488384) | `/test unit`
golint | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367132355621294081) | `/test golint`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367132355625488384) | `/test unit`
golint | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367132355621294081) | `/test golint`
govet | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367132355629682690) | `/test govet`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
Gal-Zaidman: /hold

this is going to be bigger than I thought
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
golint | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367132355621294081) | `/test golint`
govet | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367132355629682690) | `/test govet`
unit | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367150599681871877) | `/test unit`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
golint | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367132355621294081) | `/test golint`
govet | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367132355629682690) | `/test govet`
unit | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367150599681871877) | `/test unit`
gomod | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/gomod/1367150599681871876) | `/test gomod`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
govet | 60b74ba6ecc4db13b7052c13c199762932c92912 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367132355629682690) | `/test govet`
unit | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367150599681871877) | `/test unit`
gomod | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/gomod/1367150599681871876) | `/test gomod`
golint | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367150599681871879) | `/test golint`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
govet | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367150599681871874) | `/test govet`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
golint | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367150599681871879) | `/test golint`
govet | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367150599681871874) | `/test govet`
unit | f4dc9284098f7cfbf04ea8e0262e1f152ac76648 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367151354631426055) | `/test unit`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
golint | 5763de4d938955462d35e9424b6929e8878093f6 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367150599681871879) | `/test golint`
unit | f4dc9284098f7cfbf04ea8e0262e1f152ac76648 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367151354631426055) | `/test unit`
govet | f4dc9284098f7cfbf04ea8e0262e1f152ac76648 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367151354631426050) | `/test govet`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @Gal-Zaidman: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
unit | f4dc9284098f7cfbf04ea8e0262e1f152ac76648 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/unit/1367151354631426055) | `/test unit`
govet | f4dc9284098f7cfbf04ea8e0262e1f152ac76648 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/govet/1367151354631426050) | `/test govet`
golint | f4dc9284098f7cfbf04ea8e0262e1f152ac76648 | [link](https://prow.apps.ci.metal3.io/view/gcs/metal3-prow-artifacts/pr-logs/pull/metal3-io_baremetal-operator/806/golint/1367151354631426056) | `/test golint`



<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
Gal-Zaidman: /unhold
dhellmann: /test-integration
dhellmann: These changes look ok.

/approve

@kashifest I see that CAPM3 has a dependency on 0.7.0 but a replace rule changing that to 0.5.14. Would this change allow us to update that repo, too?
metal3-io-bot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/metal3-io/baremetal-operator/pull/806#issuecomment-789899202" title="Approved">dhellmann</a>*, *<a href="https://github.com/metal3-io/baremetal-operator/pull/806#" title="Author self-approved">Gal-Zaidman</a>*

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

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

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

- ~~[OWNERS](https://github.com/metal3-io/baremetal-operator/blob/master/OWNERS)~~ [dhellmann]

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":[]} -->
kashifest: > These changes look ok.
> 
> /approve
> 
> @kashifest I see that CAPM3 has a dependency on 0.7.0 but a replace rule changing that to 0.5.14. Would this change allow us to update that repo, too?

@dhellmann If I recall correctly we had to add the replace more because CAPI v1a3 supports v0.5.14. @maelk @fmuyassarov do you remember if this was the case or not? 
kashifest: Soon CAPM3 would uplift controller runtime to v0.9+ to support CAPI v1a4 though as dsecribed here https://github.com/kubernetes-sigs/cluster-api/blob/master/docs/book/src/developer/providers/v1alpha3-to-v1alpha4.md. 
dhellmann: > Soon CAPM3 would uplift controller runtime to v0.9+ to support CAPI v1a4 though as dsecribed here https://github.com/kubernetes-sigs/cluster-api/blob/master/docs/book/src/developer/providers/v1alpha3-to-v1alpha4.md.

OK, that sounds good. I don't think there's an urgent need to do anything, I just thought if we had been blocked before and we were unblocked now we could address it. It sounds like that's not the case, so we can continue on as planned.
Gal-Zaidman: /test-integration
hardys: /test-integration
andfasano: /hold verifying that the reconcile loops are still handled correctly
andfasano: /hold cancel
/test-integration

@Gal-Zaidman can you please squash the commits?
Gal-Zaidman: > @Gal-Zaidman can you please squash the commits?

I usually like to keep the commits because it make more sense when looking at the PR but sure if you prefer it squashed :)
Gal-Zaidman: @andfasano Squshed
andfasano: > > @Gal-Zaidman can you please squash the commits?
> 
> I usually like to keep the commits because it make more sense when looking at the PR but sure if you prefer it squashed :)

Just because I thought it was ready for approval
andfasano: /test-integration
Gal-Zaidman: Any idea why the "test-integration" is failing? is this related to the PR or the test is broken?
Pushing for this since it is blocking the go mod update of the openshift installer
kashifest: /test-integration
kashifest: > Any idea why the "test-integration" is failing? is this related to the PR or the test is broken?
> Pushing for this since it is blocking the go mod update of the openshift installer

On the first glance it seems a PR related issue , here is what the log says :
```
attempting to acquire leader lease capm3-system/baremetal-operator...
{"level":"info","ts":1614963206.8097231,"logger":"controller-runtime.manager","msg":"starting metrics server","path":"/metrics"}
E0305 16:53:26.816090       1 leaderelection.go:329] error initially creating leader election record: leases.coordination.k8s.io is forbidden: User "system:serviceaccount:capm3-system:default" cannot create resource "leases" in API group "coordination.k8s.io" in the namespace "capm3-system"
E0305 16:53:29.513785       1 leaderelection.go:325] error retrieving resource lock capm3-system/baremetal-operator: leases.coordination.k8s.io "baremetal-operator" is forbidden: User "system:serviceaccount:capm3-system:default" cannot get resource "leases" in API group "coordination.k8s.io" in the namespace "capm3-system"
```

I am running it once more just to be sure its not a one time issue. 
fmuyassarov: > > Any idea why the "test-integration" is failing? is this related to the PR or the test is broken?
> > Pushing for this since it is blocking the go mod update of the openshift installer
> 
> On the first glance it seems a PR related issue , here is what the log says :
> 
> ```
> attempting to acquire leader lease capm3-system/baremetal-operator...
> {"level":"info","ts":1614963206.8097231,"logger":"controller-runtime.manager","msg":"starting metrics server","path":"/metrics"}
> E0305 16:53:26.816090       1 leaderelection.go:329] error initially creating leader election record: leases.coordination.k8s.io is forbidden: User "system:serviceaccount:capm3-system:default" cannot create resource "leases" in API group "coordination.k8s.io" in the namespace "capm3-system"
> E0305 16:53:29.513785       1 leaderelection.go:325] error retrieving resource lock capm3-system/baremetal-operator: leases.coordination.k8s.io "baremetal-operator" is forbidden: User "system:serviceaccount:capm3-system:default" cannot get resource "leases" in API group "coordination.k8s.io" in the namespace "capm3-system"
> ```
> 
> I am running it once more just to be sure its not a one time issue.

It seems related to RBAC permissions, I think write permission of leases resource is missing.
kashifest: @Gal-Zaidman the current run has also failed at the same location with same error. I believe @fmuyassarov  has identified the issues with the current version of the PR. 
Gal-Zaidman: @fmuyassarov I added it to:
- config/rbac/leader_election_role.yaml
- config/render/capm3.yaml
hope that is the current places, please refview
dhellmann: /test-integration
fmuyassarov: Hi @Gal-Zaidman ,
Sorry, I checked some docs, and indeed the change regarding [leader election](https://github.com/kubernetes-sigs/controller-runtime/releases/tag/v0.7.0) is needed, but only get isn't sufficient it seems. I also checked some other projects like [CAPI](https://github.com/kubernetes-sigs/cluster-api/commit/2c24281026929effac8af568f45ae0fda80fa1de) that also made the same change when upgrading controller runtime to 0.7 and seems we need also
```
  - list
  - watch
  - create
  - update
  - patch
  - delete
```
apart from GET. Would you mind please to add this so that we could re-run the CI one more?

Patch:
diff --git a/apis/metal3.io/v1alpha1/baremetalhost_types.go b/apis/metal3.io/v1alpha1/baremetalhost_types.go
index 634a6254..08c66f74 100644
--- a/apis/metal3.io/v1alpha1/baremetalhost_types.go
+++ b/apis/metal3.io/v1alpha1/baremetalhost_types.go
@@ -220,62 +220,6 @@ type BMCDetails struct {
 	DisableCertificateVerification bool `json:"disableCertificateVerification,omitempty"`
 }
 
-// HardwareRAIDVolume defines the desired configuration of volume in hardware RAID
-type HardwareRAIDVolume struct {
-	// 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.
-	// +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, volume name will be auto-generated.
-	// +kubebuilder:validation:MaxLength=64
-	Name string `json:"name,omitempty"`
-
-	// 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.
-	// +kubebuilder:validation:Minimum=1
-	NumberOfPhysicalDisks *int `json:"numberOfPhysicalDisks,omitempty"`
-}
-
-// SoftwareRAIDVolume defines the desired configuration of volume in software RAID
-type SoftwareRAIDVolume struct {
-	// 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;1+0.
-	// +kubebuilder:validation:Enum="0";"1";"1+0"
-	Level string `json:"level" required:"true"`
-
-	// A list of device hints, the number of items should be greater than or equal to 2.
-	// +kubebuilder:validation:MinItems=2
-	PhysicalDisks []RootDeviceHints `json:"physicalDisks,omitempty"`
-}
-
-// RAIDConfig contains the configuration that are required to config RAID in Bare Metal server
-type RAIDConfig struct {
-	// The list of logical disks for hardware RAID, if rootDeviceHints isn't used, first volume is root volume.
-	HardwareRAIDVolumes []HardwareRAIDVolume `json:"hardwareRAIDVolumes,omitempty"`
-
-	// The list of logical disks for software RAID, if rootDeviceHints isn't used, first volume is 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.
-	// +kubebuilder:validation:MaxItems=2
-	SoftwareRAIDVolumes []SoftwareRAIDVolume `json:"softwareRAIDVolumes,omitempty"`
-}
-
 // BareMetalHostSpec defines the desired state of BareMetalHost
 type BareMetalHostSpec struct {
 	// Important: Run "make generate manifests" to regenerate code
@@ -290,9 +234,6 @@ type BareMetalHostSpec struct {
 	// How do we connect to the BMC?
 	BMC BMCDetails `json:"bmc,omitempty"`
 
-	// RAID configuration for bare metal server
-	RAID *RAIDConfig `json:"raid,omitempty"`
-
 	// What is the name of the hardware profile for this host? It
 	// should only be necessary to set this when inspection cannot
 	// automatically determine the profile.
@@ -662,9 +603,6 @@ type ProvisionStatus struct {
 
 	// BootMode indicates the boot mode used to provision the node
 	BootMode BootMode `json:"bootMode,omitempty"`
-
-	// The Raid set by the user
-	RAID *RAIDConfig `json:"raid,omitempty"`
 }
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
diff --git a/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go b/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
index 5cb07ddb..499b596b 100644
--- a/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
@@ -125,11 +125,6 @@ func (in *BareMetalHostSpec) DeepCopyInto(out *BareMetalHostSpec) {
 		}
 	}
 	out.BMC = in.BMC
-	if in.RAID != nil {
-		in, out := &in.RAID, &out.RAID
-		*out = new(RAIDConfig)
-		(*in).DeepCopyInto(*out)
-	}
 	if in.RootDeviceHints != nil {
 		in, out := &in.RootDeviceHints, &out.RootDeviceHints
 		*out = new(RootDeviceHints)
@@ -286,36 +281,6 @@ func (in *HardwareDetails) DeepCopy() *HardwareDetails {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *HardwareRAIDVolume) DeepCopyInto(out *HardwareRAIDVolume) {
-	*out = *in
-	if in.SizeGibibytes != nil {
-		in, out := &in.SizeGibibytes, &out.SizeGibibytes
-		*out = new(int)
-		**out = **in
-	}
-	if in.Rotational != nil {
-		in, out := &in.Rotational, &out.Rotational
-		*out = new(bool)
-		**out = **in
-	}
-	if in.NumberOfPhysicalDisks != nil {
-		in, out := &in.NumberOfPhysicalDisks, &out.NumberOfPhysicalDisks
-		*out = new(int)
-		**out = **in
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HardwareRAIDVolume.
-func (in *HardwareRAIDVolume) DeepCopy() *HardwareRAIDVolume {
-	if in == nil {
-		return nil
-	}
-	out := new(HardwareRAIDVolume)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *HardwareSystemVendor) DeepCopyInto(out *HardwareSystemVendor) {
 	*out = *in
@@ -416,11 +381,6 @@ func (in *ProvisionStatus) DeepCopyInto(out *ProvisionStatus) {
 		*out = new(RootDeviceHints)
 		(*in).DeepCopyInto(*out)
 	}
-	if in.RAID != nil {
-		in, out := &in.RAID, &out.RAID
-		*out = new(RAIDConfig)
-		(*in).DeepCopyInto(*out)
-	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProvisionStatus.
@@ -433,35 +393,6 @@ func (in *ProvisionStatus) DeepCopy() *ProvisionStatus {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *RAIDConfig) DeepCopyInto(out *RAIDConfig) {
-	*out = *in
-	if in.HardwareRAIDVolumes != nil {
-		in, out := &in.HardwareRAIDVolumes, &out.HardwareRAIDVolumes
-		*out = make([]HardwareRAIDVolume, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.SoftwareRAIDVolumes != nil {
-		in, out := &in.SoftwareRAIDVolumes, &out.SoftwareRAIDVolumes
-		*out = make([]SoftwareRAIDVolume, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RAIDConfig.
-func (in *RAIDConfig) DeepCopy() *RAIDConfig {
-	if in == nil {
-		return nil
-	}
-	out := new(RAIDConfig)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *RebootAnnotationArguments) DeepCopyInto(out *RebootAnnotationArguments) {
 	*out = *in
@@ -497,33 +428,6 @@ func (in *RootDeviceHints) DeepCopy() *RootDeviceHints {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SoftwareRAIDVolume) DeepCopyInto(out *SoftwareRAIDVolume) {
-	*out = *in
-	if in.SizeGibibytes != nil {
-		in, out := &in.SizeGibibytes, &out.SizeGibibytes
-		*out = new(int)
-		**out = **in
-	}
-	if in.PhysicalDisks != nil {
-		in, out := &in.PhysicalDisks, &out.PhysicalDisks
-		*out = make([]RootDeviceHints, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SoftwareRAIDVolume.
-func (in *SoftwareRAIDVolume) DeepCopy() *SoftwareRAIDVolume {
-	if in == nil {
-		return nil
-	}
-	out := new(SoftwareRAIDVolume)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Storage) DeepCopyInto(out *Storage) {
 	*out = *in
diff --git a/config/crd/bases/metal3.io_baremetalhosts.yaml b/config/crd/bases/metal3.io_baremetalhosts.yaml
index de07e095..2c383682 100644
--- a/config/crd/bases/metal3.io_baremetalhosts.yaml
+++ b/config/crd/bases/metal3.io_baremetalhosts.yaml
@@ -179,106 +179,6 @@ spec:
               online:
                 description: Should the server be online?
                 type: boolean
-              raid:
-                description: RAID configuration for bare metal server
-                properties:
-                  hardwareRAIDVolumes:
-                    description: The list of logical disks for hardware RAID, if rootDeviceHints isn't used, first volume is root volume.
-                    items:
-                      description: HardwareRAIDVolume defines the desired configuration of volume in hardware RAID
-                      properties:
-                        level:
-                          description: 'RAID level for the logical disk. The following levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
-                          enum:
-                          - "0"
-                          - "1"
-                          - "2"
-                          - "5"
-                          - "6"
-                          - 1+0
-                          - 5+0
-                          - 6+0
-                          type: string
-                        name:
-                          description: Name of the volume. Should be unique within the Node. If not specified, volume name will be auto-generated.
-                          maxLength: 64
-                          type: string
-                        numberOfPhysicalDisks:
-                          description: Integer, number of physical disks to use for the logical disk. Defaults to minimum number of disks required for the particular RAID level.
-                          minimum: 1
-                          type: integer
-                        rotational:
-                          description: Select disks with only rotational or solid-state storage
-                          type: boolean
-                        sizeGibibytes:
-                          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:
-                      - level
-                      type: object
-                    type: array
-                  softwareRAIDVolumes:
-                    description: The list of logical disks for software RAID, if rootDeviceHints isn't used, first volume is 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.
-                    items:
-                      description: SoftwareRAIDVolume defines the desired configuration of volume in software RAID
-                      properties:
-                        level:
-                          description: 'RAID level for the logical disk. The following levels are supported: 0;1;1+0.'
-                          enum:
-                          - "0"
-                          - "1"
-                          - 1+0
-                          type: string
-                        physicalDisks:
-                          description: A list of device hints, the number of items should be greater than or equal to 2.
-                          items:
-                            description: RootDeviceHints holds the hints for specifying the storage location for the root filesystem for the image.
-                            properties:
-                              deviceName:
-                                description: A Linux device name like "/dev/vda". The hint must match the actual value exactly.
-                                type: string
-                              hctl:
-                                description: A SCSI bus address like 0:0:0:0. The hint must match the actual value exactly.
-                                type: string
-                              minSizeGigabytes:
-                                description: The minimum size of the device in Gigabytes.
-                                minimum: 0
-                                type: integer
-                              model:
-                                description: A vendor-specific device identifier. The hint can be a substring of the actual value.
-                                type: string
-                              rotational:
-                                description: True if the device should use spinning media, false otherwise.
-                                type: boolean
-                              serialNumber:
-                                description: Device serial number. The hint must match the actual value exactly.
-                                type: string
-                              vendor:
-                                description: The name of the vendor or manufacturer of the device. The hint can be a substring of the actual value.
-                                type: string
-                              wwn:
-                                description: Unique storage identifier. The hint must match the actual value exactly.
-                                type: string
-                              wwnVendorExtension:
-                                description: Unique vendor storage identifier. The hint must match the actual value exactly.
-                                type: string
-                              wwnWithExtension:
-                                description: Unique storage identifier with the vendor extension appended. The hint must match the actual value exactly.
-                                type: string
-                            type: object
-                          minItems: 2
-                          type: array
-                        sizeGibibytes:
-                          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:
-                      - level
-                      type: object
-                    maxItems: 2
-                    type: array
-                type: object
               rootDeviceHints:
                 description: Provide guidance about how to choose the device for the image being provisioned.
                 properties:
@@ -634,106 +534,6 @@ spec:
                     required:
                     - url
                     type: object
-                  raid:
-                    description: The Raid set by the user
-                    properties:
-                      hardwareRAIDVolumes:
-                        description: The list of logical disks for hardware RAID, if rootDeviceHints isn't used, first volume is root volume.
-                        items:
-                          description: HardwareRAIDVolume defines the desired configuration of volume in hardware RAID
-                          properties:
-                            level:
-                              description: 'RAID level for the logical disk. The following levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
-                              enum:
-                              - "0"
-                              - "1"
-                              - "2"
-                              - "5"
-                              - "6"
-                              - 1+0
-                              - 5+0
-                              - 6+0
-                              type: string
-                            name:
-                              description: Name of the volume. Should be unique within the Node. If not specified, volume name will be auto-generated.
-                              maxLength: 64
-                              type: string
-                            numberOfPhysicalDisks:
-                              description: Integer, number of physical disks to use for the logical disk. Defaults to minimum number of disks required for the particular RAID level.
-                              minimum: 1
-                              type: integer
-                            rotational:
-                              description: Select disks with only rotational or solid-state storage
-                              type: boolean
-                            sizeGibibytes:
-                              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:
-                          - level
-                          type: object
-                        type: array
-                      softwareRAIDVolumes:
-                        description: The list of logical disks for software RAID, if rootDeviceHints isn't used, first volume is 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.
-                        items:
-                          description: SoftwareRAIDVolume defines the desired configuration of volume in software RAID
-                          properties:
-                            level:
-                              description: 'RAID level for the logical disk. The following levels are supported: 0;1;1+0.'
-                              enum:
-                              - "0"
-                              - "1"
-                              - 1+0
-                              type: string
-                            physicalDisks:
-                              description: A list of device hints, the number of items should be greater than or equal to 2.
-                              items:
-                                description: RootDeviceHints holds the hints for specifying the storage location for the root filesystem for the image.
-                                properties:
-                                  deviceName:
-                                    description: A Linux device name like "/dev/vda". The hint must match the actual value exactly.
-                                    type: string
-                                  hctl:
-                                    description: A SCSI bus address like 0:0:0:0. The hint must match the actual value exactly.
-                                    type: string
-                                  minSizeGigabytes:
-                                    description: The minimum size of the device in Gigabytes.
-                                    minimum: 0
-                                    type: integer
-                                  model:
-                                    description: A vendor-specific device identifier. The hint can be a substring of the actual value.
-                                    type: string
-                                  rotational:
-                                    description: True if the device should use spinning media, false otherwise.
-                                    type: boolean
-                                  serialNumber:
-                                    description: Device serial number. The hint must match the actual value exactly.
-                                    type: string
-                                  vendor:
-                                    description: The name of the vendor or manufacturer of the device. The hint can be a substring of the actual value.
-                                    type: string
-                                  wwn:
-                                    description: Unique storage identifier. The hint must match the actual value exactly.
-                                    type: string
-                                  wwnVendorExtension:
-                                    description: Unique vendor storage identifier. The hint must match the actual value exactly.
-                                    type: string
-                                  wwnWithExtension:
-                                    description: Unique storage identifier with the vendor extension appended. The hint must match the actual value exactly.
-                                    type: string
-                                type: object
-                              minItems: 2
-                              type: array
-                            sizeGibibytes:
-                              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:
-                          - level
-                          type: object
-                        maxItems: 2
-                        type: array
-                    type: object
                   rootDeviceHints:
                     description: The RootDevicehints set by the user
                     properties:
diff --git a/config/rbac/leader_election_role.yaml b/config/rbac/leader_election_role.yaml
index eaa79158..0ce1f3d7 100644
--- a/config/rbac/leader_election_role.yaml
+++ b/config/rbac/leader_election_role.yaml
@@ -30,3 +30,15 @@ rules:
   - events
   verbs:
   - create
+- apiGroups:
+  - coordination.k8s.io
+  resources:
+  - leases
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
diff --git a/config/render/capm3.yaml b/config/render/capm3.yaml
index 0bcb697e..b4342e28 100644
--- a/config/render/capm3.yaml
+++ b/config/render/capm3.yaml
@@ -177,106 +177,6 @@ spec:
               online:
                 description: Should the server be online?
                 type: boolean
-              raid:
-                description: RAID configuration for bare metal server
-                properties:
-                  hardwareRAIDVolumes:
-                    description: The list of logical disks for hardware RAID, if rootDeviceHints isn't used, first volume is root volume.
-                    items:
-                      description: HardwareRAIDVolume defines the desired configuration of volume in hardware RAID
-                      properties:
-                        level:
-                          description: 'RAID level for the logical disk. The following levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
-                          enum:
-                          - "0"
-                          - "1"
-                          - "2"
-                          - "5"
-                          - "6"
-                          - 1+0
-                          - 5+0
-                          - 6+0
-                          type: string
-                        name:
-                          description: Name of the volume. Should be unique within the Node. If not specified, volume name will be auto-generated.
-                          maxLength: 64
-                          type: string
-                        numberOfPhysicalDisks:
-                          description: Integer, number of physical disks to use for the logical disk. Defaults to minimum number of disks required for the particular RAID level.
-                          minimum: 1
-                          type: integer
-                        rotational:
-                          description: Select disks with only rotational or solid-state storage
-                          type: boolean
-                        sizeGibibytes:
-                          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:
-                      - level
-                      type: object
-                    type: array
-                  softwareRAIDVolumes:
-                    description: The list of logical disks for software RAID, if rootDeviceHints isn't used, first volume is 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.
-                    items:
-                      description: SoftwareRAIDVolume defines the desired configuration of volume in software RAID
-                      properties:
-                        level:
-                          description: 'RAID level for the logical disk. The following levels are supported: 0;1;1+0.'
-                          enum:
-                          - "0"
-                          - "1"
-                          - 1+0
-                          type: string
-                        physicalDisks:
-                          description: A list of device hints, the number of items should be greater than or equal to 2.
-                          items:
-                            description: RootDeviceHints holds the hints for specifying the storage location for the root filesystem for the image.
-                            properties:
-                              deviceName:
-                                description: A Linux device name like "/dev/vda". The hint must match the actual value exactly.
-                                type: string
-                              hctl:
-                                description: A SCSI bus address like 0:0:0:0. The hint must match the actual value exactly.
-                                type: string
-                              minSizeGigabytes:
-                                description: The minimum size of the device in Gigabytes.
-                                minimum: 0
-                                type: integer
-                              model:
-                                description: A vendor-specific device identifier. The hint can be a substring of the actual value.
-                                type: string
-                              rotational:
-                                description: True if the device should use spinning media, false otherwise.
-                                type: boolean
-                              serialNumber:
-                                description: Device serial number. The hint must match the actual value exactly.
-                                type: string
-                              vendor:
-                                description: The name of the vendor or manufacturer of the device. The hint can be a substring of the actual value.
-                                type: string
-                              wwn:
-                                description: Unique storage identifier. The hint must match the actual value exactly.
-                                type: string
-                              wwnVendorExtension:
-                                description: Unique vendor storage identifier. The hint must match the actual value exactly.
-                                type: string
-                              wwnWithExtension:
-                                description: Unique storage identifier with the vendor extension appended. The hint must match the actual value exactly.
-                                type: string
-                            type: object
-                          minItems: 2
-                          type: array
-                        sizeGibibytes:
-                          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:
-                      - level
-                      type: object
-                    maxItems: 2
-                    type: array
-                type: object
               rootDeviceHints:
                 description: Provide guidance about how to choose the device for the image being provisioned.
                 properties:
@@ -632,106 +532,6 @@ spec:
                     required:
                     - url
                     type: object
-                  raid:
-                    description: The Raid set by the user
-                    properties:
-                      hardwareRAIDVolumes:
-                        description: The list of logical disks for hardware RAID, if rootDeviceHints isn't used, first volume is root volume.
-                        items:
-                          description: HardwareRAIDVolume defines the desired configuration of volume in hardware RAID
-                          properties:
-                            level:
-                              description: 'RAID level for the logical disk. The following levels are supported: 0;1;2;5;6;1+0;5+0;6+0.'
-                              enum:
-                              - "0"
-                              - "1"
-                              - "2"
-                              - "5"
-                              - "6"
-                              - 1+0
-                              - 5+0
-                              - 6+0
-                              type: string
-                            name:
-                              description: Name of the volume. Should be unique within the Node. If not specified, volume name will be auto-generated.
-                              maxLength: 64
-                              type: string
-                            numberOfPhysicalDisks:
-                              description: Integer, number of physical disks to use for the logical disk. Defaults to minimum number of disks required for the particular RAID level.
-                              minimum: 1
-                              type: integer
-                            rotational:
-                              description: Select disks with only rotational or solid-state storage
-                              type: boolean
-                            sizeGibibytes:
-                              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:
-                          - level
-                          type: object
-                        type: array
-                      softwareRAIDVolumes:
-                        description: The list of logical disks for software RAID, if rootDeviceHints isn't used, first volume is 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.
-                        items:
-                          description: SoftwareRAIDVolume defines the desired configuration of volume in software RAID
-                          properties:
-                            level:
-                              description: 'RAID level for the logical disk. The following levels are supported: 0;1;1+0.'
-                              enum:
-                              - "0"
-                              - "1"
-                              - 1+0
-                              type: string
-                            physicalDisks:
-                              description: A list of device hints, the number of items should be greater than or equal to 2.
-                              items:
-                                description: RootDeviceHints holds the hints for specifying the storage location for the root filesystem for the image.
-                                properties:
-                                  deviceName:
-                                    description: A Linux device name like "/dev/vda". The hint must match the actual value exactly.
-                                    type: string
-                                  hctl:
-                                    description: A SCSI bus address like 0:0:0:0. The hint must match the actual value exactly.
-                                    type: string
-                                  minSizeGigabytes:
-                                    description: The minimum size of the device in Gigabytes.
-                                    minimum: 0
-                                    type: integer
-                                  model:
-                                    description: A vendor-specific device identifier. The hint can be a substring of the actual value.
-                                    type: string
-                                  rotational:
-                                    description: True if the device should use spinning media, false otherwise.
-                                    type: boolean
-                                  serialNumber:
-                                    description: Device serial number. The hint must match the actual value exactly.
-                                    type: string
-                                  vendor:
-                                    description: The name of the vendor or manufacturer of the device. The hint can be a substring of the actual value.
-                                    type: string
-                                  wwn:
-                                    description: Unique storage identifier. The hint must match the actual value exactly.
-                                    type: string
-                                  wwnVendorExtension:
-                                    description: Unique vendor storage identifier. The hint must match the actual value exactly.
-                                    type: string
-                                  wwnWithExtension:
-                                    description: Unique storage identifier with the vendor extension appended. The hint must match the actual value exactly.
-                                    type: string
-                                type: object
-                              minItems: 2
-                              type: array
-                            sizeGibibytes:
-                              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:
-                          - level
-                          type: object
-                        maxItems: 2
-                        type: array
-                    type: object
                   rootDeviceHints:
                     description: The RootDevicehints set by the user
                     properties:
@@ -842,6 +642,18 @@ rules:
   - events
   verbs:
   - create
+- apiGroups:
+  - coordination.k8s.io
+  resources:
+  - leases
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - update
+  - patch
+  - delete
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
diff --git a/controllers/metal3.io/baremetalhost_controller.go b/controllers/metal3.io/baremetalhost_controller.go
index e959bdf4..db1d1d16 100644
--- a/controllers/metal3.io/baremetalhost_controller.go
+++ b/controllers/metal3.io/baremetalhost_controller.go
@@ -31,7 +31,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
@@ -58,7 +57,6 @@ const (
 type BareMetalHostReconciler struct {
 	client.Client
 	Log                logr.Logger
-	Scheme             *runtime.Scheme
 	ProvisionerFactory provisioner.Factory
 }
 
@@ -85,7 +83,7 @@ func (info *reconcileInfo) publishEvent(reason, message string) {
 // +kubebuilder:rbac:groups="",resources=events,verbs=get;list;watch;create;update;patch
 
 // Reconcile handles changes to BareMetalHost resources
-func (r *BareMetalHostReconciler) Reconcile(request ctrl.Request) (result ctrl.Result, err error) {
+func (r *BareMetalHostReconciler) Reconcile(ctx context.Context, request ctrl.Request) (result ctrl.Result, err error) {
 
 	reconcileCounters.With(hostMetricLabels(request)).Inc()
 	defer func() {
@@ -98,7 +96,7 @@ func (r *BareMetalHostReconciler) Reconcile(request ctrl.Request) (result ctrl.R
 
 	// Fetch the BareMetalHost
 	host := &metal3v1alpha1.BareMetalHost{}
-	err = r.Get(context.TODO(), request.NamespacedName, host)
+	err = r.Get(ctx, request.NamespacedName, host)
 	if err != nil {
 		if k8serrors.IsNotFound(err) {
 			// Request object not found, could have been deleted after
@@ -134,7 +132,7 @@ func (r *BareMetalHostReconciler) Reconcile(request ctrl.Request) (result ctrl.R
 				t := metav1.Now()
 				host.Status.LastUpdated = &t
 			}
-			errStatus := r.Status().Update(context.TODO(), host)
+			errStatus := r.Status().Update(ctx, host)
 			if errStatus != nil {
 				return ctrl.Result{}, errors.Wrap(errStatus, "Could not restore status from annotation")
 			}
@@ -146,7 +144,7 @@ func (r *BareMetalHostReconciler) Reconcile(request ctrl.Request) (result ctrl.R
 		// already present. The annotation data will get outdated, so remove it.
 		if _, present := annotations[metal3v1alpha1.StatusAnnotation]; present {
 			delete(annotations, metal3v1alpha1.StatusAnnotation)
-			errStatus := r.Update(context.TODO(), host)
+			errStatus := r.Update(ctx, host)
 			if errStatus != nil {
 				return ctrl.Result{}, errors.Wrap(errStatus, "Could not delete status annotation")
 			}
@@ -168,7 +166,7 @@ func (r *BareMetalHostReconciler) Reconcile(request ctrl.Request) (result ctrl.R
 		)
 		host.Finalizers = append(host.Finalizers,
 			metal3v1alpha1.BareMetalHostFinalizer)
-		err := r.Update(context.TODO(), host)
+		err := r.Update(ctx, host)
 		if err != nil {
 			return ctrl.Result{}, errors.Wrap(err, "failed to add finalizer")
 		}
@@ -703,7 +701,6 @@ func (r *BareMetalHostReconciler) actionProvisioning(prov provisioner.Provisione
 // fields of a host.
 func clearHostProvisioningSettings(host *metal3v1alpha1.BareMetalHost) {
 	host.Status.Provisioning.RootDeviceHints = nil
-	host.Status.Provisioning.RAID = nil
 }
 
 func (r *BareMetalHostReconciler) actionDeprovisioning(prov provisioner.Provisioner, info *reconcileInfo) actionResult {
@@ -918,44 +915,6 @@ func saveHostProvisioningSettings(host *metal3v1alpha1.BareMetalHost) (dirty boo
 		dirty = true
 	}
 
-	// Copy RAID settings
-	if host.Spec.RAID != host.Status.Provisioning.RAID {
-		// If RAID settings is nil, remove saved settings,
-		// else check hardware RAID and software RAID.
-		if host.Spec.RAID == nil {
-			host.Status.Provisioning.RAID = nil
-			dirty = true
-		} else {
-			if host.Status.Provisioning.RAID == nil {
-				host.Status.Provisioning.RAID = &metal3v1alpha1.RAIDConfig{}
-				dirty = true
-			}
-			// If HardwareRAIDVolumes isn't nil, we will ignore SoftwareRAIDVolumes.
-			if len(host.Spec.RAID.HardwareRAIDVolumes) != 0 {
-				// If software RAID has been saved, remove it.
-				if len(host.Status.Provisioning.RAID.SoftwareRAIDVolumes) != 0 {
-					host.Status.Provisioning.RAID.SoftwareRAIDVolumes = nil
-				}
-				// Compare hardware RAID settings
-				if !reflect.DeepEqual(host.Spec.RAID.HardwareRAIDVolumes, host.Status.Provisioning.RAID.HardwareRAIDVolumes) {
-					host.Status.Provisioning.RAID.HardwareRAIDVolumes = host.Spec.RAID.HardwareRAIDVolumes
-					dirty = true
-				}
-			} else {
-				// If hardware RAID has been saved, remove it.
-				if len(host.Status.Provisioning.RAID.HardwareRAIDVolumes) != 0 {
-					host.Status.Provisioning.RAID.HardwareRAIDVolumes = nil
-					dirty = true
-				}
-				// Compare software RAID settings
-				if !reflect.DeepEqual(host.Spec.RAID.SoftwareRAIDVolumes, host.Status.Provisioning.RAID.SoftwareRAIDVolumes) {
-					host.Status.Provisioning.RAID.SoftwareRAIDVolumes = host.Spec.RAID.SoftwareRAIDVolumes
-					dirty = true
-				}
-			}
-		}
-	}
-
 	return
 }
 
@@ -1079,7 +1038,7 @@ func (r *BareMetalHostReconciler) setBMCCredentialsSecretOwner(request ctrl.Requ
 		return nil
 	}
 	reqLogger.Info("updating owner of secret")
-	err = controllerutil.SetControllerReference(host, secret, r.Scheme)
+	err = controllerutil.SetControllerReference(host, secret, r.Scheme())
 	if err != nil {
 		return &SaveBMCSecretOwnerError{message: fmt.Sprintf("cannot set owner: %q", err.Error())}
 	}
@@ -1121,12 +1080,12 @@ func (r *BareMetalHostReconciler) updateEventHandler(e event.UpdateEvent) bool {
 	}
 
 	//If the update increased the resource Generation then let's process it
-	if e.MetaNew.GetGeneration() != e.MetaOld.GetGeneration() {
+	if e.ObjectNew.GetGeneration() != e.ObjectOld.GetGeneration() {
 		return true
 	}
 
 	//Discard updates that did not increase the resource Generation (such as on Status.LastUpdated), except for the finalizers or annotations
-	if reflect.DeepEqual(e.MetaNew.GetFinalizers(), e.MetaOld.GetFinalizers()) && reflect.DeepEqual(e.MetaNew.GetAnnotations(), e.MetaOld.GetAnnotations()) {
+	if reflect.DeepEqual(e.ObjectNew.GetFinalizers(), e.ObjectOld.GetFinalizers()) && reflect.DeepEqual(e.ObjectNew.GetAnnotations(), e.ObjectOld.GetAnnotations()) {
 		return false
 	}
 
diff --git a/go.mod b/go.mod
index 7bcab03b..6a12dab0 100644
--- a/go.mod
+++ b/go.mod
@@ -3,19 +3,18 @@ module github.com/metal3-io/baremetal-operator
 go 1.16
 
 require (
-	github.com/go-logr/logr v0.2.1
-	github.com/go-logr/zapr v0.2.0 // indirect
+	github.com/go-logr/logr v0.3.0
 	github.com/golangci/golangci-lint v1.32.0
 	github.com/gophercloud/gophercloud v0.12.0
 	github.com/pkg/errors v0.9.1
 	github.com/prometheus/client_golang v1.7.1
 	github.com/stretchr/testify v1.6.1
-	go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738
+	go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5
 	k8s.io/api v0.20.0
 	k8s.io/apimachinery v0.20.0
 	k8s.io/client-go v0.20.0
 	k8s.io/utils v0.0.0-20201110183641-67b214c5f920
-	sigs.k8s.io/controller-runtime v0.6.2
+	sigs.k8s.io/controller-runtime v0.7.0
 	sigs.k8s.io/controller-tools v0.4.1
 	sigs.k8s.io/kustomize/kustomize/v3 v3.8.5
 	sigs.k8s.io/yaml v1.2.0
diff --git a/go.sum b/go.sum
index d697126b..ea5ef940 100644
--- a/go.sum
+++ b/go.sum
@@ -8,6 +8,7 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK
 cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
 cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
 cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
 cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
 cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0=
@@ -30,17 +31,21 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX
 github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
 github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
+github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
 github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ=
 github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
 github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
+github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
 github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
 github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0=
 github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
 github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
+github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
 github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
 github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
 github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
 github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
+github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
 github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
 github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
@@ -116,9 +121,11 @@ github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHo
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
@@ -180,9 +187,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
-github.com/go-logr/logr v0.2.1 h1:fV3MLmabKIZ383XifUjFSwcoGee0v9qgPp8wy5svibE=
-github.com/go-logr/logr v0.2.1/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
-github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
+github.com/go-logr/logr v0.3.0 h1:q4c+kbcR0d5rSurhBR8dIgieOaYpXtsdTYfx22Cu6rs=
+github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/zapr v0.2.0 h1:v6Ji8yBW77pva6NkJKQdHLAJKrIJKRHz0RXwPqCHSR4=
 github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU=
 github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
@@ -371,9 +377,9 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
-github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
-github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
+github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM=
+github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
 github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
 github.com/gophercloud/gophercloud v0.12.0 h1:mZrie07npp6ODiwHZolTicr5jV8Ogn43AvAsSMm6Ork=
@@ -429,8 +435,8 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
-github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc=
+github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk=
@@ -507,8 +513,9 @@ github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+tw
 github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/mbilski/exhaustivestruct v1.0.1 h1:FouWZOuwqC4YFgkbODefMA0lcuTLKArZLLpzKzjCMF0=
 github.com/mbilski/exhaustivestruct v1.0.1/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
@@ -525,6 +532,7 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -562,14 +570,16 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y=
 github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
+github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
+github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
+github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/paulmach/orb v0.1.3/go.mod h1:VFlX/8C+IQ1p6FTRRKzKoOPJnvEtA5G0Veuqwbu//Vk=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
@@ -612,7 +622,6 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
@@ -690,6 +699,7 @@ github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA=
 github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
+github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
@@ -750,8 +760,10 @@ github.com/yujunz/go-getter v1.4.1-lite h1:FhvNc94AXMZkfqUwfMKhnQEC9phkphSGdPTL7
 github.com/yujunz/go-getter v1.4.1-lite/go.mod h1:sbmqxXjyLunH1PkF3n7zSlnVeMvmYUuIl9ZVs/7NyCc=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0=
+go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5 h1:Gqga3zA9tdAcfqobUGjSoCob5L3f8Dt5EuOp3ihNZko=
+go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8=
 go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA=
@@ -764,13 +776,20 @@ go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWK
 go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
 go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
+go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
+go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM=
+go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -785,6 +804,7 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
@@ -810,6 +830,7 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
 golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
@@ -858,6 +879,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -920,6 +942,7 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY=
@@ -964,6 +987,7 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw
 golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -973,6 +997,7 @@ golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -999,6 +1024,7 @@ golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roY
 golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -1017,8 +1043,8 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0=
-gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
+gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k=
+gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -1033,8 +1059,9 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1071,6 +1098,7 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
 google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
@@ -1102,9 +1130,11 @@ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
+gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1116,48 +1146,52 @@ honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzE
 k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI=
 k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0=
 k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
-k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI=
+k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI=
 k8s.io/api v0.20.0 h1:WwrYoZNM1W1aQEbyl8HNG+oWGzLpZQBlcerS9BQw9yI=
 k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg=
 k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
-k8s.io/apiextensions-apiserver v0.18.6 h1:vDlk7cyFsDyfwn2rNAO2DbmUbvXy5yT5GE3rrqOzaMo=
-k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M=
+k8s.io/apiextensions-apiserver v0.19.2 h1:oG84UwiDsVDu7dlsGQs5GySmQHCzMhknfhFExJMz9tA=
+k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg=
 k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
 k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g=
 k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
-k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
+k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
 k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8=
 k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
-k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg=
+k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA=
 k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k=
 k8s.io/client-go v0.17.3/go.mod h1:cLXlTMtWHkuK4tD360KpWz2gG2KtdWEr/OT02i3emRQ=
 k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
-k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q=
+k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA=
 k8s.io/client-go v0.20.0 h1:Xlax8PKbZsjX4gFvNtt4F5MoJ1V5prDvCuoq9B7iax0=
 k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY=
 k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
-k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
+k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
 k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
-k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14=
+k8s.io/component-base v0.19.2 h1:jW5Y9RcZTb79liEhW3XDVTW7MuvEGP0tQZnfSX6/+gs=
+k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo=
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ=
 k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
 k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
-k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
+k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
 k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c=
 k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
 k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
-k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d h1:t8TAw9WgTLghti7RYkpPmqk4JtQ3+wcP5GgZqgWeWLQ=
@@ -1173,8 +1207,9 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
-sigs.k8s.io/controller-runtime v0.6.2 h1:jkAnfdTYBpFwlmBn3pS5HFO06SfxvnTZ1p5PeEF/zAA=
-sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0=
+sigs.k8s.io/controller-runtime v0.7.0 h1:bU20IBBEPccWz5+zXpLnpVsgBYxqclaHu1pVDl/gEt8=
+sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU=
 sigs.k8s.io/controller-tools v0.4.1 h1:VkuV0MxlRPmRu5iTgBZU4UxUX2LiR99n3sdQGRxZF4w=
 sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU=
 sigs.k8s.io/kustomize/api v0.6.3 h1:CX9Vot48rKRYZXzDkYJ7aJ4pEfjl8u7W8MPysbfYWps=
@@ -1189,6 +1224,7 @@ sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb
 sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
diff --git a/hack/install-controller-gen.sh b/hack/install-controller-gen.sh
index 338010e2..60e7c2b0 100755
--- a/hack/install-controller-gen.sh
+++ b/hack/install-controller-gen.sh
@@ -2,10 +2,6 @@
 
 set -ex
 
-if [ -z "${GOPATH:-}" ]; then
-    eval "$(go env | grep GOPATH)"
-fi
-
 OUTPUT=bin/controller-gen
 
 # Check for a vendor directory if any downstream forks use that dependency
diff --git a/hack/install-golangci-lint.sh b/hack/install-golangci-lint.sh
index f905154f..fafe8074 100755
--- a/hack/install-golangci-lint.sh
+++ b/hack/install-golangci-lint.sh
@@ -2,10 +2,6 @@
 
 set -ex
 
-if [ -z "${GOPATH:-}" ]; then
-    eval "$(go env | grep GOPATH)"
-fi
-
 OUTPUT=bin/golangci-lint
 
 # Check for a vendor directory if any downstream forks use that dependency
diff --git a/main.go b/main.go
index 839f780b..0e982b59 100644
--- a/main.go
+++ b/main.go
@@ -143,7 +143,6 @@ func main() {
 	if err = (&metal3iocontroller.BareMetalHostReconciler{
 		Client:             mgr.GetClient(),
 		Log:                ctrl.Log.WithName("controllers").WithName("BareMetalHost"),
-		Scheme:             mgr.GetScheme(),
 		ProvisionerFactory: provisionerFactory,
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "BareMetalHost")
diff --git a/pkg/provisioner/demo/demo.go b/pkg/provisioner/demo/demo.go
index f6bd2614..02d9b06d 100644
--- a/pkg/provisioner/demo/demo.go
+++ b/pkg/provisioner/demo/demo.go
@@ -4,14 +4,14 @@ import (
 	"time"
 
 	"github.com/go-logr/logr"
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 	"github.com/metal3-io/baremetal-operator/pkg/bmc"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner"
 )
 
-var log = logf.Log.WithName("provisioner").WithName("demo")
+var log = logz.New().WithName("provisioner").WithName("demo")
 var deprovisionRequeueDelay = time.Second * 10
 var provisionRequeueDelay = time.Second * 10
 
diff --git a/pkg/provisioner/empty/empty.go b/pkg/provisioner/empty/empty.go
index 19fc939b..a12826ca 100644
--- a/pkg/provisioner/empty/empty.go
+++ b/pkg/provisioner/empty/empty.go
@@ -1,14 +1,14 @@
 package empty
 
 import (
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 	"github.com/metal3-io/baremetal-operator/pkg/bmc"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner"
 )
 
-var log = logf.Log.WithName("provisioner").WithName("empty")
+var log = logz.New().WithName("provisioner").WithName("empty")
 
 // Provisioner implements the provisioning.Provisioner interface
 type emptyProvisioner struct {
diff --git a/pkg/provisioner/fixture/fixture.go b/pkg/provisioner/fixture/fixture.go
index 35894999..109150ad 100644
--- a/pkg/provisioner/fixture/fixture.go
+++ b/pkg/provisioner/fixture/fixture.go
@@ -4,14 +4,14 @@ import (
 	"time"
 
 	"github.com/go-logr/logr"
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 	"github.com/metal3-io/baremetal-operator/pkg/bmc"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner"
 )
 
-var log = logf.Log.WithName("provisioner").WithName("fixture")
+var log = logz.New().WithName("provisioner").WithName("fixture")
 var deprovisionRequeueDelay = time.Second * 10
 var provisionRequeueDelay = time.Second * 10
 
diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go
index 12e364bc..9638a394 100644
--- a/pkg/provisioner/ironic/ironic.go
+++ b/pkg/provisioner/ironic/ironic.go
@@ -13,7 +13,7 @@ import (
 	"github.com/gophercloud/gophercloud/openstack/baremetal/v1/ports"
 	"github.com/gophercloud/gophercloud/openstack/baremetalintrospection/v1/introspection"
 	"github.com/pkg/errors"
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 	"sigs.k8s.io/yaml"
 
 	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
@@ -26,7 +26,7 @@ import (
 )
 
 var (
-	log                       = logf.Log.WithName("provisioner").WithName("ironic")
+	log                       = logz.New().WithName("provisioner").WithName("ironic")
 	deprovisionRequeueDelay   = time.Second * 10
 	provisionRequeueDelay     = time.Second * 10
 	powerRequeueDelay         = time.Second * 10
@@ -1220,35 +1220,14 @@ func (p *ironicProvisioner) ironicHasSameImage(ironicNode *nodes.Node) (sameImag
 	return sameImage
 }
 
-func (p *ironicProvisioner) buildManualCleaningSteps() (cleanSteps []nodes.CleanStep, err error) {
-	// Build raid clean steps
-	if p.bmcAccess.RAIDInterface() != "" {
-		cleanSteps = append(cleanSteps, BuildRAIDCleanSteps(p.host.Status.Provisioning.RAID)...)
-	} else if p.host.Status.Provisioning.RAID != nil {
-		return nil, fmt.Errorf("RAID settings are defined, but the node's driver %s does not support RAID", p.bmcAccess.Driver())
-	}
-
+func (p *ironicProvisioner) buildManualCleaningSteps() (cleanSteps []nodes.CleanStep) {
 	// TODO: Add manual cleaning steps for host configuration
 
 	return
 }
 
 func (p *ironicProvisioner) startManualCleaning(ironicNode *nodes.Node) (success bool, result provisioner.Result, err error) {
-	if p.bmcAccess.RAIDInterface() != "" {
-		// Set raid configuration
-		err = setTargetRAIDCfg(p, ironicNode)
-		if err != nil {
-			result, err = transientError(err)
-			return
-		}
-	}
-
-	// Build manual clean steps
-	cleanSteps, err := p.buildManualCleaningSteps()
-	if err != nil {
-		result, err = operationFailed(err.Error())
-		return
-	}
+	cleanSteps := p.buildManualCleaningSteps()
 
 	// Start manual clean
 	if len(cleanSteps) != 0 {
@@ -1281,13 +1260,7 @@ func (p *ironicProvisioner) Prepare(unprepared bool) (result provisioner.Result,
 
 	switch nodes.ProvisionState(ironicNode.ProvisionState) {
 	case nodes.Available:
-		var cleanSteps []nodes.CleanStep
-		cleanSteps, err = p.buildManualCleaningSteps()
-		if err != nil {
-			result, err = operationFailed(err.Error())
-			return
-		}
-		if unprepared && len(cleanSteps) != 0 {
+		if unprepared && len(p.buildManualCleaningSteps()) != 0 {
 			result, err = p.changeNodeProvisionState(
 				ironicNode,
 				nodes.ProvisionStateOpts{Target: nodes.TargetManage},
diff --git a/pkg/provisioner/ironic/raid.go b/pkg/provisioner/ironic/raid.go
deleted file mode 100644
index 2acefeb7..00000000
--- a/pkg/provisioner/ironic/raid.go
+++ /dev/null
@@ -1,173 +0,0 @@
-package ironic
-
-import (
-	"fmt"
-
-	"github.com/gophercloud/gophercloud/openstack/baremetal/v1/nodes"
-
-	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
-	"github.com/metal3-io/baremetal-operator/pkg/provisioner/ironic/devicehints"
-
-	"github.com/pkg/errors"
-)
-
-// setTargetRAIDCfg set the RAID settings to the ironic Node for RAID configuration steps
-func setTargetRAIDCfg(p *ironicProvisioner, ironicNode *nodes.Node) (err error) {
-	var logicalDisks []nodes.LogicalDisk
-
-	// Build target for RAID configuration steps
-	logicalDisks, err = BuildTargetRAIDCfg(p.host.Status.Provisioning.RAID)
-	if len(logicalDisks) == 0 || err != nil {
-		return
-	}
-
-	// set root volume
-	if p.host.Status.Provisioning.RootDeviceHints == nil {
-		logicalDisks[0].IsRootVolume = new(bool)
-		*logicalDisks[0].IsRootVolume = true
-	} else {
-		p.log.Info("rootDeviceHints is used, the first volume of raid will not be set to root")
-	}
-
-	// Set target for RAID configuration steps
-	return nodes.SetRAIDConfig(
-		p.client,
-		ironicNode.UUID,
-		nodes.RAIDConfigOpts{LogicalDisks: logicalDisks},
-	).ExtractErr()
-}
-
-// BuildTargetRAIDCfg build RAID logical disks, this method doesn't set the root volume
-func BuildTargetRAIDCfg(raid *metal3v1alpha1.RAIDConfig) (logicalDisks []nodes.LogicalDisk, err error) {
-	// Deal possible panic
-	defer func() {
-		r := recover()
-		if r != nil {
-			err = fmt.Errorf("panic in build RAID settings: %v", r)
-		}
-	}()
-
-	if raid == nil {
-		return
-	}
-
-	// build logicalDisks
-	if len(raid.HardwareRAIDVolumes) != 0 {
-		logicalDisks, err = buildTargetHardwareRAIDCfg(raid.HardwareRAIDVolumes)
-	} else if len(raid.SoftwareRAIDVolumes) != 0 {
-		logicalDisks, err = buildTargetSoftwareRAIDCfg(raid.SoftwareRAIDVolumes)
-	}
-
-	return
-}
-
-// A private method to build hardware RAID disks
-func buildTargetHardwareRAIDCfg(volumes []metal3v1alpha1.HardwareRAIDVolume) (logicalDisks []nodes.LogicalDisk, err error) {
-	var (
-		logicalDisk    nodes.LogicalDisk
-		nameCheckFlags map[string]int = make(map[string]int)
-	)
-
-	if len(volumes) == 0 {
-		return
-	}
-
-	for index, volume := range volumes {
-		// Check volume's name
-		if volume.Name != "" {
-			i, exist := nameCheckFlags[volume.Name]
-			if exist {
-				return nil, errors.Errorf("the names(%s) of volume[%d] and volume[%d] are repeated", volume.Name, index, i)
-			}
-			nameCheckFlags[volume.Name] = index
-		}
-		// Build logicalDisk
-		logicalDisk = nodes.LogicalDisk{
-			SizeGB:     volume.SizeGibibytes,
-			RAIDLevel:  nodes.RAIDLevel(volume.Level),
-			VolumeName: volume.Name,
-		}
-		if volume.Rotational != nil {
-			if *volume.Rotational {
-				logicalDisk.DiskType = nodes.HDD
-			} else {
-				logicalDisk.DiskType = nodes.SSD
-			}
-		}
-		if volume.NumberOfPhysicalDisks != nil {
-			logicalDisk.NumberOfPhysicalDisks = *volume.NumberOfPhysicalDisks
-		}
-		// Add to logicalDisks
-		logicalDisks = append(logicalDisks, logicalDisk)
-	}
-
-	return
-}
-
-// A private method to build software RAID disks
-func buildTargetSoftwareRAIDCfg(volumes []metal3v1alpha1.SoftwareRAIDVolume) (logicalDisks []nodes.LogicalDisk, err error) {
-	var (
-		logicalDisk nodes.LogicalDisk
-	)
-
-	if len(volumes) == 0 {
-		return
-	}
-
-	if nodes.RAIDLevel(volumes[0].Level) != nodes.RAID1 {
-		return nil, errors.Errorf("the level in first volume of software raid must be RAID1")
-	}
-
-	for _, volume := range volumes {
-		// Build logicalDisk
-		logicalDisk = nodes.LogicalDisk{
-			SizeGB:     volume.SizeGibibytes,
-			RAIDLevel:  nodes.RAIDLevel(volume.Level),
-			Controller: "software",
-		}
-		// Build physical disks hint
-		for i := range volume.PhysicalDisks {
-			logicalDisk.PhysicalDisks = append(logicalDisk.PhysicalDisks, devicehints.MakeHintMap(&volume.PhysicalDisks[i]))
-		}
-		// Add to logicalDisks
-		logicalDisks = append(logicalDisks, logicalDisk)
-	}
-
-	return
-}
-
-// BuildRAIDCleanSteps build the clean steps for RAID configuration from BaremetalHost spec
-func BuildRAIDCleanSteps(raid *metal3v1alpha1.RAIDConfig) (cleanSteps []nodes.CleanStep) {
-	// Add ‘delete_configuration’ before ‘create_configuration’ to make sure
-	// that only the desired logical disks exist in the system after manual cleaning.
-	cleanSteps = append(
-		cleanSteps,
-		nodes.CleanStep{
-			Interface: "raid",
-			Step:      "delete_configuration",
-		},
-	)
-	// If not configure raid, only need to clear old configuration
-	if raid == nil || (len(raid.HardwareRAIDVolumes) == 0 && len(raid.SoftwareRAIDVolumes) == 0) {
-		return
-	}
-	if len(raid.HardwareRAIDVolumes) == 0 && len(raid.SoftwareRAIDVolumes) != 0 {
-		cleanSteps = append(
-			cleanSteps,
-			nodes.CleanStep{
-				Interface: "deploy",
-				Step:      "erase_devices_metadata",
-			},
-		)
-	}
-	// ‘create_configuration’ doesn’t remove existing disks. It is recommended
-	// that only the desired logical disks exist in the system after manual cleaning.
-	cleanSteps = append(
-		cleanSteps,
-		nodes.CleanStep{
-			Interface: "raid",
-			Step:      "create_configuration",
-		},
-	)
-	return
-}
diff --git a/tools/install_kustomize.sh b/tools/install_kustomize.sh
index 2f1c7ed3..931d3c3f 100755
--- a/tools/install_kustomize.sh
+++ b/tools/install_kustomize.sh
@@ -2,10 +2,6 @@
 
 set -ex
 
-if [ -z "${GOPATH:-}" ]; then
-    eval "$(go env | grep GOPATH)"
-fi
-
 OUTPUT=bin/kustomize
 
 # Check for a vendor directory if any downstream forks use that dependency


Test patch:
diff --git a/controllers/metal3.io/baremetalhost_controller_test.go b/controllers/metal3.io/baremetalhost_controller_test.go
index f8f4d50f..9fef7121 100644
--- a/controllers/metal3.io/baremetalhost_controller_test.go
+++ b/controllers/metal3.io/baremetalhost_controller_test.go
@@ -1,6 +1,7 @@
 package controllers
 
 import (
+	"context"
 	goctx "context"
 	"encoding/base64"
 	"encoding/json"
@@ -15,8 +16,6 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/types"
 
-	"k8s.io/client-go/kubernetes/scheme"
-
 	ctrl "sigs.k8s.io/controller-runtime"
 	fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/controller-runtime/pkg/event"
@@ -97,7 +96,6 @@ func newTestReconcilerWithFixture(fix *fixture.Fixture, initObjs ...runtime.Obje
 
 	return &BareMetalHostReconciler{
 		Client:             c,
-		Scheme:             scheme.Scheme,
 		ProvisionerFactory: fix.New,
 		Log:                ctrl.Log.WithName("controllers").WithName("BareMetalHost"),
 	}
@@ -128,7 +126,7 @@ func tryReconcile(t *testing.T, r *BareMetalHostReconciler, host *metal3v1alpha1
 			t.Fatal(fmt.Errorf("Exceeded 25 iterations"))
 		}
 
-		result, err := r.Reconcile(request)
+		result, err := r.Reconcile(context.Background(), request)
 
 		if err != nil {
 			t.Fatal(err)
@@ -1265,10 +1263,8 @@ func TestUpdateEventHandler(t *testing.T) {
 		{
 			name: "process-generation-change",
 			event: event.UpdateEvent{
-				ObjectOld: &metal3v1alpha1.BareMetalHost{},
-				ObjectNew: &metal3v1alpha1.BareMetalHost{},
-				MetaOld:   &metav1.ObjectMeta{Generation: 0},
-				MetaNew:   &metav1.ObjectMeta{Generation: 1},
+				ObjectOld: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{Generation: 0}},
+				ObjectNew: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{Generation: 1}},
 			},
 
 			expectedProcess: true,
@@ -1276,22 +1272,20 @@ func TestUpdateEventHandler(t *testing.T) {
 		{
 			name: "skip-if-same-generation-finalizers-and-annotations",
 			event: event.UpdateEvent{
-				ObjectOld: &metal3v1alpha1.BareMetalHost{},
-				ObjectNew: &metal3v1alpha1.BareMetalHost{},
-				MetaOld: &metav1.ObjectMeta{
+				ObjectOld: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation: 0,
 					Finalizers: []string{metal3v1alpha1.BareMetalHostFinalizer},
 					Annotations: map[string]string{
 						metal3v1alpha1.PausedAnnotation: "true",
 					},
-				},
-				MetaNew: &metav1.ObjectMeta{
+				}},
+				ObjectNew: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation: 0,
 					Finalizers: []string{metal3v1alpha1.BareMetalHostFinalizer},
 					Annotations: map[string]string{
 						metal3v1alpha1.PausedAnnotation: "true",
 					},
-				},
+				}},
 			},
 
 			expectedProcess: false,
@@ -1299,20 +1293,18 @@ func TestUpdateEventHandler(t *testing.T) {
 		{
 			name: "process-same-generation-annotations-change",
 			event: event.UpdateEvent{
-				ObjectOld: &metal3v1alpha1.BareMetalHost{},
-				ObjectNew: &metal3v1alpha1.BareMetalHost{},
-				MetaOld: &metav1.ObjectMeta{
+				ObjectOld: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation:  0,
 					Finalizers:  []string{metal3v1alpha1.BareMetalHostFinalizer},
 					Annotations: map[string]string{},
-				},
-				MetaNew: &metav1.ObjectMeta{
+				}},
+				ObjectNew: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation: 0,
 					Finalizers: []string{metal3v1alpha1.BareMetalHostFinalizer},
 					Annotations: map[string]string{
 						metal3v1alpha1.PausedAnnotation: "true",
 					},
-				},
+				}},
 			},
 
 			expectedProcess: true,
@@ -1320,22 +1312,20 @@ func TestUpdateEventHandler(t *testing.T) {
 		{
 			name: "process-same-generation-finalizers-change",
 			event: event.UpdateEvent{
-				ObjectOld: &metal3v1alpha1.BareMetalHost{},
-				ObjectNew: &metal3v1alpha1.BareMetalHost{},
-				MetaOld: &metav1.ObjectMeta{
+				ObjectOld: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation: 0,
 					Finalizers: []string{},
 					Annotations: map[string]string{
 						metal3v1alpha1.PausedAnnotation: "true",
 					},
-				},
-				MetaNew: &metav1.ObjectMeta{
+				}},
+				ObjectNew: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation: 0,
 					Finalizers: []string{metal3v1alpha1.BareMetalHostFinalizer},
 					Annotations: map[string]string{
 						metal3v1alpha1.PausedAnnotation: "true",
 					},
-				},
+				}},
 			},
 
 			expectedProcess: true,
@@ -1343,20 +1333,18 @@ func TestUpdateEventHandler(t *testing.T) {
 		{
 			name: "process-same-generation-finalizers-and-annotation-change",
 			event: event.UpdateEvent{
-				ObjectOld: &metal3v1alpha1.BareMetalHost{},
-				ObjectNew: &metal3v1alpha1.BareMetalHost{},
-				MetaOld: &metav1.ObjectMeta{
+				ObjectOld: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation:  0,
 					Finalizers:  []string{},
 					Annotations: map[string]string{},
-				},
-				MetaNew: &metav1.ObjectMeta{
+				}},
+				ObjectNew: &metal3v1alpha1.BareMetalHost{ObjectMeta: metav1.ObjectMeta{
 					Generation: 0,
 					Finalizers: []string{metal3v1alpha1.BareMetalHostFinalizer},
 					Annotations: map[string]string{
 						metal3v1alpha1.PausedAnnotation: "true",
 					},
-				},
+				}},
 			},
 
 			expectedProcess: true,
@@ -1384,408 +1372,3 @@ func TestErrorCountIncrementsAlways(t *testing.T) {
 		assert.Equal(t, before+1, b.Status.ErrorCount)
 	}
 }
-
-func TestUpdateRAID(t *testing.T) {
-	host := metal3v1alpha1.BareMetalHost{
-		Spec: metal3v1alpha1.BareMetalHostSpec{
-			HardwareProfile: "libvirt",
-			RootDeviceHints: &metal3v1alpha1.RootDeviceHints{
-				DeviceName:         "userd_devicename",
-				HCTL:               "1:2:3:4",
-				Model:              "userd_model",
-				Vendor:             "userd_vendor",
-				SerialNumber:       "userd_serial",
-				MinSizeGigabytes:   40,
-				WWN:                "userd_wwn",
-				WWNWithExtension:   "userd_with_extension",
-				WWNVendorExtension: "userd_vendor_extension",
-			},
-			RAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Name: "root",
-					},
-					{
-						Name: "v1",
-					},
-				},
-			},
-		},
-		Status: metal3v1alpha1.BareMetalHostStatus{
-			Provisioning: metal3v1alpha1.ProvisionStatus{
-				RootDeviceHints: &metal3v1alpha1.RootDeviceHints{
-					DeviceName:         "userd_devicename",
-					HCTL:               "1:2:3:4",
-					Model:              "userd_model",
-					Vendor:             "userd_vendor",
-					SerialNumber:       "userd_serial",
-					MinSizeGigabytes:   40,
-					WWN:                "userd_wwn",
-					WWNWithExtension:   "userd_with_extension",
-					WWNVendorExtension: "userd_vendor_extension",
-				},
-			},
-		},
-	}
-	cases := []struct {
-		name       string
-		specRAID   *metal3v1alpha1.RAIDConfig
-		statusRAID *metal3v1alpha1.RAIDConfig
-		dirty      bool
-		expected   *metal3v1alpha1.RAIDConfig
-	}{
-		{
-			name:       "not configured, not saved",
-			specRAID:   nil,
-			statusRAID: nil,
-			dirty:      false,
-		},
-		{
-			name:       "not configured, not saved",
-			specRAID:   &metal3v1alpha1.RAIDConfig{},
-			statusRAID: &metal3v1alpha1.RAIDConfig{},
-			dirty:      false,
-			expected:   &metal3v1alpha1.RAIDConfig{},
-		},
-		{
-			name:       "not configured, not saved",
-			specRAID:   &metal3v1alpha1.RAIDConfig{},
-			statusRAID: nil,
-			dirty:      true,
-			expected:   &metal3v1alpha1.RAIDConfig{},
-		},
-		{
-			name:       "not configured, not saved",
-			specRAID:   nil,
-			statusRAID: &metal3v1alpha1.RAIDConfig{},
-			dirty:      true,
-			expected:   nil,
-		},
-		{
-			name: "HardwareRAIDVolumes configured, not saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: nil,
-			dirty:      true,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "SoftwareRAIDVolumes configured, not saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: nil,
-			dirty:      true,
-			expected: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "both configured, not saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: nil,
-			dirty:      true,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "HardwareRAIDVolumes configured, HardwareRAIDVolumes saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: false,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "HardwareRAIDVolumes configured, SoftwareRAIDVolumes saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: true,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "HardwareRAIDVolumes configured, both saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: false,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "SoftwareRAIDVolumes configured, HardwareRAIDVolumes saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: true,
-			expected: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "SoftwareRAIDVolumes configured, SoftwareRAIDVolumes saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: false,
-			expected: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "SoftwareRAIDVolumes configured, both saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: true,
-			expected: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "both configured, HardwareRAIDVolumes saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: false,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "both configured, SoftwareRAIDVolumes saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: true,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-		{
-			name: "both configured, both saved",
-			specRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			statusRAID: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-			dirty: false,
-			expected: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Level: "1",
-					},
-				},
-			},
-		},
-	}
-	for _, c := range cases {
-		t.Run(c.name, func(t *testing.T) {
-			host.Spec.RAID = c.specRAID
-			host.Status.Provisioning.RAID = c.statusRAID
-			dirty, _ := saveHostProvisioningSettings(&host)
-			assert.Equal(t, c.dirty, dirty)
-			assert.Equal(t, c.expected, host.Status.Provisioning.RAID)
-		})
-	}
-}
diff --git a/controllers/metal3.io/controller_test.go b/controllers/metal3.io/controller_test.go
index 7e083a57..96098f9e 100644
--- a/controllers/metal3.io/controller_test.go
+++ b/controllers/metal3.io/controller_test.go
@@ -2,13 +2,14 @@ package controllers
 
 import (
 	"k8s.io/client-go/kubernetes/scheme"
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
-	logf.SetLogger(logf.ZapLogger(true))
+	logf.SetLogger(logz.New(logz.UseDevMode(true)))
 	// Register our package types with the global scheme
 	metal3v1alpha1.AddToScheme(scheme.Scheme)
 }
diff --git a/controllers/metal3.io/demo_test.go b/controllers/metal3.io/demo_test.go
index 55aec01e..af5c3735 100644
--- a/controllers/metal3.io/demo_test.go
+++ b/controllers/metal3.io/demo_test.go
@@ -6,8 +6,6 @@ import (
 
 	"k8s.io/apimachinery/pkg/runtime"
 
-	"k8s.io/client-go/kubernetes/scheme"
-
 	ctrl "sigs.k8s.io/controller-runtime"
 	fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -26,7 +24,6 @@ func newDemoReconciler(initObjs ...runtime.Object) *BareMetalHostReconciler {
 
 	return &BareMetalHostReconciler{
 		Client:             c,
-		Scheme:             scheme.Scheme,
 		ProvisionerFactory: demo.New,
 		Log:                ctrl.Log.WithName("controller").WithName("BareMetalHost"),
 	}
diff --git a/pkg/bmc/access_test.go b/pkg/bmc/access_test.go
index 7f1ef1cd..50075d16 100644
--- a/pkg/bmc/access_test.go
+++ b/pkg/bmc/access_test.go
@@ -3,11 +3,12 @@ package bmc
 import (
 	"testing"
 
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 )
 
 func init() {
-	logf.SetLogger(logf.ZapLogger(true))
+	logf.SetLogger(logz.New(logz.UseDevMode(true)))
 }
 
 func TestParse(t *testing.T) {
diff --git a/pkg/bmc/credentials_test.go b/pkg/bmc/credentials_test.go
index a9557849..3377c3ea 100644
--- a/pkg/bmc/credentials_test.go
+++ b/pkg/bmc/credentials_test.go
@@ -3,11 +3,12 @@ package bmc
 import (
 	"testing"
 
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 )
 
 func init() {
-	logf.SetLogger(logf.ZapLogger(true))
+	logf.SetLogger(logz.New(logz.UseDevMode(true)))
 }
 
 func TestValidCredentials(t *testing.T) {
diff --git a/pkg/provisioner/ironic/ironic_test.go b/pkg/provisioner/ironic/ironic_test.go
index f4d7bb7c..77f0d713 100644
--- a/pkg/provisioner/ironic/ironic_test.go
+++ b/pkg/provisioner/ironic/ironic_test.go
@@ -2,7 +2,8 @@ package ironic
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 
@@ -13,7 +14,7 @@ import (
 )
 
 func init() {
-	logf.SetLogger(logf.ZapLogger(true))
+	logf.SetLogger(logz.New(logz.UseDevMode(true)))
 }
 
 func makeHost() metal3v1alpha1.BareMetalHost {
diff --git a/pkg/provisioner/ironic/prepare_test.go b/pkg/provisioner/ironic/prepare_test.go
index 1ec188ae..79532c5a 100644
--- a/pkg/provisioner/ironic/prepare_test.go
+++ b/pkg/provisioner/ironic/prepare_test.go
@@ -8,7 +8,6 @@ import (
 	"github.com/gophercloud/gophercloud/openstack/baremetalintrospection/v1/introspection"
 	"github.com/stretchr/testify/assert"
 
-	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 	"github.com/metal3-io/baremetal-operator/pkg/bmc"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner/ironic/clients"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner/ironic/testserver"
@@ -20,7 +19,6 @@ func TestPrepare(t *testing.T) {
 		name                 string
 		ironic               *testserver.IronicMock
 		unprepared           bool
-		existRaidConfig      bool
 		expectedStarted      bool
 		expectedDirty        bool
 		expectedError        bool
@@ -37,18 +35,18 @@ func TestPrepare(t *testing.T) {
 			expectedRequestAfter: 0,
 			expectedDirty:        false,
 		},
-		{
-			name: "manageable state(have clean steps)",
-			ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{
-				ProvisionState: string(nodes.Manageable),
-				UUID:           nodeUUID,
-			}),
-			unprepared:           true,
-			existRaidConfig:      true,
-			expectedStarted:      true,
-			expectedRequestAfter: 10,
-			expectedDirty:        true,
-		},
+		// TODO: ADD test case when clean steps aren't empty
+		// {
+		// 	name: "manageable state(have clean steps)",
+		// 	ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{
+		// 		ProvisionState: string(nodes.Manageable),
+		// 		UUID:           nodeUUID,
+		// 	}),
+		// 	unprepared:           true,
+		// 	expectedStarted:      true,
+		// 	expectedRequestAfter: 10,
+		// 	expectedDirty:        true,
+		// },
 		{
 			name: "cleanFail state(cleaned provision settings)",
 			ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{
@@ -66,7 +64,6 @@ func TestPrepare(t *testing.T) {
 				UUID:           nodeUUID,
 			}),
 			unprepared:           true,
-			existRaidConfig:      true,
 			expectedStarted:      false,
 			expectedRequestAfter: 10,
 			expectedDirty:        true,
@@ -77,7 +74,6 @@ func TestPrepare(t *testing.T) {
 				ProvisionState: string(nodes.Cleaning),
 				UUID:           nodeUUID,
 			}),
-			existRaidConfig:      true,
 			expectedStarted:      false,
 			expectedRequestAfter: 10,
 			expectedDirty:        true,
@@ -88,7 +84,6 @@ func TestPrepare(t *testing.T) {
 				ProvisionState: string(nodes.CleanWait),
 				UUID:           nodeUUID,
 			}),
-			existRaidConfig:      true,
 			expectedStarted:      false,
 			expectedRequestAfter: 10,
 			expectedDirty:        true,
@@ -99,7 +94,6 @@ func TestPrepare(t *testing.T) {
 				ProvisionState: string(nodes.Manageable),
 				UUID:           nodeUUID,
 			}),
-			existRaidConfig:      true,
 			expectedStarted:      false,
 			expectedRequestAfter: 0,
 			expectedDirty:        false,
@@ -120,21 +114,6 @@ func TestPrepare(t *testing.T) {
 			defer inspector.Stop()
 
 			host := makeHost()
-			if tc.existRaidConfig {
-				host.Spec.BMC.Address = "irmc://test.bmc/"
-				host.Status.Provisioning.RAID = &metal3v1alpha1.RAIDConfig{
-					HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-						{
-							Name:  "root",
-							Level: "1",
-						},
-						{
-							Name:  "v1",
-							Level: "1",
-						},
-					},
-				}
-			}
 
 			publisher := func(reason, message string) {}
 			auth := clients.AuthConfig{Type: clients.NoAuth}
diff --git a/pkg/provisioner/ironic/raid_test.go b/pkg/provisioner/ironic/raid_test.go
deleted file mode 100644
index 0b07a4e1..00000000
--- a/pkg/provisioner/ironic/raid_test.go
+++ /dev/null
@@ -1,304 +0,0 @@
-package ironic
-
-import (
-	"reflect"
-	"testing"
-
-	"github.com/gophercloud/gophercloud/openstack/baremetal/v1/nodes"
-
-	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
-)
-
-func TestBuildTargetRAIDCfg(t *testing.T) {
-	var TRUE bool = true
-	var FALSE bool = false
-	cases := []struct {
-		name          string
-		raid          *metal3v1alpha1.RAIDConfig
-		expected      []nodes.LogicalDisk
-		expectedError string
-	}{
-		{
-			name: "hardware raid",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Name:       "root",
-						Level:      "1",
-						Rotational: &FALSE,
-					},
-					{
-						Name:       "v1",
-						Level:      "1",
-						Rotational: &TRUE,
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-					{
-						Level: "1",
-					},
-				},
-			},
-			expected: []nodes.LogicalDisk{
-				{
-					RAIDLevel:  "1",
-					VolumeName: "root",
-					DiskType:   nodes.SSD,
-				},
-				{
-					RAIDLevel:  "1",
-					DiskType:   nodes.HDD,
-					VolumeName: "v1",
-				},
-			},
-		},
-		{
-			name: "hardware raid, same volume's name",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Name:  "v1",
-						Level: "1",
-					},
-					{
-						Name:  "v1",
-						Level: "1",
-					},
-				},
-			},
-			expectedError: "the names(v1) of volume[1] and volume[0] are repeated",
-		},
-		{
-			name: "hardware raid, volume's name is empty",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Name:  "",
-						Level: "1",
-					},
-					{
-						Name:  "",
-						Level: "1",
-					},
-				},
-			},
-			expected: []nodes.LogicalDisk{
-				{
-					RAIDLevel:  "1",
-					VolumeName: "",
-				},
-				{
-					RAIDLevel:  "1",
-					VolumeName: "",
-				},
-			},
-		},
-		{
-			name: "software raid",
-			raid: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-						PhysicalDisks: []metal3v1alpha1.RootDeviceHints{
-							{
-								MinSizeGigabytes: 100,
-							},
-							{
-								MinSizeGigabytes: 200,
-							},
-						},
-					},
-					{
-						Level: "1",
-					},
-				},
-			},
-			expected: []nodes.LogicalDisk{
-				{
-					RAIDLevel:  "1",
-					Controller: "software",
-					PhysicalDisks: []interface{}{
-						map[string]string{
-							"size": ">= 100",
-						},
-						map[string]string{
-							"size": ">= 200",
-						},
-					},
-				},
-				{
-					RAIDLevel:  "1",
-					Controller: "software",
-				},
-			},
-		},
-		{
-			name: "software raid, the level in first volume isn't RAID1",
-			raid: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "0",
-					},
-					{
-						Level: "1",
-					},
-				},
-			},
-			expectedError: "the level in first volume of software raid must be RAID1",
-		},
-		{
-			name:     "raid is nil",
-			raid:     nil,
-			expected: nil,
-		},
-		{
-			name: "volumes is nil",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: nil,
-				SoftwareRAIDVolumes: nil,
-			},
-			expected: nil,
-		},
-		{
-			name: "volumes is empty",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{},
-			},
-			expected: nil,
-		},
-	}
-
-	for _, c := range cases {
-		t.Run(c.name, func(t *testing.T) {
-			cfg, err := BuildTargetRAIDCfg(c.raid)
-			if c.expectedError != "" {
-				if err == nil || err.Error() != c.expectedError {
-					t.Errorf("expectError: %v, got: %v", c.expectedError, err)
-				}
-				return
-			}
-			if !reflect.DeepEqual(c.expected, cfg) {
-				t.Errorf("expected: %v, got: %v", c.expected, cfg)
-			}
-		})
-	}
-}
-
-func TestBuildRAIDCleanSteps(t *testing.T) {
-	cases := []struct {
-		name          string
-		raid          *metal3v1alpha1.RAIDConfig
-		expected      []nodes.CleanStep
-		expectedError string
-	}{
-		{
-			name: "hardware raid",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{
-					{
-						Name:  "root",
-						Level: "1",
-					},
-					{
-						Name:  "v1",
-						Level: "1",
-					},
-				},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-					{
-						Level: "1",
-					},
-				},
-			},
-			expected: []nodes.CleanStep{
-				{
-					Interface: "raid",
-					Step:      "delete_configuration",
-				},
-				{
-					Interface: "raid",
-					Step:      "create_configuration",
-				},
-			},
-		},
-		{
-			name: "software raid",
-			raid: &metal3v1alpha1.RAIDConfig{
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{
-					{
-						Level: "1",
-					},
-					{
-						Level: "1",
-					},
-				},
-			},
-			expected: []nodes.CleanStep{
-				{
-					Interface: "raid",
-					Step:      "delete_configuration",
-				},
-				{
-					Interface: "deploy",
-					Step:      "erase_devices_metadata",
-				},
-				{
-					Interface: "raid",
-					Step:      "create_configuration",
-				},
-			},
-		},
-		{
-			name: "raid is nil",
-			raid: nil,
-			expected: []nodes.CleanStep{
-				{
-					Interface: "raid",
-					Step:      "delete_configuration",
-				},
-			},
-		},
-		{
-			name: "volumes is nil",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: nil,
-				SoftwareRAIDVolumes: nil,
-			},
-			expected: []nodes.CleanStep{
-				{
-					Interface: "raid",
-					Step:      "delete_configuration",
-				},
-			},
-		},
-		{
-			name: "volumes is empty",
-			raid: &metal3v1alpha1.RAIDConfig{
-				HardwareRAIDVolumes: []metal3v1alpha1.HardwareRAIDVolume{},
-				SoftwareRAIDVolumes: []metal3v1alpha1.SoftwareRAIDVolume{},
-			},
-			expected: []nodes.CleanStep{
-				{
-					Interface: "raid",
-					Step:      "delete_configuration",
-				},
-			},
-		},
-	}
-
-	for _, c := range cases {
-		t.Run(c.name, func(t *testing.T) {
-			step := BuildRAIDCleanSteps(c.raid)
-			if !reflect.DeepEqual(c.expected, step) {
-				t.Errorf("expected: %v, got: %v", c.expected, step)
-			}
-		})
-	}
-}
diff --git a/pkg/provisioner/ironic/testserver/ironic.go b/pkg/provisioner/ironic/testserver/ironic.go
index 56e7f2de..ce6e48b0 100644
--- a/pkg/provisioner/ironic/testserver/ironic.go
+++ b/pkg/provisioner/ironic/testserver/ironic.go
@@ -34,7 +34,6 @@ func (m *IronicMock) WithDefaultResponses() *IronicMock {
 	})
 	m.AddDefaultResponse("/v1/nodes/{id}/states/provision", "", http.StatusAccepted, "{}")
 	m.AddDefaultResponse("/v1/nodes/{id}/states/power", "", http.StatusAccepted, "{}")
-	m.AddDefaultResponse("/v1/nodes/{id}/states/raid", "", http.StatusNoContent, "{}")
 	m.AddDefaultResponse("/v1/nodes/{id}/validate", "", http.StatusOK, "{}")
 	m.Ready()