Repository: metal3-io/baremetal-operator
Pull request #1056 (2021-12-20 09:39:26)

Uplift ulikunitz/xz v0.5.8 [CVE-2020-16845]
This PR uplifts github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf and
sigs.k8s.io/kustomize/kustomize/v3 v3.10.0 to remove vulnerable ulikunitz/xz v0.5.5. 

Reference: CVE-2020-16845 

metal3-io-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **zaneb** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @zaneb` 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":["zaneb"]} -->
metal3-io-bot: @kashifest: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
generate | 6e2f8dd5c34ef3946380c2a4c89ae5e662e934d4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1056/generate/1472864216250585088) | true | `/test generate`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1056). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:kashifest).

<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 -->

Patch:
diff --git a/PROJECT b/PROJECT
index 912bb420..a76ea4d6 100644
--- a/PROJECT
+++ b/PROJECT
@@ -44,13 +44,4 @@ resources:
   kind: PreprovisioningImage
   path: github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1
   version: v1alpha1
-- api:
-    crdVersion: v1
-    namespaced: true
-  controller: true
-  domain: metal3.io
-  group: metal3.io
-  kind: BMCEventSubscription
-  path: github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1
-  version: v1alpha1
 version: "3"
diff --git a/apis/go.mod b/apis/go.mod
index 1b2ebca1..b201ad7c 100644
--- a/apis/go.mod
+++ b/apis/go.mod
@@ -5,7 +5,6 @@ go 1.17
 require (
 	github.com/metal3-io/baremetal-operator/pkg/hardwareutils v0.0.0
 	github.com/google/uuid v1.1.2
-	github.com/pkg/errors v0.9.1
 	github.com/stretchr/testify v1.7.0
 	k8s.io/api v0.21.4
 	k8s.io/apimachinery v0.21.4
@@ -32,6 +31,7 @@ require (
 	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.1 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/prometheus/client_golang v1.11.0 // indirect
 	github.com/prometheus/client_model v0.2.0 // indirect
diff --git a/apis/metal3.io/v1alpha1/bmceventsubscription_types.go b/apis/metal3.io/v1alpha1/bmceventsubscription_types.go
deleted file mode 100644
index aa8b8e69..00000000
--- a/apis/metal3.io/v1alpha1/bmceventsubscription_types.go
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha1
-
-import (
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-const (
-
-	// BMCEventSubscriptionFinalizer is the name of the finalizer added to
-	// subscriptions to block delete operations until the subscription is removed
-	// from the BMC.
-	BMCEventSubscriptionFinalizer string = "bmceventsubscription.metal3.io"
-)
-
-type BMCEventSubscriptionSpec struct {
-	// A reference to a BareMetalHost
-	HostName string `json:"hostName,omitempty"`
-
-	// A webhook URL to send events to
-	Destination string `json:"destination,omitempty"`
-
-	// Arbitrary user-provided context for the event
-	Context string `json:"context,omitempty"`
-
-	// A secret containing HTTP headers which should be passed along to the Destination
-	// when making a request
-	HTTPHeadersRef *corev1.SecretReference `json:"httpHeadersRef,omitempty"`
-}
-
-type BMCEventSubscriptionStatus struct {
-	SubscriptionID string `json:"subscriptionID,omitempty"`
-	Error          string `json:"error,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-//
-// BMCEventSubscription is the Schema for the fast eventing API
-// +k8s:openapi-gen=true
-// +kubebuilder:resource:shortName=bes;bmcevent
-// +kubebuilder:subresource:status
-// +kubebuilder:printcolumn:name="Error",type="string",JSONPath=".status.error",description="The most recent error message"
-// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description="Time duration since creation of BMCEventSubscription"
-// +kubebuilder:object:root=true
-type BMCEventSubscription struct {
-	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata,omitempty"`
-
-	Spec   BMCEventSubscriptionSpec   `json:"spec,omitempty"`
-	Status BMCEventSubscriptionStatus `json:"status,omitempty"`
-}
-
-// +kubebuilder:object:root=true
-
-// BMCEventSubscriptionList contains a list of BMCEventSubscriptions
-type BMCEventSubscriptionList struct {
-	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata,omitempty"`
-	Items           []BMCEventSubscription `json:"items"`
-}
-
-func init() {
-	SchemeBuilder.Register(&BMCEventSubscription{}, &BMCEventSubscriptionList{})
-}
diff --git a/apis/metal3.io/v1alpha1/bmceventsubscription_validation.go b/apis/metal3.io/v1alpha1/bmceventsubscription_validation.go
deleted file mode 100644
index 73b86dd6..00000000
--- a/apis/metal3.io/v1alpha1/bmceventsubscription_validation.go
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha1
-
-import (
-	"fmt"
-	"net/url"
-
-	"github.com/pkg/errors"
-
-	logf "sigs.k8s.io/controller-runtime/pkg/log"
-)
-
-// bmclog is for logging in this package.
-var bmclog = logf.Log.WithName("bmceventsubscription-validation")
-
-// validateSubscription validates BMCEventSubscription resource for creation
-func (s *BMCEventSubscription) validateSubscription() []error {
-	bmclog.Info("validate create", "name", s.Name)
-	var errs []error
-
-	if s.Spec.HostName == "" {
-		errs = append(errs, fmt.Errorf("HostName cannot be empty"))
-	}
-
-	if s.Spec.Destination == "" {
-		errs = append(errs, fmt.Errorf("Destination cannot be empty"))
-	} else {
-		destinationUrl, err := url.ParseRequestURI(s.Spec.Destination)
-
-		if err != nil {
-			errs = append(errs, errors.Wrap(err, "Destination is an invalid URL"))
-		} else {
-			if destinationUrl.Path == "" {
-				errs = append(errs, fmt.Errorf("Hostname-only destination must have a trailing slash"))
-			}
-		}
-	}
-
-	return errs
-}
diff --git a/apis/metal3.io/v1alpha1/bmceventsubscription_webhook.go b/apis/metal3.io/v1alpha1/bmceventsubscription_webhook.go
deleted file mode 100644
index 4e7cc579..00000000
--- a/apis/metal3.io/v1alpha1/bmceventsubscription_webhook.go
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha1
-
-import (
-	"fmt"
-
-	"k8s.io/apimachinery/pkg/util/errors"
-
-	"k8s.io/apimachinery/pkg/runtime"
-	ctrl "sigs.k8s.io/controller-runtime"
-	logf "sigs.k8s.io/controller-runtime/pkg/log"
-	"sigs.k8s.io/controller-runtime/pkg/webhook"
-)
-
-// bmcsubscriptionlog is for logging in this package.
-var bmcsubscriptionlog = logf.Log.WithName("bmceventsubscription-resource")
-
-func (s *BMCEventSubscription) SetupWebhookWithManager(mgr ctrl.Manager) error {
-	return ctrl.NewWebhookManagedBy(mgr).
-		For(s).
-		Complete()
-}
-
-//+kubebuilder:webhook:verbs=create;update,path=/validate-metal3-io-v1alpha1-bmceventsubscription,mutating=false,failurePolicy=fail,sideEffects=none,admissionReviewVersions=v1;v1beta,groups=metal3.io,resources=bmceventsubscriptions,versions=v1alpha1,name=bmceventsubscription.metal3.io
-
-var _ webhook.Validator = &BMCEventSubscription{}
-
-// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
-func (s *BMCEventSubscription) ValidateCreate() error {
-	bmcsubscriptionlog.Info("validate create", "name", s.Name)
-	return errors.NewAggregate(s.validateSubscription())
-}
-
-// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
-func (s *BMCEventSubscription) ValidateUpdate(old runtime.Object) error {
-	bmcsubscriptionlog.Info("validate update", "name", s.Name)
-	return fmt.Errorf("subscriptions cannot be updated, please recreate it")
-}
-
-// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
-func (s *BMCEventSubscription) ValidateDelete() error {
-	return nil
-}
diff --git a/apis/metal3.io/v1alpha1/firmwareschema_types.go b/apis/metal3.io/v1alpha1/firmwareschema_types.go
index 8c7fc852..67620b88 100644
--- a/apis/metal3.io/v1alpha1/firmwareschema_types.go
+++ b/apis/metal3.io/v1alpha1/firmwareschema_types.go
@@ -18,7 +18,6 @@ package v1alpha1
 
 import (
 	"fmt"
-	"strconv"
 	"strings"
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -50,6 +49,9 @@ type SettingSchema struct {
 	// Whether or not this setting is read only.
 	ReadOnly *bool `json:"read_only,omitempty"`
 
+	// Whether or not a reset is required after changing this setting.
+	ResetRequired *bool `json:"reset_required,omitempty"`
+
 	// Whether or not this setting's value is unique to this node, e.g.
 	// a serial number.
 	Unique *bool `json:"unique,omitempty"`
@@ -85,16 +87,11 @@ func (schema *SettingSchema) Validate(name string, value intstr.IntOrString) err
 		return SchemaSettingError{name: name, message: fmt.Sprintf("unknown enumeration value - %s", value.String())}
 
 	case "Integer":
-		if value.Type == intstr.String {
-			if _, err := strconv.Atoi(value.String()); err != nil {
-				return SchemaSettingError{name: name, message: fmt.Sprintf("String %s entered while integer expected", value.String())}
-			}
-		}
 		if schema.LowerBound != nil && value.IntValue() < *schema.LowerBound {
-			return SchemaSettingError{name: name, message: fmt.Sprintf("integer %d is below minimum value %d", value.IntValue(), *schema.LowerBound)}
+			return SchemaSettingError{name: name, message: fmt.Sprintf("integer %s is below minimum value %d", value.String(), *schema.LowerBound)}
 		}
 		if schema.UpperBound != nil && value.IntValue() > *schema.UpperBound {
-			return SchemaSettingError{name: name, message: fmt.Sprintf("integer %d is above maximum value %d", value.IntValue(), *schema.UpperBound)}
+			return SchemaSettingError{name: name, message: fmt.Sprintf("integer %s is above maximum value %d", value.String(), *schema.UpperBound)}
 		}
 		return nil
 
diff --git a/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go b/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
index 59d01bae..e62c6071 100644
--- a/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
@@ -57,100 +57,6 @@ func (in *BMCDetails) DeepCopy() *BMCDetails {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *BMCEventSubscription) DeepCopyInto(out *BMCEventSubscription) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
-	out.Status = in.Status
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BMCEventSubscription.
-func (in *BMCEventSubscription) DeepCopy() *BMCEventSubscription {
-	if in == nil {
-		return nil
-	}
-	out := new(BMCEventSubscription)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *BMCEventSubscription) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *BMCEventSubscriptionList) DeepCopyInto(out *BMCEventSubscriptionList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ListMeta.DeepCopyInto(&out.ListMeta)
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]BMCEventSubscription, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BMCEventSubscriptionList.
-func (in *BMCEventSubscriptionList) DeepCopy() *BMCEventSubscriptionList {
-	if in == nil {
-		return nil
-	}
-	out := new(BMCEventSubscriptionList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *BMCEventSubscriptionList) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *BMCEventSubscriptionSpec) DeepCopyInto(out *BMCEventSubscriptionSpec) {
-	*out = *in
-	if in.HTTPHeadersRef != nil {
-		in, out := &in.HTTPHeadersRef, &out.HTTPHeadersRef
-		*out = new(v1.SecretReference)
-		**out = **in
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BMCEventSubscriptionSpec.
-func (in *BMCEventSubscriptionSpec) DeepCopy() *BMCEventSubscriptionSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(BMCEventSubscriptionSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *BMCEventSubscriptionStatus) DeepCopyInto(out *BMCEventSubscriptionStatus) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BMCEventSubscriptionStatus.
-func (in *BMCEventSubscriptionStatus) DeepCopy() *BMCEventSubscriptionStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(BMCEventSubscriptionStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *BareMetalHost) DeepCopyInto(out *BareMetalHost) {
 	*out = *in
@@ -1058,6 +964,11 @@ func (in *SettingSchema) DeepCopyInto(out *SettingSchema) {
 		*out = new(bool)
 		**out = **in
 	}
+	if in.ResetRequired != nil {
+		in, out := &in.ResetRequired, &out.ResetRequired
+		*out = new(bool)
+		**out = **in
+	}
 	if in.Unique != nil {
 		in, out := &in.Unique, &out.Unique
 		*out = new(bool)
diff --git a/cmd/make-bm-worker/main.go b/cmd/make-bm-worker/main.go
index 6eb9b34a..3974a29e 100644
--- a/cmd/make-bm-worker/main.go
+++ b/cmd/make-bm-worker/main.go
@@ -16,20 +16,12 @@ func main() {
 	var disableCertificateVerification = flag.Bool("disableCertificateVerification", false, "will skip certificate validation when true")
 	var hardwareProfile = flag.String("hardwareprofile", "", "hardwareProfile to be used")
 	var macAddress = flag.String("boot-mac", "", "boot-mac for bootMACAddress")
-	var bootMode = flag.String("boot-mode", "", "boot-mode for host (UEFI, UEFISecureBoot or legacy)")
+	var bootMode = flag.String("boot-mode", "", "boot-mode for host (UEFI or legacy)")
 	var verbose = flag.Bool("v", false, "turn on verbose output")
 	var consumer = flag.String(
 		"consumer", "", "specify name of a related, existing, consumer to link")
 	var consumerNamespace = flag.String(
 		"consumer-namespace", "", "specify namespace of a related, existing, consumer to link")
-	var automatedCleaningMode = flag.String(
-		"automatedCleaningMode", "", "automatic cleaning mode for host (metadata or disabled)")
-	var imageURL = flag.String("image-url", "", "url for the image")
-	var imageChecksum = flag.String("image-checksum", "", "checksum for the image")
-	var imageChecksumType = flag.String(
-		"image-checksum-type", "", "checksum algorithm for the image (md5, sha256 or sha512)")
-	var imageFormat = flag.String(
-		"image-format", "", "format of the image (raw, qcow2, vdi, vmdk, or live-iso)")
 
 	flag.Parse()
 
@@ -51,27 +43,8 @@ func main() {
 		os.Exit(1)
 	}
 
-	if *bootMode != "" && *bootMode != "UEFI" && *bootMode != "UEFISecureBoot" && *bootMode != "legacy" {
-		fmt.Fprintf(os.Stderr, "Invalid boot mode %q, use \"UEFI\", \"UEFISecureBoot\" or \"legacy\"\n", *bootMode)
-		os.Exit(1)
-	}
-
-	if *automatedCleaningMode != "" && *automatedCleaningMode != "metadata" && *automatedCleaningMode != "disabled" {
-		fmt.Fprintf(os.Stderr, "Invalid automatic cleaning mode %q, use \"metadata\" or \"disabled\"\n", *automatedCleaningMode)
-		os.Exit(1)
-	}
-
-	switch *imageChecksumType {
-	case "", "md5", "sha256", "sha512":
-	default:
-		fmt.Fprintf(os.Stderr, "Invalid image checksum type %q, use \"md5\", \"sha256\" or \"sha512\"\n", *imageChecksumType)
-		os.Exit(1)
-	}
-
-	switch *imageFormat {
-	case "", "raw", "qcow2", "vdi", "vmdk", "live-iso":
-	default:
-		fmt.Fprintf(os.Stderr, "Invalid image format %q, use \"raw\", \"qcow2\", \"vdi\", \"vmdk\" or \"live-iso\"\n", *imageFormat)
+	if *bootMode != "" && *bootMode != "UEFI" && *bootMode != "legacy" {
+		fmt.Fprintf(os.Stderr, "Invalid boot mode %q, use \"UEFI\" or \"legacy\"\n", *bootMode)
 		os.Exit(1)
 	}
 
@@ -85,11 +58,6 @@ func main() {
 		BootMacAddress:                 *macAddress,
 		Consumer:                       strings.TrimSpace(*consumer),
 		ConsumerNamespace:              strings.TrimSpace(*consumerNamespace),
-		AutomatedCleaningMode:          *automatedCleaningMode,
-		ImageURL:                       *imageURL,
-		ImageChecksum:                  *imageChecksum,
-		ImageChecksumType:              *imageChecksumType,
-		ImageFormat:                    *imageFormat,
 	}
 	if bootMode != nil {
 		template.BootMode = *bootMode
diff --git a/cmd/make-bm-worker/templates/templates.go b/cmd/make-bm-worker/templates/templates.go
index c4bc6832..90d7bc83 100644
--- a/cmd/make-bm-worker/templates/templates.go
+++ b/cmd/make-bm-worker/templates/templates.go
@@ -22,9 +22,6 @@ kind: BareMetalHost
 metadata:
   name: {{ .Name }}
 spec:
-{{- if .AutomatedCleaningMode }}
-  automatedCleaningMode: {{ .AutomatedCleaningMode }}
-{{- end }}
   online: true
 {{- if .HardwareProfile }}
   hardwareProfile: {{ .HardwareProfile }}
@@ -38,28 +35,13 @@ spec:
   bmc:
     address: {{ .BMCAddress }}
     credentialsName: {{ .Name }}-bmc-secret
-{{- if .DisableCertificateVerification }}
-    disableCertificateVerification: true
-{{- end}}
 {{- if .Consumer }}
   consumerRef:
     name: {{ .Consumer }}
-{{- if .ConsumerNamespace }}
     namespace: {{ .ConsumerNamespace }}
 {{- end }}
-{{- end }}
-{{- if .ImageURL }}
-  image:
-{{- if .ImageChecksum }}
-    checksum: {{ .ImageChecksum}}
-{{- end}}
-{{- if .ImageChecksumType }}
-    checksumType: {{ .ImageChecksumType}}
-{{- end}}
-{{- if .ImageFormat }}
-    format: {{ .ImageFormat}}
-{{- end}}
-    url: {{ .ImageURL}}
+{{- if .DisableCertificateVerification }}
+  disableCertificateVerification: true
 {{- end}}
 `
 
@@ -75,11 +57,6 @@ type Template struct {
 	BootMode                       string
 	Consumer                       string
 	ConsumerNamespace              string
-	AutomatedCleaningMode          string
-	ImageURL                       string
-	ImageChecksum                  string
-	ImageChecksumType              string
-	ImageFormat                    string
 }
 
 // EncodedUsername returns the username in the format needed to store
diff --git a/config/crd/bases/metal3.io_bmceventsubscriptions.yaml b/config/crd/bases/metal3.io_bmceventsubscriptions.yaml
deleted file mode 100644
index 819db44e..00000000
--- a/config/crd/bases/metal3.io_bmceventsubscriptions.yaml
+++ /dev/null
@@ -1,90 +0,0 @@
-
----
-apiVersion: apiextensions.k8s.io/v1
-kind: CustomResourceDefinition
-metadata:
-  annotations:
-    controller-gen.kubebuilder.io/version: v0.6.2
-  creationTimestamp: null
-  name: bmceventsubscriptions.metal3.io
-spec:
-  group: metal3.io
-  names:
-    kind: BMCEventSubscription
-    listKind: BMCEventSubscriptionList
-    plural: bmceventsubscriptions
-    shortNames:
-    - bes
-    - bmcevent
-    singular: bmceventsubscription
-  scope: Namespaced
-  versions:
-  - additionalPrinterColumns:
-    - description: The most recent error message
-      jsonPath: .status.error
-      name: Error
-      type: string
-    - description: Time duration since creation of BMCEventSubscription
-      jsonPath: .metadata.creationTimestamp
-      name: Age
-      type: date
-    name: v1alpha1
-    schema:
-      openAPIV3Schema:
-        description: BMCEventSubscription is the Schema for the fast eventing API
-        properties:
-          apiVersion:
-            description: 'APIVersion defines the versioned schema of this representation
-              of an object. Servers should convert recognized schemas to the latest
-              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
-            type: string
-          kind:
-            description: 'Kind is a string value representing the REST resource this
-              object represents. Servers may infer this from the endpoint the client
-              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-            type: string
-          metadata:
-            type: object
-          spec:
-            properties:
-              context:
-                description: Arbitrary user-provided context for the event
-                type: string
-              destination:
-                description: A webhook URL to send events to
-                type: string
-              hostName:
-                description: A reference to a BareMetalHost
-                type: string
-              httpHeadersRef:
-                description: A secret containing HTTP headers which should be passed
-                  along to the Destination when making a request
-                properties:
-                  name:
-                    description: Name is unique within a namespace to reference a
-                      secret resource.
-                    type: string
-                  namespace:
-                    description: Namespace defines the space within which the secret
-                      name must be unique.
-                    type: string
-                type: object
-            type: object
-          status:
-            properties:
-              error:
-                type: string
-              subscriptionID:
-                type: string
-            type: object
-        type: object
-    served: true
-    storage: true
-    subresources:
-      status: {}
-status:
-  acceptedNames:
-    kind: ""
-    plural: ""
-  conditions: []
-  storedVersions: []
diff --git a/config/crd/bases/metal3.io_firmwareschemas.yaml b/config/crd/bases/metal3.io_firmwareschemas.yaml
index 1b012a89..362b5e69 100644
--- a/config/crd/bases/metal3.io_firmwareschemas.yaml
+++ b/config/crd/bases/metal3.io_firmwareschemas.yaml
@@ -72,6 +72,10 @@ spec:
                     read_only:
                       description: Whether or not this setting is read only.
                       type: boolean
+                    reset_required:
+                      description: Whether or not a reset is required after changing
+                        this setting.
+                      type: boolean
                     unique:
                       description: Whether or not this setting's value is unique to
                         this node, e.g. a serial number.
diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml
index edc11d77..9a31c53b 100644
--- a/config/crd/kustomization.yaml
+++ b/config/crd/kustomization.yaml
@@ -6,7 +6,6 @@ resources:
 - bases/metal3.io_hostfirmwaresettings.yaml
 - bases/metal3.io_firmwareschemas.yaml
 - bases/metal3.io_preprovisioningimages.yaml
-- bases/metal3.io_bmceventsubscriptions.yaml
 #+kubebuilder:scaffold:crdkustomizeresource
 
 patchesStrategicMerge:
@@ -16,7 +15,6 @@ patchesStrategicMerge:
 #- patches/webhook_in_hostfirmwaresettings.yaml
 #- patches/webhook_in_firmwareschemas.yaml
 #- patches/webhook_in_preprovisioningimages.yaml
-#- patches/webhook_in_bmceventsubscriptions.yaml
 #+kubebuilder:scaffold:crdkustomizewebhookpatch
 
 # [CERTMANAGER] To enable webhook, uncomment all the sections with [CERTMANAGER] prefix.
@@ -25,7 +23,6 @@ patchesStrategicMerge:
 #- patches/cainjection_in_hostfirmwaresettings.yaml
 #- patches/cainjection_in_firmwareschemas.yaml
 #- patches/cainjection_in_preprovisioningimages.yaml
-#- patches/cainjection_in_bmceventsubscriptions.yaml
 #+kubebuilder:scaffold:crdkustomizecainjectionpatch
 
 # the following config is for teaching kustomize how to do kustomization for CRDs.
diff --git a/config/crd/patches/cainjection_in_bmceventsubscriptions.yaml b/config/crd/patches/cainjection_in_bmceventsubscriptions.yaml
deleted file mode 100644
index 3eca636c..00000000
--- a/config/crd/patches/cainjection_in_bmceventsubscriptions.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-# The following patch adds a directive for certmanager to inject CA into the CRD
-apiVersion: apiextensions.k8s.io/v1
-kind: CustomResourceDefinition
-metadata:
-  annotations:
-    cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME)
-  name: bmceventsubscriptions.metal3.io
diff --git a/config/crd/patches/webhook_in_bmceventsubscriptions.yaml b/config/crd/patches/webhook_in_bmceventsubscriptions.yaml
deleted file mode 100644
index f111d04f..00000000
--- a/config/crd/patches/webhook_in_bmceventsubscriptions.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-# The following patch enables a conversion webhook for the CRD
-apiVersion: apiextensions.k8s.io/v1
-kind: CustomResourceDefinition
-metadata:
-  name: bmceventsubscriptions.metal3.io
-spec:
-  conversion:
-    strategy: Webhook
-    webhook:
-      clientConfig:
-        service:
-          namespace: system
-          name: webhook-service
-          path: /convert
diff --git a/config/rbac/bmceventsubscription_editor_role.yaml b/config/rbac/bmceventsubscription_editor_role.yaml
deleted file mode 100644
index 95e06b4f..00000000
--- a/config/rbac/bmceventsubscription_editor_role.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-# permissions for end users to edit bmceventsubscriptions.
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
-  name: bmceventsubscription-editor-role
-rules:
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions
-  verbs:
-  - create
-  - delete
-  - get
-  - list
-  - patch
-  - update
-  - watch
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions/status
-  verbs:
-  - get
diff --git a/config/rbac/bmceventsubscription_viewer_role.yaml b/config/rbac/bmceventsubscription_viewer_role.yaml
deleted file mode 100644
index ed4941f8..00000000
--- a/config/rbac/bmceventsubscription_viewer_role.yaml
+++ /dev/null
@@ -1,20 +0,0 @@
-# permissions for end users to view bmceventsubscriptions.
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
-  name: bmceventsubscription-viewer-role
-rules:
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions
-  verbs:
-  - get
-  - list
-  - watch
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions/status
-  verbs:
-  - get
diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml
index 938a97ea..a944ddaa 100644
--- a/config/rbac/role.yaml
+++ b/config/rbac/role.yaml
@@ -46,26 +46,6 @@ rules:
   - get
   - patch
   - update
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions
-  verbs:
-  - create
-  - delete
-  - get
-  - list
-  - patch
-  - update
-  - watch
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions/status
-  verbs:
-  - get
-  - patch
-  - update
 - apiGroups:
   - metal3.io
   resources:
diff --git a/config/render/capm3.yaml b/config/render/capm3.yaml
index 64b13fe9..be6d7615 100644
--- a/config/render/capm3.yaml
+++ b/config/render/capm3.yaml
@@ -1100,95 +1100,6 @@ status:
 ---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
-metadata:
-  annotations:
-    controller-gen.kubebuilder.io/version: v0.6.2
-  creationTimestamp: null
-  name: bmceventsubscriptions.metal3.io
-spec:
-  group: metal3.io
-  names:
-    kind: BMCEventSubscription
-    listKind: BMCEventSubscriptionList
-    plural: bmceventsubscriptions
-    shortNames:
-    - bes
-    - bmcevent
-    singular: bmceventsubscription
-  scope: Namespaced
-  versions:
-  - additionalPrinterColumns:
-    - description: The most recent error message
-      jsonPath: .status.error
-      name: Error
-      type: string
-    - description: Time duration since creation of BMCEventSubscription
-      jsonPath: .metadata.creationTimestamp
-      name: Age
-      type: date
-    name: v1alpha1
-    schema:
-      openAPIV3Schema:
-        description: BMCEventSubscription is the Schema for the fast eventing API
-        properties:
-          apiVersion:
-            description: 'APIVersion defines the versioned schema of this representation
-              of an object. Servers should convert recognized schemas to the latest
-              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
-            type: string
-          kind:
-            description: 'Kind is a string value representing the REST resource this
-              object represents. Servers may infer this from the endpoint the client
-              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-            type: string
-          metadata:
-            type: object
-          spec:
-            properties:
-              context:
-                description: Arbitrary user-provided context for the event
-                type: string
-              destination:
-                description: A webhook URL to send events to
-                type: string
-              hostName:
-                description: A reference to a BareMetalHost
-                type: string
-              httpHeadersRef:
-                description: A secret containing HTTP headers which should be passed
-                  along to the Destination when making a request
-                properties:
-                  name:
-                    description: Name is unique within a namespace to reference a
-                      secret resource.
-                    type: string
-                  namespace:
-                    description: Namespace defines the space within which the secret
-                      name must be unique.
-                    type: string
-                type: object
-            type: object
-          status:
-            properties:
-              error:
-                type: string
-              subscriptionID:
-                type: string
-            type: object
-        type: object
-    served: true
-    storage: true
-    subresources:
-      status: {}
-status:
-  acceptedNames:
-    kind: ""
-    plural: ""
-  conditions: []
-  storedVersions: []
----
-apiVersion: apiextensions.k8s.io/v1
-kind: CustomResourceDefinition
 metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.6.2
@@ -1259,6 +1170,10 @@ spec:
                     read_only:
                       description: Whether or not this setting is read only.
                       type: boolean
+                    reset_required:
+                      description: Whether or not a reset is required after changing
+                        this setting.
+                      type: boolean
                     unique:
                       description: Whether or not this setting's value is unique to
                         this node, e.g. a serial number.
@@ -1729,26 +1644,6 @@ rules:
   - get
   - patch
   - update
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions
-  verbs:
-  - create
-  - delete
-  - get
-  - list
-  - patch
-  - update
-  - watch
-- apiGroups:
-  - metal3.io
-  resources:
-  - bmceventsubscriptions/status
-  verbs:
-  - get
-  - patch
-  - update
 - apiGroups:
   - metal3.io
   resources:
@@ -1961,16 +1856,6 @@ spec:
         webhook: metal3-io-v1alpha1-baremetalhost
     spec:
       containers:
-      - args:
-        - --secure-listen-address=0.0.0.0:8443
-        - --upstream=http://127.0.0.1:8085/
-        - --logtostderr=true
-        - --v=10
-        image: gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0
-        name: kube-rbac-proxy
-        ports:
-        - containerPort: 8443
-          name: https
       - args:
         - --metrics-addr=127.0.0.1:8085
         - --enable-leader-election
@@ -2019,6 +1904,16 @@ spec:
         - mountPath: /tmp/k8s-webhook-server/serving-certs
           name: cert
           readOnly: true
+      - args:
+        - --secure-listen-address=0.0.0.0:8443
+        - --upstream=http://127.0.0.1:8085/
+        - --logtostderr=true
+        - --v=10
+        image: gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0
+        name: kube-rbac-proxy
+        ports:
+        - containerPort: 8443
+          name: https
       serviceAccountName: baremetal-operator-controller-manager
       terminationGracePeriodSeconds: 10
       volumes:
@@ -2077,24 +1972,3 @@ webhooks:
     resources:
     - baremetalhosts
   sideEffects: None
-- admissionReviewVersions:
-  - v1
-  - v1beta
-  clientConfig:
-    service:
-      name: baremetal-operator-webhook-service
-      namespace: baremetal-operator-system
-      path: /validate-metal3-io-v1alpha1-bmceventsubscription
-  failurePolicy: Fail
-  name: bmceventsubscription.metal3.io
-  rules:
-  - apiGroups:
-    - metal3.io
-    apiVersions:
-    - v1alpha1
-    operations:
-    - CREATE
-    - UPDATE
-    resources:
-    - bmceventsubscriptions
-  sideEffects: None
diff --git a/config/webhook/manifests.yaml b/config/webhook/manifests.yaml
index ed0e1a3c..d39766c9 100644
--- a/config/webhook/manifests.yaml
+++ b/config/webhook/manifests.yaml
@@ -27,24 +27,3 @@ webhooks:
     resources:
     - baremetalhosts
   sideEffects: None
-- admissionReviewVersions:
-  - v1
-  - v1beta
-  clientConfig:
-    service:
-      name: webhook-service
-      namespace: system
-      path: /validate-metal3-io-v1alpha1-bmceventsubscription
-  failurePolicy: Fail
-  name: bmceventsubscription.metal3.io
-  rules:
-  - apiGroups:
-    - metal3.io
-    apiVersions:
-    - v1alpha1
-    operations:
-    - CREATE
-    - UPDATE
-    resources:
-    - bmceventsubscriptions
-  sideEffects: None
diff --git a/controllers/metal3.io/baremetalhost_controller.go b/controllers/metal3.io/baremetalhost_controller.go
index f06e1c68..8eb5b399 100644
--- a/controllers/metal3.io/baremetalhost_controller.go
+++ b/controllers/metal3.io/baremetalhost_controller.go
@@ -95,7 +95,6 @@ func (info *reconcileInfo) publishEvent(reason, message string) {
 // Allow for managing hostfirmwaresettings and firmwareschema
 //+kubebuilder:rbac:groups=metal3.io,resources=hostfirmwaresettings,verbs=get;list;watch;create;update;patch
 //+kubebuilder:rbac:groups=metal3.io,resources=firmwareschemas,verbs=get;list;watch;create;update;patch
-//+kubebuilder:rbac:groups=metal3.io,resources=bmceventsubscriptions,verbs=get;list;watch;create;update;patch
 
 // Reconcile handles changes to BareMetalHost resources
 func (r *BareMetalHostReconciler) Reconcile(ctx context.Context, request ctrl.Request) (result ctrl.Result, err error) {
@@ -1483,7 +1482,7 @@ func (r *BareMetalHostReconciler) getBMCSecretAndSetOwner(request ctrl.Request,
 	reqLogger := r.Log.WithValues("baremetalhost", request.NamespacedName)
 	secretManager := r.secretManager(reqLogger)
 
-	bmcCredsSecret, err := secretManager.AcquireSecret(host.CredentialsKey(), host, true, host.Status.Provisioning.State != metal3v1alpha1.StateDeleting)
+	bmcCredsSecret, err := secretManager.AcquireSecret(host.CredentialsKey(), host, true, true)
 	if err != nil {
 		if k8serrors.IsNotFound(err) {
 			return nil, &ResolveBMCSecretRefError{message: fmt.Sprintf("The BMC secret %s does not exist", host.CredentialsKey())}
diff --git a/controllers/metal3.io/bmceventsubscription_controller.go b/controllers/metal3.io/bmceventsubscription_controller.go
deleted file mode 100644
index cfe0b7f8..00000000
--- a/controllers/metal3.io/bmceventsubscription_controller.go
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package controllers
-
-import (
-	"context"
-	"fmt"
-	"reflect"
-	"time"
-
-	"github.com/go-logr/logr"
-	"github.com/pkg/errors"
-
-	corev1 "k8s.io/api/core/v1"
-	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/types"
-	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/builder"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/event"
-	"sigs.k8s.io/controller-runtime/pkg/handler"
-	"sigs.k8s.io/controller-runtime/pkg/predicate"
-	"sigs.k8s.io/controller-runtime/pkg/source"
-
-	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
-	"github.com/metal3-io/baremetal-operator/pkg/provisioner"
-	"github.com/metal3-io/baremetal-operator/pkg/secretutils"
-	"github.com/metal3-io/baremetal-operator/pkg/utils"
-)
-
-const (
-	subscriptionRetryDelay = time.Minute * 10
-)
-
-type BMCEventSubscriptionReconciler struct {
-	client.Client
-	Log                logr.Logger
-	ProvisionerFactory provisioner.Factory
-	APIReader          client.Reader
-}
-
-//+kubebuilder:rbac:groups=metal3.io,resources=bmceventsubscriptions,verbs=get;list;watch;create;update;patch;delete
-//+kubebuilder:rbac:groups=metal3.io,resources=bmceventsubscriptions/status,verbs=get;update;patch
-
-func (r *BMCEventSubscriptionReconciler) Reconcile(ctx context.Context, request ctrl.Request) (result ctrl.Result, err error) {
-	reqLogger := r.Log.WithValues("bmceventsubscription", request.NamespacedName)
-	reqLogger.Info("start")
-
-	defer func() {
-		reqLogger.Info("done")
-	}()
-
-	// Fetch the BMCEventSubscription
-	subscription := &metal3v1alpha1.BMCEventSubscription{}
-	err = r.Get(ctx, request.NamespacedName, subscription)
-	if err != nil {
-		if k8serrors.IsNotFound(err) {
-			// Request object not found, could have been deleted after
-			// reconcile request.  Owned objects are automatically
-			// garbage collected. For additional cleanup logic use
-			// finalizers.  Return and don't requeue
-			return ctrl.Result{}, nil
-		}
-		// Error reading the object - requeue the request.
-		return ctrl.Result{}, errors.Wrap(err, "could not load subscription")
-	}
-
-	host := &metal3v1alpha1.BareMetalHost{}
-	namespacedHostName := types.NamespacedName{
-		Name:      subscription.Spec.HostName,
-		Namespace: request.Namespace,
-	}
-	err = r.Get(ctx, namespacedHostName, host)
-	if err != nil {
-		if k8serrors.IsNotFound(err) {
-			reqLogger.Error(err, "baremetalhost not found", "host", subscription.Spec.HostName)
-
-			message := fmt.Sprintf("baremetal host \"%s\"", subscription.Status.Error)
-			return r.handleError(ctx, subscription, err, message, true)
-		}
-		// Error reading the object - requeue the request.
-		return ctrl.Result{}, errors.Wrap(err, "could not load host data")
-	}
-
-	err = r.addFinalizer(ctx, subscription)
-
-	if err != nil {
-		return ctrl.Result{}, errors.Wrap(err, "failed add finalizer")
-	}
-
-	prov, ready, err := r.getProvisioner(request, host)
-
-	if err != nil {
-		return ctrl.Result{}, errors.Wrap(err, "failed to create provisioner")
-	}
-
-	if !ready {
-		reqLogger.Info("provisioner is not ready", "RequeueAfter:", provisionerNotReadyRetryDelay)
-		return ctrl.Result{RequeueAfter: provisionerNotReadyRetryDelay}, nil
-	}
-
-	if subscription.DeletionTimestamp.IsZero() {
-		// Not being deleted
-		if err := r.createSubscription(ctx, prov, subscription); err != nil {
-			return r.handleError(ctx, subscription, err, "failed to create a subscription", false)
-		}
-	} else {
-		// Being deleted
-		if err := r.deleteSubscription(ctx, prov, subscription); err != nil {
-			return r.handleError(ctx, subscription, err, "failed to delete a subscription", false)
-		}
-
-		return ctrl.Result{}, nil
-	}
-
-	return
-
-}
-
-func (r *BMCEventSubscriptionReconciler) handleError(ctx context.Context, subscription *metal3v1alpha1.BMCEventSubscription, e error, message string, requeue bool) (ctrl.Result, error) {
-	subscription.Status.Error = message
-	err := r.Status().Update(ctx, subscription)
-	if err != nil {
-		return ctrl.Result{}, errors.Wrap(err, "failed to update subscription status")
-	}
-
-	if requeue {
-		return ctrl.Result{RequeueAfter: subscriptionRetryDelay}, nil
-	}
-
-	return ctrl.Result{}, errors.Wrap(e, message)
-
-}
-
-func (r *BMCEventSubscriptionReconciler) addFinalizer(ctx context.Context, subscription *metal3v1alpha1.BMCEventSubscription) error {
-	reqLogger := r.Log.WithName("bmceventsubscription")
-
-	// Add a finalizer to newly created objects.
-	if subscription.DeletionTimestamp.IsZero() && !subscriptionHasFinalizer(subscription) {
-		reqLogger.Info(
-			"adding finalizer",
-			"existingFinalizers", subscription.Finalizers,
-			"newValue", metal3v1alpha1.BMCEventSubscriptionFinalizer,
-		)
-		subscription.Finalizers = append(subscription.Finalizers,
-			metal3v1alpha1.BMCEventSubscriptionFinalizer)
-		err := r.Update(ctx, subscription)
-		if err != nil {
-			return errors.Wrap(err, "failed to add finalizer")
-		}
-		return nil
-	}
-
-	return nil
-}
-
-func (r *BMCEventSubscriptionReconciler) createSubscription(ctx context.Context, prov provisioner.Provisioner, subscription *metal3v1alpha1.BMCEventSubscription) error {
-	reqLogger := r.Log.WithName("bmceventsubscription")
-
-	if subscription.Status.SubscriptionID != "" {
-		reqLogger.Info("subscription already exists")
-		return nil
-	}
-
-	headers, err := r.getHTTPHeaders(*subscription)
-
-	if err != nil {
-		reqLogger.Error(err, "failed to get http headers")
-		subscription.Status.Error = fmt.Sprintf("failed to retrieve HTTP headers secret")
-		updateErr := r.Status().Update(ctx, subscription)
-		if updateErr != nil {
-			return errors.Wrap(updateErr, "failed to update subscription status")
-		}
-		return err
-	}
-
-	if _, err := prov.AddBMCEventSubscriptionForNode(subscription, headers); err != nil {
-		return errors.Wrap(err, "failed to create subscription")
-	}
-
-	return r.Status().Update(ctx, subscription)
-}
-
-func (r *BMCEventSubscriptionReconciler) deleteSubscription(ctx context.Context, prov provisioner.Provisioner, subscription *metal3v1alpha1.BMCEventSubscription) error {
-	reqLogger := r.Log.WithName("bmceventsubscription")
-	reqLogger.Info("deleting subscription")
-
-	if subscriptionHasFinalizer(subscription) {
-		if _, err := prov.RemoveBMCEventSubscriptionForNode(*subscription); err != nil {
-			return errors.Wrap(err, "failed to remove a subscription")
-		}
-
-		// Remove finalizer to allow deletion
-		subscription.Finalizers = utils.FilterStringFromList(
-			subscription.Finalizers, metal3v1alpha1.BMCEventSubscriptionFinalizer)
-		reqLogger.Info("cleanup is complete, removed finalizer",
-			"remaining", subscription.Finalizers)
-		if err := r.Update(context.Background(), subscription); err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-func (r *BMCEventSubscriptionReconciler) getProvisioner(request ctrl.Request, host *metal3v1alpha1.BareMetalHost) (prov provisioner.Provisioner, ready bool, err error) {
-	reqLogger := r.Log.WithValues("bmceventsubscription", request.NamespacedName)
-
-	prov, err = r.ProvisionerFactory.NewProvisioner(provisioner.BuildHostDataNoBMC(*host), nil)
-	if err != nil {
-		return prov, ready, errors.Wrap(err, "failed to create provisioner")
-	}
-
-	ready, err = prov.IsReady()
-	if err != nil {
-		return prov, ready, errors.Wrap(err, "failed to check services availability")
-	}
-
-	if !ready {
-		reqLogger.Info("provisioner is not ready", "RequeueAfter:", provisionerNotReadyRetryDelay)
-		return prov, ready, nil
-	}
-
-	return prov, ready, nil
-}
-
-func (r *BMCEventSubscriptionReconciler) secretManager(log logr.Logger) secretutils.SecretManager {
-	return secretutils.NewSecretManager(log, r.Client, r.APIReader)
-}
-
-func (r *BMCEventSubscriptionReconciler) getHTTPHeaders(subscription metal3v1alpha1.BMCEventSubscription) ([]map[string]string, error) {
-	headers := []map[string]string{}
-
-	if subscription.Spec.HTTPHeadersRef == nil {
-		return headers, nil
-	}
-
-	secret := &corev1.Secret{}
-	secretKey := types.NamespacedName{
-		Name:      subscription.Spec.HTTPHeadersRef.Name,
-		Namespace: subscription.Spec.HTTPHeadersRef.Namespace,
-	}
-
-	err := r.Get(context.TODO(), secretKey, secret)
-
-	if err != nil {
-		return headers, err
-	}
-
-	for headerName, headerValueBytes := range secret.Data {
-		header := map[string]string{}
-		header[headerName] = string(headerValueBytes)
-		headers = append(headers, header)
-	}
-
-	return headers, err
-}
-
-func (r *BMCEventSubscriptionReconciler) updateEventHandler(e event.UpdateEvent) bool {
-	_, oldOK := e.ObjectOld.(*metal3v1alpha1.BMCEventSubscription)
-	_, newOK := e.ObjectNew.(*metal3v1alpha1.BMCEventSubscription)
-	if !(oldOK && newOK) {
-		return true
-	}
-
-	// If the update increased the resource Generation then let's process it
-	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.ObjectNew.GetFinalizers(), e.ObjectOld.GetFinalizers()) && reflect.DeepEqual(e.ObjectNew.GetAnnotations(), e.ObjectOld.GetAnnotations()) {
-		return false
-	}
-
-	return true
-}
-
-// SetupWithManager registers the reconciler to be run by the manager
-func (r *BMCEventSubscriptionReconciler) SetupWithManager(mgr ctrl.Manager) error {
-	return ctrl.NewControllerManagedBy(mgr).
-		For(&metal3v1alpha1.BMCEventSubscription{}).
-		WithEventFilter(predicate.Funcs{
-			UpdateFunc: r.updateEventHandler,
-		}).
-		Watches(&source.Kind{Type: &metal3v1alpha1.BareMetalHost{}}, &handler.EnqueueRequestForObject{}, builder.Predicates{}).
-		Complete(r)
-}
-
-func subscriptionHasFinalizer(subscription *metal3v1alpha1.BMCEventSubscription) bool {
-	return utils.StringInList(subscription.Finalizers, metal3v1alpha1.BMCEventSubscriptionFinalizer)
-}
diff --git a/docs/api.md b/docs/api.md
index 0b09aa05..159ec6c3 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -393,15 +393,11 @@ Settings related to deploying an image to the host.
 * *state* -- The current state of any ongoing provisioning operation.
   The following are the currently supported ones:
   * *\<empty string\>* -- There is no provisioning happening, at the moment.
-  * *unmanaged* -- There is an insufficient information available to register
-    the host.
   * *registering* -- The host's BMC details are being checked.
   * *match profile* -- The discovered hardware details on the host
     are being compared against known profiles.
   * *available* -- The host is available to be consumed. (This state was
     previously known as *ready*.)
-  * *preparing* -- The existing configuration will be removed, and the new
-    configuration will be set on the host.
   * *provisioning* -- An image is being written to the host's disk(s).
   * *provisioned* -- An image has been completely written to the host's
     disk(s).
@@ -409,7 +405,6 @@ Settings related to deploying an image to the host.
   * *deprovisioning* -- The image is being wiped from the host's disk(s).
   * *inspecting* -- The hardware details for the host are being collected
     by an agent.
-  * *deleting* -- The host is being deleted from the cluster.
 * *id* -- The unique identifier for the service in the underlying
   provisioning tool.
 * *image* -- The image most recently provisioned to the host.
@@ -596,252 +591,3 @@ state.
 
 Please note only the existence of the annotation is important to treat the BMH
 as detached and the value of the annotation is always ignored.
-
-## HostFirmwareSettings
-
-A **HostFirmwareSettings** resource is used to manage BIOS settings for a host,
-there is a one-to-one mapping with **BareMetalHosts**.  A
-**HostFirmwareSettings** resource is created when BIOS settings are read from
-Ironic as the host moves to the Ready state.  These settings are the complete
-actual BIOS configuration names returned from the BMC, typically 100-200
-settings per host, as compared to the three vendor-independent fields stored in
-the **BareMetalHosts** `firmware` field.
-
-### HostFirmwareSettings spec
-
-The *HostFirmwareSettings's* *spec* defines the desired BIOS settings. These
-settings will be sent to Ironic as part of clean-steps for update to the BMC
-when the host goes through cleaning, i.e. when the **BareMetalHosts** go
-through the Preparing state.
-
-#### spec settings
-
-The `settings` are an array of name/value pairs for the BIOS settings.
-The names must match the names read from Ironic and stored in the `status`
-field. The values must be within the limits as defined in the *FirmwareSchema*.
-Only settings which are not defined as `ReadOnly` or `Unique` (such as
-SerialNumbers) will be accepted.
-
-### HostFirmwareSettings status
-
-The *HostFirmwareSettings's* *status* defines the actual BIOS settings read
-from Ironic.
-
-#### status schema
-
-`Schema` is a reference to a *FirmwareSchema* resource that describes each
-BIOS setting by type and configurable limits for the type.
-
-#### status settings
-
-The `settings` are an array of name/value pairs listing the complete set
-of BIOS settings retrieved from Ironic.
-
-#### status conditions
-
-`conditions` reflects the status of the fields in the *spec*. Possible
-conditions are:
-
-* *Valid* -- When set to *True* indicates that all *settings* in the *spec* are
-  correct for names and values. This is also set to *True* when nothing is set
-  in the *spec*. When set to *False* indicates that one or more names or values
-  in the *spec* are incorrect, the actual error will be shown in the *Events*
-  field.
-* *UpdateRequested* -- Indicates whether or not settings in the *spec* are
-  different than settings in the *status*. When set to *True* the settings that
-  are different will be included in the clean-steps that are written to Ironic
-  as part of cleaning.
-
-### HostFirmwareSettings Example
-
-The following is a complete example from a running cluster of a
-*HostFirmwareSettings* resource (in YAML), it includes its spec and status
-sections:
-
-```yaml
-apiVersion: metal3.io/v1alpha1
-kind: HostFirmwareSettings
-metadata:
-  creationTimestamp: "2021-11-03T21:21:02Z"
-  generation: 1
-  name: ostest-worker-0
-  namespace: openshift-machine-api
-  ownerReferences:
-  - apiVersion: metal3.io/v1alpha1
-    blockOwnerDeletion: true
-    controller: true
-    kind: BareMetalHost
-    name: ostest-worker-0
-    uid: 87b08d19-b94c-4a29-901a-67890d9eb843
-  resourceVersion: "24688"
-  uid: 293a351b-1743-437d-abed-da53d41d8804
-spec:
-  settings: {}
-status:
-  conditions:
-  - lastTransitionTime: "2021-11-03T21:21:54Z"
-    message: ""
-    observedGeneration: 1
-    reason: Success
-    status: "False"
-    type: UpdateRequested
-  - lastTransitionTime: "2021-11-03T21:21:54Z"
-    message: ""
-    observedGeneration: 1
-    reason: Success
-    status: "True"
-    type: Valid
-  schema:
-    name: schema-dc98d7c8
-    namespace: openshift-machine-api
-  settings:
-    BootMode: Uefi
-    EmbeddedSata: Raid
-    L2Cache: 10x256 KB
-    NicBoot1: NetworkBoot
-    NumCores: "10"
-    ProcTurboMode: Enabled
-    QuietBoot: "true"
-    SecureBootStatus: Enabled
-    SerialNumber: QPX12345
-```
-
-## FirmwareSchema
-
-A **FirmwareSchema** resource contains the limits each setting, specific to
-each host.  This data comes directly from the BMC via Ironic. It can be used
-to prevent misconfiguration of the **HostFirmwareSettings** *spec* field so
-that invalid values are not sent to the host. The **FirmwareSchema** has a
-unique identifier derived from its settings and limits. Multiple hosts may therefore
-have the same **FirmwareSchema** identifier so its likely that more than one
-**HostFirmwareSettings** reference the same **FirmwareSchema** when
-hardware of the same vendor and model are used.
-
-### FirmwareSchema spec
-
-#### spec schema
-
-A map of settings names and limits. The values returned in the limits depend
-on the type of the setting. The following fields are included:
-
-* *attribute_type* -- The type of setting - `Enumeration`, `Integer`, `String`,
-  `Boolean`, or `Password`
-* *allowable_values* -- A list of allowable values when the `attribute_type` is `Enumeration`
-* *lower_bound* -- The lowest allowed value when attribute_type is `Integer`
-* *upper_bound* -- The highest allowed value when attribute_type is `Integer`
-* *min_length* -- The shortest string length that the value can have when
-  attribute_type is `String`
-* *max_length* -- The longest string length that the value can have when
-  attribute_type is `String`
-* *read_only* -- The setting is ready only and cannot be modified
-* *unique* -- The setting is specific to this host
-* *reset_required* -- After changing this setting a node reboot is required
-
-#### hardwareVendor
-
-The name of the vendor that this schema corresponds to.
-
-#### hardwareModel
-
-The hardware model that this schema corresponds to.
-
-### FirmwareSchema Example
-
-```yaml
-apiVersion: v1
-items:
-- apiVersion: metal3.io/v1alpha1
-  kind: FirmwareSchema
-  metadata:
-    creationTimestamp: "2021-11-03T21:21:54Z"
-    generation: 1
-    name: schema-4f53cda1
-    namespace: openshift-machine-api
-    ownerReferences:
-    - apiVersion: metal3.io/v1alpha1
-      kind: HostFirmwareSettings
-      name: ostest-master-0
-      uid: 8c315c33-29b0-4863-a61d-ce5ddde58498
-    resourceVersion: "19133"
-    uid: d169cd94-4d6e-4567-a1b9-d5f4962a8dee
-  spec:
-    hardwareModel: KVM (8.2.0)
-    hardwareVendor: Red Hat
-    schema: {}
-- apiVersion: metal3.io/v1alpha1
-  kind: FirmwareSchema
-  metadata:
-    creationTimestamp: "2021-11-03T21:21:54Z"
-    generation: 1
-    name: schema-dc98d7c8
-    namespace: openshift-machine-api
-    ownerReferences:
-    - apiVersion: metal3.io/v1alpha1
-      kind: HostFirmwareSettings
-      name: ostest-master-1
-      uid: a991875d-9897-49f1-9d86-16ea9ed6c84f
-    resourceVersion: "19141"
-    uid: b442e01f-3724-4f14-a578-f0b99d296c95
-  spec:
-    hardwareModel: KVM (8.2.0)
-    hardwareVendor: Red Hat
-    schema:
-      BootMode:
-        allowable_values:
-        - Bios
-        - Uefi
-        attribute_type: Enumeration
-        read_only: false
-      EmbeddedSata:
-        allowable_values:
-        - Ata
-        - Ahci
-        - Raid
-        - "Off"
-        attribute_type: Enumeration
-        read_only: false
-     L2Cache:
-        attribute_type: String
-        max_length: 16
-        min_length: 0
-        read_only: false
-        unique: false
-      NicBoot1:
-        allowable_values:
-        - NetworkBoot
-        - Disabled
-        attribute_type: Enumeration
-        read_only: false
-      NumCores:
-        attribute_type: Integer
-        lower_bound: 10
-        read_only: true
-        unique: false
-        upper_bound: 20
-      ProcTurboMode:
-        allowable_values:
-        - Enabled
-        - Disabled
-        attribute_type: Enumeration
-        read_only: false
-      QuietBoot:
-        attribute_type: Boolean
-        read_only: false
-        unique: false
-      SecureBootStatus:
-        allowable_values:
-        - Enabled
-        - Disabled
-        attribute_type: Enumeration
-        read_only: true
-      SerialNumber:
-        attribute_type: String
-        max_length: 16
-        min_length: 0
-        read_only: false
-        unique: true
-      SysPassword:
-        attribute_type: Password
-        read_only: false
-        unique: false
-```
diff --git a/go.mod b/go.mod
index d2aac1f4..9733fc72 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ go 1.17
 
 require (
 	github.com/go-logr/logr v0.4.0
-	github.com/gophercloud/gophercloud v0.22.0
+	github.com/gophercloud/gophercloud v0.18.0
 	github.com/metal3-io/baremetal-operator/apis v0.0.0
 	github.com/metal3-io/baremetal-operator/pkg/hardwareutils v0.0.0
 	github.com/pkg/errors v0.9.1
diff --git a/go.sum b/go.sum
index 84daba75..9ea428c2 100644
--- a/go.sum
+++ b/go.sum
@@ -190,8 +190,8 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
 github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
 github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
-github.com/gophercloud/gophercloud v0.22.0 h1:9lFISNLafZcecT0xUveIMt3IafexC6DIV9ek1SZdSMw=
-github.com/gophercloud/gophercloud v0.22.0/go.mod h1:wRtmUelyIIv3CSSDI47aUwbs075O6i+LY+pXsKCBsb4=
+github.com/gophercloud/gophercloud v0.18.0 h1:V6hcuMPmjXg+js9flU8T3RIHDCjV7F5CG5GD0MRhP/w=
+github.com/gophercloud/gophercloud v0.18.0/go.mod h1:wRtmUelyIIv3CSSDI47aUwbs075O6i+LY+pXsKCBsb4=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index ddfca475..72f76194 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -5,18 +5,11 @@ go 1.17
 require (
 	github.com/golangci/golangci-lint v1.41.1
 	sigs.k8s.io/controller-tools v0.6.2
-	sigs.k8s.io/kustomize/kustomize/v3 v3.8.5
+	sigs.k8s.io/kustomize/kustomize/v3 v3.10.0
 )
 
 require (
 	4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a // indirect
-	cloud.google.com/go v0.81.0 // indirect
-	github.com/Azure/go-autorest v14.2.0+incompatible // indirect
-	github.com/Azure/go-autorest/autorest v0.11.12 // indirect
-	github.com/Azure/go-autorest/autorest/adal v0.9.5 // indirect
-	github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
-	github.com/Azure/go-autorest/logger v0.2.0 // indirect
-	github.com/Azure/go-autorest/tracing v0.6.0 // indirect
 	github.com/BurntSushi/toml v0.3.1 // indirect
 	github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
 	github.com/Masterminds/semver v1.5.0 // indirect
@@ -37,13 +30,11 @@ require (
 	github.com/daixiang0/gci v0.2.8 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/denis-tingajkin/go-header v0.4.2 // indirect
-	github.com/emicklei/go-restful v2.9.5+incompatible // indirect
 	github.com/esimonov/ifshort v1.0.2 // indirect
 	github.com/ettle/strcase v0.1.1 // indirect
 	github.com/evanphx/json-patch v4.9.0+incompatible // indirect
 	github.com/fatih/color v1.12.0 // indirect
 	github.com/fatih/structtag v1.2.0 // indirect
-	github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect
 	github.com/fsnotify/fsnotify v1.4.9 // indirect
 	github.com/fzipp/gocyclo v0.3.1 // indirect
 	github.com/go-critic/go-critic v0.5.6 // indirect
@@ -85,18 +76,18 @@ require (
 	github.com/google/go-cmp v0.5.6 // indirect
 	github.com/google/gofuzz v1.1.0 // indirect
 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
-	github.com/googleapis/gnostic v0.4.1 // indirect
 	github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 // indirect
 	github.com/gostaticanalysis/analysisutil v0.4.1 // indirect
 	github.com/gostaticanalysis/comment v1.4.1 // indirect
 	github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 // indirect
 	github.com/gostaticanalysis/nilerr v0.1.1 // indirect
 	github.com/hashicorp/errwrap v1.0.0 // indirect
-	github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
+	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
 	github.com/hashicorp/go-multierror v1.1.1 // indirect
 	github.com/hashicorp/go-safetemp v1.0.0 // indirect
 	github.com/hashicorp/go-version v1.1.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/imdario/mergo v0.3.8 // indirect
 	github.com/inconshreveable/mousetrap v1.0.0 // indirect
 	github.com/jgautheron/goconst v1.5.1 // indirect
 	github.com/jingyugao/rowserrcheck v1.1.0 // indirect
@@ -138,8 +129,6 @@ require (
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/polyfloyd/go-errorlint v0.0.0-20210510181950-ab96adb96fea // indirect
-	github.com/posener/complete/v2 v2.0.1-alpha.12 // indirect
-	github.com/posener/script v1.0.4 // indirect
 	github.com/prometheus/client_golang v1.7.1 // indirect
 	github.com/prometheus/client_model v0.2.0 // indirect
 	github.com/prometheus/common v0.10.0 // indirect
@@ -176,20 +165,15 @@ require (
 	github.com/uudashr/gocognit v1.0.1 // indirect
 	github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect
 	github.com/yeya24/promlinter v0.1.0 // indirect
-	github.com/yujunz/go-getter v1.4.1-lite // indirect
+	github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf // indirect
 	go.mongodb.org/mongo-driver v1.5.1 // indirect
 	go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
-	golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect
 	golang.org/x/mod v0.4.2 // indirect
 	golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect
-	golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 // indirect
 	golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
-	golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
 	golang.org/x/text v0.3.6 // indirect
-	golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
 	golang.org/x/tools v0.1.5 // indirect
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
-	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/protobuf v1.26.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/ini.v1 v1.62.0 // indirect
@@ -199,17 +183,15 @@ require (
 	k8s.io/api v0.21.3 // indirect
 	k8s.io/apiextensions-apiserver v0.21.3 // indirect
 	k8s.io/apimachinery v0.21.3 // indirect
-	k8s.io/client-go v0.21.3 // indirect
 	k8s.io/klog/v2 v2.8.0 // indirect
-	k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect
 	k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
 	mvdan.cc/gofumpt v0.1.1 // indirect
 	mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect
 	mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect
 	mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 // indirect
-	sigs.k8s.io/kustomize/api v0.6.3 // indirect
-	sigs.k8s.io/kustomize/cmd/config v0.8.2 // indirect
-	sigs.k8s.io/kustomize/kyaml v0.9.1 // indirect
+	sigs.k8s.io/kustomize/api v0.8.0 // indirect
+	sigs.k8s.io/kustomize/cmd/config v0.9.1 // indirect
+	sigs.k8s.io/kustomize/kyaml v0.10.9 // indirect
 	sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
 	sigs.k8s.io/yaml v1.2.0 // indirect
 )
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index debc8e73..a6ae0de4 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -21,7 +21,6 @@ cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKP
 cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
 cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
 cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
-cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8=
 cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
@@ -47,26 +46,12 @@ contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EU
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE=
 github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
-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.11.12 h1:gI8ytXbxMfI+IVbI9mP2JGCTXIuhHLgRlvQ9X4PsnHE=
 github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
-github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
-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.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.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
-github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE=
 github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
-github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
-github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -85,11 +70,9 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE
 github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us=
 github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
 github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
-github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
@@ -176,7 +159,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
 github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/daixiang0/gci v0.2.8 h1:1mrIGMBQsBu0P7j7m1M8Lb+ZeZxsZL+jyGX4YoMJJpg=
 github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc=
-github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -187,15 +169,12 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/dustmop/soup v1.1.2-0.20190516214245-38228baa104e/go.mod h1:CgNC6SGbT+Xb8wGGvzilttZL1mc5sQ/5KkcxsZttMIk=
-github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -209,7 +188,6 @@ github.com/esimonov/ifshort v1.0.2 h1:K5s1W2fGfkoWXsFlxBNqT6J0ZCncPaKrGM5qe0bni6
 github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE=
 github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw=
 github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY=
-github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
@@ -220,7 +198,6 @@ github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc=
 github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
-github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
@@ -228,7 +205,6 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
 github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM=
 github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc=
 github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E=
-github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
@@ -261,13 +237,11 @@ github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQH
 github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
 github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
 github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
@@ -283,7 +257,6 @@ github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6
 github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
 github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI=
 github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
-github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
 github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
@@ -296,7 +269,6 @@ github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+Z
 github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM=
 github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
-github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
 github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
@@ -354,6 +326,7 @@ github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E
 github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
 github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
 github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
+github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM=
 github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
 github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
@@ -370,7 +343,6 @@ github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY=
 github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@@ -389,7 +361,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
 github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
-github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -455,7 +426,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -485,11 +455,8 @@ github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 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.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
 github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ=
-github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
@@ -528,11 +495,13 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN
 github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
 github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
+github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
 github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
 github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
 github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
 github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
 github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
@@ -561,6 +530,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
 github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -578,10 +548,8 @@ github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhB
 github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
-github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
 github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -644,7 +612,6 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
 github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
-github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -654,6 +621,7 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7
 github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ=
 github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU=
 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
+github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI=
 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
 github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA=
@@ -712,7 +680,6 @@ github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXy
 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=
-github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
@@ -790,12 +757,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/polyfloyd/go-errorlint v0.0.0-20210510181950-ab96adb96fea h1:Sk6Xawg57ZkjXmFYD1xCHSKN6FtYM+km51MM7Lveyyc=
 github.com/polyfloyd/go-errorlint v0.0.0-20210510181950-ab96adb96fea/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
-github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/posener/complete/v2 v2.0.1-alpha.12 h1:0wvkuDfHb5vSZlNBYgpEH4XQHpF46MjLPHav8XC77Nc=
-github.com/posener/complete/v2 v2.0.1-alpha.12/go.mod h1://JlL91cS2JV7rOl6LVHrRqBXoBUecJu3ILQPgbJiMQ=
-github.com/posener/script v1.0.4 h1:nSuXW5ZdmFnQIueLB2s0qvs4oNsUloM1Zydzh75v42w=
-github.com/posener/script v1.0.4/go.mod h1:Rg3ijooqulo05aGLyGsHoLmIOUzHUVK19WVgrYBPU/E=
 github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
@@ -918,7 +880,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -952,7 +913,6 @@ github.com/tommy-muehle/go-mnd/v2 v2.4.0 h1:1t0f8Uiaq+fqKteUR4N9Umr6E99R+lDnLnq7
 github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
 github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
@@ -992,8 +952,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yujunz/go-getter v1.4.1-lite h1:FhvNc94AXMZkfqUwfMKhnQEC9phkphSGdPTL7tIdhOM=
-github.com/yujunz/go-getter v1.4.1-lite/go.mod h1:sbmqxXjyLunH1PkF3n7zSlnVeMvmYUuIl9ZVs/7NyCc=
+github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf h1:gvEmqF83GB8R5XtrMseJb6A6R0OCtNAS8f4TmZg2dGc=
+github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf/go.mod h1:bL0Pr07HEdsMZ1WBqZIxXj96r5LnFsY4LgPaPEGkw1k=
 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/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
@@ -1035,7 +995,6 @@ golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnf
 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=
-golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
@@ -1050,7 +1009,6 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1090,7 +1048,6 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1159,7 +1116,6 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ
 golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc=
 golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1173,7 +1129,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1182,7 +1137,6 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1249,9 +1203,7 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0v
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1266,12 +1218,10 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1413,7 +1363,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww
 google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
@@ -1530,11 +1479,11 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -1549,38 +1498,23 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 honnef.co/go/tools v0.2.0 h1:ws8AfbgTX3oIczLPNPCu5166oBg9ST2vNs0rcht+mDE=
 honnef.co/go/tools v0.2.0/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY=
-k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI=
-k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0=
 k8s.io/api v0.21.3 h1:cblWILbLO8ar+Fj6xdDGr603HRsf8Wu9E9rngJeprZQ=
 k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg=
 k8s.io/apiextensions-apiserver v0.21.3 h1:+B6biyUWpqt41kz5x6peIsljlsuwvNAp/oFax/j2/aY=
 k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE=
-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.21.3 h1:3Ju4nvjCngxxMYby0BimUk+pQHPOQp3eCGChk5kfVII=
 k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI=
 k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU=
-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.21.3 h1:J9nxZTOmvkInRDCzcSNQmPJbDYN/PjlxXT9Mos3HcLg=
 k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU=
 k8s.io/code-generator v0.21.3/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo=
 k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ=
-k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
-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.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts=
 k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
-k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
-k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0=
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
-k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 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.1.1 h1:bi/1aS/5W00E2ny5q65w9SnKpWEF/UIOqDYBILpo9rA=
@@ -1598,16 +1532,14 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/controller-tools v0.6.2 h1:+Y8L0UsAugDipGRw8lrkPoAi6XqlQVZuf1DQHME3PgU=
 sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8=
-sigs.k8s.io/kustomize/api v0.6.3 h1:CX9Vot48rKRYZXzDkYJ7aJ4pEfjl8u7W8MPysbfYWps=
-sigs.k8s.io/kustomize/api v0.6.3/go.mod h1:mTwLqPB2uqh7LOcYoJKKHIfP5ioS6t3NfZ8lvia4NJY=
-sigs.k8s.io/kustomize/cmd/config v0.8.2 h1:TjKaTODb30/Ai0lFtzt0l9yfmkxpE7/GZsxV9TJbLAA=
-sigs.k8s.io/kustomize/cmd/config v0.8.2/go.mod h1:NfndXLA1moQGfNOOThNeLvHb23nrZtgf9gdM7QPdub0=
-sigs.k8s.io/kustomize/kustomize/v3 v3.8.5 h1:jtIScka2K0pkApy8NIXvCk+VCvpEFSZrnvn05LfuNbU=
-sigs.k8s.io/kustomize/kustomize/v3 v3.8.5/go.mod h1:R1zsfKSVbn6PZnZ4kAbylYj2AKyugLrk7MddPOJSEiI=
-sigs.k8s.io/kustomize/kyaml v0.9.1 h1:T7aNUraSioQp0NHJZtYjIhL/q8mqRzCiHcAKdvo09go=
-sigs.k8s.io/kustomize/kyaml v0.9.1/go.mod h1:UTm64bSWVdBUA8EQoYCxVOaBQxUdIOr5LKWxA4GNbkw=
-sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ=
-sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
+sigs.k8s.io/kustomize/api v0.8.0 h1:6C3GlBzDSrHg3q29k4nwAJHKyLAyZ+Fsz6DwZuao54w=
+sigs.k8s.io/kustomize/api v0.8.0/go.mod h1:Ih6Y6bOErR70EdapDtWitBzPG9HewyemRY6sFaQyugU=
+sigs.k8s.io/kustomize/cmd/config v0.9.1 h1:vU5aKij0ej0DroCAaiu8eObj7Z0HxNtbGi7wBmYYwP0=
+sigs.k8s.io/kustomize/cmd/config v0.9.1/go.mod h1:HAoxw2o0Kwfdre4+xAQpgD0ljMzUZvLnqcpItqnqFlk=
+sigs.k8s.io/kustomize/kustomize/v3 v3.10.0 h1:2ceyieTUl0Y5pRKAypYg1UkDSGV23cgxkeoBnz8obPI=
+sigs.k8s.io/kustomize/kustomize/v3 v3.10.0/go.mod h1:spVXMybMUUCzxzdS3TUxJU6s3kXPACyD1lK/cG+TOXI=
+sigs.k8s.io/kustomize/kyaml v0.10.9 h1:n3WNdvPPReRNDxW+XXd2JlyZ8EII721I21D1DBpBVBE=
+sigs.k8s.io/kustomize/kyaml v0.10.9/go.mod h1:K9yg1k/HB/6xNOf5VH3LhTo1DK9/5ykSZO5uIv+Y/1k=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
diff --git a/ironic-deployment/ironic/ironic.yaml b/ironic-deployment/ironic/ironic.yaml
index e27cfbf7..9f859267 100644
--- a/ironic-deployment/ironic/ironic.yaml
+++ b/ironic-deployment/ironic/ironic.yaml
@@ -49,8 +49,10 @@ spec:
             - configMapRef:
                 name: ironic-bmo-configmap
         - name: mariadb
-          image: quay.io/metal3-io/mariadb
+          image: quay.io/metal3-io/ironic
           imagePullPolicy: Always
+          command:
+            - /bin/runmariadb
           livenessProbe:
            exec:
              command: ["sh", "-c", "mysqladmin status -uironic -p$(printenv MARIADB_PASSWORD)"]
diff --git a/main.go b/main.go
index f49195e1..db41cb11 100644
--- a/main.go
+++ b/main.go
@@ -51,6 +51,7 @@ func init() {
 	_ = clientgoscheme.AddToScheme(scheme)
 
 	_ = metal3iov1alpha1.AddToScheme(scheme)
+	// +kubebuilder:scaffold:scheme
 }
 
 func printVersion() {
@@ -78,11 +79,6 @@ func setupWebhooks(mgr ctrl.Manager) {
 		setupLog.Error(err, "unable to create webhook", "webhook", "BareMetalHost")
 		os.Exit(1)
 	}
-
-	if err := (&metal3iov1alpha1.BMCEventSubscription{}).SetupWebhookWithManager(mgr); err != nil {
-		setupLog.Error(err, "unable to create webhook", "webhook", "BMCEventSubscription")
-		os.Exit(1)
-	}
 }
 
 func main() {
@@ -194,15 +190,6 @@ func main() {
 		os.Exit(1)
 	}
 
-	if err = (&metal3iocontroller.BMCEventSubscriptionReconciler{
-		Client:             mgr.GetClient(),
-		Log:                ctrl.Log.WithName("controllers").WithName("BMCEventSubscription"),
-		ProvisionerFactory: provisionerFactory,
-	}).SetupWithManager(mgr); err != nil {
-		setupLog.Error(err, "unable to create controller", "controller", "BMCEventSubscription")
-		os.Exit(1)
-	}
-
 	setupChecks(mgr)
 
 	if enableWebhook {
diff --git a/pkg/provisioner/demo/demo.go b/pkg/provisioner/demo/demo.go
index fa57a83a..d7e6e6e9 100644
--- a/pkg/provisioner/demo/demo.go
+++ b/pkg/provisioner/demo/demo.go
@@ -359,11 +359,3 @@ func (p *demoProvisioner) GetFirmwareSettings(includeSchema bool) (settings meta
 	p.log.Info("getting BIOS settings")
 	return
 }
-
-func (p *demoProvisioner) AddBMCEventSubscriptionForNode(subscription *metal3v1alpha1.BMCEventSubscription, httpHeaders provisioner.HTTPHeaders) (result provisioner.Result, err error) {
-	return result, nil
-}
-
-func (p *demoProvisioner) RemoveBMCEventSubscriptionForNode(subscription metal3v1alpha1.BMCEventSubscription) (result provisioner.Result, err error) {
-	return result, nil
-}
diff --git a/pkg/provisioner/fixture/fixture.go b/pkg/provisioner/fixture/fixture.go
index c3d0f8fc..c6e09d25 100644
--- a/pkg/provisioner/fixture/fixture.go
+++ b/pkg/provisioner/fixture/fixture.go
@@ -340,11 +340,3 @@ func (p *fixtureProvisioner) GetFirmwareSettings(includeSchema bool) (settings m
 	p.log.Info("getting BIOS settings")
 	return
 }
-
-func (p *fixtureProvisioner) AddBMCEventSubscriptionForNode(subscription *metal3v1alpha1.BMCEventSubscription, httpHeaders provisioner.HTTPHeaders) (result provisioner.Result, err error) {
-	return result, nil
-}
-
-func (p *fixtureProvisioner) RemoveBMCEventSubscriptionForNode(subscription metal3v1alpha1.BMCEventSubscription) (result provisioner.Result, err error) {
-	return result, nil
-}
diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go
index 0157752c..284e8348 100644
--- a/pkg/provisioner/ironic/ironic.go
+++ b/pkg/provisioner/ironic/ironic.go
@@ -27,7 +27,6 @@ var (
 	deprovisionRequeueDelay   = time.Second * 10
 	provisionRequeueDelay     = time.Second * 10
 	powerRequeueDelay         = time.Second * 10
-	subscriptionRequeueDelay  = time.Second * 10
 	introspectionRequeueDelay = time.Second * 15
 	softPowerOffTimeout       = time.Second * 180
 )
@@ -972,6 +971,7 @@ func (p *ironicProvisioner) GetFirmwareSettings(includeSchema bool) (settings me
 				MinLength:       v.MinLength,
 				MaxLength:       v.MaxLength,
 				ReadOnly:        v.ReadOnly,
+				ResetRequired:   v.ResetRequired,
 				Unique:          v.Unique,
 			}
 		}
@@ -1871,38 +1871,3 @@ func (p *ironicProvisioner) loadBusyHosts() (hosts map[string]struct{}, err erro
 
 	return hosts, nil
 }
-
-func (p *ironicProvisioner) AddBMCEventSubscriptionForNode(subscription *metal3v1alpha1.BMCEventSubscription, httpHeaders provisioner.HTTPHeaders) (result provisioner.Result, err error) {
-	newSubscription, err := nodes.CreateSubscription(
-		p.client,
-		p.nodeID,
-		nodes.CallVendorPassthruOpts{
-			Method: "create_subscription",
-		},
-		nodes.CreateSubscriptionOpts{
-			Destination: subscription.Spec.Destination,
-			Context:     subscription.Spec.Context,
-			HttpHeaders: httpHeaders,
-		}).Extract()
-	if err != nil {
-		return provisioner.Result{}, err
-	}
-
-	subscription.Status.SubscriptionID = newSubscription.Id
-	return operationComplete()
-}
-
-func (p *ironicProvisioner) RemoveBMCEventSubscriptionForNode(subscription metal3v1alpha1.BMCEventSubscription) (result provisioner.Result, err error) {
-	method := nodes.CallVendorPassthruOpts{
-		Method: "delete_subscription",
-	}
-	opts := nodes.DeleteSubscriptionOpts{
-		Id: subscription.Status.SubscriptionID,
-	}
-	err = nodes.DeleteSubscription(p.client, p.nodeID, method, opts).ExtractErr()
-
-	if err != nil {
-		return provisioner.Result{RequeueAfter: subscriptionRequeueDelay}, err
-	}
-	return operationComplete()
-}
diff --git a/pkg/provisioner/provisioner.go b/pkg/provisioner/provisioner.go
index e150198c..4c6f402c 100644
--- a/pkg/provisioner/provisioner.go
+++ b/pkg/provisioner/provisioner.go
@@ -113,8 +113,6 @@ type ProvisionData struct {
 	CustomDeploy    *metal3v1alpha1.CustomDeploy
 }
 
-type HTTPHeaders []map[string]string
-
 // Provisioner holds the state information for talking to the
 // provisioning backend.
 type Provisioner interface {
@@ -190,12 +188,6 @@ type Provisioner interface {
 
 	// GetFirmwareSettings gets the BIOS settings and optional schema from the host and returns maps
 	GetFirmwareSettings(includeSchema bool) (settings metal3v1alpha1.SettingsMap, schema map[string]metal3v1alpha1.SettingSchema, err error)
-
-	// AddBMCEventSubscriptionForNode creates the subscription, and updates Status.SubscriptionID
-	AddBMCEventSubscriptionForNode(subscription *metal3v1alpha1.BMCEventSubscription, httpHeaders HTTPHeaders) (result Result, err error)
-
-	// RemoveBMCEventSubscriptionForNode delete the subscription
-	RemoveBMCEventSubscriptionForNode(subscription metal3v1alpha1.BMCEventSubscription) (result Result, err error)
 }
 
 // Result holds the response from a call in the Provsioner API.
diff --git a/tools/run_local_ironic.sh b/tools/run_local_ironic.sh
index dcd54e2c..a98ef86d 100755
--- a/tools/run_local_ironic.sh
+++ b/tools/run_local_ironic.sh
@@ -8,8 +8,6 @@ IRONIC_IMAGE=${IRONIC_IMAGE:-"quay.io/metal3-io/ironic:master"}
 IRONIC_INSPECTOR_IMAGE=${IRONIC_INSPECTOR_IMAGE:-"quay.io/metal3-io/ironic"}
 IRONIC_KEEPALIVED_IMAGE=${IRONIC_KEEPALIVED_IMAGE:-"quay.io/metal3-io/keepalived"}
 IPA_DOWNLOADER_IMAGE=${IPA_DOWNLOADER_IMAGE:-"quay.io/metal3-io/ironic-ipa-downloader:master"}
-MARIADB_IMAGE=${MARIADB_IMAGE:-"quay.io/metal3-io/mariadb:main"}
-
 IPA_BASEURI=${IPA_BASEURI:-}
 IRONIC_DATA_DIR=${IRONIC_DATA_DIR:-"/opt/metal3-dev-env/ironic"}
 CONTAINER_RUNTIME="${CONTAINER_RUNTIME:-podman}"
@@ -211,12 +209,12 @@ sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name dnsmasq \
      ${POD} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
      -v "$IRONIC_DATA_DIR:/shared" --entrypoint /bin/rundnsmasq "${IRONIC_IMAGE}"
 
-# https://github.com/metal3-io/mariadb-image/blob/main/runmariadb
+# https://github.com/metal3-io/ironic-image/blob/master/scripts/runmariadb
 # shellcheck disable=SC2086
 sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name mariadb \
      ${POD} ${CERTS_MOUNTS} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
-     -v "$IRONIC_DATA_DIR:/shared" \
-     --env "MARIADB_PASSWORD=$mariadb_password" "${MARIADB_IMAGE}"
+     -v "$IRONIC_DATA_DIR:/shared" --entrypoint /bin/runmariadb \
+     --env "MARIADB_PASSWORD=$mariadb_password" "${IRONIC_IMAGE}"
 
 # See this file for additional env vars you may want to pass, like IP and INTERFACE
 # https://github.com/metal3-io/ironic-image/blob/master/scripts/runironic-api


Test patch:
diff --git a/apis/metal3.io/v1alpha1/bmceventsubscription_validation_test.go b/apis/metal3.io/v1alpha1/bmceventsubscription_validation_test.go
deleted file mode 100644
index 712f53d4..00000000
--- a/apis/metal3.io/v1alpha1/bmceventsubscription_validation_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package v1alpha1
-
-import (
-	"testing"
-
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-func TestBMCEventSubscriptionValidateCreate(t *testing.T) {
-	tm := metav1.TypeMeta{
-		Kind:       "BMCEventSubscription",
-		APIVersion: "metal3.io/v1alpha1",
-	}
-
-	om := metav1.ObjectMeta{
-		Name:      "test",
-		Namespace: "test-namespace",
-	}
-
-	tests := []struct {
-		name      string
-		newS      *BMCEventSubscription
-		oldS      *BMCEventSubscription
-		wantedErr string
-	}{
-		{
-			name:      "valid",
-			newS:      &BMCEventSubscription{TypeMeta: tm, ObjectMeta: om, Spec: BMCEventSubscriptionSpec{HostName: "worker-01", Destination: "http://localhost/abc/abc.php"}},
-			oldS:      nil,
-			wantedErr: "",
-		},
-		{
-			name: "missingHostName",
-			newS: &BMCEventSubscription{
-				TypeMeta:   tm,
-				ObjectMeta: om,
-				Spec:       BMCEventSubscriptionSpec{Destination: "http://localhost/abc/abc"},
-			},
-			oldS:      nil,
-			wantedErr: "HostName cannot be empty",
-		},
-		{
-			name: "missingDestination",
-			newS: &BMCEventSubscription{
-				TypeMeta:   tm,
-				ObjectMeta: om,
-				Spec:       BMCEventSubscriptionSpec{HostName: "worker-01"},
-			},
-			oldS:      nil,
-			wantedErr: "Destination cannot be empty",
-		},
-		{
-			name: "destinationNotUrl",
-			newS: &BMCEventSubscription{
-				TypeMeta:   tm,
-				ObjectMeta: om,
-				Spec:       BMCEventSubscriptionSpec{HostName: "worker-01", Destination: "abc"},
-			},
-			oldS:      nil,
-			wantedErr: "Destination is an invalid URL: parse \"abc\": invalid URI for request",
-		},
-		{
-			name: "destinationMissingTrailingSlash",
-			newS: &BMCEventSubscription{
-				TypeMeta:   tm,
-				ObjectMeta: om,
-				Spec:       BMCEventSubscriptionSpec{HostName: "worker-01", Destination: "http://localhost"},
-			},
-			oldS:      nil,
-			wantedErr: "Hostname-only destination must have a trailing slash",
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if err := tt.newS.validateSubscription(); !errorArrContains(err, tt.wantedErr) {
-				t.Errorf("BareMetalHost.validateSubscription() error = %v, wantErr %v", err, tt.wantedErr)
-			}
-		})
-	}
-}
diff --git a/cmd/make-bm-worker/templates/templates_test.go b/cmd/make-bm-worker/templates/templates_test.go
index 1546d646..92a6aa32 100644
--- a/cmd/make-bm-worker/templates/templates_test.go
+++ b/cmd/make-bm-worker/templates/templates_test.go
@@ -134,190 +134,3 @@ spec:
 		t.Fail()
 	}
 }
-
-func TestWithAutomatedCleaningMode(t *testing.T) {
-	template := Template{
-		Name:                  "hostname",
-		BMCAddress:            "bmcAddress",
-		Username:              "username",
-		Password:              "password",
-		AutomatedCleaningMode: "metadata",
-	}
-	actual, _ := template.Render()
-	expected := `---
-apiVersion: v1
-kind: Secret
-metadata:
-  name: hostname-bmc-secret
-type: Opaque
-data:
-  username: dXNlcm5hbWU=
-  password: cGFzc3dvcmQ=
-
----
-apiVersion: metal3.io/v1alpha1
-kind: BareMetalHost
-metadata:
-  name: hostname
-spec:
-  automatedCleaningMode: metadata
-  online: true
-  bmc:
-    address: bmcAddress
-    credentialsName: hostname-bmc-secret
-`
-	if !compareStrings(t, expected, actual) {
-		t.Fail()
-	}
-}
-
-func TestWithImage(t *testing.T) {
-	template := Template{
-		Name:              "hostname",
-		BMCAddress:        "bmcAddress",
-		Username:          "username",
-		Password:          "password",
-		ImageURL:          "imageURL",
-		ImageChecksum:     "imageChecksum",
-		ImageChecksumType: "md5",
-		ImageFormat:       "raw",
-	}
-	actual, _ := template.Render()
-	expected := `---
-apiVersion: v1
-kind: Secret
-metadata:
-  name: hostname-bmc-secret
-type: Opaque
-data:
-  username: dXNlcm5hbWU=
-  password: cGFzc3dvcmQ=
-
----
-apiVersion: metal3.io/v1alpha1
-kind: BareMetalHost
-metadata:
-  name: hostname
-spec:
-  online: true
-  bmc:
-    address: bmcAddress
-    credentialsName: hostname-bmc-secret
-  image:
-    checksum: imageChecksum
-    checksumType: md5
-    format: raw
-    url: imageURL
-`
-	if !compareStrings(t, expected, actual) {
-		t.Fail()
-	}
-}
-
-func TestWithDisableCertificateVerification(t *testing.T) {
-	template := Template{
-		Name:                           "hostname",
-		BMCAddress:                     "bmcAddress",
-		Username:                       "username",
-		Password:                       "password",
-		DisableCertificateVerification: true,
-	}
-	actual, _ := template.Render()
-	expected := `---
-apiVersion: v1
-kind: Secret
-metadata:
-  name: hostname-bmc-secret
-type: Opaque
-data:
-  username: dXNlcm5hbWU=
-  password: cGFzc3dvcmQ=
-
----
-apiVersion: metal3.io/v1alpha1
-kind: BareMetalHost
-metadata:
-  name: hostname
-spec:
-  online: true
-  bmc:
-    address: bmcAddress
-    credentialsName: hostname-bmc-secret
-    disableCertificateVerification: true
-`
-	if !compareStrings(t, expected, actual) {
-		t.Fail()
-	}
-}
-
-func TestWithBootMacAddress(t *testing.T) {
-	template := Template{
-		Name:           "hostname",
-		BMCAddress:     "bmcAddress",
-		Username:       "username",
-		Password:       "password",
-		BootMacAddress: "boot-mac",
-	}
-	actual, _ := template.Render()
-	expected := `---
-apiVersion: v1
-kind: Secret
-metadata:
-  name: hostname-bmc-secret
-type: Opaque
-data:
-  username: dXNlcm5hbWU=
-  password: cGFzc3dvcmQ=
-
----
-apiVersion: metal3.io/v1alpha1
-kind: BareMetalHost
-metadata:
-  name: hostname
-spec:
-  online: true
-  bootMACAddress: boot-mac
-  bmc:
-    address: bmcAddress
-    credentialsName: hostname-bmc-secret
-`
-	if !compareStrings(t, expected, actual) {
-		t.Fail()
-	}
-}
-
-func TestWithBootMode(t *testing.T) {
-	template := Template{
-		Name:       "hostname",
-		BMCAddress: "bmcAddress",
-		Username:   "username",
-		Password:   "password",
-		BootMode:   "UEFI",
-	}
-	actual, _ := template.Render()
-	expected := `---
-apiVersion: v1
-kind: Secret
-metadata:
-  name: hostname-bmc-secret
-type: Opaque
-data:
-  username: dXNlcm5hbWU=
-  password: cGFzc3dvcmQ=
-
----
-apiVersion: metal3.io/v1alpha1
-kind: BareMetalHost
-metadata:
-  name: hostname
-spec:
-  online: true
-  bootMode: UEFI
-  bmc:
-    address: bmcAddress
-    credentialsName: hostname-bmc-secret
-`
-	if !compareStrings(t, expected, actual) {
-		t.Fail()
-	}
-}
diff --git a/controllers/metal3.io/baremetalhost_controller_test.go b/controllers/metal3.io/baremetalhost_controller_test.go
index e5633a90..f1021066 100644
--- a/controllers/metal3.io/baremetalhost_controller_test.go
+++ b/controllers/metal3.io/baremetalhost_controller_test.go
@@ -455,48 +455,6 @@ func TestAddFinalizers(t *testing.T) {
 	)
 }
 
-// TestDoNotAddSecretFinalizersDuringDelete verifies that during a host deletion,
-// in case the removal of a secret finalizer triggers an immediate reconcile loop,
-// then the secret finalizer is not added again
-func TestDoNotAddSecretFinalizersDuringDelete(t *testing.T) {
-	host := newDefaultHost(t)
-	r := newTestReconciler(host)
-
-	// Let the host reach the available state before deleting it
-	waitForProvisioningState(t, r, host, metal3v1alpha1.StateAvailable)
-	doDeleteHost(host, r)
-	waitForProvisioningState(t, r, host, metal3v1alpha1.StateDeleting)
-
-	// The next reconcile loop will start the delete process,
-	// and as a first step the Ironic node will be removed
-	request := newRequest(host)
-	_, err := r.Reconcile(context.Background(), request)
-	assert.NoError(t, err)
-
-	// The next reconcile loop remove the finalizers from
-	// both the host and the secret.
-	// The fake client will immediately remove the host
-	// from its cache, so let's keep the latest updated
-	// host
-	r.Get(goctx.TODO(), request.NamespacedName, host)
-	_, err = r.Reconcile(context.Background(), request)
-	assert.NoError(t, err)
-
-	// To simulate an immediate reconciliation loop due the
-	// secret update (and a slow host deletion), let's push
-	// back the host in the client cache.
-	host.ResourceVersion = ""
-	r.Client.Create(context.TODO(), host)
-	previousSecret := getHostSecret(t, r, host)
-	_, err = r.Reconcile(context.Background(), request)
-	assert.NoError(t, err)
-
-	// Secret must remain unchanged
-	actualSecret := getHostSecret(t, r, host)
-	assert.Empty(t, actualSecret.Finalizers)
-	assert.Equal(t, previousSecret.ResourceVersion, actualSecret.ResourceVersion)
-}
-
 // TestSetLastUpdated ensures that the lastUpdated timestamp in the
 // status is set to a non-zero value during reconciliation.
 func TestSetLastUpdated(t *testing.T) {
diff --git a/controllers/metal3.io/host_state_machine_test.go b/controllers/metal3.io/host_state_machine_test.go
index 050ab897..20e30f4f 100644
--- a/controllers/metal3.io/host_state_machine_test.go
+++ b/controllers/metal3.io/host_state_machine_test.go
@@ -1280,14 +1280,6 @@ func (m *mockProvisioner) GetFirmwareSettings(includeSchema bool) (settings meta
 	return
 }
 
-func (m *mockProvisioner) AddBMCEventSubscriptionForNode(subscription *metal3v1alpha1.BMCEventSubscription, httpHeaders provisioner.HTTPHeaders) (result provisioner.Result, err error) {
-	return result, nil
-}
-
-func (m *mockProvisioner) RemoveBMCEventSubscriptionForNode(subscription metal3v1alpha1.BMCEventSubscription) (result provisioner.Result, err error) {
-	return result, nil
-}
-
 func TestUpdateBootModeStatus(t *testing.T) {
 	testCases := []struct {
 		Scenario       string
diff --git a/controllers/metal3.io/hostfirmwaresettings_test.go b/controllers/metal3.io/hostfirmwaresettings_test.go
index 94757e0a..ec44ae0a 100644
--- a/controllers/metal3.io/hostfirmwaresettings_test.go
+++ b/controllers/metal3.io/hostfirmwaresettings_test.go
@@ -116,14 +116,6 @@ func (m *hsfMockProvisioner) GetFirmwareSettings(includeSchema bool) (settings m
 	return m.Settings, m.Schema, m.Error
 }
 
-func (m *hsfMockProvisioner) AddBMCEventSubscriptionForNode(subscription *metal3v1alpha1.BMCEventSubscription, httpHeaders provisioner.HTTPHeaders) (result provisioner.Result, err error) {
-	return result, nil
-}
-
-func (m *hsfMockProvisioner) RemoveBMCEventSubscriptionForNode(subscription metal3v1alpha1.BMCEventSubscription) (result provisioner.Result, err error) {
-	return result, nil
-}
-
 func getSchema() *metal3v1alpha1.FirmwareSchema {
 
 	schema := &metal3v1alpha1.FirmwareSchema{
@@ -443,7 +435,7 @@ func TestStoreHostFirmwareSettings(t *testing.T) {
 					ResourceVersion: "1"},
 				Spec: metal3v1alpha1.HostFirmwareSettingsSpec{
 					Settings: metal3v1alpha1.DesiredSettingsMap{
-						"NetworkBootRetryCount": intstr.FromInt(1000),
+						"NetworkBootRetryCount": intstr.FromString("1000"),
 						"ProcVirtualization":    intstr.FromString("Enabled"),
 					},
 				},
@@ -463,7 +455,7 @@ func TestStoreHostFirmwareSettings(t *testing.T) {
 			ExpectedSettings: &metal3v1alpha1.HostFirmwareSettings{
 				Spec: metal3v1alpha1.HostFirmwareSettingsSpec{
 					Settings: metal3v1alpha1.DesiredSettingsMap{
-						"NetworkBootRetryCount": intstr.FromInt(1000),
+						"NetworkBootRetryCount": intstr.FromString("1000"),
 						"ProcVirtualization":    intstr.FromString("Enabled"),
 					},
 				},
@@ -575,7 +567,7 @@ func TestValidateHostFirmwareSettings(t *testing.T) {
 				Settings: metal3v1alpha1.DesiredSettingsMap{
 					"CustomPostMessage":     intstr.FromString("All tests passed"),
 					"ProcVirtualization":    intstr.FromString("Disabled"),
-					"NetworkBootRetryCount": intstr.FromInt(20),
+					"NetworkBootRetryCount": intstr.FromString("20"),
 				},
 			},
 			ExpectedError: "",
@@ -586,7 +578,7 @@ func TestValidateHostFirmwareSettings(t *testing.T) {
 				Settings: metal3v1alpha1.DesiredSettingsMap{
 					"CustomPostMessage":     intstr.FromString("A really long POST message"),
 					"ProcVirtualization":    intstr.FromString("Disabled"),
-					"NetworkBootRetryCount": intstr.FromInt(20),
+					"NetworkBootRetryCount": intstr.FromString("20"),
 				},
 			},
 			ExpectedError: "Setting CustomPostMessage is invalid, string A really long POST message length is above maximum length 20",
@@ -634,17 +626,6 @@ func TestValidateHostFirmwareSettings(t *testing.T) {
 			},
 			ExpectedError: "Cannot set Password field",
 		},
-		{
-			Scenario: "string instead of int",
-			SpecSettings: metal3v1alpha1.HostFirmwareSettingsSpec{
-				Settings: metal3v1alpha1.DesiredSettingsMap{
-					"CustomPostMessage":     intstr.FromString("All tests passed"),
-					"ProcVirtualization":    intstr.FromString("Disabled"),
-					"NetworkBootRetryCount": intstr.FromString("foo"),
-				},
-			},
-			ExpectedError: "Setting NetworkBootRetryCount is invalid, String foo entered while integer expected",
-		},
 	}
 
 	for _, tc := range testCases {
diff --git a/pkg/provisioner/ironic/bios_test.go b/pkg/provisioner/ironic/bios_test.go
index 7e773a06..a26f2aab 100644
--- a/pkg/provisioner/ironic/bios_test.go
+++ b/pkg/provisioner/ironic/bios_test.go
@@ -57,6 +57,7 @@ func TestGetFirmwareSettings(t *testing.T) {
 					MinLength:       &minLength,
 					MaxLength:       &maxLength,
 					ReadOnly:        &iTrue,
+					ResetRequired:   nil,
 					Unique:          nil,
 				},
 				"NumCores": {
@@ -67,6 +68,7 @@ func TestGetFirmwareSettings(t *testing.T) {
 					MinLength:       nil,
 					MaxLength:       nil,
 					ReadOnly:        &iTrue,
+					ResetRequired:   nil,
 					Unique:          nil,
 				},
 				"ProcVirtualization": {
@@ -77,6 +79,7 @@ func TestGetFirmwareSettings(t *testing.T) {
 					MinLength:       nil,
 					MaxLength:       nil,
 					ReadOnly:        &iFalse,
+					ResetRequired:   nil,
 					Unique:          nil,
 				},
 			},
diff --git a/pkg/provisioner/ironic/validatemanagementaccess_test.go b/pkg/provisioner/ironic/validatemanagementaccess_test.go
index d4e5924e..c82beea2 100644
--- a/pkg/provisioner/ironic/validatemanagementaccess_test.go
+++ b/pkg/provisioner/ironic/validatemanagementaccess_test.go
@@ -1,7 +1,6 @@
 package ironic
 
 import (
-	"fmt"
 	"net/http"
 	"testing"
 
@@ -639,9 +638,7 @@ func TestValidateManagementAccessExistingPortWithWrongUUID(t *testing.T) {
 	}
 
 	_, _, err = prov.ValidateManagementAccess(provisioner.ManagementAccessData{}, false, false)
-	endpoint := ironic.MockServer.Endpoint()
-	expected := fmt.Sprintf("failed to find existing host: port 11:11:11:11:11:11 exists but linked node doesn't random-wrong-id: Resource not found: [GET %snodes/random-wrong-id], error message: ", endpoint)
-	assert.EqualError(t, err, expected)
+	assert.EqualError(t, err, "failed to find existing host: port 11:11:11:11:11:11 exists but linked node doesn't random-wrong-id: Resource not found")
 }
 
 func TestValidateManagementAccessExistingPortButHasName(t *testing.T) {