Repository: redhat-openshift-ecosystem/openshift-preflight
Pull request #636 (2022-05-16 16:40:24)

Refactor Openshift engine to increase testability
* Also removes an unnecessary abstraction for simplification
* Use the controller-runtime client in place of client-go

Signed-off-by: Brad P. Crochet <brad@redhat.com>


Patch:
diff --git a/certification/engine/engine.go b/certification/engine/engine.go
index 95c5234..e79bcb1 100644
--- a/certification/engine/engine.go
+++ b/certification/engine/engine.go
@@ -82,7 +82,7 @@ var (
 	// operatorPkgNameIsUniqueCheck certification.Check = &operatorpol.OperatorPkgNameIsUniqueCheck{}
 	scorecardBasicSpecCheck certification.Check = operatorpol.NewScorecardBasicSpecCheck(internal.NewOperatorSdkEngine())
 	scorecardOlmSuiteCheck  certification.Check = operatorpol.NewScorecardOlmSuiteCheck(internal.NewOperatorSdkEngine())
-	deployableByOlmCheck    certification.Check = operatorpol.NewDeployableByOlmCheck(internal.NewOpenshiftEngine(), internal.NewOperatorSdkEngine())
+	deployableByOlmCheck    certification.Check = operatorpol.NewDeployableByOlmCheck(internal.NewOperatorSdkEngine())
 	validateOperatorBundle  certification.Check = operatorpol.NewValidateOperatorBundleCheck(internal.NewOperatorSdkEngine())
 )
 
diff --git a/certification/internal/bundle/bundle.go b/certification/internal/bundle/bundle.go
index f449aa6..aadceff 100644
--- a/certification/internal/bundle/bundle.go
+++ b/certification/internal/bundle/bundle.go
@@ -20,7 +20,7 @@ const ocpVerV1beta1Unsupported = "4.9"
 // versionsKey is the OpenShift versions in annotations.yaml that lists the versions allowed for an operator
 const versionsKey = "com.redhat.openshift.versions"
 
-func ValidateBundle(ctx context.Context, engine cli.OperatorSdkEngine, imagePath string) (*cli.OperatorSdkBundleValidateReport, error) {
+func Validate(ctx context.Context, engine cli.OperatorSdkEngine, imagePath string) (*cli.OperatorSdkBundleValidateReport, error) {
 	selector := []string{"community", "operatorhub"}
 	opts := cli.OperatorSdkBundleValidateOptions{
 		Selector:        selector,
@@ -30,7 +30,7 @@ func ValidateBundle(ctx context.Context, engine cli.OperatorSdkEngine, imagePath
 	}
 
 	log.Trace("reading annotations file from the bundle")
-	log.Debug("mounted directory is ", imagePath)
+	log.Debug("image extraction directory is ", imagePath)
 	// retrieve the operator metadata from bundle image
 	annotationsFileName := filepath.Join(imagePath, "metadata", "annotations.yaml")
 	annotationsFile, err := os.Open(annotationsFileName)
diff --git a/certification/internal/client/catalogsource.go b/certification/internal/client/catalogsource.go
deleted file mode 100644
index 59b5947..0000000
--- a/certification/internal/client/catalogsource.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package client
-
-import (
-	"context"
-
-	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
-	"k8s.io/apimachinery/pkg/runtime"
-
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-
-	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
-	log "github.com/sirupsen/logrus"
-	ctrl "sigs.k8s.io/controller-runtime"
-	runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
-)
-
-type catalogSourceClient struct {
-	client runtimeclient.Client
-}
-
-func (c catalogSourceClient) Create(ctx context.Context, data cli.CatalogSourceData) (*operatorv1alpha1.CatalogSource, error) {
-	catalogSource := &operatorv1alpha1.CatalogSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: data.Name,
-		},
-		Spec: operatorv1alpha1.CatalogSourceSpec{
-			SourceType:  operatorv1alpha1.SourceTypeGrpc,
-			Image:       data.Image,
-			DisplayName: data.Name,
-			Secrets:     data.Secrets,
-		},
-	}
-	err := c.client.Create(ctx, catalogSource)
-	return catalogSource, err
-}
-
-func (c catalogSourceClient) Delete(ctx context.Context, name string) error {
-	catalogSource := &operatorv1alpha1.CatalogSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: name,
-		},
-	}
-	return c.client.Delete(ctx, catalogSource)
-}
-
-func (c catalogSourceClient) Get(ctx context.Context, name string) (*operatorv1alpha1.CatalogSource, error) {
-	catalogSource := &operatorv1alpha1.CatalogSource{}
-	err := c.client.Get(ctx, runtimeclient.ObjectKey{
-		Name: name,
-	}, catalogSource)
-
-	return catalogSource, err
-}
-
-func CatalogSourceClient(namespace string) (*catalogSourceClient, error) {
-	scheme := runtime.NewScheme()
-	operatorv1alpha1.AddToScheme(scheme)
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not read kubeconfig")
-		return nil, err
-	}
-
-	client, err := runtimeclient.New(kubeconfig, runtimeclient.Options{Scheme: scheme})
-	if err != nil {
-		log.Error("could not get catalog source client")
-		return nil, err
-	}
-
-	return &catalogSourceClient{
-		client: runtimeclient.NewNamespacedClient(client, namespace),
-	}, nil
-}
diff --git a/certification/internal/client/client.go b/certification/internal/client/client.go
deleted file mode 100644
index da13c8e..0000000
--- a/certification/internal/client/client.go
+++ /dev/null
@@ -1,1 +0,0 @@
-package client
diff --git a/certification/internal/client/csv.go b/certification/internal/client/csv.go
deleted file mode 100644
index 49bed48..0000000
--- a/certification/internal/client/csv.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package client
-
-import (
-	"context"
-
-	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
-	log "github.com/sirupsen/logrus"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
-)
-
-var csvKind schema.GroupVersionKind = schema.GroupVersionKind{
-	Group:   "operators.coreos.com",
-	Kind:    "ClusterServiceVersion",
-	Version: "v1alpha1",
-}
-
-type csvClient struct {
-	client runtimeclient.Client
-}
-
-func (c csvClient) Get(ctx context.Context, name string) (*operatorv1alpha1.ClusterServiceVersion, error) {
-	csv := &operatorv1alpha1.ClusterServiceVersion{}
-	err := c.client.Get(ctx, runtimeclient.ObjectKey{
-		Name: name,
-	}, csv)
-
-	return csv, err
-}
-
-func CsvClient(namespace string) (*csvClient, error) {
-	scheme := runtime.NewScheme()
-	operatorv1alpha1.AddToScheme(scheme)
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
-	}
-	client, err := runtimeclient.New(kubeconfig, client.Options{Scheme: scheme})
-	if err != nil {
-		log.Error("could not get csv client")
-		return nil, err
-	}
-
-	return &csvClient{
-		client: runtimeclient.NewNamespacedClient(client, namespace),
-	}, nil
-}
diff --git a/certification/internal/client/operatorgroup.go b/certification/internal/client/operatorgroup.go
deleted file mode 100644
index 5e6274c..0000000
--- a/certification/internal/client/operatorgroup.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package client
-
-import (
-	"context"
-
-	operatorv1 "github.com/operator-framework/api/pkg/operators/v1"
-	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
-	"k8s.io/apimachinery/pkg/runtime"
-	ctrl "sigs.k8s.io/controller-runtime"
-
-	runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
-
-	log "github.com/sirupsen/logrus"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-type operatorGroupClient struct {
-	client runtimeclient.Client
-}
-
-func (c operatorGroupClient) Create(ctx context.Context, data cli.OperatorGroupData) (*operatorv1.OperatorGroup, error) {
-	operatorGroup := &operatorv1.OperatorGroup{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: data.Name,
-		},
-		Spec: operatorv1.OperatorGroupSpec{
-			TargetNamespaces: data.TargetNamespaces,
-		},
-	}
-	err := c.client.Create(ctx, operatorGroup)
-	return operatorGroup, err
-}
-
-func (c operatorGroupClient) Delete(ctx context.Context, name string) error {
-	operatorGroup := &operatorv1.OperatorGroup{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: name,
-		},
-	}
-	return c.client.Delete(ctx, operatorGroup)
-}
-
-func (c operatorGroupClient) Get(ctx context.Context, name string) (*operatorv1.OperatorGroup, error) {
-	operatorGroup := &operatorv1.OperatorGroup{}
-	err := c.client.Get(ctx, runtimeclient.ObjectKey{
-		Name: name,
-	}, operatorGroup)
-
-	return operatorGroup, err
-}
-
-func OperatorGroupClient(namespace string) (*operatorGroupClient, error) {
-	scheme := runtime.NewScheme()
-	operatorv1.AddToScheme(scheme)
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
-	}
-
-	client, err := runtimeclient.New(kubeconfig, runtimeclient.Options{
-		Scheme: scheme,
-	})
-	if err != nil {
-		log.Error("could not get operator group client")
-		return nil, err
-	}
-
-	return &operatorGroupClient{
-		client: runtimeclient.NewNamespacedClient(client, namespace),
-	}, nil
-}
diff --git a/certification/internal/client/subscription.go b/certification/internal/client/subscription.go
deleted file mode 100644
index 8cbe192..0000000
--- a/certification/internal/client/subscription.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package client
-
-import (
-	"context"
-
-	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
-	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
-	"k8s.io/apimachinery/pkg/runtime"
-	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
-
-	log "github.com/sirupsen/logrus"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-type subscriptionClient struct {
-	client runtimeclient.Client
-}
-
-func (c subscriptionClient) Create(ctx context.Context, data cli.SubscriptionData) (*operatorv1alpha1.Subscription, error) {
-	subscription := &operatorv1alpha1.Subscription{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: data.Name,
-		},
-		Spec: &operatorv1alpha1.SubscriptionSpec{
-			CatalogSource:          data.CatalogSource,
-			CatalogSourceNamespace: data.CatalogSourceNamespace,
-			Channel:                data.Channel,
-			Package:                data.Package,
-		},
-	}
-	err := c.client.Create(ctx, subscription)
-	return subscription, err
-}
-
-func (c subscriptionClient) Delete(ctx context.Context, name string) error {
-	subscription := &operatorv1alpha1.Subscription{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: name,
-		},
-	}
-	return c.client.Delete(ctx, subscription)
-}
-
-func (c subscriptionClient) Get(ctx context.Context, name string) (*operatorv1alpha1.Subscription, error) {
-	subscription := &operatorv1alpha1.Subscription{}
-	err := c.client.Get(ctx, runtimeclient.ObjectKey{
-		Name: name,
-	}, subscription)
-
-	return subscription, err
-}
-
-func SubscriptionClient(namespace string) (*subscriptionClient, error) {
-	scheme := runtime.NewScheme()
-	operatorv1alpha1.AddToScheme(scheme)
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
-	}
-	client, err := client.New(kubeconfig, runtimeclient.Options{Scheme: scheme})
-	if err != nil {
-		log.Error("could not get subscription client")
-		return nil, err
-	}
-
-	return &subscriptionClient{
-		client: runtimeclient.NewNamespacedClient(client, namespace),
-	}, nil
-}
diff --git a/certification/internal/engine/openshift.go b/certification/internal/engine/openshift.go
index 7b84127..a210a67 100644
--- a/certification/internal/engine/openshift.go
+++ b/certification/internal/engine/openshift.go
@@ -3,159 +3,128 @@ package engine
 import (
 	"context"
 	"fmt"
-	"os"
-
-	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/errors"
 
 	log "github.com/sirupsen/logrus"
 
 	imagestreamv1 "github.com/openshift/api/image/v1"
 	operatorv1 "github.com/operator-framework/api/pkg/operators/v1"
+	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
 	corev1 "k8s.io/api/core/v1"
 	rbacv1 "k8s.io/api/rbac/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/client-go/kubernetes"
-	ctrl "sigs.k8s.io/controller-runtime"
 	crclient "sigs.k8s.io/controller-runtime/pkg/client"
 
-	configv1ClientSet "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
-	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
-	client "github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/client"
-	preflightRuntime "github.com/redhat-openshift-ecosystem/openshift-preflight/certification/runtime"
 )
 
-type openshiftEngine struct{}
+type openshiftEngine struct {
+	Client crclient.Client
+}
 
-func NewOpenshiftEngine() *cli.OpenshiftEngine {
-	var engine cli.OpenshiftEngine = &openshiftEngine{}
+func NewOpenshiftEngine(client crclient.Client) *cli.OpenshiftEngine {
+	var engine cli.OpenshiftEngine = &openshiftEngine{
+		Client: client,
+	}
 	return &engine
 }
 
 func (oe *openshiftEngine) CreateNamespace(ctx context.Context, name string) (*corev1.Namespace, error) {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
-	}
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
-	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
-		return nil, err
-	}
-
-	nsSpec := &corev1.Namespace{
+	nsSpec := corev1.Namespace{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: name,
 		},
 	}
-	ns, err := k8sClientset.CoreV1().
-		Namespaces().
-		Create(ctx, nsSpec, metav1.CreateOptions{})
+	err := oe.Client.Create(ctx, &nsSpec, &crclient.CreateOptions{})
 	if err != nil {
-		log.Errorf("error while creating Namespace %s: %s", name, err)
+		log.Error(fmt.Errorf("%w: error while creating Namespace: %s", err, name))
 		return nil, err
 	}
 	log.Debug("Namespace created: ", name)
