Repository: Azure/ARO-RP
Pull request #1562 (2021-06-25 23:21:36)

Operator Bugfix: Clean out empty volumeClaimTemplate struct if set
### Which issue this PR addresses:

Fixes https://msazure.visualstudio.com/AzureRedHatOpenShift/_workitems/edit/10229043

### What this PR does / why we need it:
If the `openshift-monitoring` `cluster-monitoring-config` configmap has a volumeClaimTemplate in prometheusK8s or alertmanagerMain set to: `volumeClaimTemplate: {}` the ARO operator won't clean it up and the monitoring clusteroperator will be bad.  


### Test plan for issue:

Updated e2e and unit tests for it and ran it against the shared cluster.  

### Is there any documentation that needs to be updated for this PR?

No, but __NOTE__.  The aro operator will update the configmap, and it will take some time (I've seen 5 min+) for the monitoring operator to update the prometheus/alertmanager resources.  

mjudeikis: @bennerv what about taking this step forward? https://github.com/mjudeikis/ARO-RP/commit/d2ebf9595f7bd16113098ebf5193e46cbb101ed7 ? 
bennerv: /azp run e2e 
azure-pipelines[bot]: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>

Patch:
diff --git a/cmd/aro/dbtoken.go b/cmd/aro/dbtoken.go
index 25d281264..67129eacd 100644
--- a/cmd/aro/dbtoken.go
+++ b/cmd/aro/dbtoken.go
@@ -83,13 +83,7 @@ func dbtoken(ctx context.Context, log *logrus.Entry) error {
 		return err
 	}
 
-	// example value: https://login.microsoftonline.com/11111111-1111-1111-1111-111111111111/
-	issuer := _env.Environment().ActiveDirectoryEndpoint + _env.TenantID() + "/"
-
-	// example value: https://dbtoken.aro.azure.com/
-	clientID := "https://dbtoken." + _env.Environment().AppSuffix + "/"
-
-	verifier, err := oidc.NewVerifier(ctx, issuer, clientID)
+	verifier, err := oidc.NewVerifier(ctx, "https://sts.windows.net/"+_env.TenantID()+"/", pkgdbtoken.Resource)
 	if err != nil {
 		return err
 	}
diff --git a/hack/licenses/licenses.go b/hack/licenses/licenses.go
index f57d2afd5..694d4e045 100644
--- a/hack/licenses/licenses.go
+++ b/hack/licenses/licenses.go
@@ -26,7 +26,7 @@ func applyGoLicense() error {
 		}
 
 		switch path {
-		case "pkg/client", "vendor", ".git":
+		case "pkg/client", "vendor":
 			return filepath.SkipDir
 		}
 
diff --git a/pkg/api/admin/openshiftcluster.go b/pkg/api/admin/openshiftcluster.go
index 94138aabc..912b3b28f 100644
--- a/pkg/api/admin/openshiftcluster.go
+++ b/pkg/api/admin/openshiftcluster.go
@@ -48,7 +48,6 @@ type OpenShiftClusterProperties struct {
 	Install                 *Install                `json:"install,omitempty"`
 	StorageSuffix           string                  `json:"storageSuffix,omitempty"`
 	RegistryProfiles        []RegistryProfile       `json:"registryProfiles,omitempty"`
-	InfraID                 string                  `json:"infraId,omitempty"`
 }
 
 // ProvisioningState represents a provisioning state.
diff --git a/pkg/api/admin/openshiftcluster_convert.go b/pkg/api/admin/openshiftcluster_convert.go
index 26f24b924..421f152ea 100644
--- a/pkg/api/admin/openshiftcluster_convert.go
+++ b/pkg/api/admin/openshiftcluster_convert.go
@@ -56,7 +56,6 @@ func (c *openShiftClusterConverter) ToExternal(oc *api.OpenShiftCluster) interfa
 				IntIP:      oc.Properties.APIServerProfile.IntIP,
 			},
 			StorageSuffix: oc.Properties.StorageSuffix,
-			InfraID:       oc.Properties.InfraID,
 		},
 	}
 
@@ -152,7 +151,6 @@ func (c *openShiftClusterConverter) ToInternal(_oc interface{}, out *api.OpenShi
 		}
 	}
 	out.Properties.ArchitectureVersion = api.ArchitectureVersion(oc.Properties.ArchitectureVersion)
-	out.Properties.InfraID = oc.Properties.InfraID
 	out.Properties.ProvisioningState = api.ProvisioningState(oc.Properties.ProvisioningState)
 	out.Properties.LastProvisioningState = api.ProvisioningState(oc.Properties.LastProvisioningState)
 	out.Properties.FailedProvisioningState = api.ProvisioningState(oc.Properties.FailedProvisioningState)
diff --git a/pkg/api/validate/dynamic/dynamic.go b/pkg/api/validate/dynamic/dynamic.go
index 90a3eda49..369f114f5 100644
--- a/pkg/api/validate/dynamic/dynamic.go
+++ b/pkg/api/validate/dynamic/dynamic.go
@@ -19,7 +19,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/wait"
 
 	"github.com/Azure/ARO-RP/pkg/api"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/authorization"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
