Repository: Azure/ARO-RP
Pull request #1242 (2021-01-06 15:56:55)

Nits
Nits


Patch:
diff --git a/cmd/aro/monitor.go b/cmd/aro/monitor.go
index 164ccf531..c395243fd 100644
--- a/cmd/aro/monitor.go
+++ b/cmd/aro/monitor.go
@@ -45,10 +45,7 @@ func monitor(ctx context.Context, log *logrus.Entry) error {
 		}
 	}
 
-	m, err := statsd.New(ctx, log.WithField("component", "metrics"), _env, os.Getenv("MDM_ACCOUNT"), os.Getenv("MDM_NAMESPACE"))
-	if err != nil {
-		return err
-	}
+	m := statsd.New(ctx, log.WithField("component", "metrics"), _env, os.Getenv("MDM_ACCOUNT"), os.Getenv("MDM_NAMESPACE"))
 
 	tracing.Register(azure.New(m))
 	metrics.Register(metrics.RegisterOpts{
@@ -56,10 +53,7 @@ func monitor(ctx context.Context, log *logrus.Entry) error {
 		RequestLatency: k8s.NewLatency(m),
 	})
 
-	clusterm, err := statsd.New(ctx, log.WithField("component", "metrics"), _env, os.Getenv("CLUSTER_MDM_ACCOUNT"), os.Getenv("CLUSTER_MDM_NAMESPACE"))
-	if err != nil {
-		return err
-	}
+	clusterm := statsd.New(ctx, log.WithField("component", "metrics"), _env, os.Getenv("CLUSTER_MDM_ACCOUNT"), os.Getenv("CLUSTER_MDM_NAMESPACE"))
 
 	rpKVAuthorizer, err := _env.NewRPAuthorizer(_env.Environment().ResourceIdentifiers.KeyVault)
 	if err != nil {
diff --git a/cmd/aro/portal.go b/cmd/aro/portal.go
index a36aecfa1..3d2eef7c5 100644
--- a/cmd/aro/portal.go
+++ b/cmd/aro/portal.go
@@ -69,10 +69,7 @@ func portal(ctx context.Context, log *logrus.Entry) error {
 		return err
 	}
 
-	m, err := statsd.New(ctx, log.WithField("component", "portal"), _env, os.Getenv("MDM_ACCOUNT"), os.Getenv("MDM_NAMESPACE"))
-	if err != nil {
-		return err
-	}
+	m := statsd.New(ctx, log.WithField("component", "portal"), _env, os.Getenv("MDM_ACCOUNT"), os.Getenv("MDM_NAMESPACE"))
 
 	// TODO: should not be using the service keyvault here
 	serviceKeyvaultURI, err := keyvault.URI(_env, generator.ServiceKeyvaultSuffix)
diff --git a/cmd/aro/rp.go b/cmd/aro/rp.go
index 427caee62..615e2312c 100644
--- a/cmd/aro/rp.go
+++ b/cmd/aro/rp.go
@@ -65,10 +65,7 @@ func rp(ctx context.Context, log *logrus.Entry) error {
 		return err
 	}
 
-	m, err := statsd.New(ctx, log.WithField("component", "metrics"), _env, os.Getenv("MDM_ACCOUNT"), os.Getenv("MDM_NAMESPACE"))
-	if err != nil {
-		return err
-	}
+	m := statsd.New(ctx, log.WithField("component", "metrics"), _env, os.Getenv("MDM_ACCOUNT"), os.Getenv("MDM_NAMESPACE"))
 
 	tracing.Register(azure.New(m))
 	metrics.Register(metrics.RegisterOpts{
diff --git a/pkg/api/validate/openshiftcluster_validatedynamic.go b/pkg/api/validate/openshiftcluster_validatedynamic.go
index 45ff83651..559062d3a 100644
--- a/pkg/api/validate/openshiftcluster_validatedynamic.go
+++ b/pkg/api/validate/openshiftcluster_validatedynamic.go
@@ -23,7 +23,7 @@ import (
 
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/env"
-	arooperatorapi "github.com/Azure/ARO-RP/pkg/operator/apis/aro.openshift.io/v1alpha1"
+	arov1alpha1 "github.com/Azure/ARO-RP/pkg/operator/apis/aro.openshift.io/v1alpha1"
 	"github.com/Azure/ARO-RP/pkg/util/aad"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/authorization"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
@@ -59,7 +59,7 @@ func NewOpenShiftClusterFullDynamicValidator(log *logrus.Entry, env env.Interfac
 }
 
 // NewOpenShiftClusterSlimDynamicValidator creates a new OpenShiftClusterSlimDynamicValidator
-func NewOpenShiftClusterSlimDynamicValidator(log *logrus.Entry, clientID string, clientSecret api.SecureString, subscriptionID string, tenantID string, clusterSpec *arooperatorapi.ClusterSpec) OpenShiftClusterSlimDynamicValidator {
+func NewOpenShiftClusterSlimDynamicValidator(log *logrus.Entry, clientID string, clientSecret api.SecureString, subscriptionID string, tenantID string, clusterSpec *arov1alpha1.ClusterSpec) OpenShiftClusterSlimDynamicValidator {
 	spp := &api.ServicePrincipalProfile{
 		ClientID:     clientID,
 		ClientSecret: clientSecret,
@@ -92,7 +92,7 @@ type openShiftClusterSlimDynamicValidator struct {
 	log *logrus.Entry
 
 	spp             *api.ServicePrincipalProfile
-	clusterSpec     *arooperatorapi.ClusterSpec
+	clusterSpec     *arov1alpha1.ClusterSpec
 	tenantID        string
 	subscriptionID  string
 	environmentName string
diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go
index 20e0c0203..a0dad72fd 100644
--- a/pkg/cluster/cluster.go
+++ b/pkg/cluster/cluster.go
@@ -18,7 +18,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/database"
 	"github.com/Azure/ARO-RP/pkg/env"
-	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned/typed/aro.openshift.io/v1alpha1"
+	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/network"
@@ -73,7 +73,7 @@ type manager struct {
 	configcli     configclient.Interface
 	samplescli    samplesclient.Interface
 	securitycli   securityclient.Interface
-	arocli        aroclient.AroV1alpha1Interface
+	arocli        aroclient.Interface
 }
 
 const deploymentName = "azuredeploy"
diff --git a/pkg/cluster/install.go b/pkg/cluster/install.go
index a1c8034a1..1e529c915 100644
--- a/pkg/cluster/install.go
+++ b/pkg/cluster/install.go
@@ -18,7 +18,7 @@ import (
 	"k8s.io/client-go/kubernetes"
 
 	"github.com/Azure/ARO-RP/pkg/api"
-	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned/typed/aro.openshift.io/v1alpha1"
+	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned"
 	"github.com/Azure/ARO-RP/pkg/util/restconfig"
 	"github.com/Azure/ARO-RP/pkg/util/steps"
 	"github.com/Azure/ARO-RP/pkg/util/version"
diff --git a/pkg/metrics/statsd/statsd.go b/pkg/metrics/statsd/statsd.go
index 924544941..544697648 100644
--- a/pkg/metrics/statsd/statsd.go
+++ b/pkg/metrics/statsd/statsd.go
@@ -32,7 +32,7 @@ type statsd struct {
 }
 
 // New returns a new metrics.Interface
-func New(ctx context.Context, log *logrus.Entry, env env.Core, account, namespace string) (metrics.Interface, error) {
+func New(ctx context.Context, log *logrus.Entry, env env.Core, account, namespace string) metrics.Interface {
 	s := &statsd{
 		log: log,
 		env: env,
@@ -55,7 +55,7 @@ func New(ctx context.Context, log *logrus.Entry, env env.Core, account, namespac
 
 	go s.run()
 
-	return s, nil
+	return s
 }
 
 // EmitFloat records float information
diff --git a/pkg/mirror/graph.go b/pkg/mirror/graph.go
index b1e01591a..059a64519 100644
--- a/pkg/mirror/graph.go
+++ b/pkg/mirror/graph.go
@@ -74,7 +74,7 @@ loop:
 			continue
 		}
 
-		node.Payload = strings.Replace(node.Payload, "registry.ci.openshift.org/ocp/release", "quay.io/openshift-release-dev/ocp-release", 1)
+		node.Payload = strings.Replace(node.Payload, "registry.svc.ci.openshift.org/ocp/release", "quay.io/openshift-release-dev/ocp-release", 1)
 
 		releases = append(releases, node)
 	}
diff --git a/pkg/monitor/cluster/arooperatorconditions.go b/pkg/monitor/cluster/arooperatorconditions.go
index 97d278f8f..79660cda2 100644
--- a/pkg/monitor/cluster/arooperatorconditions.go
+++ b/pkg/monitor/cluster/arooperatorconditions.go
@@ -20,7 +20,7 @@ var aroOperatorConditionsExpected = map[status.ConditionType]corev1.ConditionSta
 }
 
 func (mon *Monitor) emitAroOperatorConditions(ctx context.Context) error {
-	cluster, err := mon.arocli.Clusters().Get(ctx, arov1alpha1.SingletonClusterName, metav1.GetOptions{})
+	cluster, err := mon.arocli.AroV1alpha1().Clusters().Get(ctx, arov1alpha1.SingletonClusterName, metav1.GetOptions{})
 	if err != nil {
 		return err
 	}
diff --git a/pkg/monitor/cluster/cluster.go b/pkg/monitor/cluster/cluster.go
index b725ac8fb..6a7ddb7c9 100644
--- a/pkg/monitor/cluster/cluster.go
+++ b/pkg/monitor/cluster/cluster.go
@@ -21,7 +21,7 @@ import (
 
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/metrics"
-	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned/typed/aro.openshift.io/v1alpha1"
+	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned"
 )
 
 type Monitor struct {
@@ -36,7 +36,7 @@ type Monitor struct {
 	configcli  configclient.Interface
 	mcocli     mcoclient.Interface
 	m          metrics.Interface
-	arocli     aroclient.AroV1alpha1Interface
+	arocli     aroclient.Interface
 
 	// access below only via the helper functions in cache.go
 	cache struct {
@@ -100,13 +100,6 @@ func NewMonitor(ctx context.Context, log *logrus.Entry, restConfig *rest.Config,
 func (mon *Monitor) Monitor(ctx context.Context) (errs []error) {
 	mon.log.Debug("monitoring")
 
-	if mon.hourlyRun {
-		mon.emitGauge("cluster.provisioning", 1, map[string]string{
-			"provisioningState":       mon.oc.Properties.ProvisioningState.String(),
-			"failedProvisioningState": mon.oc.Properties.FailedProvisioningState.String(),
-		})
-	}
-
 	// If API is not returning 200, don't need to run the next checks
 	statusCode, err := mon.emitAPIServerHealthzCode(ctx)
 	if err != nil {
diff --git a/pkg/monitor/cluster/summary.go b/pkg/monitor/cluster/summary.go
index caf1e10ca..70f296355 100644
--- a/pkg/monitor/cluster/summary.go
+++ b/pkg/monitor/cluster/summary.go
@@ -41,11 +41,12 @@ func (mon *Monitor) emitSummary(ctx context.Context) error {
 	}
 
 	mon.emitGauge("cluster.summary", 1, map[string]string{
-		"actualVersion":     actualVersion(cv),
-		"desiredVersion":    desiredVersion(cv),
-		"masterCount":       strconv.Itoa(masterCount),
-		"workerCount":       strconv.Itoa(workerCount),
-		"provisioningState": mon.oc.Properties.ProvisioningState.String(),
+		"actualVersion":           actualVersion(cv),
+		"desiredVersion":          desiredVersion(cv),
+		"masterCount":             strconv.Itoa(masterCount),
+		"workerCount":             strconv.Itoa(workerCount),
+		"provisioningState":       mon.oc.Properties.ProvisioningState.String(),
+		"failedProvisioningState": mon.oc.Properties.FailedProvisioningState.String(),
 	})
 
 	return nil
diff --git a/pkg/operator/apis/aro.openshift.io/v1alpha1/cluster_types.go b/pkg/operator/apis/aro.openshift.io/v1alpha1/cluster_types.go
index bc994fd7d..eb312a71c 100644
--- a/pkg/operator/apis/aro.openshift.io/v1alpha1/cluster_types.go
+++ b/pkg/operator/apis/aro.openshift.io/v1alpha1/cluster_types.go
@@ -34,6 +34,7 @@ type InternetCheckerSpec struct {
 type ClusterSpec struct {
 	// ResourceID is the Azure resourceId of the cluster
 	ResourceID      string              `json:"resourceId,omitempty"`
+	ACRName         string              `json:"acrName,omitempty"`
 	ACRDomain       string              `json:"acrDomain,omitempty"`
 	AZEnvironment   string              `json:"azEnvironment,omitempty"`
 	Location        string              `json:"location,omitempty"`
diff --git a/pkg/operator/controllers/checker/machinechecker.go b/pkg/operator/controllers/checker/machinechecker.go
index 39d5a619a..96a0451f6 100644
--- a/pkg/operator/controllers/checker/machinechecker.go
+++ b/pkg/operator/controllers/checker/machinechecker.go
@@ -19,7 +19,7 @@ import (
 
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/api/validate"
-	aro "github.com/Azure/ARO-RP/pkg/operator/apis/aro.openshift.io/v1alpha1"
+	arov1alpha1 "github.com/Azure/ARO-RP/pkg/operator/apis/aro.openshift.io/v1alpha1"
 	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned"
 	"github.com/Azure/ARO-RP/pkg/operator/controllers"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
@@ -149,7 +149,7 @@ func (r *MachineChecker) Name() string {
 // Reconcile makes sure that the Machines are in a supportable state
 func (r *MachineChecker) Check(ctx context.Context) error {
 	cond := &status.Condition{
-		Type:    aro.MachineValid,
+		Type:    arov1alpha1.MachineValid,
 		Status:  corev1.ConditionTrue,
 		Message: "all machines valid",
 		Reason:  "CheckDone",
diff --git a/pkg/operator/deploy/bindata.go b/pkg/operator/deploy/bindata.go
index e4d763315..7325d7dcf 100644
--- a/pkg/operator/deploy/bindata.go
+++ b/pkg/operator/deploy/bindata.go
@@ -86,7 +86,7 @@ func (fi bindataFileInfo) Sys() interface{} {
 	return nil
 }
 
-var _aroOpenshiftIo_clustersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x58\x4f\x6f\xeb\xc8\x0d\xbf\xfb\x53\x10\xe9\x21\x87\xc6\xca\x3e\xec\xa5\xf5\x2d\xc8\xdb\x2d\x82\x6e\xbb\xc1\x4b\xf0\x2e\x9b\x3d\x50\x23\x5a\x62\x33\x9a\x51\x67\xa8\xe4\xf9\x15\xfd\xee\x05\x67\x24\x5b\x76\xa4\x38\x2d\x50\x5d\x0c\x71\x86\xff\xc9\x1f\x69\xad\xd6\xeb\xf5\x0a\x3b\xfe\x4a\x21\xb2\x77\x1b\xc0\x8e\xe9\x9b\x90\xd3\xb7\x58\x3c\xff\x29\x16\xec\xaf\x5f\x3e\x95\x24\xf8\x69\xf5\xcc\xae\xda\xc0\x6d\x1f\xc5\xb7\x5f\x28\xfa\x3e\x18\xfa\x4c\x5b\x76\x2c\xec\xdd\xaa\x25\xc1\x0a\x05\x37\x2b\x00\x74\xce\x0b\x2a\x39\xea\x2b\x80\xf1\x4e\x82\xb7\x96\xc2\xba\x26\x57\x3c\xf7\x25\x95\x3d\xdb\x8a\x42\xd2\x30\xea\x7f\xf9\xa1\xf8\xb1\xf8\x61\x05\x60\x02\x25\xf6\x47\x6e\x29\x0a\xb6\xdd\x06\x5c\x6f\xed\x0a\xc0\x61\x4b\x1b\x30\xb6\x8f\x42\x21\x16\x18\x7c\xe1\x3b\x72\xb1\xe1\xad\x14\xec\x57\xb1\x23\xa3\x3a\xeb\xe0\xfb\x6e\x03\x6f\xce\xb3\x84\xc1\xac\xc1\xa5\x2c\x2c\x51\x2c\x47\xf9\xeb\x94\xfa\x0b\x47\x49\x27\x9d\xed\x03\xda\x83\xea\x44\x8c\xec\xea\xde\x62\xd8\x93\x57\x00\xd1\xf8\x8e\xa6\x52\x63\x5f\x86\x21\x5e\x83\xde\x28\x28\x7d\xdc\xc0\xbf\xfe\xbd\x02\x78\x41\xcb\x55\xf2\x36\x1f\xaa\xb9\x37\xf7\x77\x5f\x7f\x7c\x30\x0d\xb5\x98\x89\x00\x15\x45\x13\xb8\x4b\xf7\x46\xe1\xc0\x11\xa4\x21\xc8\x37\x61\xeb\x43\x7a\x1d\x4d\x84\x9b\xfb\xbb\x81\xbb\x0b\xbe\xa3\x20\x3c\x5a\xa0\xcf\x24\xf3\x7b\xda\x89\x9e\x4b\x35\x24\xdf\x81\x4a\x73\x4d\x59\xe1\x90\x31\xaa\x20\x66\xd5\x7e\x0b\xd2\x70\x84\x40\x5d\xa0\x48\x2e\x67\x7f\x22\x16\xf4\x0a\x3a\xf0\xe5\x3f\xc8\x48\x01\x0f\x14\x54\x08\xc4\xc6\xf7\xb6\xd2\x02\x79\xa1\x20\x10\xc8\xf8\xda\xf1\xf7\xbd\xe4\x08\xe2\x93\x4a\x8b\x42\x43\x2a\xc6\x87\x9d\x50\x70\x68\x35\x84\x3d\x5d\x01\xba\x0a\x5a\xdc\x41\x20\xd5\x01\xbd\x9b\x48\x4b\x57\x62\x01\x7f\xf3\x81\x80\xdd\xd6\x6f\xa0\x11\xe9\xe2\xe6\xfa\xba\x66\x19\x6b\xdd\xf8\xb6\xed\x1d\xcb\xee\x3a\x55\x2c\x97\xbd\xf8\x10\xaf\x2b\x7a\x21\x7b\x1d\xb9\x5e\x63\x30\x0d\x0b\x19\xe9\x03\x5d\x63\xc7\xeb\x64\xb8\x4b\xa5\x5e\xb4\xd5\x1f\xf6\x89\xbe\x9c\x58\x2a\x3b\x2d\x88\x28\x81\x5d\xbd\x27\xa7\xda\x5b\x8c\xbb\xd6\xa0\x66\x17\x07\xb6\x6c\xff\x21\xbc\x4a\xd2\xa8\x7c\xf9\xe9\xe1\x11\x46\xa5\x29\x05\xc7\x31\x4f\xd1\x3e\xb0\xc5\x43\xe0\x35\x50\xec\xb6\x14\x72\xe2\xb6\xc1\xb7\x49\x22\xb9\xaa\xf3\xec\x64\xa8\x24\x26\x77\x1c\xf4\xd8\x97\x2d\x8b\x66\xfa\x9f\x3d\x45\xd1\xfc\x14\x70\x9b\x3a\x1e\x4a\x82\xbe\xab\x50\xa8\x2a\xe0\xce\xc1\x2d\xb6\x64\x6f\x31\xd2\xff\x3d\xec\x1a\xe1\xb8\xd6\x90\x9e\x0f\xfc\x14\xa8\x8e\x2f\xe6\x68\xed\xc9\x23\x94\xcc\x66\x68\xe8\xc0\x87\x8e\xcc\x51\x67\x54\x14\x39\x68\xf5\x0a\x0a\x69\xcd\x4f\xd1\x65\xb9\x17\x53\x3f\x9a\xf0\xd9\xb7\xc8\xee\x98\xbc\xe0\x46\xe2\xf8\xfe\x93\x7b\xe1\xe0\x5d\x4b\x4e\x3e\xcc\xb5\x25\xd4\x38\xc6\x53\x86\x23\xff\x7e\x1e\x2e\x1d\x39\x78\xf3\xe5\x57\x85\xa7\x80\xe2\xc3\x28\x06\x6a\x6d\xcc\x13\x51\x4b\x2e\xa6\x33\xc5\x8e\x28\xe4\xe4\x3e\xf8\x96\xa4\xa1\x7e\xe6\xd6\x68\x7f\xe9\xbd\x25\x74\xb3\xbe\x9d\xe4\x4b\x9f\x9a\x1c\xbd\xe0\x2f\xbe\xae\xd9\xd5\xa7\x52\xdf\xb3\xca\x78\xb7\xe5\x7a\x06\x0f\xf7\xcc\x28\x8a\x36\x1b\xb8\xfc\xed\x87\xf5\x9f\x7f\xff\x63\x91\x7f\x2e\x17\x2d\x9f\x89\xbc\x3e\xad\x77\x2c\x5e\x8f\xfe\x72\xfb\xf0\x4e\xfa\xf4\x21\xd7\xb7\x73\xf4\x35\x7c\x66\xac\x9d\x8f\xc2\x26\xde\x07\x5f\xcd\xde\x79\x3c\xc5\xcb\xb3\xd6\x2d\x86\x35\x23\x2d\xc9\x6d\x43\xe6\x99\xc2\x7f\x13\xd8\x3e\xd8\xd9\xf4\xb2\x50\x3b\x7b\x70\x26\x7e\xe3\x31\x86\x80\xbb\x8f\xda\x6f\xbd\x99\x4c\xd8\x0f\x68\x1a\x21\xf5\xae\x7a\xb7\x4b\xc6\x3d\xe8\xee\xf3\x38\x8a\x6f\xbe\x6b\x4f\x1c\xd8\xf3\x64\xa4\xc9\x7e\xf0\x21\xfd\x2f\x8e\xe4\xad\xee\x85\xeb\xf3\xe8\x95\x77\x8c\x73\xf8\x95\x6e\x1d\x21\x98\x2f\xa3\x8e\x88\xff\x09\xc2\x8c\x77\x15\x4f\xf6\xbe\x25\xe5\xfb\x6b\xc3\x8c\x23\x49\x7a\x46\x32\xb0\x8b\x82\xce\x50\x2c\x4e\xc4\x2c\x54\xcd\x91\xf4\x8b\x83\x9c\xc3\xe0\xcb\xbb\x87\x7a\x96\x0a\xe1\x68\x1b\xb9\x8c\xd9\xd7\x53\x65\xfa\x4c\x4c\xc5\x40\xca\xb3\xdf\x90\xa1\x25\xd3\xa0\xe3\xd8\xa6\xfe\x70\x15\x55\xba\xac\xe8\x10\x8c\x54\xc1\x6b\x43\x4e\x03\x3a\x23\xb4\x22\x41\xb6\x71\x6f\xc4\xc1\x2c\xd5\xa1\x93\x14\xa1\x0b\xec\x03\xc3\xb3\xf3\xaf\x0e\x7c\x80\xd7\xb4\x27\xa5\xb3\xae\xb3\xa7\x95\x9f\xca\xc0\x03\x5a\x7b\x88\x5d\x12\x0f\x35\xbf\x90\x03\xdd\x27\x0a\x78\x72\x53\x7f\x86\xd5\xab\x24\xc0\xaa\xa2\x39\x0c\x11\x0f\xf4\xad\xb3\x6c\x58\xec\x2e\xef\x68\xbb\x49\xee\x41\x1a\x14\x75\x36\xc4\xb4\x7b\x19\xdf\x76\xde\xa5\x68\x9b\x14\xac\xd2\xf7\x73\x08\x14\x50\x9a\xb4\x77\xa0\x4b\x6b\x04\x87\xbc\xce\xf8\x48\x47\xd2\x53\x2c\xd3\x8e\xa2\x13\x35\x6d\x28\x5e\x39\x67\x44\x4e\x62\x18\x0b\xf8\xd5\x19\x1a\x6a\xba\xba\x4a\x45\xdd\x12\x3a\x55\x92\x42\x72\xa8\x0f\x83\x0e\xf2\xe2\x32\x23\x53\x93\x5b\x53\x05\x18\x4a\x96\x80\x81\xed\x0e\xd6\xc0\x7a\xdb\xf8\x96\x22\x74\x18\x64\xec\xef\x9b\xfb\xbb\xbc\x80\x36\x98\xdb\x28\x62\x3b\x27\xb4\x44\xf3\xfc\x8a\xa1\x8a\xeb\x74\x7b\xeb\x43\x7e\xd3\xd8\xa1\x70\xc9\x96\x25\x85\xda\x50\x70\x43\x85\xec\xb2\xdb\x49\xdf\x9c\xef\x7b\x0b\x8a\x8b\xb7\xd3\xf6\x1d\x68\x06\xb0\x18\xe5\x31\xa0\x8b\x3c\xfe\xdb\x9a\x47\xe4\xad\x0f\x2d\xca\x06\x74\xb7\x5b\x0b\xcf\x7a\x76\x16\xb7\x5b\x8a\x11\xeb\x05\x0d\x67\x78\x03\x61\x9c\x9f\xcb\x4b\xd0\xf2\x25\x71\x28\xbe\x9c\x34\x27\x82\x77\xb4\x7e\xf5\xa1\xba\x3a\x6c\xa8\xb3\x82\xe1\xe4\xef\xcc\x1e\xcb\x51\xa8\xf6\x61\xa7\xef\x06\xfb\x48\xfb\x83\x3e\x04\x72\x32\x60\xef\x1c\x9c\xe8\x73\x27\x33\x56\x25\xc8\x60\x97\x32\xcf\x2a\xb1\x97\xae\x97\x2b\x88\xbd\x69\x00\x63\xb2\xd9\xb2\x5b\x32\x54\xff\x51\x1b\xb1\x50\x2b\x92\x0e\xac\x5a\x5f\xec\x20\xf6\x6d\x8b\x81\xbf\xa7\xf2\x37\xd9\xc4\x01\x1d\x92\xf1\x0b\x76\x9e\x49\xc8\xdb\xf1\xf2\x61\xd6\x74\x7c\x3e\x93\x07\x18\x7f\xdc\x75\x34\xce\x57\x65\xde\x87\x7b\xdf\xc7\xc9\xd5\xd3\x25\x74\xa2\x8f\x0d\x5a\xbb\xd3\xd6\x1f\x13\x5e\x81\x56\x80\x02\x6b\x6c\x7c\x10\xe8\x9a\x90\xfe\xa8\x4c\x21\x32\x29\x5b\x92\x3a\xa0\x27\xbb\x8a\xb5\x1e\x86\x69\xc9\x09\xf2\xe1\xe9\x02\x4b\xa7\x3d\x63\xd7\x12\x7a\x7a\xba\x80\xce\x5b\x0c\x2c\xbb\x02\x7e\xf6\x73\x00\xa6\x0f\x7d\xc3\xb6\xb3\x74\x05\x7c\xea\xdf\xa8\x25\xe6\xa9\x82\x2a\x8e\xcd\x2e\xd7\x51\xfa\x80\x70\xb5\xe4\x7c\xb2\x86\x63\xfe\xcc\xf0\x74\x01\x06\x63\x0a\x66\x17\x7c\x89\xa5\xdd\xa5\x1b\x6a\xeb\x15\x44\x7f\xac\xf6\x7d\xcf\x4b\x6d\x04\x6b\xa9\x82\xa7\x8b\x3b\x37\x88\x9f\x41\x20\x38\x57\x11\x79\x04\xd0\x9b\x6d\x47\x77\xd8\x5c\x66\x33\x07\x2a\xf1\x0d\x79\x71\xff\x5b\x5e\x1a\xc7\xbf\x33\x0b\x9b\xff\xc7\x37\xae\x13\xd2\xe1\x9b\xd6\x27\xb4\x5d\x83\x9f\x0e\xb4\xd4\x35\xeb\xe1\x4b\xd6\xe4\x18\x20\x2f\x5e\x1b\xd0\x9a\x19\x3e\x14\xf9\xa0\x90\x99\x29\x87\x9e\x43\x63\xa8\x13\xaa\xfe\x7e\xfa\x2d\xeb\xe2\xe2\xe8\x63\x55\x7a\x9d\x2c\x65\xf0\xdb\xef\xab\x2c\x95\xaa\xaf\xa3\x35\x4a\xfc\x4f\x00\x00\x00\xff\xff\x99\x65\x98\xfa\x0b\x14\x00\x00")
+var _aroOpenshiftIo_clustersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x58\x41\x73\xeb\xb8\x0d\xbe\xfb\x57\x60\xd2\xc3\x3b\x34\x56\xde\x9b\xbd\xb4\xbe\x65\xf2\x76\x3b\x99\x6e\x77\x33\x2f\x99\x77\xd9\xec\x01\xa2\x60\x09\x0d\x45\xaa\x24\x94\x3c\xbf\x4e\xff\x7b\x07\xa4\x64\xcb\x8e\x14\xa7\x9d\x59\x5d\x3c\x02\x49\x00\xfc\x00\x7c\x80\xb5\x5a\xaf\xd7\x2b\xec\xf8\x2b\x85\xc8\xde\x6d\x00\x3b\xa6\x6f\x42\x4e\xdf\x62\xf1\xf4\x97\x58\xb0\xbf\x7a\xfe\x54\x92\xe0\xa7\xd5\x13\xbb\x6a\x03\x37\x7d\x14\xdf\x7e\xa1\xe8\xfb\x60\xe8\x33\x6d\xd9\xb1\xb0\x77\xab\x96\x04\x2b\x14\xdc\xac\x00\xd0\x39\x2f\xa8\xe2\xa8\xaf\x00\xc6\x3b\x09\xde\x5a\x0a\xeb\x9a\x5c\xf1\xd4\x97\x54\xf6\x6c\x2b\x0a\xc9\xc2\x68\xff\xf9\x63\xf1\x43\xf1\x71\x05\x60\x02\xa5\xe3\x0f\xdc\x52\x14\x6c\xbb\x0d\xb8\xde\xda\x15\x80\xc3\x96\x36\x60\x6c\x1f\x85\x42\x2c\x30\xf8\xc2\x77\xe4\x62\xc3\x5b\x29\xd8\xaf\x62\x47\x46\x6d\xd6\xc1\xf7\xdd\x06\x5e\xad\x67\x0d\x83\x5b\xc3\x95\xb2\xb2\x24\xb1\x1c\xe5\xef\x53\xe9\xcf\x1c\x25\xad\x74\xb6\x0f\x68\x0f\xa6\x93\x30\xb2\xab\x7b\x8b\x61\x2f\x5e\x01\x44\xe3\x3b\x9a\x6a\x8d\x7d\x19\x06\xbc\x06\xbb\x51\x50\xfa\xb8\x81\x7f\xff\x67\x05\xf0\x8c\x96\xab\x74\xdb\xbc\xa8\xee\x5e\xdf\xdd\x7e\xfd\xe1\xde\x34\xd4\x62\x16\x02\x54\x14\x4d\xe0\x2e\xed\x1b\x95\x03\x47\x90\x86\x20\xef\x84\xad\x0f\xe9\x75\x74\x11\xae\xef\x6e\x87\xd3\x5d\xf0\x1d\x05\xe1\xd1\x03\x7d\x26\x91\xdf\xcb\x4e\xec\x7c\x50\x47\xf2\x1e\xa8\x34\xd6\x94\x0d\x0e\x11\xa3\x0a\x62\x36\xed\xb7\x20\x0d\x47\x08\xd4\x05\x8a\xe4\x72\xf4\x27\x6a\x41\xb7\xa0\x03\x5f\xfe\x93\x8c\x14\x70\x4f\x41\x95\x40\x6c\x7c\x6f\x2b\x4d\x90\x67\x0a\x02\x81\x8c\xaf\x1d\x7f\xdf\x6b\x8e\x20\x3e\x99\xb4\x28\x34\x84\x62\x7c\xd8\x09\x05\x87\x56\x21\xec\xe9\x12\xd0\x55\xd0\xe2\x0e\x02\xa9\x0d\xe8\xdd\x44\x5b\xda\x12\x0b\xf8\x87\x0f\x04\xec\xb6\x7e\x03\x8d\x48\x17\x37\x57\x57\x35\xcb\x98\xeb\xc6\xb7\x6d\xef\x58\x76\x57\x29\x63\xb9\xec\xc5\x87\x78\x55\xd1\x33\xd9\xab\xc8\xf5\x1a\x83\x69\x58\xc8\x48\x1f\xe8\x0a\x3b\x5e\x27\xc7\x5d\x4a\xf5\xa2\xad\xfe\xb4\x0f\xf4\x87\x89\xa7\xb2\xd3\x84\x88\x12\xd8\xd5\x7b\x71\xca\xbd\x45\xdc\x35\x07\x35\xba\x38\x1c\xcb\xfe\x1f\xe0\x55\x91\xa2\xf2\xe5\xc7\xfb\x07\x18\x8d\xa6\x10\x1c\x63\x9e\xd0\x3e\x1c\x8b\x07\xe0\x15\x28\x76\x5b\x0a\x39\x70\xdb\xe0\xdb\xa4\x91\x5c\xd5\x79\x76\x32\x64\x12\x93\x3b\x06\x3d\xf6\x65\xcb\xa2\x91\xfe\x57\x4f\x51\x34\x3e\x05\xdc\xa4\x8a\x87\x92\xa0\xef\x2a\x14\xaa\x0a\xb8\x75\x70\x83\x2d\xd9\x1b\x8c\xf4\x87\xc3\xae\x08\xc7\xb5\x42\x7a\x1e\xf8\x29\x51\x1d\x6f\xcc\x68\xed\xc5\x23\x95\xcc\x46\x68\xa8\xc0\xfb\x8e\xcc\x51\x65\x54\x14\x39\x68\xf6\x0a\x0a\x69\xce\x4f\xd9\x65\xb9\x16\x53\x3d\x9a\xf0\xd9\xb7\xc8\xee\x58\xbc\x70\x8d\xe1\xc4\x2f\xca\x87\xef\xde\xff\xfd\x47\xf7\xcc\xc1\xbb\x96\x9c\xbc\xfb\xd4\x96\x50\x71\x8f\xa7\x07\x8e\xf0\xf8\x69\xd8\x74\x04\xc8\xf5\x97\x5f\x95\xce\x02\x8a\x0f\xa3\x1a\xa8\xb5\x90\x4f\x54\x2d\x41\x92\xd6\x94\x6b\xa2\x90\x93\xbb\xe0\x5b\x92\x86\xfa\x99\x5d\xa3\xff\xa5\xf7\x96\xd0\xcd\xde\xed\x24\xbe\xfa\xd4\xe4\xe8\x19\x7f\xf6\x75\xcd\xae\x3e\xd5\xfa\x96\x57\xc6\xbb\x2d\xd7\x33\xfc\xb9\x3f\x8c\xa2\xec\xb4\x81\x0f\xbf\x7d\x5c\xff\xf5\xf7\x3f\x17\xf9\xe7\xc3\xa2\xe7\x33\xc8\xeb\xd3\x7a\xc7\xe2\x75\xe9\x6f\x37\xf7\x6f\x84\x4f\x1f\x72\x7d\x3b\x27\x5f\xc3\x67\xc6\xda\xf9\x28\x6c\xe2\x5d\xf0\xd5\xec\x9e\x87\x53\x7e\x3d\xeb\xdd\x22\xac\x99\x99\x49\x6e\x1a\x32\x4f\x14\xfe\x17\x60\xfb\x60\x67\xc3\xcb\x42\xed\xec\xc2\x19\xfc\xc6\x65\x0c\x01\x77\xef\xf5\xdf\x7a\x33\xe9\xc8\xef\xb0\x34\x52\xf0\x6d\xf5\x66\x95\x8c\x73\xd3\xed\xe7\xb1\x75\x5f\x7f\xd7\x9a\x38\x1c\xcf\x9d\x94\x26\xf3\xc4\xbb\xec\x3f\x3b\x92\xd7\xb6\x17\xb6\xcf\xb3\x5d\x9e\x49\xce\xf1\x5d\xda\x75\xc4\x78\xbe\x8c\xda\x52\xfe\x2f\xca\x33\xde\x55\x3c\x99\x13\x97\x8c\xef\xb7\x0d\x3d\x91\x24\xd9\x19\xc5\xc0\x2e\x0a\x3a\x43\xb1\x38\x51\xb3\x90\x35\x47\xda\x2f\x0e\x7a\x0e\x8d\x32\xcf\x2a\x7a\xb3\x94\x08\x47\xd3\xcb\x87\x98\xef\x7a\x6a\x4c\x9f\x89\xab\x18\x48\xcf\xec\x27\x6a\x68\xc9\x34\xe8\x38\xb6\xa9\x3e\x5c\x45\x95\x0e\x37\xda\x34\x23\x55\xf0\xd2\x90\x53\x40\x67\x94\x56\x24\xc8\x36\xee\x9d\x38\xb8\xa5\x36\xb4\xf3\x22\x74\x81\x7d\x60\x78\x72\xfe\xc5\x81\x0f\xf0\x92\xe6\xaa\xb4\xd6\x75\xf6\x34\xf3\x53\x1a\x78\x40\x6b\x0f\xd8\x25\xf5\x50\xf3\x33\x39\xd0\xf9\xa3\x80\x47\x37\xbd\xcf\x30\xaa\x95\x04\x58\x55\x34\xc7\x21\xe2\x81\xbe\x75\x96\x0d\x8b\xdd\xe5\x99\x6e\x37\x89\x3d\x48\x83\xa2\x97\x0d\x31\xcd\x6a\xc6\xb7\x9d\x77\x09\x6d\x93\xc0\x2a\x7d\x3f\xc7\x40\x01\xa5\x49\x73\x0a\xba\x34\x76\x70\xc8\xe3\x8f\x8f\x74\xa4\x3d\x61\x99\x66\x1a\xed\xc0\x69\xa2\xf1\x7a\x72\x46\xe5\x04\xc3\x58\xc0\xaf\xce\xd0\x90\xd3\xd5\x65\x4a\xea\x96\xd0\xa9\x91\x04\xc9\x21\x3f\x0c\x3a\xc8\x83\xce\x8c\x4e\x0d\x6e\x4d\x15\x60\x28\x59\x02\x06\xb6\x3b\x58\x03\xeb\x6e\xe3\x5b\x8a\xd0\x61\x90\xb1\xbe\xaf\xef\x6e\xf3\xc0\xda\x60\x2e\xa3\x88\xed\x9c\xd2\x12\xcd\xd3\x0b\x86\x2a\xae\xd3\xee\xad\x0f\xf9\x4d\xb1\x43\xe1\x92\x2d\x4b\x82\xda\x50\x70\x43\x86\xec\xf2\xb5\x93\xbd\xb9\xbb\xef\x3d\x28\x2e\x5e\x77\xdb\x37\xa8\x19\xc0\x62\x94\x87\x80\x2e\xf2\xf8\xef\x6c\x9e\x91\xb7\x3e\xb4\x28\x1b\xd0\x59\x70\x2d\x3c\x7b\xb3\xb3\xbc\xdd\x52\x8c\x58\x2f\x58\x38\x73\x36\x10\xc6\xf9\xbe\xbc\x44\x2d\x5f\xd2\x09\xe5\x97\x93\xe2\x44\xf0\x8e\xd6\x2f\x3e\x54\x97\x87\x89\x76\x56\x31\x9c\xfc\xfd\xd9\x73\x39\x0a\xd5\x3e\xec\xf4\xdd\x60\x1f\x69\xbf\xd0\x87\x40\x4e\x06\xee\x9d\xa3\x13\x7d\x6e\x65\xc6\xab\x44\x19\xec\x52\xe4\x59\x35\xf6\xd2\xf5\x72\x09\xb1\x37\x0d\x60\x4c\x3e\x5b\x76\x4b\x8e\xea\x3f\x70\x23\x16\x6a\x65\xd2\xe1\xa8\xe6\x17\x3b\x88\x7d\xdb\x62\xe0\xef\x29\xfd\x4d\x76\x71\x60\x87\xe4\xfc\x82\x9f\x67\x02\xf2\xba\xbd\xbc\xfb\x68\x5a\x3e\x1f\xc9\x03\x8d\x3f\xec\x3a\x1a\xfb\xab\x1e\xde\xc3\xbd\xaf\xe3\x74\xd5\xd3\x21\x74\x62\x8f\x0d\x5a\xbb\xd3\xd2\x1f\x03\x5e\x81\x66\x80\x12\x6b\x6c\x7c\x10\xe8\x9a\x90\xfe\xd8\x4c\x29\x32\x19\x5b\xd2\x3a\xb0\x27\xbb\x8a\x35\x1f\x86\x6e\xc9\x89\xf2\xe1\xf1\x02\x4b\xa7\x35\x63\xd7\x12\x7a\x7a\xbc\x80\xce\x5b\x0c\x2c\xbb\x02\x7e\xf2\x73\x04\xa6\x0f\x7d\xc3\xb6\xb3\x74\x09\x7c\x7a\xbf\xd1\x4a\xcc\x5d\x05\x55\x1d\x9b\x5d\xce\xa3\xf4\xc1\xe1\x72\xe9\xf2\xc9\x1b\x8e\xf9\xb3\xc4\xe3\x05\x18\x8c\x09\xcc\x2e\xf8\x12\x4b\xbb\x4b\x3b\xd4\xd7\x4b\x88\xfe\xd8\xec\xdb\x37\x2f\xb5\x10\xac\xa5\x0a\x1e\x2f\x6e\xdd\xa0\x7e\x86\x81\xe0\x5c\x46\xe4\x16\x40\xaf\xa6\x1d\x9d\x61\x73\x9a\xcd\x2c\xa8\xc6\x57\xe2\xc5\xf9\x6f\x79\x68\x1c\xff\xce\x2c\x4c\xfe\xef\x9f\xb8\x4e\x44\x87\x6f\x60\x9f\xd0\x76\x0d\x7e\x3a\xc8\x52\xd5\xac\x87\x2f\x5f\x93\x65\x80\x3c\x78\x6d\x40\x73\x66\xf8\xb0\xe4\x83\x52\x66\x96\x1c\x6a\x0e\x8d\xa1\x4e\xa8\xfa\xe5\xf4\xdb\xd7\xc5\xc5\xd1\xc7\xad\xf4\x3a\x19\xca\xe0\xb7\xdf\x57\x59\x2b\x55\x5f\x47\x6f\x54\xf8\xdf\x00\x00\x00\xff\xff\xe6\x41\x09\x04\x3b\x14\x00\x00")
 
 func aroOpenshiftIo_clustersYamlBytes() ([]byte, error) {
 	return bindataRead(
diff --git a/pkg/operator/deploy/deploy.go b/pkg/operator/deploy/deploy.go
index 80857e414..84bc18be1 100644
--- a/pkg/operator/deploy/deploy.go
+++ b/pkg/operator/deploy/deploy.go
@@ -28,7 +28,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/env"
 	pkgoperator "github.com/Azure/ARO-RP/pkg/operator"
 	arov1alpha1 "github.com/Azure/ARO-RP/pkg/operator/apis/aro.openshift.io/v1alpha1"
-	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned/typed/aro.openshift.io/v1alpha1"
+	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned"
 	"github.com/Azure/ARO-RP/pkg/operator/controllers/genevalogging"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	"github.com/Azure/ARO-RP/pkg/util/dynamichelper"
@@ -53,10 +53,10 @@ type operator struct {
 	dh            dynamichelper.Interface
 	cli           kubernetes.Interface
 	extensionscli extensionsclient.Interface
-	arocli        aroclient.AroV1alpha1Interface
+	arocli        aroclient.Interface
 }
 
-func New(log *logrus.Entry, env env.Interface, oc *api.OpenShiftCluster, cli kubernetes.Interface, extensionscli extensionsclient.Interface, arocli aroclient.AroV1alpha1Interface) (Operator, error) {
+func New(log *logrus.Entry, env env.Interface, oc *api.OpenShiftCluster, cli kubernetes.Interface, extensionscli extensionsclient.Interface, arocli aroclient.Interface) (Operator, error) {
 	restConfig, err := restconfig.RestConfig(env, oc)
 	if err != nil {
 		return nil, err
@@ -241,7 +241,7 @@ func (o *operator) CreateOrUpdate(ctx context.Context) error {
 				// "aro.openshift.io/v1alpha1"
 				return errors.IsForbidden(err) || errors.IsConflict(err)
 			}, func() error {
-				cluster, err := o.arocli.Clusters().Get(ctx, arov1alpha1.SingletonClusterName, metav1.GetOptions{})
+				cluster, err := o.arocli.AroV1alpha1().Clusters().Get(ctx, arov1alpha1.SingletonClusterName, metav1.GetOptions{})
 				if err != nil {
 					return err
 				}
@@ -278,7 +278,7 @@ func (o *operator) IsReady(ctx context.Context) (bool, error) {
 	}
 
 	// wait for conditions to appear
-	cluster, err := o.arocli.Clusters().Get(ctx, arov1alpha1.SingletonClusterName, metav1.GetOptions{})
+	cluster, err := o.arocli.AroV1alpha1().Clusters().Get(ctx, arov1alpha1.SingletonClusterName, metav1.GetOptions{})
 	if err != nil {
 		return false, err
 	}
diff --git a/pkg/operator/deploy/staticresources/aro.openshift.io_clusters.yaml b/pkg/operator/deploy/staticresources/aro.openshift.io_clusters.yaml
index 2a823d69a..b06cc368c 100644
--- a/pkg/operator/deploy/staticresources/aro.openshift.io_clusters.yaml
+++ b/pkg/operator/deploy/staticresources/aro.openshift.io_clusters.yaml
@@ -38,6 +38,8 @@ spec:
           properties:
             acrDomain:
               type: string
+            acrName:
+              type: string
             azEnvironment:
               type: string
             features:
diff --git a/python/az/aro/azext_aro/custom.py b/python/az/aro/azext_aro/custom.py
index 1f108f6c0..e756bc045 100644
--- a/python/az/aro/azext_aro/custom.py
+++ b/python/az/aro/azext_aro/custom.py
@@ -316,7 +316,7 @@ def get_cluster_network_resources(cli_ctx, oc):
     # Ensure that worker_profiles exists
     # it will not be returned if the cluster resources do not exist
     if oc.worker_profiles is not None:
-        worker_subnets = {w.subnet_id for w in oc.worker_profiles if w}
+        worker_subnets = {w.subnet_id for w in oc.worker_profiles}
 
     master_parts = parse_resource_id(master_subnet)
     vnet = resource_id(
diff --git a/vendor/github.com/openshift/client-go/project/clientset/versioned/clientset.go b/vendor/github.com/openshift/client-go/project/clientset/versioned/clientset.go
new file mode 100644
index 000000000..d21aa2b91
--- /dev/null
+++ b/vendor/github.com/openshift/client-go/project/clientset/versioned/clientset.go
@@ -0,0 +1,81 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+package versioned
+
+import (
+	"fmt"
+
+	projectv1 "github.com/openshift/client-go/project/clientset/versioned/typed/project/v1"
+	discovery "k8s.io/client-go/discovery"
+	rest "k8s.io/client-go/rest"
+	flowcontrol "k8s.io/client-go/util/flowcontrol"
+)
+
+type Interface interface {
+	Discovery() discovery.DiscoveryInterface
+	ProjectV1() projectv1.ProjectV1Interface
+}
+
+// Clientset contains the clients for groups. Each group has exactly one
+// version included in a Clientset.
+type Clientset struct {
+	*discovery.DiscoveryClient
+	projectV1 *projectv1.ProjectV1Client
+}
+
+// ProjectV1 retrieves the ProjectV1Client
+func (c *Clientset) ProjectV1() projectv1.ProjectV1Interface {
+	return c.projectV1
+}
+
+// Discovery retrieves the DiscoveryClient
+func (c *Clientset) Discovery() discovery.DiscoveryInterface {
+	if c == nil {
+		return nil
+	}
+	return c.DiscoveryClient
+}
+
+// NewForConfig creates a new Clientset for the given config.
+// If config's RateLimiter is not set and QPS and Burst are acceptable,
+// NewForConfig will generate a rate-limiter in configShallowCopy.
+func NewForConfig(c *rest.Config) (*Clientset, error) {
+	configShallowCopy := *c
+	if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
+		if configShallowCopy.Burst <= 0 {
+			return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
+		}
+		configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
+	}
+	var cs Clientset
+	var err error
+	cs.projectV1, err = projectv1.NewForConfig(&configShallowCopy)
+	if err != nil {
+		return nil, err
+	}
+
+	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
+	if err != nil {
+		return nil, err
+	}
+	return &cs, nil
+}
+
+// NewForConfigOrDie creates a new Clientset for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *Clientset {
+	var cs Clientset
+	cs.projectV1 = projectv1.NewForConfigOrDie(c)
+
+	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
+	return &cs
+}
+
+// New creates a new Clientset for the given RESTClient.
+func New(c rest.Interface) *Clientset {
+	var cs Clientset
+	cs.projectV1 = projectv1.New(c)
+
+	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
+	return &cs
+}
diff --git a/vendor/github.com/openshift/client-go/project/clientset/versioned/doc.go b/vendor/github.com/openshift/client-go/project/clientset/versioned/doc.go
new file mode 100644
index 000000000..0e0c2a890
--- /dev/null
+++ b/vendor/github.com/openshift/client-go/project/clientset/versioned/doc.go
@@ -0,0 +1,4 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package has the automatically generated clientset.
+package versioned
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 435d2aa0f..f2f878e6f 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -677,6 +677,7 @@ github.com/openshift/client-go/operator/clientset/versioned/typed/operator/v1
 github.com/openshift/client-go/operator/clientset/versioned/typed/operator/v1/fake
 github.com/openshift/client-go/operator/clientset/versioned/typed/operator/v1alpha1
 github.com/openshift/client-go/operator/clientset/versioned/typed/operator/v1alpha1/fake
+github.com/openshift/client-go/project/clientset/versioned
 github.com/openshift/client-go/project/clientset/versioned/scheme
 github.com/openshift/client-go/project/clientset/versioned/typed/project/v1
 github.com/openshift/client-go/samples/clientset/versioned


Test patch:
diff --git a/pkg/monitor/cluster/clusterversions_test.go b/pkg/monitor/cluster/clusterversions_test.go
index 259e7c445..9e4c9e26e 100644
--- a/pkg/monitor/cluster/clusterversions_test.go
+++ b/pkg/monitor/cluster/clusterversions_test.go
@@ -117,7 +117,7 @@ func TestEmitClusterVersion(t *testing.T) {
 				},
 			},
 			wantProvisionedByResourceProviderVersion: "somesha",
-			wantAvailableRP:                          "unknown", // (rpVersion = unkwnown) != (provisionedByResourceProvider = "")
+			wantAvailableRP:                          "unknown", // (rpVersion = unknown) != (provisionedByResourceProvider = "")
 		},
 		{
 			name: "with ProvisionedBy",
diff --git a/pkg/monitor/cluster/summary_test.go b/pkg/monitor/cluster/summary_test.go
index bb1a8463c..50a9fcb79 100644
--- a/pkg/monitor/cluster/summary_test.go
+++ b/pkg/monitor/cluster/summary_test.go
@@ -74,18 +74,20 @@ func TestEmitSummary(t *testing.T) {
 		m:         m,
 		oc: &api.OpenShiftCluster{
 			Properties: api.OpenShiftClusterProperties{
-				ProvisioningState: api.ProvisioningStateFailed,
+				ProvisioningState:       api.ProvisioningStateFailed,
+				FailedProvisioningState: api.ProvisioningStateDeleting,
 			},
 		},
 		hourlyRun: true,
 	}
 
 	m.EXPECT().EmitGauge("cluster.summary", int64(1), map[string]string{
-		"actualVersion":     "4.3.0",
-		"desiredVersion":    "4.3.3",
-		"masterCount":       "1",
-		"workerCount":       "2",
-		"provisioningState": api.ProvisioningStateFailed.String(),
+		"actualVersion":           "4.3.0",
+		"desiredVersion":          "4.3.3",
+		"masterCount":             "1",
+		"workerCount":             "2",
+		"provisioningState":       api.ProvisioningStateFailed.String(),
+		"failedProvisioningState": api.ProvisioningStateDeleting.String(),
 	})
 
 	err := mon.emitSummary(ctx)
diff --git a/pkg/operator/controllers/monitoring/monitoring_controller_test.go b/pkg/operator/controllers/monitoring/monitoring_controller_test.go
index 46bb8d96c..331fb49ae 100644
--- a/pkg/operator/controllers/monitoring/monitoring_controller_test.go
+++ b/pkg/operator/controllers/monitoring/monitoring_controller_test.go
@@ -20,7 +20,7 @@ import (
 )
 
 var cmMetadata = metav1.ObjectMeta{Name: "cluster-monitoring-config", Namespace: "openshift-monitoring"}
-var custerMetadata = metav1.ObjectMeta{Name: arov1alpha1.SingletonClusterName}
+var clusterMetadata = metav1.ObjectMeta{Name: arov1alpha1.SingletonClusterName}
 
 func TestReconcileMonitoringConfig(t *testing.T) {
 	log := logrus.NewEntry(logrus.StandardLogger())
@@ -36,7 +36,7 @@ func TestReconcileMonitoringConfig(t *testing.T) {
 			setConfigMap: func() *Reconciler {
 				return &Reconciler{
 					arocli: arofake.NewSimpleClientset(&arov1alpha1.Cluster{
-						ObjectMeta: custerMetadata,
+						ObjectMeta: clusterMetadata,
 						Spec: arov1alpha1.ClusterSpec{
 							Features: arov1alpha1.FeaturesSpec{
 								PersistentPrometheus: true,
@@ -63,7 +63,7 @@ prometheusK8s:
 			setConfigMap: func() *Reconciler {
 				return &Reconciler{
 					arocli: arofake.NewSimpleClientset(&arov1alpha1.Cluster{
-						ObjectMeta: custerMetadata,
+						ObjectMeta: clusterMetadata,
 						Spec: arov1alpha1.ClusterSpec{
 							Features: arov1alpha1.FeaturesSpec{
 								PersistentPrometheus: true,
@@ -92,7 +92,7 @@ prometheusK8s:
 			setConfigMap: func() *Reconciler {
 				return &Reconciler{
 					arocli: arofake.NewSimpleClientset(&arov1alpha1.Cluster{
-						ObjectMeta: custerMetadata,
+						ObjectMeta: clusterMetadata,
 						Spec: arov1alpha1.ClusterSpec{
 							Features: arov1alpha1.FeaturesSpec{
 								PersistentPrometheus: true,
@@ -124,7 +124,7 @@ prometheusK8s:
 			setConfigMap: func() *Reconciler {
 				return &Reconciler{
 					arocli: arofake.NewSimpleClientset(&arov1alpha1.Cluster{
-						ObjectMeta: custerMetadata,
+						ObjectMeta: clusterMetadata,
 						Spec: arov1alpha1.ClusterSpec{
 							Features: arov1alpha1.FeaturesSpec{
 								PersistentPrometheus: true,
@@ -168,7 +168,7 @@ prometheusK8s:
 			setConfigMap: func() *Reconciler {
 				return &Reconciler{
 					arocli: arofake.NewSimpleClientset(&arov1alpha1.Cluster{
-						ObjectMeta: custerMetadata,
+						ObjectMeta: clusterMetadata,
 						Spec: arov1alpha1.ClusterSpec{
 							Features: arov1alpha1.FeaturesSpec{
 								PersistentPrometheus: true,
@@ -207,7 +207,7 @@ prometheusK8s:
 			setConfigMap: func() *Reconciler {
 				return &Reconciler{
 					arocli: arofake.NewSimpleClientset(&arov1alpha1.Cluster{
-						ObjectMeta: custerMetadata,
+						ObjectMeta: clusterMetadata,
 						Spec: arov1alpha1.ClusterSpec{
 							Features: arov1alpha1.FeaturesSpec{
 								PersistentPrometheus: false,
diff --git a/test/e2e/operator.go b/test/e2e/operator.go
index 500b7396d..a8e002646 100644
--- a/test/e2e/operator.go
+++ b/test/e2e/operator.go
@@ -58,7 +58,7 @@ var _ = Describe("ARO Operator - Internet checking", func() {
 	var originalURLs []string
 	BeforeEach(func() {
 		// save the originalURLs
-		co, err := clients.AROClusters.Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
+		co, err := clients.AROClusters.AroV1alpha1().Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
 		if errors.IsNotFound(err) {
 			Skip("skipping tests as aro-operator is not deployed")
 		}
@@ -69,24 +69,24 @@ var _ = Describe("ARO Operator - Internet checking", func() {
 	AfterEach(func() {
 		// set the URLs back again
 		err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
-			co, err := clients.AROClusters.Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
+			co, err := clients.AROClusters.AroV1alpha1().Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
 			if err != nil {
 				return err
 			}
 			co.Spec.InternetChecker.URLs = originalURLs
-			_, err = clients.AROClusters.Clusters().Update(context.Background(), co, metav1.UpdateOptions{})
+			_, err = clients.AROClusters.AroV1alpha1().Clusters().Update(context.Background(), co, metav1.UpdateOptions{})
 			return err
 		})
 		Expect(err).NotTo(HaveOccurred())
 	})
 	Specify("the InternetReachable default list should all be reachable", func() {
-		co, err := clients.AROClusters.Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
+		co, err := clients.AROClusters.AroV1alpha1().Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
 		Expect(err).NotTo(HaveOccurred())
 		Expect(co.Status.Conditions.IsTrueFor(arov1alpha1.InternetReachableFromMaster)).To(BeTrue())
 	})
 
 	Specify("the InternetReachable default list should all be reachable from worker", func() {
-		co, err := clients.AROClusters.Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
+		co, err := clients.AROClusters.AroV1alpha1().Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
 		Expect(err).NotTo(HaveOccurred())
 		Expect(co.Status.Conditions.IsTrueFor(arov1alpha1.InternetReachableFromWorker)).To(BeTrue())
 	})
@@ -94,19 +94,19 @@ var _ = Describe("ARO Operator - Internet checking", func() {
 	Specify("custom invalid site shows not InternetReachable", func() {
 		// set an unreachable URL
 		err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
-			co, err := clients.AROClusters.Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
+			co, err := clients.AROClusters.AroV1alpha1().Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
 			if err != nil {
 				return err
 			}
 			co.Spec.InternetChecker.URLs = []string{"https://localhost:1234/shouldnotexist"}
-			_, err = clients.AROClusters.Clusters().Update(context.Background(), co, metav1.UpdateOptions{})
+			_, err = clients.AROClusters.AroV1alpha1().Clusters().Update(context.Background(), co, metav1.UpdateOptions{})
 			return err
 		})
 		Expect(err).NotTo(HaveOccurred())
 
 		// confirm the conditions are correct
 		err = wait.PollImmediate(10*time.Second, 10*time.Minute, func() (bool, error) {
-			co, err := clients.AROClusters.Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
+			co, err := clients.AROClusters.AroV1alpha1().Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
 			if err != nil {
 				log.Warn(err)
 				return false, nil // swallow error
diff --git a/test/e2e/setup.go b/test/e2e/setup.go
index a5b0bd4a2..7f8be70ef 100644
--- a/test/e2e/setup.go
+++ b/test/e2e/setup.go
@@ -13,7 +13,7 @@ import (
 	. "github.com/onsi/gomega"
 
 	"github.com/Azure/go-autorest/autorest/azure/auth"
-	projectv1client "github.com/openshift/client-go/project/clientset/versioned/typed/project/v1"
+	projectclient "github.com/openshift/client-go/project/clientset/versioned"
 	machineapiclient "github.com/openshift/machine-api-operator/pkg/generated/clientset/versioned"
 	"github.com/sirupsen/logrus"
 	"k8s.io/client-go/kubernetes"
@@ -23,7 +23,7 @@ import (
 	"k8s.io/client-go/tools/clientcmd/api/latest"
 
 	"github.com/Azure/ARO-RP/pkg/env"
-	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned/typed/aro.openshift.io/v1alpha1"
+	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/insights"
@@ -49,8 +49,8 @@ type clientSet struct {
 	RestConfig  *rest.Config
 	Kubernetes  kubernetes.Interface
 	MachineAPI  machineapiclient.Interface
-	AROClusters aroclient.AroV1alpha1Interface
-	Project     projectv1client.ProjectV1Interface
+	AROClusters aroclient.Interface
+	Project     projectclient.Interface
 }
 
 var (
@@ -106,7 +106,7 @@ func newClientSet(ctx context.Context) (*clientSet, error) {
 		return nil, err
 	}
 
-	projectcli, err := projectv1client.NewForConfig(restconfig)
+	projectcli, err := projectclient.NewForConfig(restconfig)
 	if err != nil {
 		return nil, err
 	}
diff --git a/test/util/project/project.go b/test/util/project/project.go
index 59ea7ab6b..f915fc2dc 100644
--- a/test/util/project/project.go
+++ b/test/util/project/project.go
@@ -8,7 +8,7 @@ import (
 	"fmt"
 
 	projectv1 "github.com/openshift/api/project/v1"
-	projectv1client "github.com/openshift/client-go/project/clientset/versioned/typed/project/v1"
+	projectclient "github.com/openshift/client-go/project/clientset/versioned"
 	authorizationv1 "k8s.io/api/authorization/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -16,21 +16,21 @@ import (
 )
 
 type Project struct {
-	projectV1Client projectv1client.ProjectV1Interface
-	cli             kubernetes.Interface
-	name            string
+	projectClient projectclient.Interface
+	cli           kubernetes.Interface
+	name          string
 }
 
-func NewProject(cli kubernetes.Interface, projectV1Client projectv1client.ProjectV1Interface, name string) Project {
+func NewProject(cli kubernetes.Interface, projectClient projectclient.Interface, name string) Project {
 	return Project{
-		projectV1Client: projectV1Client,
-		cli:             cli,
-		name:            name,
+		projectClient: projectClient,
+		cli:           cli,
+		name:          name,
 	}
 }
 
 func (p Project) Create(ctx context.Context) error {
-	_, err := p.projectV1Client.Projects().Create(ctx, &projectv1.Project{
+	_, err := p.projectClient.ProjectV1().Projects().Create(ctx, &projectv1.Project{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: p.name,
 		},
@@ -39,7 +39,7 @@ func (p Project) Create(ctx context.Context) error {
 }
 
 func (p Project) Delete(ctx context.Context) error {
-	return p.projectV1Client.Projects().Delete(ctx, p.name, metav1.DeleteOptions{})
+	return p.projectClient.ProjectV1().Projects().Delete(ctx, p.name, metav1.DeleteOptions{})
 }
 
 // VerifyProjectIsReady verifies that the project and relevant resources have been created correctly and returns error otherwise
@@ -67,7 +67,7 @@ func (p Project) Verify(ctx context.Context) error {
 		return fmt.Errorf("Default ServiceAccount does not have secrets")
 	}
 
-	proj, err := p.projectV1Client.Projects().Get(ctx, p.name, metav1.GetOptions{})
+	proj, err := p.projectClient.ProjectV1().Projects().Get(ctx, p.name, metav1.GetOptions{})
 	if err != nil {
 		return err
 	}
@@ -81,7 +81,7 @@ func (p Project) Verify(ctx context.Context) error {
 // VerifyProjectIsDeleted verifies that the project does not exist and returns error if a project exists
 // or if it encounters an error other than NotFound
 func (p Project) VerifyProjectIsDeleted(ctx context.Context) error {
-	_, err := p.projectV1Client.Projects().Get(ctx, p.name, metav1.GetOptions{})
+	_, err := p.projectClient.ProjectV1().Projects().Get(ctx, p.name, metav1.GetOptions{})
 	if errors.IsNotFound(err) {
 		return nil
 	}