-	return ns, nil
+	return &nsSpec, nil
 }
 
 func (oe *openshiftEngine) DeleteNamespace(ctx context.Context, name string) error {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return err
-	}
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
-	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
-		return err
-	}
 	log.Debugf("Deleting namespace: %s", name)
-
-	return k8sClientset.CoreV1().
-		Namespaces().
-		Delete(ctx, name, metav1.DeleteOptions{})
+	nsSpec := corev1.Namespace{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: name,
+		},
+	}
+	return oe.Client.Delete(ctx, &nsSpec, &crclient.DeleteOptions{})
 }
 
 func (oe *openshiftEngine) GetNamespace(ctx context.Context, name string) (*corev1.Namespace, error) {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
+	log.Debugf("fetching namespace %s", name)
+	nsSpec := corev1.Namespace{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: name,
+		},
 	}
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
+
+	err := oe.Client.Get(ctx, crclient.ObjectKey{
+		Name: name,
+	}, &nsSpec)
 	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
+		log.Error(fmt.Errorf("%w: could not retrieve namespace: %s", err, name))
 		return nil, err
 	}
-	log.Debugf("fetching namespace %s", name)
-
-	return k8sClientset.CoreV1().
-		Namespaces().
-		Get(ctx, name, metav1.GetOptions{})
+	return &nsSpec, nil
 }
 
 func (oe *openshiftEngine) CreateOperatorGroup(ctx context.Context, data cli.OperatorGroupData, namespace string) (*operatorv1.OperatorGroup, error) {
-	ogClient, err := client.OperatorGroupClient(namespace)
-	if err != nil {
-		log.Error("unable to create a client for OperatorGroup: ", err)
-		return nil, err
-	}
-
 	log.Debugf("Creating OperatorGroup %s in namespace %s", data.Name, namespace)
-	resp, err := ogClient.Create(ctx, data)
+	operatorGroup := &operatorv1.OperatorGroup{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      data.Name,
+			Namespace: namespace,
+		},
+		Spec: operatorv1.OperatorGroupSpec{
+			TargetNamespaces: data.TargetNamespaces,
+		},
+	}
+	err := oe.Client.Create(ctx, operatorGroup)
 	if err != nil {
-		log.Errorf("error while creating OperatorGroup %s: %s", data.Name, err)
+		log.Error(fmt.Errorf("%w: error while creating OperatorGroup: %s", err, data.Name))
 		return nil, err
 	}
-	log.Debugf("OperatorGroup %s is created successfully in namespace %s", data.Name, namespace)
 
-	return resp, nil
+	log.Debugf("OperatorGroup %s is created successfully in namespace %s", data.Name, namespace)
+	return operatorGroup, nil
 }
 
 func (oe *openshiftEngine) DeleteOperatorGroup(ctx context.Context, name string, namespace string) error {
-	ogClient, err := client.OperatorGroupClient(namespace)
-	if err != nil {
-		log.Error("unable to create a client for OperatorGroup: ", err)
-		return err
-	}
 	log.Debugf("Deleting OperatorGroup %s in namespace %s", name, namespace)
-
-	err = ogClient.Delete(ctx, name)
+	operatorGroup := operatorv1.OperatorGroup{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
+	}
+	err := oe.Client.Delete(ctx, &operatorGroup)
 	if err != nil {
-		log.Errorf("error while deleting OperatorGroup %s in namespace %s: %s", name, namespace, err)
+		log.Error(fmt.Errorf("%w: error while deleting OperatorGroup: %s in namespace: %s", err, name, namespace))
 		return err
 	}
-	log.Debugf("OperatorGroup %s is deleted successfully from namespace %s", name, namespace)
 
+	log.Debugf("OperatorGroup %s is deleted successfully from namespace %s", name, namespace)
 	return nil
 }
 
 func (oe *openshiftEngine) GetOperatorGroup(ctx context.Context, name string, namespace string) (*operatorv1.OperatorGroup, error) {
-	ogClient, err := client.OperatorGroupClient(namespace)
+	log.Debugf("fetching operatorgroup %s from namespace %s", name, namespace)
+	operatorGroup := operatorv1.OperatorGroup{}
+	err := oe.Client.Get(ctx, crclient.ObjectKey{
+		Name:      name,
+		Namespace: namespace,
+	}, &operatorGroup)
 	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
+		log.Error(fmt.Errorf("%w: error while retrieving OperatorGroup %s in namespace %s", err, name, namespace))
 		return nil, err
 	}
-	log.Debugf("fetching operatorgroup %s from namespace %s", name, namespace)
-	return ogClient.Get(ctx, name)
+	return &operatorGroup, nil
 }
 
 func (oe openshiftEngine) CreateSecret(ctx context.Context, name string, content map[string]string, secretType corev1.SecretType, namespace string) (*corev1.Secret, error) {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
-	}
-
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
-	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
-		return nil, err
-	}
-
 	secret := corev1.Secret{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       "Secret",
@@ -168,78 +137,75 @@ func (oe openshiftEngine) CreateSecret(ctx context.Context, name string, content
 		StringData: content,
 		Type:       secretType,
 	}
-	resp, err := k8sClientset.CoreV1().
-		Secrets(namespace).
-		Create(ctx, &secret, metav1.CreateOptions{})
+	err := oe.Client.Create(ctx, &secret, &crclient.CreateOptions{})
 	if err != nil {
-		log.Errorf("error while creating secret %s in namespace %s: %s", name, namespace, err)
+		log.Error(fmt.Errorf("%w: error while creating secret: %s in namespace: %s", err, name, namespace))
 		return nil, err
 	}
 
 	log.Debugf("Secret %s created successfully in namespace %s", name, namespace)
-	return resp, nil
+	return &secret, nil
 }
 
 func (oe openshiftEngine) DeleteSecret(ctx context.Context, name string, namespace string) error {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return err
-	}
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
-	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
-		return err
+	secret := corev1.Secret{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
 	}
 	log.Debugf("Deleting secret %s from namespace %s", name, namespace)
-	return k8sClientset.CoreV1().
-		Secrets(namespace).
-		Delete(ctx, name, metav1.DeleteOptions{})
+	return oe.Client.Delete(ctx, &secret, &crclient.DeleteOptions{})
 }
 
 func (oe openshiftEngine) GetSecret(ctx context.Context, name string, namespace string) (*corev1.Secret, error) {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
-	}
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
+	log.Debugf("fetching secrets %s from namespace %s", name, namespace)
+	secret := corev1.Secret{}
+	err := oe.Client.Get(ctx, crclient.ObjectKey{
+		Name:      name,
+		Namespace: namespace,
+	}, &secret)
 	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
+		log.Error(fmt.Errorf("%w: error while retrieving secret: %s in namespace: %s", err, name, namespace))
 		return nil, err
 	}
-	log.Debugf("fetching secrets %s from namespace %s", name, namespace)
-	return k8sClientset.CoreV1().
-		Secrets(namespace).
-		Get(ctx, name, metav1.GetOptions{})
+	return &secret, nil
 }
 
 func (oe openshiftEngine) CreateCatalogSource(ctx context.Context, data cli.CatalogSourceData, namespace string) (*operatorv1alpha1.CatalogSource, error) {
-	csClient, err := client.CatalogSourceClient(namespace)
-	if err != nil {
-		log.Error("unable to create a client for CatalogSource: ", err)
-		return nil, err
-	}
 	log.Debugf("Creating CatalogSource %s in namespace %s", data.Name, namespace)
-	resp, err := csClient.Create(ctx, data)
+	catalogSource := &operatorv1alpha1.CatalogSource{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      data.Name,
+			Namespace: namespace,
+		},
+		Spec: operatorv1alpha1.CatalogSourceSpec{
+			SourceType:  operatorv1alpha1.SourceTypeGrpc,
+			Image:       data.Image,
+			DisplayName: data.Name,
+			Secrets:     data.Secrets,
+		},
+	}
+	err := oe.Client.Create(ctx, catalogSource)
 	if err != nil {
-		log.Errorf("error while creating CatalogSource %s: %s", data.Name, err)
+		log.Error(fmt.Errorf("%w: error while creating CatalogSource: %s", err, data.Name))
 		return nil, err
 	}
 	log.Debugf("CatalogSource %s is created successfully in namespace %s", data.Name, namespace)
-	return resp, nil
+	return catalogSource, nil
 }
 
 func (oe *openshiftEngine) DeleteCatalogSource(ctx context.Context, name string, namespace string) error {
-	csClient, err := client.CatalogSourceClient(namespace)
-	if err != nil {
-		log.Error("unable to create a client for CatalogSource: ", err)
-		return err
-	}
 	log.Debugf("Deleting CatalogSource %s in namespace %s", name, namespace)
-	err = csClient.Delete(ctx, name)
+	catalogSource := operatorv1alpha1.CatalogSource{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
+	}
+	err := oe.Client.Delete(ctx, &catalogSource)
 	if err != nil {
-		log.Errorf("error while deleting CatalogSource %s in namespace %s: %s", name, namespace, err)
+		log.Error(fmt.Errorf("%w: error while deleting CatalogSource: %s in namespace: %s", err, name, namespace))
 		return err
 	}
 	log.Debugf("CatalogSource %s is deleted successfully from namespace %s", name, namespace)
@@ -247,54 +213,69 @@ func (oe *openshiftEngine) DeleteCatalogSource(ctx context.Context, name string,
 }
 
 func (oe *openshiftEngine) GetCatalogSource(ctx context.Context, name string, namespace string) (*operatorv1alpha1.CatalogSource, error) {
-	csClient, err := client.CatalogSourceClient(namespace)
+	log.Debug("fetching catalogsource: " + name)
+	catalogSource := &operatorv1alpha1.CatalogSource{}
+	err := oe.Client.Get(ctx, crclient.ObjectKey{
+		Name:      name,
+		Namespace: namespace,
+	}, catalogSource)
 	if err != nil {
-		log.Error("unable to create a client for CatalogSource: ", err)
+		log.Error(fmt.Errorf("%w: error while retieving CatalogSource: %s in namespace: %s", err, name, namespace))
 		return nil, err
 	}
-	log.Debug("fetching catalogsource: " + name)
-	return csClient.Get(ctx, name)
+	return catalogSource, nil
 }
 
 func (oe openshiftEngine) CreateSubscription(ctx context.Context, data cli.SubscriptionData, namespace string) (*operatorv1alpha1.Subscription, error) {
-	subsClient, err := client.SubscriptionClient(namespace)
-	if err != nil {
-		log.Error("unable to create a client for Subscription: ", err)
-		return nil, err
-	}
-
 	log.Debugf("Creating Subscription %s in namespace %s", data.Name, namespace)
-	resp, err := subsClient.Create(ctx, data)
+	subscription := &operatorv1alpha1.Subscription{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      data.Name,
+			Namespace: namespace,
+		},
+		Spec: &operatorv1alpha1.SubscriptionSpec{
+			CatalogSource:          data.CatalogSource,
+			CatalogSourceNamespace: data.CatalogSourceNamespace,
+			Channel:                data.Channel,
+			Package:                data.Package,
+		},
+	}
+	err := oe.Client.Create(ctx, subscription)
 	if err != nil {
-		log.Errorf("error while creating Subscription %s: %s", data.Name, err)
+		log.Error(fmt.Errorf("%w: error while creating Subscription: %s", err, data.Name))
 		return nil, err
 	}
 	log.Debugf("Subscription %s is created successfully in namespace %s", data.Name, namespace)
 
-	return resp, nil
+	return subscription, nil
 }
 
 func (oe *openshiftEngine) GetSubscription(ctx context.Context, name string, namespace string) (*operatorv1alpha1.Subscription, error) {
-	subsClient, err := client.SubscriptionClient(namespace)
+	log.Debugf("fetching subscription %s from namespace %s ", name, namespace)
+	subscription := &operatorv1alpha1.Subscription{}
+	err := oe.Client.Get(ctx, crclient.ObjectKey{
+		Name:      name,
+		Namespace: namespace,
+	}, subscription)
 	if err != nil {
-		log.Error("unable to create a client for Subscription: ", err)
+		log.Error(fmt.Errorf("%w: error while retrieving Subscription: %s in namespace: %s", err, name, namespace))
 		return nil, err
 	}
-	log.Debugf("fetching subscription %s from namespace %s ", name, namespace)
-	return subsClient.Get(ctx, name)
+	return subscription, nil
 }
 
 func (oe openshiftEngine) DeleteSubscription(ctx context.Context, name string, namespace string) error {
-	subsClient, err := client.SubscriptionClient(namespace)
-	if err != nil {
-		log.Error("unable to create a client for Subscription: ", err)
-		return err
-	}
 	log.Debugf("Deleting Subscription %s in namespace %s", name, namespace)
 
-	err = subsClient.Delete(ctx, name)
+	subscription := &operatorv1alpha1.Subscription{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
+	}
+	err := oe.Client.Delete(ctx, subscription)
 	if err != nil {
-		log.Errorf("error while deleting Subscription %s in namespace %s: %s", name, namespace, err)
+		log.Error(fmt.Errorf("%w: error while deleting Subscription: %s in namespace: %s", err, name, namespace))
 		return err
 	}
 	log.Debugf("Subscription %s is deleted successfully from namespace %s", name, namespace)
@@ -302,27 +283,19 @@ func (oe openshiftEngine) DeleteSubscription(ctx context.Context, name string, n
 }
 
 func (oe *openshiftEngine) GetCSV(ctx context.Context, name string, namespace string) (*operatorv1alpha1.ClusterServiceVersion, error) {
-	csvClient, err := client.CsvClient(namespace)
-	if err != nil {
-		log.Error("unable to create a client for csv: ", err)
-		return nil, err
-	}
 	log.Debugf("fetching csv %s from namespace %s", name, namespace)
-	return csvClient.Get(ctx, name)
+	csv := &operatorv1alpha1.ClusterServiceVersion{}
+	err := oe.Client.Get(ctx, crclient.ObjectKey{
+		Name:      name,
+		Namespace: namespace,
+	}, csv)
+
+	return csv, err
 }
 
 func (oe *openshiftEngine) GetImages(ctx context.Context) (map[string]struct{}, error) {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("could not get kubeconfig")
-		return nil, err
-	}
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
-	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
-		return nil, err
-	}
-	pods, err := k8sClientset.CoreV1().Pods("").List(ctx, metav1.ListOptions{})
+	var pods corev1.PodList
+	err := oe.Client.List(ctx, &pods, &crclient.ListOptions{})
 	if err != nil {
 		log.Error("could not retrieve pod list: ", err)
 		return nil, err
@@ -335,15 +308,8 @@ func (oe *openshiftEngine) GetImages(ctx context.Context) (map[string]struct{},
 		}
 	}
 