@@ -48,7 +47,7 @@ type Dynamic interface {
 type dynamic struct {
 	log            *logrus.Entry
 	authorizerType AuthorizerType
-	azEnv          *azureclient.AROEnvironment
+	azEnv          *azure.Environment
 
 	permissions     authorization.PermissionsClient
 	providers       features.ProvidersClient
@@ -62,7 +61,7 @@ type AuthorizerType string
 const AuthorizerFirstParty AuthorizerType = "resource provider"
 const AuthorizerClusterServicePrincipal AuthorizerType = "cluster"
 
-func NewValidator(log *logrus.Entry, azEnv *azureclient.AROEnvironment, subscriptionID string, authorizer refreshable.Authorizer, authorizerType AuthorizerType) (*dynamic, error) {
+func NewValidator(log *logrus.Entry, azEnv *azure.Environment, subscriptionID string, authorizer refreshable.Authorizer, authorizerType AuthorizerType) (*dynamic, error) {
 	return &dynamic{
 		log:            log,
 		authorizerType: authorizerType,
diff --git a/pkg/dbtoken/api.go b/pkg/dbtoken/api.go
index ad70eb137..ea09b980e 100644
--- a/pkg/dbtoken/api.go
+++ b/pkg/dbtoken/api.go
@@ -3,6 +3,8 @@ package dbtoken
 // Copyright (c) Microsoft Corporation.
 // Licensed under the Apache License 2.0.
 
+const Resource = "https://dbtoken.aro.azure.com/"
+
 type tokenResponse struct {
 	Token string `json:"token,omitempty"`
 }
diff --git a/pkg/deploy/deploy_rp.go b/pkg/deploy/deploy_rp.go
index 84d7c54d4..3bcf54759 100644
--- a/pkg/deploy/deploy_rp.go
+++ b/pkg/deploy/deploy_rp.go
@@ -61,11 +61,23 @@ func (d *deployer) DeployRP(ctx context.Context) error {
 	parameters.Parameters["keyvaultDNSSuffix"] = &arm.ParametersParameter{
 		Value: d.env.Environment().KeyVaultDNSSuffix,
 	}
+
 	parameters.Parameters["fpServicePrincipalId"] = &arm.ParametersParameter{
 		Value: *d.config.Configuration.FPServicePrincipalID,
 	}
+
+	// Cloud name is used by az cli.
+	// Therfore must translate cloud names, only Public and USGov needed
+	// https://github.com/Azure/go-autorest/issues/624
+	cloudName := d.env.Environment().Name // Default, we'll translate only those we need
+	switch cloudName {
+	case azure.PublicCloud.Name:
+		cloudName = "AzureCloud"
+	case azure.USGovernmentCloud.Name:
+		cloudName = "AzureUSGovernment"
+	}
 	parameters.Parameters["azureCloudName"] = &arm.ParametersParameter{
-		Value: d.env.Environment().ActualCloudName,
+		Value: cloudName,
 	}
 
 	for i := 0; i < 2; i++ {
diff --git a/pkg/deploy/upgrade.go b/pkg/deploy/upgrade.go
index 169faa7ad..415b62152 100644
--- a/pkg/deploy/upgrade.go
+++ b/pkg/deploy/upgrade.go
@@ -37,7 +37,7 @@ func (d *deployer) SaveVersion(ctx context.Context) error {
 	}
 
 	blobClient := azstorage.NewAccountSASClient(
-		*d.config.Configuration.RPVersionStorageAccountName, v, (*d.env.Environment()).Environment).GetBlobService()
+		*d.config.Configuration.RPVersionStorageAccountName, v, *d.env.Environment()).GetBlobService()
 
 	containerRef := blobClient.GetContainerReference("rpversion")
 
diff --git a/pkg/env/core.go b/pkg/env/core.go
index 46bed2886..bf5ec4163 100644
--- a/pkg/env/core.go
+++ b/pkg/env/core.go
@@ -5,8 +5,10 @@ package env
 
 import (
 	"context"
+	"errors"
 
 	"github.com/Azure/go-autorest/autorest"
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/sirupsen/logrus"
 
 	"github.com/Azure/ARO-RP/pkg/util/instancemetadata"
@@ -42,6 +44,10 @@ func NewCore(ctx context.Context, log *logrus.Entry) (Core, error) {
 		return nil, err
 	}
 
+	err = validateCloudEnvironment(im.Environment().Name)
+	if err != nil {
+		return nil, err
+	}
 	log.Infof("InstanceMetadata: running on %s", im.Environment().Name)
 
 	return &core{
@@ -67,8 +73,22 @@ func NewCoreForCI(ctx context.Context, log *logrus.Entry) (Core, error) {
 		return nil, err
 	}
 
+	err = validateCloudEnvironment(im.Environment().Name)
+	if err != nil {
+		return nil, err
+	}
+
 	return &core{
 		InstanceMetadata:       im,
 		isLocalDevelopmentMode: isLocalDevelopmentMode,
 	}, nil
 }
+
+func validateCloudEnvironment(name string) error {
+	switch name {
+	case azure.PublicCloud.Name, azure.USGovernmentCloud.Name:
+		return nil
+	default:
+		return errors.New("unsupported Azure cloud environment")
+	}
+}
diff --git a/pkg/env/prod.go b/pkg/env/prod.go
index 982b70ecd..e29f09764 100644
--- a/pkg/env/prod.go
+++ b/pkg/env/prod.go
@@ -18,7 +18,6 @@ import (
 	"github.com/sirupsen/logrus"
 
 	"github.com/Azure/ARO-RP/pkg/proxy"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	"github.com/Azure/ARO-RP/pkg/util/keyvault"
@@ -168,7 +167,7 @@ func newProd(ctx context.Context, log *logrus.Entry) (*prod, error) {
 		}
 		p.acrDomain = acrResource.ResourceName + "." + p.Environment().ContainerRegistryDNSSuffix
 	} else {
-		p.acrDomain = "arointsvc" + "." + azureclient.PublicCloud.ContainerRegistryDNSSuffix // TODO: make cloud aware once this is set up for US Gov Cloud
+		p.acrDomain = "arointsvc" + "." + azure.PublicCloud.ContainerRegistryDNSSuffix // TODO: make cloud aware once this is set up for US Gov Cloud
 	}
 
 	p.ARMHelper, err = newARMHelper(ctx, log, p)
diff --git a/pkg/frontend/adminactions/vmserialconsole.go b/pkg/frontend/adminactions/vmserialconsole.go
index 70aab9f46..f322c2dce 100644
--- a/pkg/frontend/adminactions/vmserialconsole.go
+++ b/pkg/frontend/adminactions/vmserialconsole.go
@@ -64,7 +64,7 @@ func (a *azureActions) VMSerialConsole(ctx context.Context, w http.ResponseWrite
 	}
 
 	blobService := azstorage.NewAccountSASClient(
-		"cluster"+a.oc.Properties.StorageSuffix, v, (*a.env.Environment()).Environment).GetBlobService()
+		"cluster"+a.oc.Properties.StorageSuffix, v, *a.env.Environment()).GetBlobService()
 
 	c := blobService.GetContainerReference(parts[1])
 
diff --git a/pkg/operator/controllers/azurensg/azurensg_controller.go b/pkg/operator/controllers/azurensg/azurensg_controller.go
index c0982f656..dbf5b7795 100644
--- a/pkg/operator/controllers/azurensg/azurensg_controller.go
+++ b/pkg/operator/controllers/azurensg/azurensg_controller.go
@@ -25,7 +25,6 @@ import (
 	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/aad"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/network"
 	"github.com/Azure/ARO-RP/pkg/util/clusterauthorizer"
 )
@@ -61,7 +60,7 @@ func (r *AzureNSGReconciler) Reconcile(ctx context.Context, request ctrl.Request
 	}
 
 	// Get endpoints from operator
-	azEnv, err := azureclient.EnvironmentFromName(instance.Spec.AZEnvironment)
+	azEnv, err := azure.EnvironmentFromName(instance.Spec.AZEnvironment)
 	if err != nil {
 		return reconcile.Result{}, err
 	}
diff --git a/pkg/operator/controllers/checker/serviceprincipalchecker.go b/pkg/operator/controllers/checker/serviceprincipalchecker.go
index fd031180c..9612d269d 100644
--- a/pkg/operator/controllers/checker/serviceprincipalchecker.go
+++ b/pkg/operator/controllers/checker/serviceprincipalchecker.go
@@ -20,7 +20,6 @@ import (
 	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/aad"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/clusterauthorizer"
 )
 
@@ -64,7 +63,7 @@ func (r *ServicePrincipalChecker) Check(ctx context.Context) error {
 		return err
 	}
 
-	azEnv, err := azureclient.EnvironmentFromName(cluster.Spec.AZEnvironment)
+	azEnv, err := azure.EnvironmentFromName(cluster.Spec.AZEnvironment)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/operator/controllers/monitoring/monitoring_controller.go b/pkg/operator/controllers/monitoring/monitoring_controller.go
index c2d6bd84a..50acbf788 100644
--- a/pkg/operator/controllers/monitoring/monitoring_controller.go
+++ b/pkg/operator/controllers/monitoring/monitoring_controller.go
@@ -5,7 +5,7 @@ package monitoring
 
 import (
 	"context"
-	"reflect"
+	"encoding/json"
 
 	"github.com/ghodss/yaml"
 	"github.com/sirupsen/logrus"
@@ -29,7 +29,10 @@ import (
 	"github.com/Azure/ARO-RP/pkg/operator/controllers"
 )
 
-var monitoringName = types.NamespacedName{Name: "cluster-monitoring-config", Namespace: "openshift-monitoring"}
+var (
+	monitoringName   = types.NamespacedName{Name: "cluster-monitoring-config", Namespace: "openshift-monitoring"}
+	prometheusLabels = "app=prometheus,prometheus=k8s"
+)
 
 // Config represents cluster monitoring stack configuration.
 // Reconciler reconciles retention and storage settings,
@@ -38,21 +41,15 @@ type Config struct {
 	api.MissingFields
 	PrometheusK8s struct {
 		api.MissingFields
-		Retention           string `json:"retention,omitempty"`
-		VolumeClaimTemplate struct {
-			api.MissingFields
-		} `json:"volumeClaimTemplate,omitempty"`
+		Retention           string           `json:"retention,omitempty"`
+		VolumeClaimTemplate *json.RawMessage `json:"volumeClaimTemplate,omitempty"`
 	} `json:"prometheusK8s,omitempty"`
 	AlertManagerMain struct {
 		api.MissingFields
-		VolumeClaimTemplate struct {
-			api.MissingFields
-		} `json:"volumeClaimTemplate,omitempty"`
+		VolumeClaimTemplate *json.RawMessage `json:"volumeClaimTemplate,omitempty"`
 	} `json:"alertmanagerMain,omitempty"`
 }
 
-var defaultConfig = `prometheusK8s: {}`
-
 type Reconciler struct {
 	arocli        aroclient.Interface
 	kubernetescli kubernetes.Interface
@@ -70,10 +67,39 @@ func NewReconciler(log *logrus.Entry, kubernetescli kubernetes.Interface, arocli
 }
 
 func (r *Reconciler) Reconcile(ctx context.Context, request ctrl.Request) (ctrl.Result, error) {
+	for _, f := range []func(context.Context, ctrl.Request) (ctrl.Result, error){
+		r.reconcileConfiguration,
+		r.reconcilePVC, // TODO(mj): This should be removed once we don't have PVC anymore
+	} {
+		result, err := f(ctx, request)
+		if err != nil {
+			return result, err
+		}
+	}
+	return reconcile.Result{}, nil
+}
+
+func (r *Reconciler) reconcilePVC(ctx context.Context, request ctrl.Request) (ctrl.Result, error) {
+	pvcList, err := r.kubernetescli.CoreV1().PersistentVolumeClaims(monitoringName.Namespace).List(ctx, metav1.ListOptions{LabelSelector: prometheusLabels})
+	if err != nil {
+		return reconcile.Result{}, err
+	}
+
+	for _, pvc := range pvcList.Items {
+		err = r.kubernetescli.CoreV1().PersistentVolumeClaims(monitoringName.Namespace).Delete(ctx, pvc.Name, metav1.DeleteOptions{})
+		if err != nil {
+			return reconcile.Result{}, err
+		}
+	}
+	return reconcile.Result{}, nil
+}
+
+func (r *Reconciler) reconcileConfiguration(ctx context.Context, request ctrl.Request) (ctrl.Result, error) {
 	cm, isCreate, err := r.monitoringConfigMap(ctx)
 	if err != nil {
 		return reconcile.Result{}, err
 	}
+
 	if cm.Data == nil {
 		cm.Data = map[string]string{}
 	}
@@ -90,19 +116,20 @@ func (r *Reconciler) Reconcile(ctx context.Context, request ctrl.Request) (ctrl.
 	}
 
 	changed := false
-	// we are disabling persistence. We use omitempty on the struct to
-	// clean the fields
-	if configData.PrometheusK8s.Retention != "" {
-		configData.PrometheusK8s.Retention = ""
+
+	// Nil out the fields we don't want set
+	if configData.AlertManagerMain.VolumeClaimTemplate != nil {
+		configData.AlertManagerMain.VolumeClaimTemplate = nil
 		changed = true
 	}
-	if !reflect.DeepEqual(configData.PrometheusK8s.VolumeClaimTemplate, struct{ api.MissingFields }{}) {
-		configData.PrometheusK8s.VolumeClaimTemplate = struct{ api.MissingFields }{}
+
+	if configData.PrometheusK8s.Retention != "" {
+		configData.PrometheusK8s.Retention = ""
 		changed = true
 	}
 
-	if !reflect.DeepEqual(configData.AlertManagerMain.VolumeClaimTemplate, struct{ api.MissingFields }{}) {
-		configData.AlertManagerMain.VolumeClaimTemplate = struct{ api.MissingFields }{}
+	if configData.PrometheusK8s.VolumeClaimTemplate != nil {
+		configData.PrometheusK8s.VolumeClaimTemplate = nil
 		changed = true
 	}
 
@@ -140,9 +167,7 @@ func (r *Reconciler) monitoringConfigMap(ctx context.Context) (*corev1.ConfigMap
 				Name:      monitoringName.Name,
 				Namespace: monitoringName.Namespace,
 			},
-			Data: map[string]string{
-				"config.yaml": defaultConfig,
-			},
+			Data: nil,
 		}, true, nil
 	}
 	if err != nil {
diff --git a/pkg/operator/controllers/workaround/cleanprompvc.go b/pkg/operator/controllers/workaround/cleanprompvc.go
deleted file mode 100644
index 747f966d3..000000000
--- a/pkg/operator/controllers/workaround/cleanprompvc.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package workaround
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-// Clean the remaining PVCs in openshift-monitoring namespace.
-// These PVCs with labels: app=prometheus,prometheus=k8s are left
-// behind after switching back to use emptydir as persistent storage
-// for prometheus by disabling featureflag in monitoing controller.
-// This workaround is in effect for all clusters set to
-// have non-persistent prometheus.
-// The cleanup loop removes only up to 2 PVCs as this is the
-// production configuration at the time of the workaround release.
-
-import (
-	"context"
-	"reflect"
-
-	"github.com/ghodss/yaml"
-	"github.com/sirupsen/logrus"
-	"github.com/ugorji/go/codec"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/client-go/kubernetes"
-	"k8s.io/client-go/util/retry"
-
-	"github.com/Azure/ARO-RP/pkg/api"
-	"github.com/Azure/ARO-RP/pkg/operator/controllers/monitoring"
-	"github.com/Azure/ARO-RP/pkg/util/version"
-)
-
-const (
-	prometheusLabels    = "app=prometheus,prometheus=k8s"
-	monitoringName      = "cluster-monitoring-config"
-	monitoringNamespace = "openshift-monitoring"
-)
-
-type cleanPromPVC struct {
-	log *logrus.Entry
-	cli kubernetes.Interface
-}
-
-func NewCleanFromPVCWorkaround(log *logrus.Entry, cli kubernetes.Interface) Workaround {
-	return &cleanPromPVC{
-		log: log,
-		cli: cli,
-	}
-}
-
-func (*cleanPromPVC) Name() string {
-	return "Clean prometheus PVC after disabling persistency"
-}
-
-func (c *cleanPromPVC) IsRequired(clusterVersion *version.Version) bool {
-	cm, err := c.cli.CoreV1().ConfigMaps(monitoringNamespace).Get(context.Background(), monitoringName, metav1.GetOptions{})
-	if err != nil {
-		return false
-	}
-
-	configDataJSON, err := yaml.YAMLToJSON([]byte(cm.Data["config.yaml"]))
-	if err != nil {
-		return false
-	}
-	var configData monitoring.Config
-	handle := new(codec.JsonHandle)
-	err = codec.NewDecoderBytes(configDataJSON, handle).Decode(&configData)
-	if err != nil {
-		return false
-	}
-
-	if configData.PrometheusK8s.Retention == "" && reflect.DeepEqual(configData.PrometheusK8s.VolumeClaimTemplate, struct{ api.MissingFields }{}) {
-		return true
-	}
-
-	return false
-}
-
-func (c *cleanPromPVC) Ensure(ctx context.Context) error {
-
-	err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
-		pvcList, err := c.cli.CoreV1().PersistentVolumeClaims(monitoringNamespace).List(ctx, metav1.ListOptions{LabelSelector: prometheusLabels})
-		if err != nil {
-			return err
-		}
-
-		for _, pvc := range pvcList.Items {
-			err = c.cli.CoreV1().PersistentVolumeClaims(monitoringNamespace).Delete(ctx, pvc.Name, metav1.DeleteOptions{})
-			if err != nil {
-				return err
-			}
-		}
-
-		return nil
-	})
-
-	return err
-}
-
-func (c *cleanPromPVC) Remove(ctx context.Context) error {
-	return nil
-}
diff --git a/pkg/operator/controllers/workaround/workaround_controller.go b/pkg/operator/controllers/workaround/workaround_controller.go
index 1e80c0108..b009f0472 100644
--- a/pkg/operator/controllers/workaround/workaround_controller.go
+++ b/pkg/operator/controllers/workaround/workaround_controller.go
@@ -44,7 +44,7 @@ func NewReconciler(log *logrus.Entry, kubernetescli kubernetes.Interface, config
 		configcli:     configcli,
 		arocli:        arocli,
 		restConfig:    restConfig,
-		workarounds:   []Workaround{NewSystemReserved(log, mcocli, dh), NewIfReload(log, kubernetescli), NewCleanFromPVCWorkaround(log, kubernetescli)},
+		workarounds:   []Workaround{NewSystemReserved(log, mcocli, dh), NewIfReload(log, kubernetescli)},
 		log:           log,
 	}
 }
diff --git a/pkg/operator/deploy/deploy.go b/pkg/operator/deploy/deploy.go
index ba356c354..1b01314c8 100644
--- a/pkg/operator/deploy/deploy.go
+++ b/pkg/operator/deploy/deploy.go
@@ -9,6 +9,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/sirupsen/logrus"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
@@ -128,6 +129,16 @@ func (o *operator) resources() ([]runtime.Object, error) {
 		return nil, err
 	}
 
+	var monitoringEndpoint string
+	switch o.env.Environment().Name {
+	case azure.PublicCloud.Name:
+		monitoringEndpoint = "https://gcs.prod.monitoring.core.windows.net/"
+	case azure.USGovernmentCloud.Name:
+		monitoringEndpoint = "https://gcs.monitoring.core.usgovcloudapi.net/"
+	default:
+		return nil, fmt.Errorf("unsupported cloud environment")
+	}
+
 	vnetID, _, err := subnet.Split(o.oc.Properties.MasterProfile.SubnetID)
 	if err != nil {
 		return nil, err
@@ -174,7 +185,7 @@ func (o *operator) resources() ([]runtime.Object, error) {
 						fmt.Sprintf("https://%s/", o.env.ACRDomain()),
 						o.env.Environment().ActiveDirectoryEndpoint,
 						o.env.Environment().ResourceManagerEndpoint,
-						o.env.Environment().GenevaMonitoringEndpoint,
+						monitoringEndpoint,
 					},
 				},
 				APIIntIP:  o.oc.Properties.APIServerProfile.IntIP,
diff --git a/pkg/util/azureclient/environments.go b/pkg/util/azureclient/environments.go
deleted file mode 100644
index 23f8c036e..000000000
--- a/pkg/util/azureclient/environments.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package azureclient
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"fmt"
-	"strings"
-
-	"github.com/Azure/go-autorest/autorest/azure"
-)
-
-// AROEnvironment contains additional, cloud-specific information needed by ARO.
-type AROEnvironment struct {
-	azure.Environment
-	ActualCloudName          string
-	GenevaMonitoringEndpoint string
-	AppSuffix                string
-}
-
-var (
-	// PublicCloud contains additional ARO information for the public Azure cloud environment.
-	PublicCloud = AROEnvironment{
-		Environment:              azure.PublicCloud,
-		ActualCloudName:          "AzureCloud",
-		GenevaMonitoringEndpoint: "https://gcs.prod.monitoring.core.windows.net/",
-		AppSuffix:                "aro.azure.com",
-	}
-
-	// USGovernmentCloud contains additional ARO information for the US Gov cloud environment.
-	USGovernmentCloud = AROEnvironment{
-		Environment:              azure.USGovernmentCloud,
-		ActualCloudName:          "AzureUSGovernment",
-		GenevaMonitoringEndpoint: "https://gcs.monitoring.core.usgovcloudapi.net/",
-		AppSuffix:                "aro.azure.us",
-	}
-)
-
-// EnvironmentFromName returns the AROEnvironment corresponding to the common name specified.
-func EnvironmentFromName(name string) (AROEnvironment, error) {
-	switch strings.ToUpper(name) {
-	case "AZUREPUBLICCLOUD":
-		return PublicCloud, nil
-	case "AZUREUSGOVERNMENTCLOUD":
-		return USGovernmentCloud, nil
-	}
-	return AROEnvironment{}, fmt.Errorf("cloud environment %q is unsupported by ARO", name)
-}
diff --git a/pkg/util/azureclient/graphrbac/applications.go b/pkg/util/azureclient/graphrbac/applications.go
index 24fb98dfa..335c89ece 100644
--- a/pkg/util/azureclient/graphrbac/applications.go
+++ b/pkg/util/azureclient/graphrbac/applications.go
@@ -8,8 +8,7 @@ import (
 
 	azgraphrbac "github.com/Azure/azure-sdk-for-go/services/graphrbac/1.6/graphrbac"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // ApplicationsClient is a minimal interface for azure ApplicationsClient
@@ -27,7 +26,7 @@ type applicationsClient struct {
 var _ ApplicationsClient = &applicationsClient{}
 
 // NewApplicationsClient creates a new ApplicationsClient
-func NewApplicationsClient(environment *azureclient.AROEnvironment, tenantID string, authorizer autorest.Authorizer) ApplicationsClient {
+func NewApplicationsClient(environment *azure.Environment, tenantID string, authorizer autorest.Authorizer) ApplicationsClient {
 	client := azgraphrbac.NewApplicationsClientWithBaseURI(environment.GraphEndpoint, tenantID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/graphrbac/serviceprincipals.go b/pkg/util/azureclient/graphrbac/serviceprincipals.go
index 268315fde..76e9d79fe 100644
--- a/pkg/util/azureclient/graphrbac/serviceprincipals.go
+++ b/pkg/util/azureclient/graphrbac/serviceprincipals.go
@@ -8,8 +8,7 @@ import (
 
 	azgraphrbac "github.com/Azure/azure-sdk-for-go/services/graphrbac/1.6/graphrbac"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // ServicePrincipalClient is a minimal interface for azure ApplicationsClient
@@ -25,7 +24,7 @@ type servicePrincipalClient struct {
 var _ ServicePrincipalClient = &servicePrincipalClient{}
 
 // NewServicePrincipalClient creates a new ServicePrincipalClient
-func NewServicePrincipalClient(environment *azureclient.AROEnvironment, tenantID string, authorizer autorest.Authorizer) ServicePrincipalClient {
+func NewServicePrincipalClient(environment *azure.Environment, tenantID string, authorizer autorest.Authorizer) ServicePrincipalClient {
 	client := azgraphrbac.NewServicePrincipalsClientWithBaseURI(environment.GraphEndpoint, tenantID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/authorization/denyassignment.go b/pkg/util/azureclient/mgmt/authorization/denyassignment.go
index 5e4b8e25f..3ae0460f4 100644
--- a/pkg/util/azureclient/mgmt/authorization/denyassignment.go
+++ b/pkg/util/azureclient/mgmt/authorization/denyassignment.go
@@ -6,8 +6,7 @@ package authorization
 import (
 	mgmtauthorization "github.com/Azure/azure-sdk-for-go/services/preview/authorization/mgmt/2018-09-01-preview/authorization"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // DenyAssignmentClient is a minimal interface for azure DenyAssignmentClient
@@ -22,7 +21,7 @@ type denyAssignmentClient struct {
 var _ DenyAssignmentClient = &denyAssignmentClient{}
 
 // NewDenyAssignmentsClient creates a new DenyAssignmentsClient
-func NewDenyAssignmentsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) DenyAssignmentClient {
+func NewDenyAssignmentsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) DenyAssignmentClient {
 	client := mgmtauthorization.NewDenyAssignmentsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/authorization/permissions.go b/pkg/util/azureclient/mgmt/authorization/permissions.go
index 478c59317..4ac84dcd9 100644
--- a/pkg/util/azureclient/mgmt/authorization/permissions.go
+++ b/pkg/util/azureclient/mgmt/authorization/permissions.go
@@ -6,8 +6,7 @@ package authorization
 import (
 	mgmtauthorization "github.com/Azure/azure-sdk-for-go/services/preview/authorization/mgmt/2018-09-01-preview/authorization"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // PermissionsClient is a minimal interface for azure PermissionsClient
@@ -22,7 +21,7 @@ type permissionsClient struct {
 var _ PermissionsClient = &permissionsClient{}
 
 // NewPermissionsClient creates a new PermissionsClient
-func NewPermissionsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PermissionsClient {
+func NewPermissionsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) PermissionsClient {
 	client := mgmtauthorization.NewPermissionsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/authorization/roleassignments.go b/pkg/util/azureclient/mgmt/authorization/roleassignments.go
index daa98cf2c..af5c87658 100644
--- a/pkg/util/azureclient/mgmt/authorization/roleassignments.go
+++ b/pkg/util/azureclient/mgmt/authorization/roleassignments.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtauthorization "github.com/Azure/azure-sdk-for-go/services/preview/authorization/mgmt/2018-09-01-preview/authorization"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // RoleAssignmentsClient is a minimal interface for azure RoleAssignmentsClient
@@ -26,7 +25,7 @@ type roleAssignmentsClient struct {
 var _ RoleAssignmentsClient = &roleAssignmentsClient{}
 
 // NewRoleAssignmentsClient creates a new RoleAssignmentsClient
-func NewRoleAssignmentsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RoleAssignmentsClient {
+func NewRoleAssignmentsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) RoleAssignmentsClient {
 	client := mgmtauthorization.NewRoleAssignmentsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/authorization/roledefinitions.go b/pkg/util/azureclient/mgmt/authorization/roledefinitions.go
index 29ff633cd..a5483b0cb 100644
--- a/pkg/util/azureclient/mgmt/authorization/roledefinitions.go
+++ b/pkg/util/azureclient/mgmt/authorization/roledefinitions.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtauthorization "github.com/Azure/azure-sdk-for-go/services/preview/authorization/mgmt/2018-09-01-preview/authorization"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // RoleDefinitionsClient is a minimal interface for azure RoleDefinitionsClient
@@ -25,7 +24,7 @@ type roleDefinitionsClient struct {
 var _ RoleDefinitionsClient = &roleDefinitionsClient{}
 
 // NewRoleDefinitionsClient creates a new RoleDefinitionsClient
-func NewRoleDefinitionsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RoleDefinitionsClient {
+func NewRoleDefinitionsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) RoleDefinitionsClient {
 	client := mgmtauthorization.NewRoleDefinitionsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/compute/disks.go b/pkg/util/azureclient/mgmt/compute/disks.go
index 31f95cab0..f5e26dd4a 100644
--- a/pkg/util/azureclient/mgmt/compute/disks.go
+++ b/pkg/util/azureclient/mgmt/compute/disks.go
@@ -6,8 +6,7 @@ package compute
 import (
 	mgmtcompute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // DisksClient is a minimal interface for azure DisksClient
@@ -22,7 +21,7 @@ type disksClient struct {
 var _ DisksClient = &disksClient{}
 
 // NewDisksClient creates a new DisksClient
-func NewDisksClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) DisksClient {
+func NewDisksClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) DisksClient {
 	client := mgmtcompute.NewDisksClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/compute/resourceskus.go b/pkg/util/azureclient/mgmt/compute/resourceskus.go
index ac0006023..e573fe0a7 100644
--- a/pkg/util/azureclient/mgmt/compute/resourceskus.go
+++ b/pkg/util/azureclient/mgmt/compute/resourceskus.go
@@ -6,8 +6,7 @@ package compute
 import (
 	mgmtcompute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // ResourceSkusClient is a minimal interface for azure ResourceSkusClient
@@ -22,7 +21,7 @@ type resourceSkusClient struct {
 var _ ResourceSkusClient = &resourceSkusClient{}
 
 // NewResourceSkusClient creates a new ResourceSkusClient
-func NewResourceSkusClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ResourceSkusClient {
+func NewResourceSkusClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) ResourceSkusClient {
 	client := mgmtcompute.NewResourceSkusClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/compute/usage.go b/pkg/util/azureclient/mgmt/compute/usage.go
index a3937d405..0db8643f3 100644
--- a/pkg/util/azureclient/mgmt/compute/usage.go
+++ b/pkg/util/azureclient/mgmt/compute/usage.go
@@ -6,8 +6,7 @@ package compute
 import (
 	mgmtcompute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // UsageClient is a minimal interface for azure UsageClient
@@ -22,7 +21,7 @@ type usageClient struct {
 var _ UsageClient = &usageClient{}
 
 // NewUsageClient creates a new UsageClient
-func NewUsageClient(environment *azureclient.AROEnvironment, tenantID string, authorizer autorest.Authorizer) UsageClient {
+func NewUsageClient(environment *azure.Environment, tenantID string, authorizer autorest.Authorizer) UsageClient {
 	client := mgmtcompute.NewUsageClientWithBaseURI(environment.ResourceManagerEndpoint, tenantID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/compute/virtualmachines.go b/pkg/util/azureclient/mgmt/compute/virtualmachines.go
index 4988cc3d8..b8b389ce6 100644
--- a/pkg/util/azureclient/mgmt/compute/virtualmachines.go
+++ b/pkg/util/azureclient/mgmt/compute/virtualmachines.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtcompute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // VirtualMachinesClient is a minimal interface for azure VirtualMachinesClient
@@ -25,7 +24,7 @@ type virtualMachinesClient struct {
 var _ VirtualMachinesClient = &virtualMachinesClient{}
 
 // NewVirtualMachinesClient creates a new VirtualMachinesClient
-func NewVirtualMachinesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachinesClient {
+func NewVirtualMachinesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachinesClient {
 	client := mgmtcompute.NewVirtualMachinesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go b/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go
index 3a59e35e2..04c05a84d 100644
--- a/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go
+++ b/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go
@@ -9,8 +9,7 @@ import (
 
 	mgmtcompute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // VirtualMachineScaleSetVMsClient is a minimal interface for azure VirtualMachineScaleSetVMsClient
@@ -26,7 +25,7 @@ type virtualMachineScaleSetVMsClient struct {
 var _ VirtualMachineScaleSetVMsClient = &virtualMachineScaleSetVMsClient{}
 
 // NewVirtualMachineScaleSetVMsClient creates a new VirtualMachineScaleSetVMsClient
-func NewVirtualMachineScaleSetVMsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachineScaleSetVMsClient {
+func NewVirtualMachineScaleSetVMsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachineScaleSetVMsClient {
 	client := mgmtcompute.NewVirtualMachineScaleSetVMsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 	client.PollingDuration = time.Hour
diff --git a/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go b/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go
index 31664dd15..b81b767c2 100644
--- a/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go
+++ b/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go
@@ -6,8 +6,7 @@ package compute
 import (
 	mgmtcompute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 type VirtualMachineScaleSetsClient interface {
@@ -21,7 +20,7 @@ type virtualMachineScaleSetsClient struct {
 var _ VirtualMachineScaleSetsClient = &virtualMachineScaleSetsClient{}
 
 // NewVirtualMachineScaleSetsClient creates a new VirtualMachineScaleSetsClient
-func NewVirtualMachineScaleSetsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachineScaleSetsClient {
+func NewVirtualMachineScaleSetsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachineScaleSetsClient {
 	client := mgmtcompute.NewVirtualMachineScaleSetsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/containerregistry/registries.go b/pkg/util/azureclient/mgmt/containerregistry/registries.go
index 97ac29184..c5397c535 100644
--- a/pkg/util/azureclient/mgmt/containerregistry/registries.go
+++ b/pkg/util/azureclient/mgmt/containerregistry/registries.go
@@ -6,8 +6,7 @@ package containerregistry
 import (
 	mgmtcontainerregistry "github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/mgmt/2020-11-01-preview/containerregistry"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // RegistriesClient is a minimal interface for azure RegistriesClient
@@ -22,7 +21,7 @@ type registriesClient struct {
 var _ RegistriesClient = &registriesClient{}
 
 // NewRegistriesClient creates a new RegistriesClient
-func NewRegistriesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RegistriesClient {
+func NewRegistriesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) RegistriesClient {
 	client := mgmtcontainerregistry.NewRegistriesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/containerregistry/tokens.go b/pkg/util/azureclient/mgmt/containerregistry/tokens.go
index f340adcd4..ca0dbfc28 100644
--- a/pkg/util/azureclient/mgmt/containerregistry/tokens.go
+++ b/pkg/util/azureclient/mgmt/containerregistry/tokens.go
@@ -6,8 +6,7 @@ package containerregistry
 import (
 	mgmtcontainerregistry "github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/mgmt/2020-11-01-preview/containerregistry"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // TokensClient is a minimal interface for azure TokensClient
@@ -22,7 +21,7 @@ type tokensClient struct {
 var _ TokensClient = &tokensClient{}
 
 // NewTokensClient creates a new TokensClient
-func NewTokensClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) TokensClient {
+func NewTokensClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) TokensClient {
 	client := mgmtcontainerregistry.NewTokensClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/dns/recordsets.go b/pkg/util/azureclient/mgmt/dns/recordsets.go
index e688da2d2..29434f998 100644
--- a/pkg/util/azureclient/mgmt/dns/recordsets.go
+++ b/pkg/util/azureclient/mgmt/dns/recordsets.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtdns "github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2018-05-01/dns"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // RecordSetsClient is a minimal interface for azure RecordSetsClient
@@ -26,7 +25,7 @@ type recordSetsClient struct {
 var _ RecordSetsClient = &recordSetsClient{}
 
 // NewRecordSetsClient creates a new RecordSetsClient
-func NewRecordSetsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RecordSetsClient {
+func NewRecordSetsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) RecordSetsClient {
 	client := mgmtdns.NewRecordSetsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/dns/zones.go b/pkg/util/azureclient/mgmt/dns/zones.go
index babd9912d..15cee3652 100644
--- a/pkg/util/azureclient/mgmt/dns/zones.go
+++ b/pkg/util/azureclient/mgmt/dns/zones.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtdns "github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2018-05-01/dns"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // ZonesClient is a minimal interface for azure ZonesClient
@@ -24,7 +23,7 @@ type zonesClient struct {
 var _ ZonesClient = &zonesClient{}
 
 // NewZonesClient creates a new ZonesClient
-func NewZonesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ZonesClient {
+func NewZonesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) ZonesClient {
 	client := mgmtdns.NewZonesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go b/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go
index 984b804dc..3c1d67347 100644
--- a/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go
+++ b/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtdocumentdb "github.com/Azure/azure-sdk-for-go/services/cosmos-db/mgmt/2019-08-01/documentdb"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // DatabaseAccountsClient is a minimal interface for azure DatabaseAccountsClient
@@ -24,7 +23,7 @@ type databaseAccountsClient struct {
 var _ DatabaseAccountsClient = &databaseAccountsClient{}
 
 // NewDatabaseAccountsClient creates a new DatabaseAccountsClient
-func NewDatabaseAccountsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) DatabaseAccountsClient {
+func NewDatabaseAccountsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) DatabaseAccountsClient {
 	client := mgmtdocumentdb.NewDatabaseAccountsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/features/deployments.go b/pkg/util/azureclient/mgmt/features/deployments.go
index 128d21de0..939a1c3af 100644
--- a/pkg/util/azureclient/mgmt/features/deployments.go
+++ b/pkg/util/azureclient/mgmt/features/deployments.go
@@ -9,8 +9,7 @@ import (
 
 	mgmtfeatures "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-07-01/features"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // DeploymentsClient is a minimal interface for azure DeploymentsClient
@@ -26,7 +25,7 @@ type deploymentsClient struct {
 var _ DeploymentsClient = &deploymentsClient{}
 
 // NewDeploymentsClient creates a new DeploymentsClient
-func NewDeploymentsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) DeploymentsClient {
+func NewDeploymentsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) DeploymentsClient {
 	client := mgmtfeatures.NewDeploymentsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 	client.PollingDelay = 10 * time.Second
diff --git a/pkg/util/azureclient/mgmt/features/features.go b/pkg/util/azureclient/mgmt/features/features.go
index c0b074a0b..c3617dad3 100644
--- a/pkg/util/azureclient/mgmt/features/features.go
+++ b/pkg/util/azureclient/mgmt/features/features.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtfeatures "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2015-12-01/features"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // Client is a minimal interface for azure Client
@@ -25,7 +24,7 @@ type client struct {
 var _ Client = &client{}
 
 // NewClient creates a new Client
-func NewClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) Client {
+func NewClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) Client {
 	_client := mgmtfeatures.NewClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	_client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/features/providers.go b/pkg/util/azureclient/mgmt/features/providers.go
index 016d649ac..825388440 100644
--- a/pkg/util/azureclient/mgmt/features/providers.go
+++ b/pkg/util/azureclient/mgmt/features/providers.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtfeatures "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-07-01/features"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // ProvidersClient is a minimal interface for azure ProvidersClient
@@ -25,7 +24,7 @@ type providersClient struct {
 var _ ProvidersClient = &providersClient{}
 
 // NewProvidersClient creates a new ProvidersClient
-func NewProvidersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ProvidersClient {
+func NewProvidersClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) ProvidersClient {
 	client := mgmtfeatures.NewProvidersClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/features/resourcegroups.go b/pkg/util/azureclient/mgmt/features/resourcegroups.go
index a4cc1123d..aa767559e 100644
--- a/pkg/util/azureclient/mgmt/features/resourcegroups.go
+++ b/pkg/util/azureclient/mgmt/features/resourcegroups.go
@@ -9,8 +9,7 @@ import (
 
 	mgmtfeatures "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-07-01/features"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // ResourceGroupsClient is a minimal interface for azure ResourceGroupsClient
@@ -28,7 +27,7 @@ type resourceGroupsClient struct {
 var _ ResourceGroupsClient = &resourceGroupsClient{}
 
 // NewResourceGroupsClient creates a new ResourceGroupsClient
-func NewResourceGroupsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ResourceGroupsClient {
+func NewResourceGroupsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) ResourceGroupsClient {
 	client := mgmtfeatures.NewResourceGroupsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 	client.PollingDelay = 10 * time.Second
diff --git a/pkg/util/azureclient/mgmt/features/resources.go b/pkg/util/azureclient/mgmt/features/resources.go
index b3b3e6210..b10db4092 100644
--- a/pkg/util/azureclient/mgmt/features/resources.go
+++ b/pkg/util/azureclient/mgmt/features/resources.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtfeatures "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-07-01/features"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // ResourcesClient is a minimal interface for azure ResourcesClient
@@ -26,7 +25,7 @@ type resourcesClient struct {
 var _ ResourcesClient = &resourcesClient{}
 
 // NewResourcesClient creates a new ResourcesClient
-func NewResourcesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ResourcesClient {
+func NewResourcesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) ResourcesClient {
 	client := mgmtfeatures.NewResourcesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/insights/activitylogs.go b/pkg/util/azureclient/mgmt/insights/activitylogs.go
index d59c3d654..6c07f8888 100644
--- a/pkg/util/azureclient/mgmt/insights/activitylogs.go
+++ b/pkg/util/azureclient/mgmt/insights/activitylogs.go
@@ -5,8 +5,8 @@ package insights
 
 import (
 	"github.com/Azure/go-autorest/autorest"
+	"github.com/Azure/go-autorest/autorest/azure"
 
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/insights/insights"
 )
 
@@ -33,7 +33,7 @@ type activityLogsClient struct {
 var _ ActivityLogsClient = &activityLogsClient{}
 
 // NewActivityLogsClient creates a new ActivityLogsClient
-func NewActivityLogsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ActivityLogsClient {
+func NewActivityLogsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) ActivityLogsClient {
 	client := insights.NewActivityLogsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/msi/userassignedidentities.go b/pkg/util/azureclient/mgmt/msi/userassignedidentities.go
index 2c5eee797..5f9371547 100644
--- a/pkg/util/azureclient/mgmt/msi/userassignedidentities.go
+++ b/pkg/util/azureclient/mgmt/msi/userassignedidentities.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtmsi "github.com/Azure/azure-sdk-for-go/services/msi/mgmt/2018-11-30/msi"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // UserAssignedIdentitiesClient is a minimal interface for azure UserAssignedIdentitiesClient
@@ -24,7 +23,7 @@ type userAssignedIdentitiesClient struct {
 var _ UserAssignedIdentitiesClient = &userAssignedIdentitiesClient{}
 
 // NewUserAssignedIdentitiesClient creates a new UserAssignedIdentitiesClient
-func NewUserAssignedIdentitiesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) UserAssignedIdentitiesClient {
+func NewUserAssignedIdentitiesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) UserAssignedIdentitiesClient {
 	client := mgmtmsi.NewUserAssignedIdentitiesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/interfaces.go b/pkg/util/azureclient/mgmt/network/interfaces.go
index d6c7b0c58..191806d8b 100644
--- a/pkg/util/azureclient/mgmt/network/interfaces.go
+++ b/pkg/util/azureclient/mgmt/network/interfaces.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // InterfacesClient is a minimal interface for azure InterfacesClient
@@ -25,7 +24,7 @@ type interfacesClient struct {
 var _ InterfacesClient = &interfacesClient{}
 
 // NewInterfacesClient creates a new InterfacesClient
-func NewInterfacesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) InterfacesClient {
+func NewInterfacesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) InterfacesClient {
 	client := mgmtnetwork.NewInterfacesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/loadbalancers.go b/pkg/util/azureclient/mgmt/network/loadbalancers.go
index 5e45f22e1..1c18f3983 100644
--- a/pkg/util/azureclient/mgmt/network/loadbalancers.go
+++ b/pkg/util/azureclient/mgmt/network/loadbalancers.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // LoadBalancersClient is a minimal interface for Azure LoadBalancersClient
@@ -25,7 +24,7 @@ type loadBalancersClient struct {
 var _ LoadBalancersClient = &loadBalancersClient{}
 
 // NewLoadBalancersClient creates a new LoadBalancersClient
-func NewLoadBalancersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) LoadBalancersClient {
+func NewLoadBalancersClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) LoadBalancersClient {
 	client := mgmtnetwork.NewLoadBalancersClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/privateendpoints.go b/pkg/util/azureclient/mgmt/network/privateendpoints.go
index 13d4e26fe..623e0ed92 100644
--- a/pkg/util/azureclient/mgmt/network/privateendpoints.go
+++ b/pkg/util/azureclient/mgmt/network/privateendpoints.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // PrivateEndpointsClient is a minimal interface for azure PrivateEndpointsClient
@@ -25,7 +24,7 @@ type privateEndpointsClient struct {
 var _ PrivateEndpointsClient = &privateEndpointsClient{}
 
 // NewPrivateEndpointsClient creates a new PrivateEndpointsClient
-func NewPrivateEndpointsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PrivateEndpointsClient {
+func NewPrivateEndpointsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) PrivateEndpointsClient {
 	client := mgmtnetwork.NewPrivateEndpointsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/privatelinkservices.go b/pkg/util/azureclient/mgmt/network/privatelinkservices.go
index de4bd947c..3d6fbef3d 100644
--- a/pkg/util/azureclient/mgmt/network/privatelinkservices.go
+++ b/pkg/util/azureclient/mgmt/network/privatelinkservices.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // PrivateLinkServicesClient is a minimal interface for azure PrivateLinkServicesClient
@@ -25,7 +24,7 @@ type privateLinkServicesClient struct {
 var _ PrivateLinkServicesClient = &privateLinkServicesClient{}
 
 // NewPrivateLinkServicesClient creates a new PrivateLinkServicesClient
-func NewPrivateLinkServicesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PrivateLinkServicesClient {
+func NewPrivateLinkServicesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) PrivateLinkServicesClient {
 	client := mgmtnetwork.NewPrivateLinkServicesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/publicipaddresses.go b/pkg/util/azureclient/mgmt/network/publicipaddresses.go
index 1a0b9ce2c..804a3c2ba 100644
--- a/pkg/util/azureclient/mgmt/network/publicipaddresses.go
+++ b/pkg/util/azureclient/mgmt/network/publicipaddresses.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // PublicIPAddressesClient is a minimal interface for azure PublicIPAddressesClient
@@ -26,7 +25,7 @@ type publicIPAddressesClient struct {
 var _ PublicIPAddressesClient = &publicIPAddressesClient{}
 
 // NewPublicIPAddressesClient creates a new PublicIPAddressesClient
-func NewPublicIPAddressesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PublicIPAddressesClient {
+func NewPublicIPAddressesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) PublicIPAddressesClient {
 	client := mgmtnetwork.NewPublicIPAddressesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/routetable.go b/pkg/util/azureclient/mgmt/network/routetable.go
index abcf891e9..c55a7622d 100644
--- a/pkg/util/azureclient/mgmt/network/routetable.go
+++ b/pkg/util/azureclient/mgmt/network/routetable.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // RouteTablesClient is a minimal interface for azure RouteTablesClient
@@ -25,7 +24,7 @@ type routeTablesClient struct {
 var _ RouteTablesClient = &routeTablesClient{}
 
 // NewRouteTablesClient creates a new RouteTablesClient
-func NewRouteTablesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RouteTablesClient {
+func NewRouteTablesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) RouteTablesClient {
 	client := mgmtnetwork.NewRouteTablesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/securitygroups.go b/pkg/util/azureclient/mgmt/network/securitygroups.go
index 84d96ac92..3736416cc 100644
--- a/pkg/util/azureclient/mgmt/network/securitygroups.go
+++ b/pkg/util/azureclient/mgmt/network/securitygroups.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // SecurityGroupsClient is a minimal interface for azure SecurityGroupsClient
@@ -25,7 +24,7 @@ type securityGroupsClient struct {
 var _ SecurityGroupsClient = &securityGroupsClient{}
 
 // NewSecurityGroupsClient creates a new SecurityGroupsClient
-func NewSecurityGroupsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) SecurityGroupsClient {
+func NewSecurityGroupsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) SecurityGroupsClient {
 	client := mgmtnetwork.NewSecurityGroupsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/subnets.go b/pkg/util/azureclient/mgmt/network/subnets.go
index 52397902d..afb60cc95 100644
--- a/pkg/util/azureclient/mgmt/network/subnets.go
+++ b/pkg/util/azureclient/mgmt/network/subnets.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // SubnetsClient is a minimal interface for azure SubnetsClient
@@ -25,7 +24,7 @@ type subnetsClient struct {
 var _ SubnetsClient = &subnetsClient{}
 
 // NewSubnetsClient creates a new SubnetsClient
-func NewSubnetsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) SubnetsClient {
+func NewSubnetsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) SubnetsClient {
 	client := mgmtnetwork.NewSubnetsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/usage.go b/pkg/util/azureclient/mgmt/network/usage.go
index 4ca845f77..73a932a9a 100644
--- a/pkg/util/azureclient/mgmt/network/usage.go
+++ b/pkg/util/azureclient/mgmt/network/usage.go
@@ -6,8 +6,7 @@ package network
 import (
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // UsageClient is a minimal interface for azure UsageClient
@@ -22,7 +21,7 @@ type usageClient struct {
 var _ UsageClient = &usageClient{}
 
 // NewUsageClient creates a new UsageClient
-func NewUsageClient(environment *azureclient.AROEnvironment, tenantID string, authorizer autorest.Authorizer) UsageClient {
+func NewUsageClient(environment *azure.Environment, tenantID string, authorizer autorest.Authorizer) UsageClient {
 	client := mgmtnetwork.NewUsagesClientWithBaseURI(environment.ResourceManagerEndpoint, tenantID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go
index d50085b62..1a0279af0 100644
--- a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go
+++ b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 type VirtualNetworkPeeringsClient interface {
@@ -26,7 +25,7 @@ type virtualNetworkPeeringsClient struct {
 var _ VirtualNetworkPeeringsClient = &virtualNetworkPeeringsClient{}
 
 // NewVirtualNetworkPeeringsClient creates a new VirtualNetworkPeeringsClient
-func NewVirtualNetworkPeeringsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworkPeeringsClient {
+func NewVirtualNetworkPeeringsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworkPeeringsClient {
 	client := mgmtnetwork.NewVirtualNetworkPeeringsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/network/virtualnetworks.go b/pkg/util/azureclient/mgmt/network/virtualnetworks.go
index 3c1a4a680..b3728808e 100644
--- a/pkg/util/azureclient/mgmt/network/virtualnetworks.go
+++ b/pkg/util/azureclient/mgmt/network/virtualnetworks.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-07-01/network"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // VirtualNetworksClient is a minimal interface for azure VirtualNetworksClient
@@ -26,7 +25,7 @@ type virtualNetworksClient struct {
 var _ VirtualNetworksClient = &virtualNetworksClient{}
 
 // NewVirtualNetworksClient creates a new VirtualNetworksClient
-func NewVirtualNetworksClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworksClient {
+func NewVirtualNetworksClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworksClient {
 	client := mgmtnetwork.NewVirtualNetworksClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/privatedns/privatezones.go b/pkg/util/azureclient/mgmt/privatedns/privatezones.go
index 8fb2c402f..452c2e7dd 100644
--- a/pkg/util/azureclient/mgmt/privatedns/privatezones.go
+++ b/pkg/util/azureclient/mgmt/privatedns/privatezones.go
@@ -6,8 +6,7 @@ package privatedns
 import (
 	mgmtprivatedns "github.com/Azure/azure-sdk-for-go/services/privatedns/mgmt/2018-09-01/privatedns"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // PrivateZonesClient is a minimal interface for azure PrivateZonesClient
@@ -22,7 +21,7 @@ type privateZonesClient struct {
 var _ PrivateZonesClient = &privateZonesClient{}
 
 // NewPrivateZonesClient creates a new PrivateZonesClient
-func NewPrivateZonesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PrivateZonesClient {
+func NewPrivateZonesClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) PrivateZonesClient {
 	client := mgmtprivatedns.NewPrivateZonesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go b/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go
index 9872e8460..982c0b324 100644
--- a/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go
+++ b/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go
@@ -6,8 +6,7 @@ package privatedns
 import (
 	mgmtprivatedns "github.com/Azure/azure-sdk-for-go/services/privatedns/mgmt/2018-09-01/privatedns"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // VirtualNetworkLinksClient is a minimal interface for azure VirtualNetworkLinksClient
@@ -22,7 +21,7 @@ type virtualNetworkLinksClient struct {
 var _ VirtualNetworkLinksClient = &virtualNetworkLinksClient{}
 
 // NewVirtualNetworkLinksClient creates a new VirtualNetworkLinksClient
-func NewVirtualNetworkLinksClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworkLinksClient {
+func NewVirtualNetworkLinksClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworkLinksClient {
 	client := mgmtprivatedns.NewVirtualNetworkLinksClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/openshiftclusters.go b/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/openshiftclusters.go
index 1fe18d47d..65f1e704a 100644
--- a/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/openshiftclusters.go
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/openshiftclusters.go
@@ -10,10 +10,10 @@ import (
 	"time"
 
 	"github.com/Azure/go-autorest/autorest"
+	"github.com/Azure/go-autorest/autorest/azure"
 
 	mgmtredhatopenshift20200430 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2020-04-30/redhatopenshift"
 	"github.com/Azure/ARO-RP/pkg/env"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 // OpenShiftClustersClient is a minimal interface for azure OpenshiftClustersClient
@@ -30,7 +30,7 @@ type openShiftClustersClient struct {
 var _ OpenShiftClustersClient = &openShiftClustersClient{}
 
 // NewOpenShiftClustersClient creates a new OpenShiftClustersClient
-func NewOpenShiftClustersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) OpenShiftClustersClient {
+func NewOpenShiftClustersClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) OpenShiftClustersClient {
 	var client mgmtredhatopenshift20200430.OpenShiftClustersClient
 	if env.IsLocalDevelopmentMode() {
 		client = mgmtredhatopenshift20200430.NewOpenShiftClustersClientWithBaseURI("https://localhost:8443", subscriptionID)
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/operations.go b/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/operations.go
index a1590761c..22c1fedd8 100644
--- a/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/operations.go
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift/operations.go
@@ -8,10 +8,10 @@ import (
 	"net/http"
 
 	"github.com/Azure/go-autorest/autorest"
+	"github.com/Azure/go-autorest/autorest/azure"
 
 	mgmtredhatopenshift20200430 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2020-04-30/redhatopenshift"
 	"github.com/Azure/ARO-RP/pkg/env"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 // OperationsClient is a minimal interface for azure OperationsClient
@@ -26,7 +26,7 @@ type operationsClient struct {
 var _ OperationsClient = &operationsClient{}
 
 // NewOperationsClient creates a new OperationsClient
-func NewOperationsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) OperationsClient {
+func NewOperationsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) OperationsClient {
 	var client mgmtredhatopenshift20200430.OperationsClient
 	if env.IsLocalDevelopmentMode() {
 		client = mgmtredhatopenshift20200430.NewOperationsClientWithBaseURI("https://localhost:8443", subscriptionID)
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/openshiftclusters.go b/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/openshiftclusters.go
index 8db00f578..cdf9cc6d8 100644
--- a/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/openshiftclusters.go
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/openshiftclusters.go
@@ -10,10 +10,10 @@ import (
 	"time"
 
 	"github.com/Azure/go-autorest/autorest"
+	"github.com/Azure/go-autorest/autorest/azure"
 
 	mgmtredhatopenshift20210131preview "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2021-01-31-preview/redhatopenshift"
 	"github.com/Azure/ARO-RP/pkg/env"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 // OpenShiftClustersClient is a minimal interface for azure OpenshiftClustersClient
@@ -30,7 +30,7 @@ type openShiftClustersClient struct {
 var _ OpenShiftClustersClient = &openShiftClustersClient{}
 
 // NewOpenShiftClustersClient creates a new OpenShiftClustersClient
-func NewOpenShiftClustersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) OpenShiftClustersClient {
+func NewOpenShiftClustersClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) OpenShiftClustersClient {
 	var client mgmtredhatopenshift20210131preview.OpenShiftClustersClient
 	if env.IsLocalDevelopmentMode() {
 		client = mgmtredhatopenshift20210131preview.NewOpenShiftClustersClientWithBaseURI("https://localhost:8443", subscriptionID)
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/operations.go b/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/operations.go
index cd97601e1..2e8226338 100644
--- a/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/operations.go
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2021-01-31-preview/redhatopenshift/operations.go
@@ -8,10 +8,10 @@ import (
 	"net/http"
 
 	"github.com/Azure/go-autorest/autorest"
+	"github.com/Azure/go-autorest/autorest/azure"
 
 	mgmtredhatopenshift20210131preview "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2021-01-31-preview/redhatopenshift"
 	"github.com/Azure/ARO-RP/pkg/env"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 // OperationsClient is a minimal interface for azure OperationsClient
@@ -26,7 +26,7 @@ type operationsClient struct {
 var _ OperationsClient = &operationsClient{}
 
 // NewOperationsClient creates a new OperationsClient
-func NewOperationsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) OperationsClient {
+func NewOperationsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) OperationsClient {
 	var client mgmtredhatopenshift20210131preview.OperationsClient
 	if env.IsLocalDevelopmentMode() {
 		client = mgmtredhatopenshift20210131preview.NewOperationsClientWithBaseURI("https://localhost:8443", subscriptionID)
diff --git a/pkg/util/azureclient/mgmt/storage/accounts.go b/pkg/util/azureclient/mgmt/storage/accounts.go
index cc70d4b2e..2a9803bd2 100644
--- a/pkg/util/azureclient/mgmt/storage/accounts.go
+++ b/pkg/util/azureclient/mgmt/storage/accounts.go
@@ -8,8 +8,7 @@ import (
 
 	mgmtstorage "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-04-01/storage"
 	"github.com/Azure/go-autorest/autorest"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 // AccountsClient is a minimal interface for azure AccountsClient
@@ -26,7 +25,7 @@ type accountsClient struct {
 var _ AccountsClient = &accountsClient{}
 
 // NewAccountsClient returns a new AccountsClient
-func NewAccountsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) AccountsClient {
+func NewAccountsClient(environment *azure.Environment, subscriptionID string, authorizer autorest.Authorizer) AccountsClient {
 	client := mgmtstorage.NewAccountsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
 	client.Authorizer = authorizer
 
diff --git a/pkg/util/cluster/aad.go b/pkg/util/cluster/aad.go
index fcc217cb4..b6d0d335a 100644
--- a/pkg/util/cluster/aad.go
+++ b/pkg/util/cluster/aad.go
@@ -38,12 +38,9 @@ func (c *Cluster) getServicePrincipal(ctx context.Context, appID string) (string
 func (c *Cluster) createApplication(ctx context.Context, displayName string) (string, string, error) {
 	password := uuid.Must(uuid.NewV4()).String()
 
-	// example value: https://test.aro.azure.com/11111111-1111-1111-1111-111111111111
-	identifierURI := "https://test." + c.env.Environment().AppSuffix + "/" + uuid.Must(uuid.NewV4()).String()
-
 	app, err := c.applications.Create(ctx, azgraphrbac.ApplicationCreateParameters{
 		DisplayName:    &displayName,
-		IdentifierUris: &[]string{identifierURI},
+		IdentifierUris: &[]string{"https://test.aro.azure.com/" + uuid.Must(uuid.NewV4()).String()},
 		PasswordCredentials: &[]azgraphrbac.PasswordCredential{
 			{
 				EndDate: &date.Time{Time: time.Now().AddDate(1, 0, 0)},
diff --git a/pkg/util/cluster/cluster.go b/pkg/util/cluster/cluster.go
index ac1ecd12f..b658f0c76 100644
--- a/pkg/util/cluster/cluster.go
+++ b/pkg/util/cluster/cluster.go
@@ -35,7 +35,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/deploy/generator"
 	"github.com/Azure/ARO-RP/pkg/env"
 	"github.com/Azure/ARO-RP/pkg/util/arm"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/graphrbac"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/authorization"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
@@ -123,7 +122,7 @@ func New(log *logrus.Entry, env env.Core, ci bool) (*Cluster, error) {
 		} else {
 			// This is dirty, but it used to be hard coded only for pub cloud.
 			// TODO pick right config value to get sub and resource group
-			if env.Environment().Name == azureclient.USGovernmentCloud.Name {
+			if env.Environment().Name == azure.USGovernmentCloud.Name {
 				c.ciParentVnet = "/subscriptions/28015960-ee66-4844-8037-fc28b0560bf1/resourceGroups/e2einfra-usgovvirginia/providers/Microsoft.Network/virtualNetworks/dev-vnet"
 			} else {
 				// default to prior behavior, public cloud int
diff --git a/pkg/util/instancemetadata/dev.go b/pkg/util/instancemetadata/dev.go
index 22b410685..a307b7507 100644
--- a/pkg/util/instancemetadata/dev.go
+++ b/pkg/util/instancemetadata/dev.go
@@ -7,7 +7,7 @@ import (
 	"fmt"
 	"os"
 
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 func NewDev(checkEnv bool) (InstanceMetadata, error) {
@@ -24,10 +24,10 @@ func NewDev(checkEnv bool) (InstanceMetadata, error) {
 		}
 	}
 
-	environment := azureclient.PublicCloud
+	environment := azure.PublicCloud
 	if value, found := os.LookupEnv("AZURE_ENVIRONMENT"); found {
 		var err error
-		environment, err = azureclient.EnvironmentFromName(value)
+		environment, err = azure.EnvironmentFromName(value)
 		if err != nil {
 			return nil, err
 		}
diff --git a/pkg/util/instancemetadata/instancemetadata.go b/pkg/util/instancemetadata/instancemetadata.go
index 4d09c037e..8cf125d33 100644
--- a/pkg/util/instancemetadata/instancemetadata.go
+++ b/pkg/util/instancemetadata/instancemetadata.go
@@ -7,9 +7,8 @@ import (
 	"context"
 	"os"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/sirupsen/logrus"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 type InstanceMetadata interface {
@@ -18,7 +17,7 @@ type InstanceMetadata interface {
 	SubscriptionID() string
 	Location() string
 	ResourceGroup() string
-	Environment() *azureclient.AROEnvironment
+	Environment() *azure.Environment
 }
 
 type instanceMetadata struct {
@@ -27,7 +26,7 @@ type instanceMetadata struct {
 	subscriptionID string
 	location       string
 	resourceGroup  string
-	environment    *azureclient.AROEnvironment
+	environment    *azure.Environment
 }
 
 func (im *instanceMetadata) Hostname() string {
@@ -50,11 +49,10 @@ func (im *instanceMetadata) ResourceGroup() string {
 	return im.resourceGroup
 }
 
-func (im *instanceMetadata) Environment() *azureclient.AROEnvironment {
+func (im *instanceMetadata) Environment() *azure.Environment {
 	return im.environment
 }
 
-// New returns a new InstanceMetadata for the given mode, environment, and deployment system
 func New(ctx context.Context, log *logrus.Entry, isLocalDevelopmentMode bool) (InstanceMetadata, error) {
 	if isLocalDevelopmentMode {
 		log.Info("creating development InstanceMetadata")
@@ -64,8 +62,8 @@ func New(ctx context.Context, log *logrus.Entry, isLocalDevelopmentMode bool) (I
 	if os.Getenv("AZURE_EV2") != "" {
 		log.Info("creating InstanceMetadata from Environment")
 		return newProdFromEnv(ctx)
+	} else {
+		log.Info("creating InstanceMetadata from Azure Instance Metadata Service (AIMS)")
+		return newProd(ctx)
 	}
-
-	log.Info("creating InstanceMetadata from Azure Instance Metadata Service (AIMS)")
-	return newProd(ctx)
 }
diff --git a/pkg/util/instancemetadata/prod.go b/pkg/util/instancemetadata/prod.go
index 3fcc57cc4..7844b4445 100644
--- a/pkg/util/instancemetadata/prod.go
+++ b/pkg/util/instancemetadata/prod.go
@@ -12,10 +12,10 @@ import (
 	"strings"
 
 	"github.com/Azure/go-autorest/autorest/adal"
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/form3tech-oss/jwt-go"
 
 	"github.com/Azure/ARO-RP/pkg/util/azureclaim"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 type ServicePrincipalToken interface {
@@ -112,7 +112,7 @@ func (p *prod) populateInstanceMetadata() error {
 		return err
 	}
 
-	environment, err := azureclient.EnvironmentFromName(m.AzEnvironment)
+	environment, err := azure.EnvironmentFromName(m.AzEnvironment)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/util/instancemetadata/prodfromenv.go b/pkg/util/instancemetadata/prodfromenv.go
index 403371ba1..393c586a1 100644
--- a/pkg/util/instancemetadata/prodfromenv.go
+++ b/pkg/util/instancemetadata/prodfromenv.go
@@ -8,24 +8,18 @@ import (
 	"fmt"
 	"os"
 
-	"github.com/Azure/go-autorest/autorest/adal"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+	"github.com/Azure/go-autorest/autorest/azure"
 )
 
 type prodFromEnv struct {
 	instanceMetadata
 
-	newServicePrincipalTokenFromMSI func(string, string) (ServicePrincipalToken, error)
-	Getenv                          func(key string) string
-	LookupEnv                       func(key string) (string, bool)
+	Getenv    func(key string) string
+	LookupEnv func(key string) (string, bool)
 }
 
 func newProdFromEnv(ctx context.Context) (InstanceMetadata, error) {
 	p := &prodFromEnv{
-		newServicePrincipalTokenFromMSI: func(msiEndpoint, resource string) (ServicePrincipalToken, error) {
-			return adal.NewServicePrincipalTokenFromMSI(msiEndpoint, resource)
-		},
 		Getenv:    os.Getenv,
 		LookupEnv: os.LookupEnv,
 	}
@@ -55,11 +49,13 @@ func (p *prodFromEnv) populateInstanceMetadata() error {
 	// optional env variables
 	// * HOSTNAME_OVERRIDE: defaults to os.Hostname()
 
-	environment, err := azureclient.EnvironmentFromName(p.Getenv("AZURE_ENVIRONMENT"))
+	envStr := p.Getenv("AZURE_ENVIRONMENT")
+	environment, err := azure.EnvironmentFromName(envStr)
 	if err != nil {
 		return err
 	}
 	p.environment = &environment
+
 	p.subscriptionID = p.Getenv("AZURE_SUBSCRIPTION_ID")
 	p.tenantID = p.Getenv("AZURE_TENANT_ID")
 	p.location = p.Getenv("LOCATION")
diff --git a/pkg/util/mocks/env/env.go b/pkg/util/mocks/env/env.go
index 30056eb35..1658ca702 100644
--- a/pkg/util/mocks/env/env.go
+++ b/pkg/util/mocks/env/env.go
@@ -12,10 +12,10 @@ import (
 	reflect "reflect"
 
 	autorest "github.com/Azure/go-autorest/autorest"
+	azure "github.com/Azure/go-autorest/autorest/azure"
 	gomock "github.com/golang/mock/gomock"
 
 	env "github.com/Azure/ARO-RP/pkg/env"
-	azureclient "github.com/Azure/ARO-RP/pkg/util/azureclient"
 	clientauthorizer "github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	keyvault "github.com/Azure/ARO-RP/pkg/util/keyvault"
 	refreshable "github.com/Azure/ARO-RP/pkg/util/refreshable"
@@ -45,10 +45,10 @@ func (m *MockCore) EXPECT() *MockCoreMockRecorder {
 }
 
 // Environment mocks base method.
-func (m *MockCore) Environment() *azureclient.AROEnvironment {
+func (m *MockCore) Environment() *azure.Environment {
 	m.ctrl.T.Helper()
 	ret := m.ctrl.Call(m, "Environment")
-	ret0, _ := ret[0].(*azureclient.AROEnvironment)
+	ret0, _ := ret[0].(*azure.Environment)
 	return ret0
 }
 
@@ -351,10 +351,10 @@ func (mr *MockInterfaceMockRecorder) EnsureARMResourceGroupRoleAssignment(arg0,
 }
 
 // Environment mocks base method.
-func (m *MockInterface) Environment() *azureclient.AROEnvironment {
+func (m *MockInterface) Environment() *azure.Environment {
 	m.ctrl.T.Helper()
 	ret := m.ctrl.Call(m, "Environment")
-	ret0, _ := ret[0].(*azureclient.AROEnvironment)
+	ret0, _ := ret[0].(*azure.Environment)
 	return ret0
 }
 
diff --git a/pkg/util/mocks/instancemetadata/instancemetadata.go b/pkg/util/mocks/instancemetadata/instancemetadata.go
index d27bbf6dd..cdf394275 100644
--- a/pkg/util/mocks/instancemetadata/instancemetadata.go
+++ b/pkg/util/mocks/instancemetadata/instancemetadata.go
@@ -8,9 +8,8 @@ import (
 	context "context"
 	reflect "reflect"
 
+	azure "github.com/Azure/go-autorest/autorest/azure"
 	gomock "github.com/golang/mock/gomock"
-
-	azureclient "github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 // MockServicePrincipalToken is a mock of ServicePrincipalToken interface.
@@ -88,10 +87,10 @@ func (m *MockInstanceMetadata) EXPECT() *MockInstanceMetadataMockRecorder {
 }
 
 // Environment mocks base method.
-func (m *MockInstanceMetadata) Environment() *azureclient.AROEnvironment {
+func (m *MockInstanceMetadata) Environment() *azure.Environment {
 	m.ctrl.T.Helper()
 	ret := m.ctrl.Call(m, "Environment")
-	ret0, _ := ret[0].(*azureclient.AROEnvironment)
+	ret0, _ := ret[0].(*azure.Environment)
 	return ret0
 }
 
diff --git a/pkg/util/storage/manager.go b/pkg/util/storage/manager.go
index 2db2f8c0b..066367b18 100644
--- a/pkg/util/storage/manager.go
+++ b/pkg/util/storage/manager.go
@@ -52,7 +52,7 @@ func (m *manager) BlobService(ctx context.Context, resourceGroup, account string
 		return nil, err
 	}
 
-	blobcli := azstorage.NewAccountSASClient(account, v, (*m.env.Environment()).Environment).GetBlobService()
+	blobcli := azstorage.NewAccountSASClient(account, v, *m.env.Environment()).GetBlobService()
 
 	return &blobcli, nil
 }


Test patch:
diff --git a/pkg/frontend/security_test.go b/pkg/frontend/security_test.go
index a7e268626..c1eb99a0f 100644
--- a/pkg/frontend/security_test.go
+++ b/pkg/frontend/security_test.go
@@ -12,13 +12,13 @@ import (
 	"testing"
 	"time"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 	"github.com/sirupsen/logrus"
 
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/env"
 	"github.com/Azure/ARO-RP/pkg/metrics/noop"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	"github.com/Azure/ARO-RP/pkg/util/log/audit"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
@@ -57,7 +57,7 @@ func TestSecurity(t *testing.T) {
 
 	_env := mock_env.NewMockInterface(controller)
 	_env.EXPECT().IsLocalDevelopmentMode().AnyTimes().Return(false)
-	_env.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+	_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 	_env.EXPECT().Hostname().AnyTimes().Return("testhost")
 	_env.EXPECT().Location().AnyTimes().Return("eastus")
 	_env.EXPECT().ServiceKeyvault().AnyTimes().Return(keyvault)
diff --git a/pkg/frontend/shared_test.go b/pkg/frontend/shared_test.go
index b1ea058ae..215f9d17f 100644
--- a/pkg/frontend/shared_test.go
+++ b/pkg/frontend/shared_test.go
@@ -16,6 +16,7 @@ import (
 	"reflect"
 	"testing"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/go-test/deep"
 	"github.com/golang/mock/gomock"
 	"github.com/sirupsen/logrus"
@@ -24,7 +25,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/database"
 	"github.com/Azure/ARO-RP/pkg/database/cosmosdb"
 	"github.com/Azure/ARO-RP/pkg/env"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 	mock_keyvault "github.com/Azure/ARO-RP/pkg/util/mocks/keyvault"
@@ -90,7 +90,7 @@ func newTestInfra(t *testing.T) *testInfra {
 
 	_env := mock_env.NewMockInterface(controller)
 	_env.EXPECT().IsLocalDevelopmentMode().AnyTimes().Return(false)
-	_env.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+	_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 	_env.EXPECT().Hostname().AnyTimes().Return("testhost")
 	_env.EXPECT().Location().AnyTimes().Return("eastus")
 	_env.EXPECT().ServiceKeyvault().AnyTimes().Return(keyvault)
diff --git a/pkg/operator/controllers/checker/serviceprincipalchecker_test.go b/pkg/operator/controllers/checker/serviceprincipalchecker_test.go
index 07c798787..7bd137702 100644
--- a/pkg/operator/controllers/checker/serviceprincipalchecker_test.go
+++ b/pkg/operator/controllers/checker/serviceprincipalchecker_test.go
@@ -53,7 +53,7 @@ func TestServicePrincipalValid(t *testing.T) {
 					ResourceID:    "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myresourcegroup/providers/Microsoft.RedHatOpenShift/openShiftClusters/mycluster",
 				},
 			},
-			wantErr: `cloud environment "NEVERLAND" is unsupported by ARO`,
+			wantErr: `autorest/azure: There is no cloud environment matching the name "NEVERLAND"`,
 		},
 		{
 			name: "fail: azure-credential secret doesn't exist",
diff --git a/pkg/operator/controllers/monitoring/monitoring_controller_test.go b/pkg/operator/controllers/monitoring/monitoring_controller_test.go
index f237f0e4d..79d837e95 100644
--- a/pkg/operator/controllers/monitoring/monitoring_controller_test.go
+++ b/pkg/operator/controllers/monitoring/monitoring_controller_test.go
@@ -5,6 +5,7 @@ package monitoring
 
 import (
 	"context"
+	"reflect"
 	"strings"
 	"testing"
 
@@ -12,8 +13,11 @@ import (
 	"github.com/ugorji/go/codec"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/kubernetes/fake"
 	ctrl "sigs.k8s.io/controller-runtime"
+
+	"github.com/Azure/ARO-RP/pkg/util/cmp"
 )
 
 var cmMetadata = metav1.ObjectMeta{Name: "cluster-monitoring-config", Namespace: "openshift-monitoring"}
@@ -21,61 +25,33 @@ var cmMetadata = metav1.ObjectMeta{Name: "cluster-monitoring-config", Namespace:
 func TestReconcileMonitoringConfig(t *testing.T) {
 	log := logrus.NewEntry(logrus.StandardLogger())
 	type test struct {
-		name         string
-		setConfigMap func() *Reconciler
-		wantConfig   string
+		name          string
+		kubernetescli kubernetes.Interface
+		wantConfig    string
 	}
 
 	for _, tt := range []*test{
 		{
-			name: "ConfigMap does not exist - enable",
-			setConfigMap: func() *Reconciler {
-				return &Reconciler{
-					kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{}),
-					log:           log,
-					jsonHandle:    new(codec.JsonHandle),
-				}
-			},
-			wantConfig: `
-{}`,
-		},
-		{
-			name: "ConfigMap does not have data",
-			setConfigMap: func() *Reconciler {
-				return &Reconciler{
-					kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
-						ObjectMeta: cmMetadata,
-					}),
-					log:        log,
-					jsonHandle: new(codec.JsonHandle),
-				}
-			},
-			wantConfig: ``,
+			name:          "ConfigMap does not exist - enable",
+			kubernetescli: fake.NewSimpleClientset(),
+			wantConfig:    `{}`,
 		},
 		{
 			name: "empty config.yaml",
-			setConfigMap: func() *Reconciler {
-				return &Reconciler{
-					kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
-						ObjectMeta: cmMetadata,
-						Data: map[string]string{
-							"config.yaml": ``,
-						},
-					}),
-					log:        log,
-					jsonHandle: new(codec.JsonHandle),
-				}
-			},
+			kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
+				ObjectMeta: cmMetadata,
+				Data: map[string]string{
+					"config.yaml": ``,
+				},
+			}),
 			wantConfig: ``,
 		},
 		{
 			name: "settings restored to default and extra fields are preserved",
-			setConfigMap: func() *Reconciler {
-				return &Reconciler{
-					kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
-						ObjectMeta: cmMetadata,
-						Data: map[string]string{
-							"config.yaml": `
+			kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
+				ObjectMeta: cmMetadata,
+				Data: map[string]string{
+					"config.yaml": `
 prometheusK8s:
   extraField: prometheus
   retention: 1d
@@ -100,39 +76,51 @@ alertmanagerMain:
         storageClassName: snail-mail
         volumeMode: Filesystem
 `,
-						},
-					}),
-					log:        log,
-					jsonHandle: new(codec.JsonHandle),
-				}
-			},
+				},
+			}),
 			wantConfig: `
 alertmanagerMain:
   extraField: yeet
 prometheusK8s:
   extraField: prometheus
+`,
+		},
+		{
+			name: "empty volumeClaimTemplate struct is cleared out",
+			kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
+				ObjectMeta: cmMetadata,
+				Data: map[string]string{
+					"config.yaml": `
+alertmanagerMain:
+  volumeClaimTemplate: {}
+  extraField: alertmanager
+prometheusK8s:
+  volumeClaimTemplate: {}
+  bugs: not-here
+`,
+				},
+			}),
+			wantConfig: `
+alertmanagerMain:
+  extraField: alertmanager
+prometheusK8s:
+  bugs: not-here
 `,
 		},
 		{
 			name: "other monitoring components are configured",
-			setConfigMap: func() *Reconciler {
-				return &Reconciler{
-					kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
-						ObjectMeta: cmMetadata,
-						Data: map[string]string{
-							"config.yaml": `
+			kubernetescli: fake.NewSimpleClientset(&corev1.ConfigMap{
+				ObjectMeta: cmMetadata,
+				Data: map[string]string{
+					"config.yaml": `
 alertmanagerMain:
   nodeSelector:
     foo: bar
 somethingElse:
   configured: true
 `,
-						},
-					}),
-					log:        log,
-					jsonHandle: new(codec.JsonHandle),
-				}
-			},
+				},
+			}),
 			wantConfig: `
 alertmanagerMain:
   nodeSelector:
@@ -143,8 +131,12 @@ somethingElse:
 		},
 	} {
 		t.Run(tt.name, func(t *testing.T) {
+			r := &Reconciler{
+				kubernetescli: tt.kubernetescli,
+				log:           log,
+				jsonHandle:    new(codec.JsonHandle),
+			}
 			ctx := context.Background()
-			r := tt.setConfigMap()
 			request := ctrl.Request{}
 			request.Name = "cluster-monitoring-config"
 			request.Namespace = "openshift-monitoring"
@@ -165,3 +157,98 @@ somethingElse:
 		})
 	}
 }
+
+func TestReconcilePVC(t *testing.T) {
+	log := logrus.NewEntry(logrus.StandardLogger())
+	tests := []struct {
+		name          string
+		kubernetescli kubernetes.Interface
+		want          []corev1.PersistentVolumeClaim
+	}{
+		{
+			name: "Should delete the prometheus PVCs",
+			kubernetescli: fake.NewSimpleClientset(&corev1.PersistentVolumeClaim{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "prometheus-k8s-db-prometheus-k8s-0",
+					Namespace: "openshift-monitoring",
+					Labels: map[string]string{
+						"app":        "prometheus",
+						"prometheus": "k8s",
+					},
+				},
+			},
+				&corev1.PersistentVolumeClaim{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "prometheus-k8s-db-prometheus-k8s-1",
+						Namespace: "openshift-monitoring",
+						Labels: map[string]string{
+							"app":        "prometheus",
+							"prometheus": "k8s",
+						},
+					},
+				}),
+			want: nil,
+		},
+		{
+			name: "Should preserve 1 pvc",
+			kubernetescli: fake.NewSimpleClientset(&corev1.PersistentVolumeClaim{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "prometheus-k8s-db-prometheus-k8s-0",
+					Namespace: "openshift-monitoring",
+					Labels: map[string]string{
+						"app":        "prometheus",
+						"prometheus": "k8s",
+					},
+				},
+			},
+				&corev1.PersistentVolumeClaim{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "random-pvc",
+						Namespace: "openshift-monitoring",
+						Labels: map[string]string{
+							"app": "random",
+						},
+					},
+				}),
+			want: []corev1.PersistentVolumeClaim{
+				{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "random-pvc",
+						Namespace: "openshift-monitoring",
+						Labels: map[string]string{
+							"app": "random",
+						},
+					},
+				},
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			ctx := context.Background()
+			r := &Reconciler{
+				log:           log,
+				kubernetescli: tt.kubernetescli,
+				jsonHandle:    new(codec.JsonHandle),
+			}
+			request := ctrl.Request{}
+			request.Name = "cluster-monitoring-config"
+			request.Namespace = "openshift-monitoring"
+
+			_, err := r.Reconcile(ctx, request)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			pvcList, err := r.kubernetescli.CoreV1().PersistentVolumeClaims(monitoringName.Namespace).List(context.Background(), metav1.ListOptions{})
+			if err != nil {
+				t.Fatalf("Unexpected error during list of PVCs: %v", err)
+			}
+
+			if !reflect.DeepEqual(pvcList.Items, tt.want) {
+				t.Error(cmp.Diff(pvcList.Items, tt.want))
+			}
+		})
+	}
+}
diff --git a/pkg/operator/controllers/workaround/cleanprompvc_test.go b/pkg/operator/controllers/workaround/cleanprompvc_test.go
deleted file mode 100644
index 028e7dc90..000000000
--- a/pkg/operator/controllers/workaround/cleanprompvc_test.go
+++ /dev/null
@@ -1,150 +0,0 @@
-package workaround
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-	"testing"
-
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/client-go/kubernetes/fake"
-
-	utillog "github.com/Azure/ARO-RP/pkg/util/log"
-)
-
-func TestCleanPromPVCEnsure(t *testing.T) {
-
-	pvc0 := corev1.PersistentVolumeClaim{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "prometheus-k8s-db-prometheus-k8s-00",
-			Namespace: "openshift-monitoring",
-			Labels: map[string]string{
-				"app":        "prometheus",
-				"prometheus": "k8s",
-			},
-		},
-	}
-
-	pvc1 := corev1.PersistentVolumeClaim{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "prometheus-k8s-db-prometheus-k8s-0",
-			Namespace: "openshift-monitoring",
-			Labels: map[string]string{
-				"app":        "prometheus",
-				"prometheus": "k8s",
-			},
-		},
-	}
-
-	pvc2 := corev1.PersistentVolumeClaim{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "prometheus-k8s-db-prometheus-k8s-1",
-			Namespace: "openshift-monitoring",
-			Labels: map[string]string{
-				"app":        "prometheus",
-				"prometheus": "k8s",
-			},
-		},
-	}
-
-	pvc3 := corev1.PersistentVolumeClaim{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "dummy",
-			Namespace: "openshift-monitoring",
-		},
-	}
-
-	tests := []struct {
-		name       string
-		cli        *fake.Clientset
-		wantPVCNum int
-		wantErr    error
-	}{
-		{
-			name:       "Should delete the prometheus PVCs",
-			cli:        fake.NewSimpleClientset(&pvc1, &pvc2, &pvc3),
-			wantPVCNum: 1,
-			wantErr:    nil,
-		},
-		{
-			name:       "Should not delete the prometheus PVCs, too many items",
-			cli:        fake.NewSimpleClientset(&pvc1, &pvc2, &pvc3, &pvc0),
-			wantPVCNum: 1,
-			wantErr:    nil,
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			w := NewCleanFromPVCWorkaround(utillog.GetLogger(), tt.cli)
-			err := w.Ensure(context.Background())
-			if err != tt.wantErr {
-				t.Fatalf("Unexpected error\nwant: %v\ngot: %v", tt.wantErr, err)
-			}
-
-			pvcList, err := tt.cli.CoreV1().PersistentVolumeClaims(monitoringNamespace).List(context.Background(), metav1.ListOptions{})
-			if err != nil {
-				t.Fatalf("Unexpected error during list of PVCs: %v", err)
-			}
-			if len(pvcList.Items) != tt.wantPVCNum {
-				t.Fatalf("Unexpected number of PVCs\nwant: %d\ngot: %d", tt.wantPVCNum, len(pvcList.Items))
-			}
-		})
-	}
-}
-
-func TestCleanPromPVCIsRequired(t *testing.T) {
-	newKubernetesCli := func(config string) *fake.Clientset {
-		configMap := corev1.ConfigMap{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:      monitoringName,
-				Namespace: monitoringNamespace,
-			},
-			Data: make(map[string]string),
-		}
-
-		configMap.Data["config.yaml"] = config
-
-		return fake.NewSimpleClientset(&configMap)
-	}
-
-	tests := []struct {
-		name         string
-		kcli         *fake.Clientset
-		wantRequired bool
-	}{
-		{
-			name: "Should not be required, persistent set true",
-			kcli: newKubernetesCli(`prometheusK8s:
-  retention: 15d
-  volumeClaimTemplate:
-    spec:
-      resources:
-        requests:
-          storage: 100Gi
-            `),
-			wantRequired: false,
-		},
-		{
-			name: "Should be required, persistent set to false",
-			kcli: newKubernetesCli(`prometheusK8s:
-  retention: ""
-  volumeClaimTemplate: {}
-`),
-			wantRequired: true,
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			w := NewCleanFromPVCWorkaround(utillog.GetLogger(), tt.kcli)
-			required := w.IsRequired(nil)
-			if required != tt.wantRequired {
-				t.Fatalf("Unexpected workaroud required result\nwant: %t\ngot: %t", tt.wantRequired, required)
-			}
-
-		})
-	}
-}
diff --git a/pkg/portal/kubeconfig/kubeconfig_test.go b/pkg/portal/kubeconfig/kubeconfig_test.go
index 64ee04ef2..782f291b3 100644
--- a/pkg/portal/kubeconfig/kubeconfig_test.go
+++ b/pkg/portal/kubeconfig/kubeconfig_test.go
@@ -12,6 +12,7 @@ import (
 	"reflect"
 	"testing"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 	"github.com/gorilla/mux"
 
@@ -19,7 +20,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/database/cosmosdb"
 	"github.com/Azure/ARO-RP/pkg/portal/middleware"
 	"github.com/Azure/ARO-RP/pkg/portal/util/responsewriter"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 	testdatabase "github.com/Azure/ARO-RP/test/database"
 	testlog "github.com/Azure/ARO-RP/test/util/log"
@@ -139,7 +139,7 @@ func TestNew(t *testing.T) {
 			defer ctrl.Finish()
 
 			_env := mock_env.NewMockInterface(ctrl)
-			_env.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+			_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 			_env.EXPECT().Hostname().AnyTimes().Return("testhost")
 			_env.EXPECT().Location().AnyTimes().Return("eastus")
 
diff --git a/pkg/portal/kubeconfig/proxy_test.go b/pkg/portal/kubeconfig/proxy_test.go
index bdab6089f..b19f7c71e 100644
--- a/pkg/portal/kubeconfig/proxy_test.go
+++ b/pkg/portal/kubeconfig/proxy_test.go
@@ -15,6 +15,7 @@ import (
 	"net/http/httputil"
 	"testing"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 	"github.com/gorilla/mux"
 	clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1"
@@ -22,7 +23,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/database/cosmosdb"
 	"github.com/Azure/ARO-RP/pkg/portal/util/responsewriter"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 	mock_proxy "github.com/Azure/ARO-RP/pkg/util/mocks/proxy"
 	utiltls "github.com/Azure/ARO-RP/pkg/util/tls"
@@ -384,7 +384,7 @@ func TestProxy(t *testing.T) {
 			defer ctrl.Finish()
 
 			_env := mock_env.NewMockInterface(ctrl)
-			_env.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+			_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 			_env.EXPECT().Hostname().AnyTimes().Return("testhost")
 			_env.EXPECT().Location().AnyTimes().Return("eastus")
 
diff --git a/pkg/portal/middleware/aad_test.go b/pkg/portal/middleware/aad_test.go
index 78cbec76b..a62212e20 100644
--- a/pkg/portal/middleware/aad_test.go
+++ b/pkg/portal/middleware/aad_test.go
@@ -17,6 +17,7 @@ import (
 	"testing"
 	"time"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/form3tech-oss/jwt-go"
 	"github.com/go-test/deep"
 	"github.com/gofrs/uuid"
@@ -25,7 +26,6 @@ import (
 	"github.com/gorilla/securecookie"
 	"golang.org/x/oauth2"
 
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 	"github.com/Azure/ARO-RP/pkg/util/oidc"
 	"github.com/Azure/ARO-RP/pkg/util/roundtripper"
@@ -828,7 +828,7 @@ func TestClientAssertion(t *testing.T) {
 	controller := gomock.NewController(t)
 	defer controller.Finish()
 	env := mock_env.NewMockInterface(controller)
-	env.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+	env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 	env.EXPECT().IsLocalDevelopmentMode().AnyTimes().Return(false)
 	env.EXPECT().TenantID().AnyTimes().Return("")
 
diff --git a/pkg/portal/middleware/log_test.go b/pkg/portal/middleware/log_test.go
index 41f7b7600..153ace4e7 100644
--- a/pkg/portal/middleware/log_test.go
+++ b/pkg/portal/middleware/log_test.go
@@ -13,12 +13,12 @@ import (
 	"strings"
 	"testing"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 	"github.com/onsi/gomega"
 	"github.com/onsi/gomega/types"
 	"github.com/sirupsen/logrus"
 
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/log/audit"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 	testlog "github.com/Azure/ARO-RP/test/util/log"
@@ -31,7 +31,7 @@ func TestLog(t *testing.T) {
 	controller := gomock.NewController(t)
 	defer controller.Finish()
 	_env := mock_env.NewMockInterface(controller)
-	_env.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+	_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 	_env.EXPECT().Hostname().AnyTimes().Return("testhost")
 	_env.EXPECT().Location().AnyTimes().Return("eastus")
 
diff --git a/pkg/portal/security_test.go b/pkg/portal/security_test.go
index e08b235a2..f93fffc1b 100644
--- a/pkg/portal/security_test.go
+++ b/pkg/portal/security_test.go
@@ -15,6 +15,7 @@ import (
 	"testing"
 	"time"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 	"github.com/golangci/golangci-lint/pkg/sliceutil"
 	"github.com/gorilla/securecookie"
@@ -22,7 +23,6 @@ import (
 	"github.com/sirupsen/logrus"
 
 	"github.com/Azure/ARO-RP/pkg/portal/middleware"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	"github.com/Azure/ARO-RP/pkg/util/log/audit"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 	utiltls "github.com/Azure/ARO-RP/pkg/util/tls"
@@ -51,7 +51,7 @@ func TestSecurity(t *testing.T) {
 	_env.EXPECT().IsLocalDevelopmentMode().AnyTimes().Return(false)
 	_env.EXPECT().Location().AnyTimes().Return("eastus")
 	_env.EXPECT().TenantID().AnyTimes().Return("00000000-0000-0000-0000-000000000001")
-	_env.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+	_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 	_env.EXPECT().Hostname().AnyTimes().Return("testhost")
 
 	l := listener.NewListener()
@@ -422,10 +422,10 @@ func auditPayloadFixture() *audit.Payload {
 		EnvName:              audit.IFXAuditName,
 		EnvFlags:             257,
 		EnvAppID:             audit.SourceAdminPortal,
-		EnvCloudName:         azureclient.PublicCloud.Name,
+		EnvCloudName:         azure.PublicCloud.Name,
 		EnvCloudRole:         audit.CloudRoleRP,
 		EnvCloudRoleInstance: "testhost",
-		EnvCloudEnvironment:  azureclient.PublicCloud.Name,
+		EnvCloudEnvironment:  azure.PublicCloud.Name,
 		EnvCloudLocation:     "eastus",
 		EnvCloudVer:          1,
 		CallerIdentities: []audit.CallerIdentity{
diff --git a/pkg/util/clientauthorizer/arm_test.go b/pkg/util/clientauthorizer/arm_test.go
index 7045cd9db..bb5e8e4bc 100644
--- a/pkg/util/clientauthorizer/arm_test.go
+++ b/pkg/util/clientauthorizer/arm_test.go
@@ -14,9 +14,9 @@ import (
 	"testing"
 	"time"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	mock_instancemetadata "github.com/Azure/ARO-RP/pkg/util/mocks/instancemetadata"
 )
 
@@ -118,7 +118,7 @@ func TestARMRefreshOnce(t *testing.T) {
 			defer controller.Finish()
 
 			im := mock_instancemetadata.NewMockInstanceMetadata(controller)
-			im.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+			im.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 
 			a := &arm{
 				now: func() time.Time { return time.Date(2020, 1, 20, 0, 0, 0, 0, time.UTC) },
@@ -278,7 +278,7 @@ func TestARMIsAuthorized(t *testing.T) {
 			defer controller.Finish()
 
 			im := mock_instancemetadata.NewMockInstanceMetadata(controller)
-			im.EXPECT().Environment().AnyTimes().Return(&azureclient.PublicCloud)
+			im.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
 
 			a := &arm{
 				im: im,
diff --git a/pkg/util/instancemetadata/prod_test.go b/pkg/util/instancemetadata/prod_test.go
index ef87b71f1..28dc0414f 100644
--- a/pkg/util/instancemetadata/prod_test.go
+++ b/pkg/util/instancemetadata/prod_test.go
@@ -14,9 +14,9 @@ import (
 	"strings"
 	"testing"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 	mock_instancemetadata "github.com/Azure/ARO-RP/pkg/util/mocks/instancemetadata"
 )
 
@@ -27,7 +27,7 @@ func TestPopulateInstanceMetadata(t *testing.T) {
 		wantSubscriptionID string
 		wantLocation       string
 		wantResourceGroup  string
-		wantEnvironment    *azureclient.AROEnvironment
+		wantEnvironment    *azure.Environment
 		wantErr            string
 	}{
 		{
@@ -51,7 +51,7 @@ func TestPopulateInstanceMetadata(t *testing.T) {
 			wantSubscriptionID: "rpSubscriptionId",
 			wantLocation:       "eastus",
 			wantResourceGroup:  "rpResourceGroup",
-			wantEnvironment:    &azureclient.PublicCloud,
+			wantEnvironment:    &azure.PublicCloud,
 		},
 		{
 			name: "valid (US Government Cloud)",
@@ -74,7 +74,7 @@ func TestPopulateInstanceMetadata(t *testing.T) {
 			wantSubscriptionID: "rpSubscriptionId",
 			wantLocation:       "eastus",
 			wantResourceGroup:  "rpResourceGroup",
-			wantEnvironment:    &azureclient.USGovernmentCloud,
+			wantEnvironment:    &azure.USGovernmentCloud,
 		},
 		{
 			name: "invalid JSON",
@@ -222,13 +222,13 @@ func TestPopulateTenantIDFromMSI(t *testing.T) {
 					if msiEndpoint != "http://169.254.169.254/metadata/identity/oauth2/token" {
 						return nil, fmt.Errorf("unexpected endpoint %q", msiEndpoint)
 					}
-					if resource != azureclient.PublicCloud.ResourceManagerEndpoint {
+					if resource != azure.PublicCloud.ResourceManagerEndpoint {
 						return nil, fmt.Errorf("unexpected resource %q", resource)
 					}
 					return token, nil
 				},
 				instanceMetadata: instanceMetadata{
-					environment: &azureclient.PublicCloud,
+					environment: &azure.PublicCloud,
 				},
 			}
 
diff --git a/pkg/util/instancemetadata/prodfromenv_test.go b/pkg/util/instancemetadata/prodfromenv_test.go
index 14f3146f6..cb6119d41 100644
--- a/pkg/util/instancemetadata/prodfromenv_test.go
+++ b/pkg/util/instancemetadata/prodfromenv_test.go
@@ -8,9 +8,8 @@ import (
 	"reflect"
 	"testing"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/google/go-cmp/cmp"
-
-	"github.com/Azure/ARO-RP/pkg/util/azureclient"
 )
 
 func TestProdEnvPopulateInstanceMetadata(t *testing.T) {
@@ -32,14 +31,14 @@ func TestProdEnvPopulateInstanceMetadata(t *testing.T) {
 		{
 			name: "valid environment variables",
 			environment: map[string]string{
-				"AZURE_ENVIRONMENT":     azureclient.PublicCloud.Name,
+				"AZURE_ENVIRONMENT":     azure.PublicCloud.Name,
 				"AZURE_SUBSCRIPTION_ID": "some-sub-guid",
 				"AZURE_TENANT_ID":       "some-tenant-guid",
 				"LOCATION":              "some-region",
 				"RESOURCEGROUP":         "my-resourceGroup",
 			},
 			wantInstanceMetadata: instanceMetadata{
-				environment:    &azureclient.PublicCloud,
+				environment:    &azure.PublicCloud,
 				subscriptionID: "some-sub-guid",
 				tenantID:       "some-tenant-guid",
 				location:       "some-region",
@@ -56,12 +55,12 @@ func TestProdEnvPopulateInstanceMetadata(t *testing.T) {
 				"LOCATION":              "some-region",
 				"RESOURCEGROUP":         "my-resourceGroup",
 			},
-			wantErr: "cloud environment \"ThisEnvDoesNotExist\" is unsupported by ARO",
+			wantErr: "autorest/azure: There is no cloud environment matching the name \"THISENVDOESNOTEXIST\"",
 		},
 		{
 			name: "valid environment variables with hostname override",
 			environment: map[string]string{
-				"AZURE_ENVIRONMENT":     azureclient.PublicCloud.Name,
+				"AZURE_ENVIRONMENT":     azure.PublicCloud.Name,
 				"AZURE_SUBSCRIPTION_ID": "some-sub-guid",
 				"AZURE_TENANT_ID":       "some-tenant-guid",
 				"LOCATION":              "some-region",
@@ -69,7 +68,7 @@ func TestProdEnvPopulateInstanceMetadata(t *testing.T) {
 				"HOSTNAME_OVERRIDE":     "my.over.ride",
 			},
 			wantInstanceMetadata: instanceMetadata{
-				environment:    &azureclient.PublicCloud,
+				environment:    &azure.PublicCloud,
 				subscriptionID: "some-sub-guid",
 				tenantID:       "some-tenant-guid",
 				location:       "some-region",
diff --git a/test/e2e/adminapi_cluster_get.go b/test/e2e/adminapi_cluster_get.go
index 8306173c0..49da92559 100644
--- a/test/e2e/adminapi_cluster_get.go
+++ b/test/e2e/adminapi_cluster_get.go
@@ -27,6 +27,5 @@ var _ = Describe("[Admin API] Get cluster action", func() {
 		// Note: some fields will have empty values
 		// on successfully provisioned cluster (oc.Properties.Install, for example)
 		Expect(oc.Properties.StorageSuffix).ToNot(BeEmpty())
-		Expect(oc.Properties.InfraID).ToNot(BeEmpty())
 	})
 })
diff --git a/test/e2e/operator.go b/test/e2e/operator.go
index 5add00407..c443110ee 100644
--- a/test/e2e/operator.go
+++ b/test/e2e/operator.go
@@ -21,7 +21,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/wait"
 	"k8s.io/client-go/util/retry"
 
-	"github.com/Azure/ARO-RP/pkg/api"
 	arov1alpha1 "github.com/Azure/ARO-RP/pkg/operator/apis/aro.openshift.io/v1alpha1"
 	"github.com/Azure/ARO-RP/pkg/operator/controllers/monitoring"
 	"github.com/Azure/ARO-RP/pkg/util/ready"
@@ -269,8 +268,10 @@ var _ = Describe("ARO Operator - Cluster Monitoring ConfigMap", func() {
 			log.Warn(err)
 		}
 
-		Expect(configData.PrometheusK8s.Retention).To(Equal(""))
-		Expect(configData.PrometheusK8s.VolumeClaimTemplate).To(Equal(struct{ api.MissingFields }{}))
+		Expect(configData.PrometheusK8s.Retention).To(BeEmpty())
+		Expect(configData.PrometheusK8s.VolumeClaimTemplate).To(BeNil())
+		Expect(configData.AlertManagerMain.VolumeClaimTemplate).To(BeNil())
+
 	})
 
 	Specify("cluster monitoring configmap should be restored if deleted", func() {