-	scheme := runtime.NewScheme()
-	imagestreamv1.AddToScheme(scheme)
-	isClient, err := crclient.New(kubeconfig, crclient.Options{Scheme: scheme})
-	if err != nil {
-		log.Error("could not create isClient: ", err)
-		return nil, err
-	}
 	var imageStreamList imagestreamv1.ImageStreamList
-	if err := isClient.List(ctx, &imageStreamList, &crclient.ListOptions{}); err != nil {
+	if err := oe.Client.List(ctx, &imageStreamList, &crclient.ListOptions{}); err != nil {
 		log.Error("could not list image stream: ", err)
 		return nil, err
 	}
@@ -359,26 +325,14 @@ func (oe *openshiftEngine) GetImages(ctx context.Context) (map[string]struct{},
 }
 
 func (oe *openshiftEngine) CreateRoleBinding(ctx context.Context, data cli.RoleBindingData, namespace string) (*rbacv1.RoleBinding, error) {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("unable to create a rest client: ", err)
-		return nil, err
-	}
-
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
-	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
-		return nil, err
-	}
-
 	log.Debugf("Creating RoleBinding %s in namespace %s", data.Name, namespace)
-	subjectsObj := make([]rbacv1.Subject, 1)
-	for i := range data.Subjects {
-		subjectsObj[i] = rbacv1.Subject{
+	subjectsObj := make([]rbacv1.Subject, 0, len(data.Subjects))
+	for _, subject := range data.Subjects {
+		subjectsObj = append(subjectsObj, rbacv1.Subject{
 			Kind:      "ServiceAccount",
-			Name:      data.Subjects[i],
+			Name:      subject,
 			Namespace: data.Namespace,
-		}
+		})
 	}
 	roleObj := rbacv1.RoleRef{
 		Kind:     "ClusterRole",
@@ -397,87 +351,52 @@ func (oe *openshiftEngine) CreateRoleBinding(ctx context.Context, data cli.RoleB
 		Subjects: subjectsObj,
 		RoleRef:  roleObj,
 	}
-	resp, err := k8sClientset.RbacV1().
-		RoleBindings(namespace).
-		Create(ctx, &roleBindingObj, metav1.CreateOptions{})
+	err := oe.Client.Create(ctx, &roleBindingObj, &crclient.CreateOptions{})
 	if err != nil {
-		log.Errorf("error while creating rolebinding %s in namespace %s: %s", data.Name, namespace, err)
+		log.Error(fmt.Errorf("%w: error while creating rolebinding: %s in namespace: %s", err, data.Name, namespace))
 		return nil, err
 	}
 
 	log.Debugf("RoleBinding %s created in namespace %s", data.Name, namespace)
-	return resp, nil
+	return &roleBindingObj, nil
 }
 
 func (oe *openshiftEngine) GetRoleBinding(ctx context.Context, name string, namespace string) (*rbacv1.RoleBinding, error) {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("unable to create a rest client: ", err)
-		return nil, err
+	log.Debugf("fetching RoleBinding %s from namespace %s: ", name, namespace)
+	roleBinding := rbacv1.RoleBinding{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       "RoleBinding",
+			APIVersion: "rbac.authorization.k8s.io/v1",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
 	}
-
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
+	err := oe.Client.Get(ctx, crclient.ObjectKey{
+		Name:      name,
+		Namespace: namespace,
+	}, &roleBinding)
 	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
+		log.Error(fmt.Errorf("%w: error while retrieving rolebinding: %s in namespace: %s", err, name, namespace))
 		return nil, err
 	}
-
-	log.Debugf("fetching RoleBinding %s from namespace %s: ", name, namespace)
-	return k8sClientset.RbacV1().
-		RoleBindings(namespace).
-		Get(ctx, name, metav1.GetOptions{})
+	return &roleBinding, nil
 }
 
 func (oe *openshiftEngine) DeleteRoleBinding(ctx context.Context, name string, namespace string) error {
-	kubeconfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("unable to create a rest client: ", err)
-		return err
-	}
-
-	k8sClientset, err := kubernetes.NewForConfig(kubeconfig)
-	if err != nil {
-		log.Error("unable to obtain k8s client: ", err)
-		return err
-	}
-
 	log.Debugf("Deleting RoleBinding %s in namespace %s", name, namespace)
 
-	err = k8sClientset.RbacV1().
-		RoleBindings(namespace).
-		Delete(ctx, name, metav1.DeleteOptions{})
-
-	if err != nil {
-		log.Errorf("error while deleting RoleBiding %s in namespace %s: %s", name, namespace, err)
+	roleBinding := rbacv1.RoleBinding{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      name,
+			Namespace: namespace,
+		},
+	}
+	if err := oe.Client.Delete(ctx, &roleBinding, &crclient.DeleteOptions{}); err != nil {
+		log.Error(fmt.Errorf("%w: error while deleting RoleBiding: %s in namespace: %s", err, name, namespace))
 		return err
 	}
 	log.Debugf("RoleBinding %s is deleted successfully from namespace %s", name, namespace)
 	return nil
 }
-
-func GetOpenshiftClusterVersion() (preflightRuntime.OpenshiftClusterVersion, error) {
-	if _, ok := os.LookupEnv("KUBECONFIG"); !ok {
-		return preflightRuntime.UnknownOpenshiftClusterVersion(), errors.ErrNoKubeconfig
-	}
-	kubeConfig, err := ctrl.GetConfig()
-	if err != nil {
-		log.Error("unable to load the config, check if KUBECONFIG is set correctly: ", err)
-		return preflightRuntime.UnknownOpenshiftClusterVersion(), err
-	}
-	configV1Client, err := configv1ClientSet.NewForConfig(kubeConfig)
-	if err != nil {
-		log.Error("unable to create a client with the provided kubeconfig: ", err)
-		return preflightRuntime.UnknownOpenshiftClusterVersion(), err
-	}
-	openshiftApiServer, err := configV1Client.ClusterOperators().Get(context.Background(), "openshift-apiserver", metav1.GetOptions{})
-	if err != nil {
-		log.Error("unable to get openshift-apiserver cluster operator: ", err)
-		return preflightRuntime.UnknownOpenshiftClusterVersion(), err
-	}
-
-	log.Debug(fmt.Sprintf("fetching operator version and openshift-apiserver version %s from %s", openshiftApiServer.Status.Versions, kubeConfig.Host))
-	return preflightRuntime.OpenshiftClusterVersion{
-		Name:    "OpenShift",
-		Version: openshiftApiServer.Status.Versions[1].Version,
-	}, nil
-}
diff --git a/certification/internal/engine/openshift_version.go b/certification/internal/engine/openshift_version.go
new file mode 100644
index 0000000..7aa5715
--- /dev/null
+++ b/certification/internal/engine/openshift_version.go
@@ -0,0 +1,41 @@
+package engine
+
+import (
+	"context"
+	"fmt"
+	"os"
+
+	configv1Client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
+	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/errors"
+	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/runtime"
+	log "github.com/sirupsen/logrus"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	ctrl "sigs.k8s.io/controller-runtime"
+)
+
+func GetOpenshiftClusterVersion() (runtime.OpenshiftClusterVersion, error) {
+	if _, ok := os.LookupEnv("KUBECONFIG"); !ok {
+		return runtime.UnknownOpenshiftClusterVersion(), errors.ErrNoKubeconfig
+	}
+	kubeConfig, err := ctrl.GetConfig()
+	if err != nil {
+		log.Error("unable to load the config, check if KUBECONFIG is set correctly: ", err)
+		return runtime.UnknownOpenshiftClusterVersion(), err
+	}
+	configV1Client, err := configv1Client.NewForConfig(kubeConfig)
+	if err != nil {
+		log.Error("unable to create a client with the provided kubeconfig: ", err)
+		return runtime.UnknownOpenshiftClusterVersion(), err
+	}
+	openshiftApiServer, err := configV1Client.ClusterOperators().Get(context.Background(), "openshift-apiserver", metav1.GetOptions{})
+	if err != nil {
+		log.Error("unable to get openshift-apiserver cluster operator: ", err)
+		return runtime.UnknownOpenshiftClusterVersion(), err
+	}
+
+	log.Debug(fmt.Sprintf("fetching operator version and openshift-apiserver version %s from %s", openshiftApiServer.Status.Versions, kubeConfig.Host))
+	return runtime.OpenshiftClusterVersion{
+		Name:    "OpenShift",
+		Version: openshiftApiServer.Status.Versions[1].Version,
+	}, nil
+}
diff --git a/certification/internal/policy/operator/deployable_by_olm.go b/certification/internal/policy/operator/deployable_by_olm.go
index 07be2a1..2d60f96 100644
--- a/certification/internal/policy/operator/deployable_by_olm.go
+++ b/certification/internal/policy/operator/deployable_by_olm.go
@@ -2,6 +2,7 @@ package operator
 
 import (
 	"context"
+	"encoding/json"
 	"fmt"
 	"os"
 	"path/filepath"
@@ -9,26 +10,31 @@ import (
 	"sync"
 	"time"
 
+	imagestreamv1 "github.com/openshift/api/image/v1"
 	operatorv1 "github.com/operator-framework/api/pkg/operators/v1"
 	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
-
 	"github.com/spf13/viper"
 	corev1 "k8s.io/api/core/v1"
+	rbacv1 "k8s.io/api/rbac/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
+	apiruntime "k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	ctrl "sigs.k8s.io/controller-runtime"
+	crclient "sigs.k8s.io/controller-runtime/pkg/client"
 
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification"
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/artifacts"
 	pflterr "github.com/redhat-openshift-ecosystem/openshift-preflight/certification/errors"
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/bundle"
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
+	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/engine"
 
 	log "github.com/sirupsen/logrus"
 	k8serr "k8s.io/apimachinery/pkg/api/errors"
 )
 
-type OperatorData struct {
+type operatorData struct {
 	CatalogImage     string
 	Channel          string
 	PackageName      string
@@ -41,21 +47,57 @@ type OperatorData struct {
 }
 
 type DeployableByOlmCheck struct {
-	OpenshiftEngine   cli.OpenshiftEngine
 	OperatorSdkEngine cli.OperatorSdkEngine
+	openshiftEngine   cli.OpenshiftEngine
+	client            crclient.Client
 	csvReady          bool
 	validImages       bool
 }
 
-func NewDeployableByOlmCheck(openshiftEngine *cli.OpenshiftEngine, operatorSdkEngine *cli.OperatorSdkEngine) *DeployableByOlmCheck {
+func (p *DeployableByOlmCheck) initClient() error {
+	if p.client != nil {
+		return nil
+	}
+	scheme := apiruntime.NewScheme()
+	operatorv1.AddToScheme(scheme)
+	operatorv1alpha1.AddToScheme(scheme)
+	imagestreamv1.AddToScheme(scheme)
+	rbacv1.AddToScheme(scheme)
+	kubeconfig, err := ctrl.GetConfig()
+	if err != nil {
+		log.Error("could not get kubeconfig")
+		return err
+	}
+
+	client, err := crclient.New(kubeconfig, crclient.Options{
+		Scheme: scheme,
+	})
+	if err != nil {
+		log.Error("could not get controller-runtime client")
+		return err
+	}
+
+	p.client = client
+	return nil
+}
+
+func (p *DeployableByOlmCheck) initOpenShifeEngine() error {
+	if p.openshiftEngine == nil {
+		p.openshiftEngine = *engine.NewOpenshiftEngine(p.client)
+	}
+	return nil
+}
+
+func NewDeployableByOlmCheck(operatorSdkEngine *cli.OperatorSdkEngine) *DeployableByOlmCheck {
 	return &DeployableByOlmCheck{
-		OpenshiftEngine:   *openshiftEngine,
 		OperatorSdkEngine: *operatorSdkEngine,
 	}
 }
 
 func (p *DeployableByOlmCheck) Validate(ctx context.Context, bundleRef certification.ImageReference) (bool, error) {
-	if report, err := bundle.ValidateBundle(ctx, p.OperatorSdkEngine, bundleRef.ImageFSPath); err != nil || !report.Passed {
+	p.initClient()
+	p.initOpenShifeEngine()
+	if report, err := bundle.Validate(ctx, p.OperatorSdkEngine, bundleRef.ImageFSPath); err != nil || !report.Passed {
 		return false, err
 	}
 
@@ -137,7 +179,7 @@ func checkImageSource(operatorImages []string) bool {
 	return allApproved
 }
 
-func (p *DeployableByOlmCheck) operatorMetadata(ctx context.Context, bundleRef certification.ImageReference) (*OperatorData, error) {
+func (p *DeployableByOlmCheck) operatorMetadata(ctx context.Context, bundleRef certification.ImageReference) (*operatorData, error) {
 	// retrieve the operator metadata from bundle image
 	annotationsFileName := filepath.Join(bundleRef.ImageFSPath, "metadata", "annotations.yaml")
 	annotationsFile, err := os.Open(annotationsFileName)
@@ -186,7 +228,7 @@ func (p *DeployableByOlmCheck) operatorMetadata(ctx context.Context, bundleRef c
 		return nil, err
 	}
 
-	return &OperatorData{
+	return &operatorData{
 		CatalogImage:     catalogImage,
 		Channel:          channel,
 		PackageName:      packageName,
@@ -197,12 +239,12 @@ func (p *DeployableByOlmCheck) operatorMetadata(ctx context.Context, bundleRef c
 	}, nil
 }
 
-func (p *DeployableByOlmCheck) setUp(ctx context.Context, operatorData *OperatorData) error {
-	if _, err := p.OpenshiftEngine.CreateNamespace(ctx, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
+func (p *DeployableByOlmCheck) setUp(ctx context.Context, operatorData *operatorData) error {
+	if _, err := p.openshiftEngine.CreateNamespace(ctx, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
 		return err
 	}
 
-	if _, err := p.OpenshiftEngine.CreateNamespace(ctx, operatorData.TargetNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
+	if _, err := p.openshiftEngine.CreateNamespace(ctx, operatorData.TargetNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
 		return err
 	}
 
@@ -213,7 +255,7 @@ func (p *DeployableByOlmCheck) setUp(ctx context.Context, operatorData *Operator
 			return err
 		}
 		data := map[string]string{".dockerconfigjson": string(content)}
-		if _, err := p.OpenshiftEngine.CreateSecret(ctx, secretName, data, corev1.SecretTypeDockerConfigJson, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
+		if _, err := p.openshiftEngine.CreateSecret(ctx, secretName, data, corev1.SecretTypeDockerConfigJson, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
 			return err
 		}
 	} else {
@@ -242,7 +284,7 @@ func (p *DeployableByOlmCheck) setUp(ctx context.Context, operatorData *Operator
 		}
 	}
 
-	if _, err := p.OpenshiftEngine.CreateCatalogSource(ctx, cli.CatalogSourceData{Name: operatorData.App, Image: operatorData.CatalogImage, Secrets: []string{secretName}}, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
+	if _, err := p.openshiftEngine.CreateCatalogSource(ctx, cli.CatalogSourceData{Name: operatorData.App, Image: operatorData.CatalogImage, Secrets: []string{secretName}}, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
 		return err
 	}
 
@@ -250,7 +292,7 @@ func (p *DeployableByOlmCheck) setUp(ctx context.Context, operatorData *Operator
 	if err != nil {
 		return err
 	}
-	if _, err := p.OpenshiftEngine.CreateOperatorGroup(ctx, operatorGroupData, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
+	if _, err := p.openshiftEngine.CreateOperatorGroup(ctx, operatorGroupData, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
 		return err
 	}
 
@@ -261,13 +303,13 @@ func (p *DeployableByOlmCheck) setUp(ctx context.Context, operatorData *Operator
 		CatalogSourceNamespace: operatorData.InstallNamespace,
 		Package:                operatorData.PackageName,
 	}
-	if _, err := p.OpenshiftEngine.CreateSubscription(ctx, subscriptionData, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
+	if _, err := p.openshiftEngine.CreateSubscription(ctx, subscriptionData, operatorData.InstallNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
 		return err
 	}
 	return nil
 }
 
-func (p *DeployableByOlmCheck) generateOperatorGroupData(operatorData *OperatorData) (cli.OperatorGroupData, error) {
+func (p *DeployableByOlmCheck) generateOperatorGroupData(operatorData *operatorData) (cli.OperatorGroupData, error) {
 	var installMode string
 	for i := 0; i < len(prioritizedInstallModes); i++ {
 		if _, ok := operatorData.InstallModes[prioritizedInstallModes[i]]; ok {
@@ -302,7 +344,7 @@ func (p *DeployableByOlmCheck) grantRegistryPermissionToServiceAccount(ctx conte
 			Role:      role,
 			Namespace: serviceAccountNamespace,
 		}
-		if _, err := p.OpenshiftEngine.CreateRoleBinding(ctx, roleBindingData, indexImageNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
+		if _, err := p.openshiftEngine.CreateRoleBinding(ctx, roleBindingData, indexImageNamespace); err != nil && !k8serr.IsAlreadyExists(err) {
 			return err
 		}
 	}
@@ -359,7 +401,7 @@ func csvStatusSucceeded(ctx context.Context, engine cli.OpenshiftEngine, name, n
 	return "", false, nil
 }
 
-func (p *DeployableByOlmCheck) isCSVReady(ctx context.Context, operatorData OperatorData) (bool, error) {
+func (p *DeployableByOlmCheck) isCSVReady(ctx context.Context, operatorData operatorData) (bool, error) {
 	var CsvNamespaces []string
 	if len(operatorData.CsvNamespaces) == 0 {
 		CsvNamespaces = []string{operatorData.TargetNamespace, "default", openshiftMarketplaceNamespace}
@@ -374,7 +416,7 @@ func (p *DeployableByOlmCheck) isCSVReady(ctx context.Context, operatorData Oper
 
 	for _, CsvNamespace := range CsvNamespaces {
 		wg.Add(1)
-		go watch(ctx, p.OpenshiftEngine, &wg, operatorData.InstalledCsv, CsvNamespace, csvTimeout, csvChannel, csvStatusSucceeded)
+		go watch(ctx, p.openshiftEngine, &wg, operatorData.InstalledCsv, CsvNamespace, csvTimeout, csvChannel, csvStatusSucceeded)
 	}
 
 	go func() {
@@ -408,13 +450,13 @@ func subscriptionCsvIsInstalled(ctx context.Context, engine cli.OpenshiftEngine,
 	return "", false, nil
 }
 
-func (p *DeployableByOlmCheck) installedCSV(ctx context.Context, operatorData OperatorData) (string, error) {
+func (p *DeployableByOlmCheck) installedCSV(ctx context.Context, operatorData operatorData) (string, error) {
 	installedCSVChannel := make(chan string)
 
 	var wg sync.WaitGroup
 	// query API server for the installed CSV field of the created subscription
 	wg.Add(1)
-	go watch(ctx, p.OpenshiftEngine, &wg, operatorData.App, operatorData.InstallNamespace, subscriptionTimeout, installedCSVChannel, subscriptionCsvIsInstalled)
+	go watch(ctx, p.openshiftEngine, &wg, operatorData.App, operatorData.InstallNamespace, subscriptionTimeout, installedCSVChannel, subscriptionCsvIsInstalled)
 
 	go func() {
 		wg.Wait()
@@ -432,38 +474,38 @@ func (p *DeployableByOlmCheck) installedCSV(ctx context.Context, operatorData Op
 	return installedCsv, nil
 }
 
-func (p *DeployableByOlmCheck) cleanUp(ctx context.Context, operatorData OperatorData) {
+func (p *DeployableByOlmCheck) cleanUp(ctx context.Context, operatorData operatorData) {
 	log.Debug("Dumping data in artifacts/ directory")
 
-	subs, err := p.OpenshiftEngine.GetSubscription(ctx, operatorData.App, operatorData.InstallNamespace)
+	subs, err := p.openshiftEngine.GetSubscription(ctx, operatorData.App, operatorData.InstallNamespace)
 	if err != nil {
 		log.Warn("unable to retrieve the subscription")
 	} else {
 		p.writeToFile(subs)
 	}
 
-	cs, err := p.OpenshiftEngine.GetCatalogSource(ctx, operatorData.App, operatorData.InstallNamespace)
+	cs, err := p.openshiftEngine.GetCatalogSource(ctx, operatorData.App, operatorData.InstallNamespace)
 	if err != nil {
 		log.Warn("unable to retrieve the catalogsource")
 	} else {
 		p.writeToFile(cs)
 	}
 
-	og, err := p.OpenshiftEngine.GetOperatorGroup(ctx, operatorData.App, operatorData.InstallNamespace)
+	og, err := p.openshiftEngine.GetOperatorGroup(ctx, operatorData.App, operatorData.InstallNamespace)
 	if err != nil {
 		log.Warn("unable to retrieve the operatorgroup")
 	} else {
 		p.writeToFile(og)
 	}
 
-	installNamespace, err := p.OpenshiftEngine.GetNamespace(ctx, operatorData.InstallNamespace)
+	installNamespace, err := p.openshiftEngine.GetNamespace(ctx, operatorData.InstallNamespace)
 	if err != nil {
 		log.Warn("unable to retrieve the install namespace")
 	} else {
 		p.writeToFile(installNamespace)
 	}
 
-	targetNamespace, err := p.OpenshiftEngine.GetNamespace(ctx, operatorData.TargetNamespace)
+	targetNamespace, err := p.openshiftEngine.GetNamespace(ctx, operatorData.TargetNamespace)
 	if err != nil {
 		log.Warn("unable to retrieve the target namespace")
 	} else {
@@ -471,67 +513,62 @@ func (p *DeployableByOlmCheck) cleanUp(ctx context.Context, operatorData Operato
 	}
 
 	log.Trace("Deleting the resources created by DeployableByOLM Check")
-	p.OpenshiftEngine.DeleteSubscription(ctx, operatorData.App, operatorData.InstallNamespace)
-	p.OpenshiftEngine.DeleteCatalogSource(ctx, operatorData.App, operatorData.InstallNamespace)
-	p.OpenshiftEngine.DeleteOperatorGroup(ctx, operatorData.App, operatorData.InstallNamespace)
-	p.OpenshiftEngine.DeleteSecret(ctx, secretName, operatorData.InstallNamespace)
+	p.openshiftEngine.DeleteSubscription(ctx, operatorData.App, operatorData.InstallNamespace)
+	p.openshiftEngine.DeleteCatalogSource(ctx, operatorData.App, operatorData.InstallNamespace)
+	p.openshiftEngine.DeleteOperatorGroup(ctx, operatorData.App, operatorData.InstallNamespace)
+	p.openshiftEngine.DeleteSecret(ctx, secretName, operatorData.InstallNamespace)
 
 	if strings.Contains(operatorData.CatalogImage, imageRegistryService) {
 		indexImageNamespace := strings.Split(operatorData.CatalogImage, "/")[1]
 		operatorServiceAccount := operatorData.App
 		operatorNamespace := operatorData.InstallNamespace
 		// remove pipeline-related rolebindings
-		p.OpenshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", pipelineServiceAccount, operatorNamespace, registryViewerRole), indexImageNamespace)
-		p.OpenshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", pipelineServiceAccount, operatorNamespace, imagePullerRole), indexImageNamespace)
+		p.openshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", pipelineServiceAccount, operatorNamespace, registryViewerRole), indexImageNamespace)
+		p.openshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", pipelineServiceAccount, operatorNamespace, imagePullerRole), indexImageNamespace)
 		// remove rolebindings required for the default OperatorHub catalog sources
-		p.OpenshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, openshiftMarketplaceNamespace, registryViewerRole), indexImageNamespace)
-		p.OpenshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, openshiftMarketplaceNamespace, imagePullerRole), indexImageNamespace)
+		p.openshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, openshiftMarketplaceNamespace, registryViewerRole), indexImageNamespace)
+		p.openshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, openshiftMarketplaceNamespace, imagePullerRole), indexImageNamespace)
 		// remove rolebindings required for custom catalog sources
-		p.OpenshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, operatorNamespace, registryViewerRole), indexImageNamespace)
-		p.OpenshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, operatorNamespace, imagePullerRole), indexImageNamespace)
+		p.openshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, operatorNamespace, registryViewerRole), indexImageNamespace)
+		p.openshiftEngine.DeleteRoleBinding(ctx, fmt.Sprintf("%s:%s:%s", operatorServiceAccount, operatorNamespace, imagePullerRole), indexImageNamespace)
 	}
-	p.OpenshiftEngine.DeleteNamespace(ctx, operatorData.InstallNamespace)
-	p.OpenshiftEngine.DeleteNamespace(ctx, operatorData.TargetNamespace)
+	p.openshiftEngine.DeleteNamespace(ctx, operatorData.InstallNamespace)
+	p.openshiftEngine.DeleteNamespace(ctx, operatorData.TargetNamespace)
 }
 
 func (p *DeployableByOlmCheck) writeToFile(data interface{}) error {
 	obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(data)
 	if err != nil {
-		log.Error("unable to convert the object to unstructured.Unstructured: ", err)
-		return err
+		log.Error(fmt.Errorf("%w: unable to convert the object to unstructured.Unstructured", err))
 	}
 
+	group := "operators.coreos.com"
+	var version, kind string
 	u := &unstructured.Unstructured{Object: obj}
 	switch data.(type) {
 	case *operatorv1alpha1.CatalogSource:
-		u.SetGroupVersionKind(schema.GroupVersionKind{
-			Group:   "operators.coreos.com",
-			Kind:    "CatalogSource",
-			Version: "v1alpha1",
-		})
+		version = "v1alpha1"
+		kind = "CatalogSource"
 	case *operatorv1.OperatorGroup:
-		u.SetGroupVersionKind(schema.GroupVersionKind{
-			Group:   "operators.coreos.com",
-			Kind:    "OperatorGroup",
-			Version: "v1",
-		})
+		version = "v1"
+		kind = "OperatorGroup"
 	case *operatorv1alpha1.Subscription:
-		u.SetGroupVersionKind(schema.GroupVersionKind{
-			Group:   "operators.coreos.com",
-			Kind:    "Subscription",
-			Version: "v1alpha1",
-		})
+		version = "v1alpha1"
+		kind = "Subscription"
 	case *corev1.Namespace:
-		u.SetGroupVersionKind(schema.GroupVersionKind{
-			Group:   "",
-			Kind:    "Namespace",
-			Version: "v1",
-		})
+		group = ""
+		version = "v1"
+		kind = "Namespace"
 	default:
 		return pflterr.ErrUnsupportedGoType
 	}
+	u.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   group,
+		Version: version,
+		Kind:    kind,
+	})
 
-	jsonManifest, err := u.MarshalJSON()
+	jsonManifest, err := json.Marshal(u)
 	if err != nil {
 		log.Error("unable to marshal to json: ", err)
 		return err
@@ -555,7 +592,7 @@ func (p *DeployableByOlmCheck) readFileAsByteArray(filename string) ([]byte, err
 }
 
 func (p *DeployableByOlmCheck) getImages(ctx context.Context) (map[string]struct{}, error) {
-	return p.OpenshiftEngine.GetImages(ctx)
+	return p.openshiftEngine.GetImages(ctx)
 }
 
 func (p *DeployableByOlmCheck) Name() string {
diff --git a/certification/internal/policy/operator/validate_operator_bundle.go b/certification/internal/policy/operator/validate_operator_bundle.go
index eaaf116..37804e2 100644
--- a/certification/internal/policy/operator/validate_operator_bundle.go
+++ b/certification/internal/policy/operator/validate_operator_bundle.go
@@ -34,7 +34,7 @@ func (p ValidateOperatorBundleCheck) Validate(ctx context.Context, bundleRef cer
 }
 
 func (p ValidateOperatorBundleCheck) getDataToValidate(ctx context.Context, imagePath string) (*cli.OperatorSdkBundleValidateReport, error) {
-	return bundle.ValidateBundle(ctx, p.OperatorSdkEngine, imagePath)
+	return bundle.Validate(ctx, p.OperatorSdkEngine, imagePath)
 }
 
 func (p ValidateOperatorBundleCheck) validate(ctx context.Context, report *cli.OperatorSdkBundleValidateReport) (bool, error) {
diff --git a/go.mod b/go.mod
index 80262e1..c6c60b1 100644
--- a/go.mod
+++ b/go.mod
@@ -13,19 +13,20 @@ require (
 	github.com/onsi/gomega v1.18.1
 	github.com/openshift/api v0.0.0-20210910062324-a41d3573a3ba
 	github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142
-	github.com/operator-framework/api v0.11.0
+	github.com/operator-framework/api v0.12.0
 	github.com/sirupsen/logrus v1.8.1
-	github.com/spf13/cobra v1.3.0
+	github.com/spf13/cobra v1.4.0
 	github.com/spf13/viper v1.10.1
 	gopkg.in/yaml.v2 v2.4.0
 	gotest.tools/v3 v3.0.3
-	k8s.io/api v0.23.0
-	k8s.io/apimachinery v0.23.0
-	k8s.io/client-go v0.23.0
-	sigs.k8s.io/controller-runtime v0.11.0
+	k8s.io/api v0.24.0
+	k8s.io/apimachinery v0.24.0
+	sigs.k8s.io/controller-runtime v0.12.0
 )
 
 require (
+	github.com/PuerkitoBio/purell v1.1.1 // indirect
+	github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/blang/semver/v4 v4.0.0 // indirect
 	github.com/cespare/xxhash/v2 v2.1.2 // indirect
@@ -35,36 +36,43 @@ require (
 	github.com/docker/distribution v2.8.0+incompatible // indirect
 	github.com/docker/docker v20.10.12+incompatible // indirect
 	github.com/docker/docker-credential-helpers v0.6.4 // indirect
+	github.com/emicklei/go-restful v2.9.5+incompatible // indirect
 	github.com/evanphx/json-patch v4.12.0+incompatible // indirect
 	github.com/fsnotify/fsnotify v1.5.1 // indirect
 	github.com/go-logr/logr v1.2.0 // indirect
+	github.com/go-openapi/jsonpointer v0.19.5 // indirect
+	github.com/go-openapi/jsonreference v0.19.5 // indirect
+	github.com/go-openapi/swag v0.19.14 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
 	github.com/google/go-cmp v0.5.7 // indirect
 	github.com/google/gofuzz v1.1.0 // indirect
 	github.com/google/uuid v1.3.0 // indirect
-	github.com/googleapis/gnostic v0.5.5 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/imdario/mergo v0.3.12 // indirect
 	github.com/inconshreveable/mousetrap v1.0.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/compress v1.14.4 // indirect
 	github.com/magiconair/properties v1.8.5 // indirect
+	github.com/mailru/easyjson v0.7.6 // indirect
 	github.com/mattn/go-sqlite3 v1.14.12 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
 	github.com/mitchellh/mapstructure v1.4.3 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect
 	github.com/pelletier/go-toml v1.9.4 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/prometheus/client_golang v1.11.0 // indirect
+	github.com/prometheus/client_golang v1.12.1 // indirect
 	github.com/prometheus/client_model v0.2.0 // indirect
-	github.com/prometheus/common v0.28.0 // indirect
-	github.com/prometheus/procfs v0.6.0 // indirect
+	github.com/prometheus/common v0.32.1 // indirect
+	github.com/prometheus/procfs v0.7.3 // indirect
 	github.com/spf13/afero v1.6.0 // indirect
 	github.com/spf13/cast v1.4.1 // indirect
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
@@ -77,7 +85,7 @@ require (
 	golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 // indirect
 	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
 	golang.org/x/text v0.3.7 // indirect
-	golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
+	golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
@@ -86,14 +94,15 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/ini.v1 v1.66.2 // indirect
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
-	k8s.io/apiextensions-apiserver v0.23.0 // indirect
-	k8s.io/component-base v0.23.0 // indirect
-	k8s.io/klog/v2 v2.30.0 // indirect
-	k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect
-	k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect
+	k8s.io/apiextensions-apiserver v0.24.0 // indirect
+	k8s.io/client-go v0.24.0 // indirect
+	k8s.io/component-base v0.24.0 // indirect
+	k8s.io/klog/v2 v2.60.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
+	k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
 	nhooyr.io/websocket v1.8.7 // indirect
-	sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect
+	sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
 	sigs.k8s.io/yaml v1.3.0 // indirect
 )
 
diff --git a/go.sum b/go.sum
index c83ce9e..e567f78 100644
--- a/go.sum
+++ b/go.sum
@@ -26,10 +26,6 @@ cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSU
 cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
 cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
 cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
-cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
-cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
-cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM=
-cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
@@ -46,7 +42,6 @@ cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7
 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU=
-cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -84,7 +79,6 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
 github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
 github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
@@ -95,7 +89,9 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0
 github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
+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-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 v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -113,9 +109,9 @@ github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI=
 github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU=
@@ -141,7 +137,6 @@ github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2
 github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso=
 github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
@@ -156,19 +151,11 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5O
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
-github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
 github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
 github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
@@ -217,6 +204,7 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 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=
@@ -225,11 +213,8 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
-github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
-github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
 github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
 github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE=
 github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY=
 github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
@@ -282,14 +267,17 @@ github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU
 github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
+github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
 github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
 github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
 github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
 github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
 github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
@@ -384,9 +372,12 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
 github.com/google/cel-go v0.9.0/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=
+github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=
 github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=
 github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
 github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs=
+github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
+github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -437,10 +428,8 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 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/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
-github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
 github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
-github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
 github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
 github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@@ -479,22 +468,16 @@ github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqC
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
 github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
-github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
 github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
 github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
 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/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
 github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-immutable-radix v1.3.1/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/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
-github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
 github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
 github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
 github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
@@ -511,19 +494,15 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
 github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
-github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
-github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
-github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
 github.com/hasura/go-graphql-client v0.6.5 h1:2l7awV5eCRnxEIOTanIWiFz4klq3UWplWn/spD2wpKE=
 github.com/hasura/go-graphql-client v0.6.5/go.mod h1:kvaJsDhxGbkIJ1jgebkrnt9EDIELZHpsAMint56v+2I=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
 github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4=
-github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 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=
@@ -545,6 +524,7 @@ github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhB
 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/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw=
 github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
@@ -603,7 +583,6 @@ github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
 github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
-github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
@@ -611,6 +590,7 @@ github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPK
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
+github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=
 github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
@@ -624,7 +604,6 @@ github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope
 github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
-github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
@@ -650,7 +629,6 @@ github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
 github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
-github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
 github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
 github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
 github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37/go.mod h1:dYWq+UWoFCDY1TndvFUQuhBbIYmZpjreC8adEAx93zE=
@@ -675,6 +653,7 @@ github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx
 github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
 github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=
 github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A=
+github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
 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=
@@ -687,6 +666,7 @@ github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8q
 github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8=
 github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -741,15 +721,14 @@ github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e/go.mo
 github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1p9LsJt4HQ+akDrys4PrYnXzOWI5LK03I=
 github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0=
 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/operator-framework/api v0.11.0 h1:W9V1NNwl3LWPQL9S1pDaFONCarJLl8Xu6gdF9w54hTE=
-github.com/operator-framework/api v0.11.0/go.mod h1:FTiYGm11fZQ3cSX+EQHc/UWoGZAwkGfyeHU+wMJ8jmA=
+github.com/operator-framework/api v0.12.0 h1:aHxHk50/Y1J4Ogdk2J6tYofgX+GEqyBPCMyun+JFqV4=
+github.com/operator-framework/api v0.12.0/go.mod h1:FTiYGm11fZQ3cSX+EQHc/UWoGZAwkGfyeHU+wMJ8jmA=
 github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
 github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
 github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
 github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
 github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
@@ -772,10 +751,10 @@ github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prY
 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=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
 github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -784,19 +763,18 @@ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-github.com/prometheus/common v0.28.0 h1:vGVfV9KrDTvWt5boZO0I19g2E3CsWfpPPKZM9dt3mEw=
-github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA=
 github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q=
@@ -821,7 +799,6 @@ github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoL
 github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE=
-github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
 github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI=
 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc=
@@ -847,7 +824,6 @@ github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag07
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
 github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
@@ -860,8 +836,8 @@ github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHN
 github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
 github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
 github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
-github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0=
-github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
+github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
+github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
@@ -875,7 +851,6 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
 github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
 github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4=
-github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
 github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
 github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU=
 github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
@@ -909,7 +884,6 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1
 github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY=
 github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4=
 github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
-github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
 github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
@@ -945,6 +919,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 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/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 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=
@@ -957,8 +932,8 @@ go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQc
 go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
 go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
 go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs=
 go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
+go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=
 go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
 go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
 go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
@@ -1018,6 +993,7 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 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=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1056,7 +1032,8 @@ 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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
+golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
+golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1106,15 +1083,15 @@ golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
@@ -1134,7 +1111,6 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ
 golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
 golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
@@ -1216,7 +1192,6 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1234,25 +1209,22 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/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/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1271,8 +1243,9 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
 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/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/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=
@@ -1375,10 +1348,10 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM=
 golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
-golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8=
+golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717 h1:hI3jKY4Hpf63ns040onEbB3dAkR/H/P83hw1TG8dD3Y=
+golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1414,12 +1387,7 @@ google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtuk
 google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
 google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
 google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
-google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
 google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
-google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
-google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU=
-google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
-google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -1491,16 +1459,7 @@ google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwy
 google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -1531,8 +1490,6 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ
 google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
 google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
 google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -1606,53 +1563,54 @@ k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s=
 k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s=
 k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg=
 k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY=
-k8s.io/api v0.23.0 h1:WrL1gb73VSC8obi8cuYETJGXEoFNEh3LU0Pt+Sokgro=
-k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg=
+k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg=
+k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
 k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE=
 k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c=
-k8s.io/apiextensions-apiserver v0.23.0 h1:uii8BYmHYiT2ZTAJxmvc3X8UhNYMxl2A0z0Xq3Pm+WY=
-k8s.io/apiextensions-apiserver v0.23.0/go.mod h1:xIFAEEDlAZgpVBl/1VSjGDmLoXAWRG40+GsWhKhAxY4=
+k8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY=
+k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM=
 k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
 k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
 k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI=
 k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
-k8s.io/apimachinery v0.23.0 h1:mIfWRMjBuMdolAWJ3Fd+aPTMv3X9z+waiARMpvvb0HQ=
-k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc=
+k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ=
+k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
 k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU=
 k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400=
-k8s.io/apiserver v0.23.0/go.mod h1:Cec35u/9zAepDPPFyT+UMrgqOCjgJ5qtfVJDxjZYmt4=
+k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA=
 k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs=
 k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs=
 k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU=
 k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk=
-k8s.io/client-go v0.23.0 h1:vcsOqyPq7XV3QmQRCBH/t9BICJM9Q1M18qahjv+rebY=
-k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA=
+k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U=
+k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
 k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
 k8s.io/code-generator v0.21.3/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo=
 k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o=
-k8s.io/code-generator v0.23.0/go.mod h1:vQvOhDXhuzqiVfM/YHp+dmg10WDZCchJVObc9MvowsE=
+k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
 k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ=
 k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo=
-k8s.io/component-base v0.23.0 h1:UAnyzjvVZ2ZR1lF35YwtNY6VMN94WtOnArcXBu34es8=
-k8s.io/component-base v0.23.0/go.mod h1:DHH5uiFvLC1edCpvcTDV++NKULdYYU6pR9Tt3HIKMKI=
+k8s.io/component-base v0.24.0 h1:h5jieHZQoHrY/lHG+HyrSbJeyfuitheBvqvKwKHVC0g=
+k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=
 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/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
+k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 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/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
-k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw=
-k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc=
+k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
 k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4=
-k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
+k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
+k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs=
-k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=
+k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
@@ -1664,18 +1622,18 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.25/go.mod h1:Mlj9PNLmG9bZ6BHFwFKDo5afkpWyUISkb9Me0GnK66I=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
 sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg=
-sigs.k8s.io/controller-runtime v0.11.0 h1:DqO+c8mywcZLFJWILq4iktoECTyn30Bkj0CwgqMpZWQ=
-sigs.k8s.io/controller-runtime v0.11.0/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
+sigs.k8s.io/controller-runtime v0.12.0 h1:gA4zphrmHFc7ihmY/+GyyE0BxKD+OYdb5+DjD2azFAQ=
+sigs.k8s.io/controller-runtime v0.12.0/go.mod h1:BKhxlA4l7FPK4AQcsuL4X6vZeWnKDXez/vp1Y8dxTU0=
 sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8=
-sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
-sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
+sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=
+sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.0 h1:kDvPBbnPk+qYmkHmSo8vKGp438IASWofnbbUKDE/bv0=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=


Test patch:
diff --git a/certification/internal/bundle/bundle_test.go b/certification/internal/bundle/bundle_test.go
index 23ce21c..55d9648 100644
--- a/certification/internal/bundle/bundle_test.go
+++ b/certification/internal/bundle/bundle_test.go
@@ -56,7 +56,7 @@ var _ = Describe("BundleValidateCheck", func() {
 
 		Context("the annotations file is valid", func() {
 			It("should pass", func() {
-				report, err := ValidateBundle(context.Background(), fakeEngine, imageRef.ImageFSPath)
+				report, err := Validate(context.Background(), fakeEngine, imageRef.ImageFSPath)
 				Expect(err).ToNot(HaveOccurred())
 				Expect(report).ToNot(BeNil())
 			})
@@ -68,7 +68,7 @@ var _ = Describe("BundleValidateCheck", func() {
 				Expect(err).ToNot(HaveOccurred())
 			})
 			It("should error", func() {
-				report, err := ValidateBundle(context.Background(), fakeEngine, imageRef.ImageFSPath)
+				report, err := Validate(context.Background(), fakeEngine, imageRef.ImageFSPath)
 				Expect(err).To(HaveOccurred())
 				Expect(report).To(BeNil())
 			})
@@ -80,7 +80,7 @@ var _ = Describe("BundleValidateCheck", func() {
 				Expect(err).ToNot(HaveOccurred())
 			})
 			It("should error", func() {
-				report, err := ValidateBundle(context.Background(), fakeEngine, imageRef.ImageFSPath)
+				report, err := Validate(context.Background(), fakeEngine, imageRef.ImageFSPath)
 				Expect(err).To(HaveOccurred())
 				Expect(report).To(BeNil())
 			})
@@ -92,7 +92,7 @@ var _ = Describe("BundleValidateCheck", func() {
 				Expect(err).ToNot(HaveOccurred())
 			})
 			It("should fail gracefully", func() {
-				report, err := ValidateBundle(context.Background(), fakeEngine, imageRef.ImageFSPath)
+				report, err := Validate(context.Background(), fakeEngine, imageRef.ImageFSPath)
 				Expect(err).ToNot(HaveOccurred())
 				Expect(report).ToNot(BeNil())
 			})
diff --git a/certification/internal/engine/openshift_test.go b/certification/internal/engine/openshift_test.go
new file mode 100644
index 0000000..2bb82cc
--- /dev/null
+++ b/certification/internal/engine/openshift_test.go
@@ -0,0 +1,294 @@
+package engine
+
+import (
+	"context"
+
+	. "github.com/onsi/ginkgo/v2"
+	. "github.com/onsi/gomega"
+
+	imagestreamv1 "github.com/openshift/api/image/v1"
+	operatorv1 "github.com/operator-framework/api/pkg/operators/v1"
+	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
+	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
+	corev1 "k8s.io/api/core/v1"
+	rbacv1 "k8s.io/api/rbac/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	apiruntime "k8s.io/apimachinery/pkg/runtime"
+
+	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+)
+
+var _ = Describe("OpenShift Engine", func() {
+	var oe *openshiftEngine
+
+	BeforeEach(func() {
+		pod1 := corev1.Pod{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "pod1",
+				Namespace: "testns",
+			},
+			Spec: corev1.PodSpec{
+				Containers: []corev1.Container{
+					{
+						Name:  "cont1",
+						Image: "my.container/image/1:latest",
+					},
+					{
+						Name:  "cont2",
+						Image: "my.container/image/2:3",
+					},
+				},
+			},
+		}
+
+		pod2 := corev1.Pod{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "pod2",
+				Namespace: "testns",
+			},
+			Spec: corev1.PodSpec{
+				Containers: []corev1.Container{
+					{
+						Name:  "cont3",
+						Image: "my.container/image/my3:4",
+					},
+					{
+						Name:  "cont2",
+						Image: "my.container/image/2:3",
+					},
+				},
+			},
+		}
+
+		pods := corev1.PodList{
+			Items: []corev1.Pod{
+				pod1,
+				pod2,
+			},
+		}
+
+		isList := imagestreamv1.ImageStreamList{
+			Items: []imagestreamv1.ImageStream{
+				{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "imagestream1",
+						Namespace: "testns",
+					},
+					Spec: imagestreamv1.ImageStreamSpec{
+						Tags: []imagestreamv1.TagReference{
+							{
+								From: &corev1.ObjectReference{
+									Name: "stream1",
+									Kind: "DockerImage",
+								},
+							},
+						},
+					},
+				},
+			},
+		}
+
+		csv := operatorv1alpha1.ClusterServiceVersion{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "testcsv",
+				Namespace: "testns",
+			},
+		}
+
+		scheme := apiruntime.NewScheme()
+		Expect(operatorv1.AddToScheme(scheme)).To(Succeed())
+		Expect(operatorv1alpha1.AddToScheme(scheme)).To(Succeed())
+		Expect(imagestreamv1.AddToScheme(scheme)).To(Succeed())
+		Expect(rbacv1.AddToScheme(scheme)).To(Succeed())
+		cl := fake.NewClientBuilder().
+			WithScheme(scheme).
+			WithObjects(&csv).
+			WithLists(&pods, &isList).
+			Build()
+		oe = &openshiftEngine{Client: cl}
+	})
+	Context("Namespaces", func() {
+		It("should exercise Namespaces", func() {
+			By("creating a Namespace", func() {
+				ns, err := oe.CreateNamespace(context.TODO(), "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(ns).ToNot(BeNil())
+			})
+			By("getting that Namespace", func() {
+				ns, err := oe.GetNamespace(context.TODO(), "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(ns).ToNot(BeNil())
+			})
+			By("deleting that Namespace", func() {
+				err := oe.DeleteNamespace(context.TODO(), "testns")
+				Expect(err).ToNot(HaveOccurred())
+			})
+			By("trying to get it again, but failing", func() {
+				ns, err := oe.GetNamespace(context.TODO(), "testns")
+				Expect(err).To(HaveOccurred())
+				Expect(ns).To(BeNil())
+			})
+		})
+	})
+	Context("OperatorGroups", func() {
+		It("should exercise OperatorGroups", func() {
+			operatorGroupData := cli.OperatorGroupData{
+				Name:             "testog",
+				TargetNamespaces: []string{"default", "testns"},
+			}
+			By("creating a OperatorGroup", func() {
+				og, err := oe.CreateOperatorGroup(context.TODO(), operatorGroupData, "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(og).ToNot(BeNil())
+			})
+			By("getting that OperatorGroup", func() {
+				og, err := oe.GetOperatorGroup(context.TODO(), "testog", "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(og).ToNot(BeNil())
+				Expect(og.Spec.TargetNamespaces).To(ContainElement("testns"))
+			})
+			By("deleting that OperatorGroup", func() {
+				err := oe.DeleteOperatorGroup(context.TODO(), "testog", "testns")
+				Expect(err).ToNot(HaveOccurred())
+			})
+			By("trying to get it again, but failing", func() {
+				og, err := oe.GetOperatorGroup(context.TODO(), "testog", "testns")
+				Expect(err).To(HaveOccurred())
+				Expect(og).To(BeNil())
+			})
+		})
+	})
+	Context("Secrets", func() {
+		It("should exercise Secrets", func() {
+			By("creating a Secret", func() {
+				content := make(map[string]string, 1)
+				content["test"] = "testdata"
+				secret, err := oe.CreateSecret(context.TODO(), "testsecret", content, corev1.SecretTypeDockerConfigJson, "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(secret).ToNot(BeNil())
+			})
+			By("getting that Secret", func() {
+				secret, err := oe.GetSecret(context.TODO(), "testsecret", "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(secret).ToNot(BeNil())
+				// This wouldn't be a readable field in "normal" client operations. But rather
+				// than changing the main code to use Data, we're just asserting that what
+				// we sent in is what we get back.
+				Expect(secret.StringData).To(ContainElement("testdata"))
+			})
+			By("deleting that Secret", func() {
+				err := oe.DeleteSecret(context.TODO(), "testsecret", "testns")
+				Expect(err).ToNot(HaveOccurred())
+			})
+			By("trying to get it again, but failing", func() {
+				secret, err := oe.GetSecret(context.TODO(), "testsecret", "testns")
+				Expect(err).To(HaveOccurred())
+				Expect(secret).To(BeNil())
+			})
+		})
+	})
+	Context("CatalogSources", func() {
+		It("should exercise CatalogSources", func() {
+			By("creating a CatalogSource", func() {
+				csData := cli.CatalogSourceData{
+					Name:    "testcs",
+					Image:   "this/is/my-image:now",
+					Secrets: []string{"my-secrets"},
+				}
+				cs, err := oe.CreateCatalogSource(context.TODO(), csData, "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(cs).ToNot(BeNil())
+			})
+			By("getting that CatalogSource", func() {
+				cs, err := oe.GetCatalogSource(context.TODO(), "testcs", "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(cs).ToNot(BeNil())
+				Expect(cs.Spec.Image).To(Equal("this/is/my-image:now"))
+			})
+			By("deleting that CatalogSource", func() {
+				err := oe.DeleteCatalogSource(context.TODO(), "testcs", "testns")
+				Expect(err).ToNot(HaveOccurred())
+			})
+			By("trying to get it again, but failing", func() {
+				cs, err := oe.GetCatalogSource(context.TODO(), "testcs", "testns")
+				Expect(err).To(HaveOccurred())
+				Expect(cs).To(BeNil())
+			})
+		})
+	})
+	Context("Subscriptions", func() {
+		It("should exercise Subscriptions", func() {
+			By("creating a Subscription", func() {
+				subData := cli.SubscriptionData{
+					Name:                   "testsub",
+					Channel:                "testchannel",
+					CatalogSource:          "testcs",
+					CatalogSourceNamespace: "testns",
+					Package:                "testpackage",
+				}
+				sub, err := oe.CreateSubscription(context.TODO(), subData, "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(sub).ToNot(BeNil())
+			})
+			By("getting that Subscription", func() {
+				sub, err := oe.GetSubscription(context.TODO(), "testsub", "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(sub).ToNot(BeNil())
+				Expect(sub.Spec.Channel).To(Equal("testchannel"))
+			})
+			By("deleting that Subscription", func() {
+				err := oe.DeleteSubscription(context.TODO(), "testsub", "testns")
+				Expect(err).ToNot(HaveOccurred())
+			})
+			By("trying to get it again, but failing", func() {
+				sub, err := oe.GetSubscription(context.TODO(), "testsub", "testns")
+				Expect(err).To(HaveOccurred())
+				Expect(sub).To(BeNil())
+			})
+		})
+	})
+	Context("RoleBindings", func() {
+		It("should exercise RoleBindings", func() {
+			By("creating a RoleBinding", func() {
+				rbData := cli.RoleBindingData{
+					Name:      "testrb",
+					Subjects:  []string{"testsubject"},
+					Role:      "testrole",
+					Namespace: "testns",
+				}
+				rb, err := oe.CreateRoleBinding(context.TODO(), rbData, "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(rb).ToNot(BeNil())
+			})
+			By("getting that RoleBinding", func() {
+				rb, err := oe.GetRoleBinding(context.TODO(), "testrb", "testns")
+				Expect(err).ToNot(HaveOccurred())
+				Expect(rb).ToNot(BeNil())
+				Expect(rb.Name).To(Equal("testrb"))
+			})
+			By("deleting that RoleBinding", func() {
+				err := oe.DeleteRoleBinding(context.TODO(), "testrb", "testns")
+				Expect(err).ToNot(HaveOccurred())
+			})
+			By("trying to get it again, but failing", func() {
+				rb, err := oe.GetRoleBinding(context.TODO(), "testrb", "testns")
+				Expect(err).To(HaveOccurred())
+				Expect(rb).To(BeNil())
+			})
+		})
+	})
+	Context("Images", func() {
+		It("should exercise GetImages", func() {
+			images, err := oe.GetImages(context.TODO())
+			Expect(err).ToNot(HaveOccurred())
+			Expect(images).ToNot(BeNil())
+		})
+	})
+	Context("CSVs", func() {
+		It("should exercise GetCSV", func() {
+			csv, err := oe.GetCSV(context.TODO(), "testcsv", "testns")
+			Expect(err).ToNot(HaveOccurred())
+			Expect(csv).ToNot(BeNil())
+		})
+	})
+})
diff --git a/certification/internal/policy/operator/deployable_by_olm_test.go b/certification/internal/policy/operator/deployable_by_olm_test.go
index 30bc1a8..d427a0a 100644
--- a/certification/internal/policy/operator/deployable_by_olm_test.go
+++ b/certification/internal/policy/operator/deployable_by_olm_test.go
@@ -6,9 +6,19 @@ import (
 	"path/filepath"
 	"time"
 
-	fakecranev1 "github.com/google/go-containerregistry/pkg/v1/fake"
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
+
+	fakecranev1 "github.com/google/go-containerregistry/pkg/v1/fake"
+	imagestreamv1 "github.com/openshift/api/image/v1"
+	operatorv1 "github.com/operator-framework/api/pkg/operators/v1"
+	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
+	rbacv1 "k8s.io/api/rbac/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	apiruntime "k8s.io/apimachinery/pkg/runtime"
+	crclient "sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification"
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
 )
@@ -16,10 +26,10 @@ import (
 var _ = Describe("DeployableByOLMCheck", func() {
 	var (
 		deployableByOLMCheck DeployableByOlmCheck
-		engine               cli.OpenshiftEngine
 		fakeEngine           cli.OperatorSdkEngine
 		imageRef             certification.ImageReference
 		tmpDockerDir         string
+		client               crclient.Client
 	)
 	const (
 		metadataDir            = "metadata"
@@ -40,7 +50,7 @@ var _ = Describe("DeployableByOLMCheck", func() {
   }
 }`
 
-		csv = `
+		csvStr = `
     spec:
       installModes:
         - supported: false
@@ -62,28 +72,24 @@ var _ = Describe("DeployableByOLMCheck", func() {
 		tmpDir, err := os.MkdirTemp("", "bundle-metadata-*")
 		Expect(err).ToNot(HaveOccurred())
 
-		err = os.Mkdir(filepath.Join(tmpDir, metadataDir), 0o755)
-		Expect(err).ToNot(HaveOccurred())
-
-		err = os.WriteFile(filepath.Join(tmpDir, metadataDir, annotationFilename), []byte(annotations), 0o644)
-		Expect(err).ToNot(HaveOccurred())
+		Expect(os.Mkdir(filepath.Join(tmpDir, metadataDir), 0o755)).To(Succeed())
+		Expect(os.WriteFile(filepath.Join(tmpDir, metadataDir, annotationFilename), []byte(annotations), 0o644)).To(Succeed())
 
 		// mock csv file
-		err = os.Mkdir(filepath.Join(tmpDir, manifestDir), 0o755)
-		Expect(err).ToNot(HaveOccurred())
-
-		err = os.WriteFile(filepath.Join(tmpDir, manifestDir, csvFilename), []byte(csv), 0o644)
-		Expect(err).ToNot(HaveOccurred())
+		Expect(os.Mkdir(filepath.Join(tmpDir, manifestDir), 0o755)).To(Succeed())
+		Expect(os.WriteFile(filepath.Join(tmpDir, manifestDir, csvFilename), []byte(csvStr), 0o644)).To(Succeed())
 
 		// mock docker config file
 		tmpDockerDir, err = os.MkdirTemp("", "docker-config-*")
 		Expect(err).ToNot(HaveOccurred())
 
-		err = os.Mkdir(filepath.Join(tmpDockerDir, registryConfigDir), 0o755)
-		Expect(err).ToNot(HaveOccurred())
-
-		err = os.WriteFile(filepath.Join(tmpDockerDir, registryConfigDir, registryConfigFilename), []byte(registryAuthToken), 0o644)
-		Expect(err).ToNot(HaveOccurred())
+		Expect(os.Mkdir(filepath.Join(tmpDockerDir, registryConfigDir), 0o755)).To(Succeed())
+		Expect(os.WriteFile(filepath.Join(
+			tmpDockerDir,
+			registryConfigDir,
+			registryConfigFilename),
+			[]byte(registryAuthToken),
+			0o644)).To(Succeed())
 
 		fakeImage := fakecranev1.FakeImage{}
 		imageRef.ImageInfo = &fakeImage
@@ -97,16 +103,27 @@ var _ = Describe("DeployableByOLMCheck", func() {
 			OperatorSdkBVReport: report,
 		}
 
+		now := metav1.Now()
+		og.Status.LastUpdated = &now
+		deployableByOLMCheck = *NewDeployableByOlmCheck(&fakeEngine)
+		scheme := apiruntime.NewScheme()
+		Expect(operatorv1.AddToScheme(scheme)).To(Succeed())
+		Expect(operatorv1alpha1.AddToScheme(scheme)).To(Succeed())
+		Expect(imagestreamv1.AddToScheme(scheme)).To(Succeed())
+		Expect(rbacv1.AddToScheme(scheme)).To(Succeed())
+		client = fake.NewClientBuilder().
+			WithScheme(scheme).
+			WithObjects(&csv, &csvDefault, &csvMarketplace, &ns, &secret, &sub, &og).
+			WithLists(&pods, &isList).
+			Build()
+		deployableByOLMCheck.client = client
+
 		// set env var for index image
 		os.Setenv("PFLT_INDEXIMAGE", "test_indeximage")
 		os.Setenv("PFLT_ARTIFACTS", tmpDir)
 	})
 	Describe("When deploying an operator using OLM", func() {
 		Context("When CSV has been created successfully", func() {
-			BeforeEach(func() {
-				engine = FakeOpenshiftEngine{}
-				deployableByOLMCheck = *NewDeployableByOlmCheck(&engine, &fakeEngine)
-			})
 			It("Should pass Validate", func() {
 				ok, err := deployableByOLMCheck.Validate(context.TODO(), imageRef)
 				Expect(err).ToNot(HaveOccurred())
@@ -115,8 +132,13 @@ var _ = Describe("DeployableByOLMCheck", func() {
 		})
 		Context("When installedCSV field of Subscription is not set", func() {
 			BeforeEach(func() {
-				engine = BadOpenshiftEngine{}
-				deployableByOLMCheck = *NewDeployableByOlmCheck(&engine, &fakeEngine)
+				badSub := sub
+				Expect(client.Get(context.TODO(), crclient.ObjectKey{
+					Name:      "testPackage",
+					Namespace: "testPackage",
+				}, &badSub)).To(Succeed())
+				badSub.Status.InstalledCSV = ""
+				Expect(client.Update(context.TODO(), &badSub, &crclient.UpdateOptions{})).To(Succeed())
 			})
 			It("Should fail Validate", func() {
 				ok, err := deployableByOLMCheck.Validate(context.TODO(), imageRef)
@@ -127,21 +149,19 @@ var _ = Describe("DeployableByOLMCheck", func() {
 		Context("When index image is in a custom namespace and CSV has been created successfully", func() {
 			BeforeEach(func() {
 				os.Setenv("PFLT_INDEXIMAGE", "image-registry.openshift-image-registry.svc/namespace/indeximage:v0.0.0")
-				engine = FakeOpenshiftEngine{}
-				deployableByOLMCheck = *NewDeployableByOlmCheck(&engine, &fakeEngine)
 			})
 			It("Should pass Validate", func() {
 				ok, err := deployableByOLMCheck.Validate(context.TODO(), imageRef)
 				Expect(err).ToNot(HaveOccurred())
 				Expect(ok).To(BeTrue())
 			})
+			AfterEach(func() {
+				os.Unsetenv("PFTL_INDEXIMAGE")
+			})
 		})
 		Context("When index image is in a private registry and CSV has been created successfully", func() {
 			BeforeEach(func() {
 				os.Setenv("PFLT_DOCKERCONFIG", filepath.Join(tmpDockerDir, registryConfigDir, registryConfigFilename))
-
-				engine = FakeOpenshiftEngine{}
-				deployableByOLMCheck = *NewDeployableByOlmCheck(&engine, &fakeEngine)
 			})
 			It("Should pass Validate", func() {
 				ok, err := deployableByOLMCheck.Validate(context.TODO(), imageRef)
@@ -153,10 +173,6 @@ var _ = Describe("DeployableByOLMCheck", func() {
 			})
 		})
 		Context("When the only supported install mode is AllNamespaces", func() {
-			BeforeEach(func() {
-				engine = FakeOpenshiftEngine{}
-				deployableByOLMCheck = *NewDeployableByOlmCheck(&engine, &fakeEngine)
-			})
 			It("Should pass Validate", func() {
 				ok, err := deployableByOLMCheck.Validate(context.TODO(), imageRef)
 				Expect(err).ToNot(HaveOccurred())
@@ -166,9 +182,6 @@ var _ = Describe("DeployableByOLMCheck", func() {
 		Context("When the non-default channel is being tested", func() {
 			BeforeEach(func() {
 				os.Setenv("PFLT_CHANNEL", "non-default-channel")
-
-				engine = FakeOpenshiftEngine{}
-				deployableByOLMCheck = *NewDeployableByOlmCheck(&engine, &fakeEngine)
 			})
 			It("Should pass Validate", func() {
 				ok, err := deployableByOLMCheck.Validate(context.TODO(), imageRef)
diff --git a/certification/internal/policy/operator/operator_suite_test.go b/certification/internal/policy/operator/operator_suite_test.go
index bcb6e96..c72ebc9 100644
--- a/certification/internal/policy/operator/operator_suite_test.go
+++ b/certification/internal/policy/operator/operator_suite_test.go
@@ -1,20 +1,18 @@
 package operator
 
 import (
-	"context"
 	"errors"
 	"testing"
-	"time"
 
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
+	imagestreamv1 "github.com/openshift/api/image/v1"
 	operatorv1 "github.com/operator-framework/api/pkg/operators/v1"
 	operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
 	"github.com/redhat-openshift-ecosystem/openshift-preflight/certification/internal/cli"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
 	corev1 "k8s.io/api/core/v1"
-	rbacv1 "k8s.io/api/rbac/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -65,429 +63,136 @@ func (bose BadOperatorSdkEngine) BundleValidate(bundleImage string, opts cli.Ope
 	return &operatorSdkReport, errors.New("the Operator Sdk Bundle Validate has failed")
 }
 
-type FakeOpenshiftEngine struct{}
-
-func (foe FakeOpenshiftEngine) CreateNamespace(ctx context.Context, name string) (*corev1.Namespace, error) {
-	return &corev1.Namespace{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: "test-ns",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) DeleteNamespace(ctx context.Context, name string) error {
-	return nil
-}
-
-func (foe FakeOpenshiftEngine) GetNamespace(ctx context.Context, name string) (*corev1.Namespace, error) {
-	return &corev1.Namespace{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: "test-ns",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) CreateSecret(ctx context.Context, name string, content map[string]string, secretType corev1.SecretType, namespace string) (*corev1.Secret, error) {
-	return &corev1.Secret{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "pull-image-secret",
-			Namespace: "test-ns",
-		},
-		Type:       "kubernetes.io/dockerconfigjson",
-		StringData: map[string]string{".dockerconfigjson": "secretData"},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) DeleteSecret(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe FakeOpenshiftEngine) GetSecret(ctx context.Context, name, namespace string) (*corev1.Secret, error) {
-	return &corev1.Secret{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "pull-image-secret",
-			Namespace: "test-ns",
-		},
-		Type:       "kubernetes.io/dockerconfigjson",
-		StringData: map[string]string{".dockerconfigjson": "secretData"},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) CreateOperatorGroup(ctx context.Context, data cli.OperatorGroupData, namespace string) (*operatorv1.OperatorGroup, error) {
-	return &operatorv1.OperatorGroup{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-og",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1.OperatorGroupSpec{
-			TargetNamespaces: []string{"test-ns"},
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) DeleteOperatorGroup(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe FakeOpenshiftEngine) GetOperatorGroup(ctx context.Context, name, namespace string) (*operatorv1.OperatorGroup, error) {
-	return &operatorv1.OperatorGroup{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-og",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1.OperatorGroupSpec{
-			TargetNamespaces: []string{"test-ns"},
-		},
-		Status: operatorv1.OperatorGroupStatus{
-			LastUpdated: &metav1.Time{Time: time.Now()},
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) CreateRoleBinding(ctx context.Context, data cli.RoleBindingData, namespace string) (*rbacv1.RoleBinding, error) {
-	subjectsObj := make([]rbacv1.Subject, 1)
-
-	subjectsObj[0] = rbacv1.Subject{
-		Kind:      "ServiceAccount",
-		Name:      "test-sa",
-		Namespace: "test-ns",
-	}
-	return &rbacv1.RoleBinding{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "RoleBinding",
-			APIVersion: "rbac.authorization.k8s.io/v1",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-rolebinding",
-			Namespace: "a namespace",
-		},
-		Subjects: subjectsObj,
-		RoleRef: rbacv1.RoleRef{
-			Kind:     "ClusterRole",
-			APIGroup: "rbac.authorization.k8s.io",
-			Name:     "a role",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) GetRoleBinding(ctx context.Context, name, namespace string) (*rbacv1.RoleBinding, error) {
-	subjectsObj := make([]rbacv1.Subject, 1)
-
-	subjectsObj[0] = rbacv1.Subject{
-		Kind:      "ServiceAccount",
-		Name:      "test-sa",
-		Namespace: "test-ns",
-	}
-	return &rbacv1.RoleBinding{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "RoleBinding",
-			APIVersion: "rbac.authorization.k8s.io/v1",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-rolebinding",
-			Namespace: "a namespace",
-		},
-		Subjects: subjectsObj,
-		RoleRef: rbacv1.RoleRef{
-			Kind:     "ClusterRole",
-			APIGroup: "rbac.authorization.k8s.io",
-			Name:     "a role",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) DeleteRoleBinding(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe FakeOpenshiftEngine) CreateCatalogSource(ctx context.Context, data cli.CatalogSourceData, namespace string) (*operatorv1alpha1.CatalogSource, error) {
-	return &operatorv1alpha1.CatalogSource{
-		Spec: operatorv1alpha1.CatalogSourceSpec{
-			SourceType: operatorv1alpha1.SourceTypeGrpc,
-			Image:      "indexImageUri",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) DeleteCatalogSource(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe FakeOpenshiftEngine) GetCatalogSource(ctx context.Context, name, namespace string) (*operatorv1alpha1.CatalogSource, error) {
-	return &operatorv1alpha1.CatalogSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-cs",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1alpha1.CatalogSourceSpec{
-			SourceType: operatorv1alpha1.SourceTypeGrpc,
-			Image:      "indexImageUri",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) CreateSubscription(ctx context.Context, data cli.SubscriptionData, namespace string) (*operatorv1alpha1.Subscription, error) {
-	return &operatorv1alpha1.Subscription{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-sub",
-			Namespace: "test-ns",
-		},
-		Spec: &operatorv1alpha1.SubscriptionSpec{
-			CatalogSource:          "test-cs",
-			CatalogSourceNamespace: "openshift-marketplace",
-			Channel:                "stable",
-			Package:                "test-operator",
-		},
-		Status: operatorv1alpha1.SubscriptionStatus{
-			InstalledCSV: "csv-v0.0.0",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) DeleteSubscription(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe FakeOpenshiftEngine) GetSubscription(ctx context.Context, name, namespace string) (*operatorv1alpha1.Subscription, error) {
-	return &operatorv1alpha1.Subscription{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-sub",
-			Namespace: "test-ns",
-		},
-		Spec: &operatorv1alpha1.SubscriptionSpec{
-			CatalogSource:          "test-cs",
-			CatalogSourceNamespace: "openshift-marketplace",
-			Channel:                "stable",
-			Package:                "test-operator",
-		},
-		Status: operatorv1alpha1.SubscriptionStatus{
-			InstalledCSV: "csv-v0.0.0",
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) GetCSV(ctx context.Context, name, namespace string) (*operatorv1alpha1.ClusterServiceVersion, error) {
-	return &operatorv1alpha1.ClusterServiceVersion{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "csv-v0.0.0",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1alpha1.ClusterServiceVersionSpec{},
-		Status: operatorv1alpha1.ClusterServiceVersionStatus{
-			Phase: operatorv1alpha1.CSVPhaseSucceeded,
-		},
-	}, nil
-}
-
-func (foe FakeOpenshiftEngine) GetImages(ctx context.Context) (map[string]struct{}, error) {
-	return map[string]struct{}{}, nil
-}
-
-type BadOpenshiftEngine struct{}
-
-func (foe BadOpenshiftEngine) CreateNamespace(ctx context.Context, name string) (*corev1.Namespace, error) {
-	return &corev1.Namespace{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: "test-ns",
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) DeleteNamespace(ctx context.Context, name string) error {
-	return nil
-}
-
-func (foe BadOpenshiftEngine) GetNamespace(ctx context.Context, name string) (*corev1.Namespace, error) {
-	return &corev1.Namespace{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: "test-ns",
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) CreateSecret(ctx context.Context, name string, content map[string]string, secretType corev1.SecretType, namespace string) (*corev1.Secret, error) {
-	return &corev1.Secret{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "pull-image-secret",
-			Namespace: "test-ns",
-		},
-		Type:       "kubernetes.io/dockerconfigjson",
-		StringData: map[string]string{".dockerconfigjson": "secretData"},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) DeleteSecret(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe BadOpenshiftEngine) GetSecret(ctx context.Context, name, namespace string) (*corev1.Secret, error) {
-	return &corev1.Secret{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "pull-image-secret",
-			Namespace: "test-ns",
-		},
-		Type:       "kubernetes.io/dockerconfigjson",
-		StringData: map[string]string{".dockerconfigjson": "secretData"},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) CreateOperatorGroup(ctx context.Context, data cli.OperatorGroupData, namespace string) (*operatorv1.OperatorGroup, error) {
-	return &operatorv1.OperatorGroup{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-og",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1.OperatorGroupSpec{
-			TargetNamespaces: []string{"test-ns"},
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) DeleteOperatorGroup(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe BadOpenshiftEngine) GetOperatorGroup(ctx context.Context, name, namespace string) (*operatorv1.OperatorGroup, error) {
-	return &operatorv1.OperatorGroup{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-og",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1.OperatorGroupSpec{
-			TargetNamespaces: []string{"test-ns"},
-		},
-		Status: operatorv1.OperatorGroupStatus{
-			LastUpdated: &metav1.Time{Time: time.Now()},
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) CreateCatalogSource(ctx context.Context, data cli.CatalogSourceData, namespace string) (*operatorv1alpha1.CatalogSource, error) {
-	return &operatorv1alpha1.CatalogSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-cs",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1alpha1.CatalogSourceSpec{
-			SourceType: operatorv1alpha1.SourceTypeGrpc,
-			Image:      "indexImageUri",
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) DeleteCatalogSource(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe BadOpenshiftEngine) GetCatalogSource(ctx context.Context, name, namespace string) (*operatorv1alpha1.CatalogSource, error) {
-	return &operatorv1alpha1.CatalogSource{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-cs",
-			Namespace: "test-ns",
-		},
-		Spec: operatorv1alpha1.CatalogSourceSpec{
-			SourceType: operatorv1alpha1.SourceTypeGrpc,
-			Image:      "indexImageUri",
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) CreateSubscription(ctx context.Context, data cli.SubscriptionData, namespace string) (*operatorv1alpha1.Subscription, error) {
-	return &operatorv1alpha1.Subscription{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-sub",
-			Namespace: "test-ns",
-		},
-		Spec: &operatorv1alpha1.SubscriptionSpec{
-			CatalogSource:          "test-cs",
-			CatalogSourceNamespace: "openshift-marketplace",
-			Channel:                "stable",
-			Package:                "test-operator",
-		},
-		Status: operatorv1alpha1.SubscriptionStatus{},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) DeleteSubscription(ctx context.Context, name, namespace string) error {
-	return nil
-}
-
-func (foe BadOpenshiftEngine) GetSubscription(ctx context.Context, name, namespace string) (*operatorv1alpha1.Subscription, error) {
-	return &operatorv1alpha1.Subscription{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-sub",
-			Namespace: "test-ns",
-		},
-		Spec: &operatorv1alpha1.SubscriptionSpec{
-			CatalogSource:          "test-cs",
-			CatalogSourceNamespace: "openshift-marketplace",
-			Channel:                "stable",
-			Package:                "test-operator",
-		},
-		Status: operatorv1alpha1.SubscriptionStatus{},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) GetCSV(ctx context.Context, name, namespace string) (*operatorv1alpha1.ClusterServiceVersion, error) {
-	return nil, nil
-}
-
-func (foe BadOpenshiftEngine) GetImages(ctx context.Context) (map[string]struct{}, error) {
-	return nil, nil
-}
-
-func (foe BadOpenshiftEngine) CreateRoleBinding(ctx context.Context, data cli.RoleBindingData, namespace string) (*rbacv1.RoleBinding, error) {
-	subjectsObj := make([]rbacv1.Subject, 1)
-
-	subjectsObj[0] = rbacv1.Subject{
-		Kind:      "ServiceAccount",
-		Name:      "test-sa",
+var pod1 = corev1.Pod{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "pod1",
+		Namespace: "testns",
+	},
+	Spec: corev1.PodSpec{
+		Containers: []corev1.Container{
+			{
+				Name:  "cont1",
+				Image: "my.container/image/1:latest",
+			},
+			{
+				Name:  "cont2",
+				Image: "my.container/image/2:3",
+			},
+		},
+	},
+}
+
+var pod2 = corev1.Pod{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "pod2",
+		Namespace: "testns",
+	},
+	Spec: corev1.PodSpec{
+		Containers: []corev1.Container{
+			{
+				Name:  "cont3",
+				Image: "my.container/image/my3:4",
+			},
+			{
+				Name:  "cont2",
+				Image: "my.container/image/2:3",
+			},
+		},
+	},
+}
+
+var pods = corev1.PodList{
+	Items: []corev1.Pod{
+		pod1,
+		pod2,
+	},
+}
+
+var csv = operatorv1alpha1.ClusterServiceVersion{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "csv-v0.0.0",
+		Namespace: "testPackage-target",
+	},
+	Spec: operatorv1alpha1.ClusterServiceVersionSpec{},
+	Status: operatorv1alpha1.ClusterServiceVersionStatus{
+		Phase: operatorv1alpha1.CSVPhaseSucceeded,
+	},
+}
+
+var csvDefault = operatorv1alpha1.ClusterServiceVersion{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "csv-v0.0.0",
+		Namespace: "default",
+	},
+	Spec: operatorv1alpha1.ClusterServiceVersionSpec{},
+	Status: operatorv1alpha1.ClusterServiceVersionStatus{
+		Phase: operatorv1alpha1.CSVPhaseSucceeded,
+	},
+}
+
+var csvMarketplace = operatorv1alpha1.ClusterServiceVersion{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "csv-v0.0.0",
+		Namespace: "openshift-marketplace",
+	},
+	Spec: operatorv1alpha1.ClusterServiceVersionSpec{},
+	Status: operatorv1alpha1.ClusterServiceVersionStatus{
+		Phase: operatorv1alpha1.CSVPhaseSucceeded,
+	},
+}
+
+var ns = corev1.Namespace{
+	ObjectMeta: metav1.ObjectMeta{
+		Name: "test-ns",
+	},
+}
+
+var secret = corev1.Secret{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "pull-image-secret",
 		Namespace: "test-ns",
-	}
-	return &rbacv1.RoleBinding{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "RoleBinding",
-			APIVersion: "rbac.authorization.k8s.io/v1",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-rolebinding",
-			Namespace: "a namespace",
-		},
-		Subjects: subjectsObj,
-		RoleRef: rbacv1.RoleRef{
-			Kind:     "ClusterRole",
-			APIGroup: "rbac.authorization.k8s.io",
-			Name:     "a role",
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) GetRoleBinding(ctx context.Context, name, namespace string) (*rbacv1.RoleBinding, error) {
-	subjectsObj := make([]rbacv1.Subject, 1)
-
-	subjectsObj[0] = rbacv1.Subject{
-		Kind:      "ServiceAccount",
-		Name:      "test-sa",
-		Namespace: "test-ns",
-	}
-	return &rbacv1.RoleBinding{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "RoleBinding",
-			APIVersion: "rbac.authorization.k8s.io/v1",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test-rolebinding",
-			Namespace: "a namespace",
-		},
-		Subjects: subjectsObj,
-		RoleRef: rbacv1.RoleRef{
-			Kind:     "ClusterRole",
-			APIGroup: "rbac.authorization.k8s.io",
-			Name:     "a role",
-		},
-	}, nil
-}
-
-func (foe BadOpenshiftEngine) DeleteRoleBinding(ctx context.Context, name, namespace string) error {
-	return nil
+	},
+	Type:       "kubernetes.io/dockerconfigjson",
+	StringData: map[string]string{".dockerconfigjson": "secretData"},
+}
+
+var sub = operatorv1alpha1.Subscription{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "testPackage",
+		Namespace: "testPackage",
+	},
+	Status: operatorv1alpha1.SubscriptionStatus{
+		InstalledCSV: "csv-v0.0.0",
+	},
+}
+
+var og = operatorv1.OperatorGroup{
+	ObjectMeta: metav1.ObjectMeta{
+		Name:      "testPackage",
+		Namespace: "testPackage",
+	},
+	Status: operatorv1.OperatorGroupStatus{
+		LastUpdated: nil,
+	},
+}
+
+var isList = imagestreamv1.ImageStreamList{
+	Items: []imagestreamv1.ImageStream{
+		{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "imagestream1",
+				Namespace: "testns",
+			},
+			Spec: imagestreamv1.ImageStreamSpec{
+				Tags: []imagestreamv1.TagReference{
+					{
+						From: &corev1.ObjectReference{
+							Name: "stream1",
+							Kind: "DockerImage",
+						},
+					},
+				},
+			},
+		},
+	},
 }