Repository: Azure/ARO-RP
Pull request #2300 (2022-08-02 18:46:48)

CI E2E in SimplySecure
Signed-off-by: Karan <kmagdani@redhat.com>

### Which issue this PR addresses:

<!--
Please include a link to the ADO work item as well as any GitHub issues.

Usage: `Fixes #<GitHub issue number>`, or `Fixes (paste link of issue)`.
-->
Fixes https://dev.azure.com/msazure/AzureRedHatOpenShift/_boards/board/t/Chainsaw/Stories/?workitem=15123283

### What this PR does / why we need it:

<!--
Include a brief summary of what the PR is intended to accomplish and how the PR
does it. (2-3 sentences)
-->

This PR enables VPN support on our CI-E2E Pipelines. The pipeline connects to a vpn before creating private clusters and  running end to end tests. This will facilitate running pipelines when SimplySecure V2 is enabled on our subscriptions 

### Test plan for issue:

<!--
How did you test that this PR works?

- Are there unit tests?
- Are there integration/e2e tests?
- If it is not possible to write automated tests, explain why and document how
  to manually test and verify the feature.
-->

### Is there any documentation that needs to be updated for this PR?

<!--
- If yes and the docs are in GitHub, include doc updates in the PR.
- If yes and the docs are not in GitHub (i.e. ADO wiki), include a link to the
  docs.
- If no, explain why (e.g. "tech debt cleanup, N/A").
-->


karanmagdani: Example pipeline successful result with VPN solution in a SimplySecure Enabled Subscription https://msazure.visualstudio.com/AzureRedHatOpenShift/_build?definitionId=284186&_a=summary
karanmagdani: Pipeline showing successful execution in RP Health Subscription https://msazure.visualstudio.com/AzureRedHatOpenShift/_build/results?buildId=58931516&view=results

karanmagdani: This cannot be merged until we switchover to using new RP 
swiencki: lgtm
karanmagdani: E2E is expected to fail, but you can see `CI-E2E SS` check passing which is essentially the same e2e with vpn solution
karanmagdani: @bennerv Added changes to aks manifest to remove vpn gateway and add peerings. IMO there is not much benefit in splitting all the vnets in a separate predeploy step as the current manifest already references rp-vnet and rp-pe-vnet-001 from different manifests.

Aks-development.json manifest needs to be run with the expectation that RP is already deployed with the following steps https://github.com/Azure/ARO-RP/blob/master/docs/prepare-a-shared-rp-development-environment.md#deploy-shared-rp-development-environment-once-per-location

Let me know what you think

Patch:
diff --git a/.sha256sum b/.sha256sum
index d82cdd4a0..b3b18318d 100644
--- a/.sha256sum
+++ b/.sha256sum
@@ -1,4 +1,4 @@
 468fa0da0a50d50640ec57843ad288af343128b39f5bf23e76e4e336580883d4  swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2020-04-30/redhatopenshift.json
 c323c84befa5ea11da50a2407050abed6540ea01e796720bc2241604ce80567c  swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/preview/2021-09-01-preview/redhatopenshift.json
 e4e522e41855de71c0318db31cbd96c8713e7a74e7c81911bb494f0b194b3f43  swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-04-01/redhatopenshift.json
-009e7ade338aa2803cb5ef94e3d6057b7093af7ed9b194e51b86e4eb71b4ac05  swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json
+70e23386b8277aea07a1babd61fb2c1252cff46ad032f700b02074fb46a58c4c  swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json
diff --git a/cmd/aro/update_ocp_versions.go b/cmd/aro/update_ocp_versions.go
index 94505ff2c..ea661f8e7 100644
--- a/cmd/aro/update_ocp_versions.go
+++ b/cmd/aro/update_ocp_versions.go
@@ -31,12 +31,10 @@ func getLatestOCPVersions(ctx context.Context, log *logrus.Entry) ([]api.OpenShi
 	var (
 		OpenshiftVersions = []api.OpenShiftVersion{
 			{
-				Properties: api.OpenShiftVersionProperties{
-					Version:           version.InstallStream.Version.String(),
-					OpenShiftPullspec: version.InstallStream.PullSpec,
-					InstallerPullspec: dstRepo + "/aro-installer:release-4.10",
-					Enabled:           true,
-				},
+				Version:           version.InstallStream.Version.String(),
+				OpenShiftPullspec: version.InstallStream.PullSpec,
+				InstallerPullspec: dstRepo + "/aro-installer:release-4.10",
+				Enabled:           true,
 			},
 		}
 	)
@@ -123,13 +121,13 @@ func updateOpenShiftVersions(ctx context.Context, dbOpenShiftVersions database.O
 
 	newVersions := make(map[string]api.OpenShiftVersion)
 	for _, doc := range latestVersions {
-		newVersions[doc.Properties.Version] = doc
+		newVersions[doc.Version] = doc
 	}
 
 	for _, doc := range existingVersions.OpenShiftVersionDocuments {
-		existing, found := newVersions[doc.OpenShiftVersion.Properties.Version]
+		existing, found := newVersions[doc.OpenShiftVersion.Version]
 		if found {
-			log.Printf("Found Version %q, patching", existing.Properties.Version)
+			log.Printf("Found Version %q, patching", existing.Version)
 			_, err := dbOpenShiftVersions.Patch(ctx, doc.ID, func(inFlightDoc *api.OpenShiftVersionDocument) error {
 				inFlightDoc.OpenShiftVersion = &existing
 				return nil
@@ -137,12 +135,12 @@ func updateOpenShiftVersions(ctx context.Context, dbOpenShiftVersions database.O
 			if err != nil {
 				return err
 			}
-			log.Printf("Version %q found", existing.Properties.Version)
-			delete(newVersions, existing.Properties.Version)
+			log.Printf("Version %q found", existing.Version)
+			delete(newVersions, existing.Version)
 			continue
 		}
 
-		log.Printf("Version %q not found, deleting", doc.OpenShiftVersion.Properties.Version)
+		log.Printf("Version %q not found, deleting", doc.OpenShiftVersion.Version)
 		err := dbOpenShiftVersions.Delete(ctx, doc)
 		if err != nil {
 			return err
@@ -150,7 +148,7 @@ func updateOpenShiftVersions(ctx context.Context, dbOpenShiftVersions database.O
 	}
 
 	for _, doc := range newVersions {
-		log.Printf("Version %q not found in database, creating", doc.Properties.Version)
+		log.Printf("Version %q not found in database, creating", doc.Version)
 		newDoc := api.OpenShiftVersionDocument{
 			ID:               dbOpenShiftVersions.NewUUID(),
 			OpenShiftVersion: &doc,
diff --git a/docs/deploy-development-rp.md b/docs/deploy-development-rp.md
index 9fb6d07bd..e8daaaadc 100644
--- a/docs/deploy-development-rp.md
+++ b/docs/deploy-development-rp.md
@@ -216,15 +216,6 @@
   curl -X GET -k "https://localhost:8443/admin/subscriptions/$AZURE_SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.RedHatOpenShift/openShiftClusters/$CLUSTER/kubernetespodlogs?podname=$POD&namespace=$NAMESPACE&container=$CONTAINER"
   ```
 
-## OpenShift Version 
-
-* We have a cosmos container which contains supported installable OCP versions, more information on the definition in `pkg/api/openshiftversion.go`.
-
-* Populate the `OpenShiftVersions` container via admin api
-```bash
-curl -X PUT -k "https://localhost:8443/admin/versions" --header "Content-Type: application/json" -d '{ "properties": { "version": "4.10.0", "enabled": true, "openShiftPullspec": "test.com/a:b", "installerPullspec": "test.com/a:b" }}'
-```
-
 ## OpenShift Cluster Manager (OCM) Configuration API Actions
 
 * Create a new OCM configuration
diff --git a/docs/prepare-a-shared-rp-development-environment.md b/docs/prepare-a-shared-rp-development-environment.md
index 781bf920d..2b976ecb7 100644
--- a/docs/prepare-a-shared-rp-development-environment.md
+++ b/docs/prepare-a-shared-rp-development-environment.md
@@ -456,6 +456,8 @@ each of the bash functions below.
    deploy_rp_dev
    # Deploy the proxy and VPN
    deploy_env_dev
+   # Deploy AKS resources for Hive
+   deploy_aks_dev
    ```
 
    If you encounter a "VirtualNetworkGatewayCannotUseStandardPublicIP" error
diff --git a/hack/devtools/deploy-shared-env.sh b/hack/devtools/deploy-shared-env.sh
index 8fe72b538..4705cbccd 100644
--- a/hack/devtools/deploy-shared-env.sh
+++ b/hack/devtools/deploy-shared-env.sh
@@ -48,6 +48,7 @@ deploy_env_dev_ci() {
             "proxyImage=arointsvc.azurecr.io/proxy:latest" \
             "proxyImageAuth=$(jq -r '.auths["arointsvc.azurecr.io"].auth' <<<$PULL_SECRET)" \
             "proxyKey=$(base64 -w0 <secrets/proxy.key)" \
+            "vpnCACertificate=$(base64 -w0 <secrets/vpn-ca.crt)" \
             "sshPublicKey=$(<secrets/proxy_id_rsa.pub)" >/dev/null
 }
 
@@ -77,8 +78,7 @@ deploy_aks_dev() {
         --parameters \
             "adminObjectId=$ADMIN_OBJECT_ID" \
             "dnsZone=$DOMAIN_NAME" \
-            "sshRSAPublicKey=$(<secrets/proxy_id_rsa.pub)" \
-            "vpnCACertificate=$(base64 -w0 <secrets/vpn-ca.crt)" >/dev/null
+            "sshRSAPublicKey=$(<secrets/proxy_id_rsa.pub)" >/dev/null
 }
 
 deploy_env_dev_override() {
diff --git a/pkg/api/admin/openshiftversion.go b/pkg/api/admin/openshiftversion.go
index 00e03c276..b2b5d6c40 100644
--- a/pkg/api/admin/openshiftversion.go
+++ b/pkg/api/admin/openshiftversion.go
@@ -10,19 +10,6 @@ type OpenShiftVersionList struct {
 }
 
 type OpenShiftVersion struct {
-	// The ID for the resource.
-	ID string `json:"id,omitempty"`
-
-	// Name of the resource.
-	Name string `json:"name,omitempty"`
-
-	// The properties for the OpenShiftVersion resource.
-	Properties OpenShiftVersionProperties `json:"properties,omitempty"`
-}
-
-// OpenShiftVersionProperties represents the properties of an OpenShiftVersion.
-type OpenShiftVersionProperties struct {
-	// Version represents the version to create the cluster at.
 	Version           string `json:"version,omitempty"`
 	OpenShiftPullspec string `json:"openShiftPullspec,omitempty" mutable:"true"`
 	InstallerPullspec string `json:"installerPullspec,omitempty" mutable:"true"`
diff --git a/pkg/api/admin/openshiftversion_convert.go b/pkg/api/admin/openshiftversion_convert.go
index 628865ac2..17225720d 100644
--- a/pkg/api/admin/openshiftversion_convert.go
+++ b/pkg/api/admin/openshiftversion_convert.go
@@ -16,12 +16,10 @@ type openShiftVersionConverter struct{}
 // returned objects.
 func (openShiftVersionConverter) ToExternal(v *api.OpenShiftVersion) interface{} {
 	out := &OpenShiftVersion{
-		Properties: OpenShiftVersionProperties{
-			Version:           v.Properties.Version,
-			OpenShiftPullspec: v.Properties.OpenShiftPullspec,
-			InstallerPullspec: v.Properties.InstallerPullspec,
-			Enabled:           v.Properties.Enabled,
-		},
+		Version:           v.Version,
+		OpenShiftPullspec: v.OpenShiftPullspec,
+		InstallerPullspec: v.InstallerPullspec,
+		Enabled:           v.Enabled,
 	}
 
 	return out
@@ -48,8 +46,8 @@ func (c openShiftVersionConverter) ToExternalList(vers []*api.OpenShiftVersion)
 func (c openShiftVersionConverter) ToInternal(_new interface{}, out *api.OpenShiftVersion) {
 	new := _new.(*OpenShiftVersion)
 
-	out.Properties.Enabled = new.Properties.Enabled
-	out.Properties.InstallerPullspec = new.Properties.InstallerPullspec
-	out.Properties.OpenShiftPullspec = new.Properties.OpenShiftPullspec
-	out.Properties.Version = new.Properties.Version
+	out.Enabled = new.Enabled
+	out.InstallerPullspec = new.InstallerPullspec
+	out.OpenShiftPullspec = new.OpenShiftPullspec
+	out.Version = new.Version
 }
diff --git a/pkg/api/components/installversion/openshiftcluster.go b/pkg/api/components/installversion/openshiftcluster.go
new file mode 100644
index 000000000..84c6bfe6c
--- /dev/null
+++ b/pkg/api/components/installversion/openshiftcluster.go
@@ -0,0 +1,16 @@
+package installversion
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+// OpenShiftCluster represents the portion of the OpenShift cluster
+// representation which provides the cluster installation version.
+type openShiftCluster struct {
+	Properties openShiftClusterProperties `json:"properties,omitempty"`
+}
+
+// OpenShiftClusterProperties represents an OpenShift cluster's properties.
+type openShiftClusterProperties struct {
+	// The cluster install version.
+	InstallVersion string `json:"installVersion,omitempty"`
+}
diff --git a/pkg/api/components/installversion/parse.go b/pkg/api/components/installversion/parse.go
new file mode 100644
index 000000000..6dd534cb0
--- /dev/null
+++ b/pkg/api/components/installversion/parse.go
@@ -0,0 +1,19 @@
+package installversion
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"encoding/json"
+)
+
+func FromExternalBytes(body []byte) (*openShiftCluster, error) {
+	r := &openShiftCluster{}
+
+	err := json.Unmarshal(body, &r)
+	if err != nil {
+		return nil, err
+	}
+
+	return r, nil
+}
diff --git a/pkg/api/openshiftversion.go b/pkg/api/openshiftversion.go
index cf145ff31..2c9ee5709 100644
--- a/pkg/api/openshiftversion.go
+++ b/pkg/api/openshiftversion.go
@@ -8,17 +8,8 @@ type OpenShiftVersion struct {
 	MissingFields
 
 	ID       string `json:"id,omitempty"`
-	Name     string `json:"name,omitempty"`
-	Type     string `json:"type,omitempty"`
 	Deleting bool   `json:"deleting,omitempty"` // https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed-design-patterns#deletes
 
-	// The properties for the OpenShiftVersion resource.
-	Properties OpenShiftVersionProperties `json:"properties,omitempty"`
-}
-
-// OpenShiftVersionProperties represents the properties of an OpenShiftVersion.
-type OpenShiftVersionProperties struct {
-	// Version represents the version to create the cluster at.
 	Version           string `json:"version,omitempty"`
 	OpenShiftPullspec string `json:"openShiftPullspec,omitempty"`
 	InstallerPullspec string `json:"installerPullspec,omitempty"`
diff --git a/pkg/api/openshiftversiondocument_example.go b/pkg/api/openshiftversiondocument_example.go
deleted file mode 100644
index f674e74ec..000000000
--- a/pkg/api/openshiftversiondocument_example.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package api
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-func ExampleOpenShiftVersionDocument() *OpenShiftVersionDocument {
-	return &OpenShiftVersionDocument{
-		MissingFields: MissingFields{},
-		ID:            "00000000-0000-0000-0000-000000000000",
-		OpenShiftVersion: &OpenShiftVersion{
-			ID:   "00000000-0000-0000-0000-000000000000",
-			Name: "default",
-			Type: "Microsoft.RedHatOpenShift/OpenShiftVersion",
-			Properties: OpenShiftVersionProperties{
-				Version:           "4.10.20",
-				OpenShiftPullspec: "ab:c",
-				InstallerPullspec: "de:f",
-				Enabled:           true,
-			},
-		},
-	}
-}
diff --git a/pkg/api/register.go b/pkg/api/register.go
index f553caeb2..76db993b0 100644
--- a/pkg/api/register.go
+++ b/pkg/api/register.go
@@ -35,6 +35,10 @@ type OpenShiftVersionConverter interface {
 	ToInternal(interface{}, *OpenShiftVersion)
 }
 
+type InstallVersionsConverter interface {
+	ToExternal(*InstallVersions) interface{}
+}
+
 type OpenShiftVersionStaticValidator interface {
 	Static(interface{}, *OpenShiftVersion) error
 }
@@ -48,6 +52,7 @@ type Version struct {
 	OpenShiftClusterAdminKubeconfigConverter OpenShiftClusterAdminKubeconfigConverter
 	OpenShiftVersionConverter                OpenShiftVersionConverter
 	OpenShiftVersionStaticValidator          OpenShiftVersionStaticValidator
+	InstallVersionsConverter                 InstallVersionsConverter
 	OperationList                            OperationList
 }
 
diff --git a/pkg/api/v20220904/clustermanager_example.go b/pkg/api/v20220904/clustermanager_example.go
index b38b2ada5..9bf3ba9e8 100644
--- a/pkg/api/v20220904/clustermanager_example.go
+++ b/pkg/api/v20220904/clustermanager_example.go
@@ -9,20 +9,19 @@ import (
 
 func exampleSyncSet() *SyncSet {
 	doc := api.ExampleClusterManagerConfigurationDocumentSyncSet()
+	doc.SyncSet.ID = ""
+	doc.SyncSet.Type = ""
+	doc.SyncSet.Name = ""
 	ext := (&clusterManagerConfigurationConverter{}).SyncSetToExternal(doc.SyncSet)
 	return ext.(*SyncSet)
 }
 
 func ExampleSyncSetPutParameter() interface{} {
-	ss := exampleSyncSet()
-	ss.ID = ""
-	ss.Type = ""
-	ss.Name = ""
-	return ss
+	return exampleSyncSet()
 }
 
 func ExampleSyncSetPatchParameter() interface{} {
-	return ExampleSyncSetPutParameter()
+	return exampleSyncSet()
 }
 
 func ExampleSyncSetResponse() interface{} {
@@ -39,20 +38,20 @@ func ExampleSyncSetListResponse() interface{} {
 
 func exampleMachinePool() *MachinePool {
 	doc := api.ExampleClusterManagerConfigurationDocumentMachinePool()
+	doc.MachinePool.ID = ""
+	doc.MachinePool.Type = ""
+	doc.MachinePool.Name = ""
 	ext := (&clusterManagerConfigurationConverter{}).MachinePoolToExternal(doc.MachinePool)
+
 	return ext.(*MachinePool)
 }
 
 func ExampleMachinePoolPutParameter() interface{} {
-	mp := exampleMachinePool()
-	mp.ID = ""
-	mp.Type = ""
-	mp.Name = ""
-	return mp
+	return exampleMachinePool()
 }
 
 func ExampleMachinePoolPatchParameter() interface{} {
-	return ExampleMachinePoolPutParameter()
+	return exampleMachinePool()
 }
 
 func ExampleMachinePoolResponse() interface{} {
@@ -69,20 +68,19 @@ func ExampleMachinePoolListResponse() interface{} {
 
 func exampleSyncIdentityProvider() *SyncIdentityProvider {
 	doc := api.ExampleClusterManagerConfigurationDocumentSyncIdentityProvider()
+	doc.SyncIdentityProvider.ID = ""
+	doc.SyncIdentityProvider.Type = ""
+	doc.SyncIdentityProvider.Name = ""
 	ext := (&clusterManagerConfigurationConverter{}).SyncIdentityProviderToExternal(doc.SyncIdentityProvider)
 	return ext.(*SyncIdentityProvider)
 }
 
 func ExampleSyncIdentityProviderPutParameter() interface{} {
-	sip := exampleSyncIdentityProvider()
-	sip.ID = ""
-	sip.Type = ""
-	sip.Name = ""
-	return sip
+	return exampleSyncIdentityProvider()
 }
 
 func ExampleSyncIdentityProviderPatchParameter() interface{} {
-	return ExampleSyncIdentityProviderPutParameter()
+	return exampleSyncIdentityProvider()
 }
 
 func ExampleSyncIdentityProviderResponse() interface{} {
@@ -99,20 +97,19 @@ func ExampleSyncIdentityProviderListResponse() interface{} {
 
 func exampleSecret() *Secret {
 	doc := api.ExampleClusterManagerConfigurationDocumentSecret()
+	doc.Secret.ID = ""
+	doc.Secret.Type = ""
+	doc.Secret.Name = ""
 	ext := (&clusterManagerConfigurationConverter{}).SecretToExternal(doc.Secret)
 	return ext.(*Secret)
 }
 
 func ExampleSecretPutParameter() interface{} {
-	s := exampleSecret()
-	s.ID = ""
-	s.Type = ""
-	s.Name = ""
-	return s
+	return exampleSecret()
 }
 
 func ExampleSecretPatchParameter() interface{} {
-	return ExampleSecretPutParameter()
+	return exampleSecret()
 }
 
 func ExampleSecretResponse() interface{} {
diff --git a/pkg/api/v20220904/installversions.go b/pkg/api/v20220904/installversions.go
new file mode 100644
index 000000000..17cc4ac10
--- /dev/null
+++ b/pkg/api/v20220904/installversions.go
@@ -0,0 +1,7 @@
+package v20220904
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+// InstallVersions represents a List of OpenShift installable versions.
+type InstallVersions []InstallVersion
diff --git a/pkg/api/v20220904/installversions_convert.go b/pkg/api/v20220904/installversions_convert.go
new file mode 100644
index 000000000..2941bbc42
--- /dev/null
+++ b/pkg/api/v20220904/installversions_convert.go
@@ -0,0 +1,12 @@
+package v20220904
+
+import "github.com/Azure/ARO-RP/pkg/api"
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+type installVersionsConverter struct{}
+
+func (installVersionsConverter) ToExternal(installVersions *api.InstallVersions) interface{} {
+	return installVersions
+}
diff --git a/pkg/api/v20220904/installversions_example.go b/pkg/api/v20220904/installversions_example.go
new file mode 100644
index 000000000..cbc251ca3
--- /dev/null
+++ b/pkg/api/v20220904/installversions_example.go
@@ -0,0 +1,10 @@
+package v20220904
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+// ExampleInstallVersions returns an example
+// InstallVersions object i.e []string that the RP would return to an end-user.
+func ExampleInstallVersionsResponse() interface{} {
+	return &InstallVersions{"4.10.20"}
+}
diff --git a/pkg/api/v20220904/openshiftcluster.go b/pkg/api/v20220904/openshiftcluster.go
index 113eedb66..b41f49098 100644
--- a/pkg/api/v20220904/openshiftcluster.go
+++ b/pkg/api/v20220904/openshiftcluster.go
@@ -69,6 +69,9 @@ type OpenShiftClusterProperties struct {
 
 	// The cluster ingress profiles.
 	IngressProfiles []IngressProfile `json:"ingressProfiles,omitempty"`
+
+	// The cluster install version.
+	InstallVersion string `json:"installVersion,omitempty"`
 }
 
 // ProvisioningState represents a provisioning state.
@@ -84,6 +87,9 @@ const (
 	ProvisioningStateFailed        ProvisioningState = "Failed"
 )
 
+// InstallVersion is the OpenShift installation version string.
+type InstallVersion string
+
 // FipsValidatedModules determines if FIPS is used.
 type FipsValidatedModules string
 
diff --git a/pkg/api/v20220904/openshiftcluster_example.go b/pkg/api/v20220904/openshiftcluster_example.go
index d239d90bc..72ef08c85 100644
--- a/pkg/api/v20220904/openshiftcluster_example.go
+++ b/pkg/api/v20220904/openshiftcluster_example.go
@@ -37,6 +37,7 @@ func ExampleOpenShiftClusterPutParameter() interface{} {
 	oc.Properties.APIServerProfile.IP = ""
 	oc.Properties.IngressProfiles[0].IP = ""
 	oc.Properties.MasterProfile.EncryptionAtHost = EncryptionAtHost(EncryptionAtHostEnabled)
+	oc.Properties.InstallVersion = ""
 	oc.SystemData = nil
 
 	return oc
diff --git a/pkg/api/v20220904/openshiftversion.go b/pkg/api/v20220904/openshiftversion.go
deleted file mode 100644
index e162dd432..000000000
--- a/pkg/api/v20220904/openshiftversion.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package v20220904
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-// OpenShiftVersionList represents a List of available versions.
-type OpenShiftVersionList struct {
-	// The List of available versions.
-	OpenShiftVersions []*OpenShiftVersion `json:"value"`
-
-	// Next Link to next operation.
-	NextLink string `json:"nextLink,omitempty"`
-}
-
-// OpenShiftVersion represents an OpenShift version that can be installed.
-type OpenShiftVersion struct {
-	proxyResource bool
-
-	// The ID for the resource.
-	ID string `json:"id,omitempty" mutable:"case"`
-
-	// Name of the resource.
-	Name string `json:"name,omitempty" mutable:"case"`
-
-	// The resource type.
-	Type string `json:"type,omitempty" mutable:"case"`
-
-	// The properties for the OpenShiftVersion resource.
-	Properties OpenShiftVersionProperties `json:"properties,omitempty"`
-}
-
-// OpenShiftVersionProperties represents the properties of an OpenShiftVersion.
-type OpenShiftVersionProperties struct {
-	// Version represents the version to create the cluster at.
-	Version string `json:"version,omitempty"`
-}
diff --git a/pkg/api/v20220904/openshiftversion_convert.go b/pkg/api/v20220904/openshiftversion_convert.go
deleted file mode 100644
index 5c79e784d..000000000
--- a/pkg/api/v20220904/openshiftversion_convert.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package v20220904
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"github.com/Azure/ARO-RP/pkg/api"
-)
-
-type openShiftVersionConverter struct{}
-
-// openShiftVersionConverter.ToExternal returns a new external representation
-// of the internal object, reading from the subset of the internal object's
-// fields that appear in the external representation.  ToExternal does not
-// modify its argument; there is no pointer aliasing between the passed and
-// returned objects.
-func (openShiftVersionConverter) ToExternal(v *api.OpenShiftVersion) interface{} {
-	out := &OpenShiftVersion{
-		proxyResource: true,
-		Properties: OpenShiftVersionProperties{
-			Version: v.Properties.Version,
-		},
-	}
-
-	return out
-}
-
-// ToExternalList returns a slice of external representations of the internal
-// objects
-func (c openShiftVersionConverter) ToExternalList(vers []*api.OpenShiftVersion) interface{} {
-	l := &OpenShiftVersionList{
-		OpenShiftVersions: make([]*OpenShiftVersion, 0, len(vers)),
-	}
-
-	for _, ver := range vers {
-		l.OpenShiftVersions = append(l.OpenShiftVersions, c.ToExternal(ver).(*OpenShiftVersion))
-	}
-
-	return l
-}
-
-// ToInternal overwrites in place a pre-existing internal object, setting (only)
-// all mapped fields from the external representation. ToInternal modifies its
-// argument; there is no pointer aliasing between the passed and returned
-// objects
-func (c openShiftVersionConverter) ToInternal(_new interface{}, out *api.OpenShiftVersion) {
-	new := _new.(*OpenShiftVersion)
-	out.Properties.Version = new.Properties.Version
-}
diff --git a/pkg/api/v20220904/openshiftversion_example.go b/pkg/api/v20220904/openshiftversion_example.go
deleted file mode 100644
index 6157b366d..000000000
--- a/pkg/api/v20220904/openshiftversion_example.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package v20220904
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import "github.com/Azure/ARO-RP/pkg/api"
-
-func exampleOpenShiftVersion() *OpenShiftVersion {
-	doc := api.ExampleOpenShiftVersionDocument()
-	ext := (&openShiftVersionConverter{}).ToExternal(doc.OpenShiftVersion)
-	return ext.(*OpenShiftVersion)
-}
-
-func ExampleOpenShiftVersionResponse() interface{} {
-	return exampleOpenShiftVersion()
-}
-
-func ExampleOpenShiftVersionListResponse() interface{} {
-	return &OpenShiftVersionList{
-		OpenShiftVersions: []*OpenShiftVersion{
-			ExampleOpenShiftVersionResponse().(*OpenShiftVersion),
-		},
-	}
-}
diff --git a/pkg/api/v20220904/register.go b/pkg/api/v20220904/register.go
index 5d338fe99..da71d29b9 100644
--- a/pkg/api/v20220904/register.go
+++ b/pkg/api/v20220904/register.go
@@ -21,7 +21,7 @@ func init() {
 		OpenShiftClusterStaticValidator:          openShiftClusterStaticValidator{},
 		OpenShiftClusterCredentialsConverter:     openShiftClusterCredentialsConverter{},
 		OpenShiftClusterAdminKubeconfigConverter: openShiftClusterAdminKubeconfigConverter{},
-		OpenShiftVersionConverter:                openShiftVersionConverter{},
+		InstallVersionsConverter:                 installVersionsConverter{},
 		OperationList: api.OperationList{
 			Operations: []api.Operation{
 				api.OperationResultsRead,
diff --git a/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/openshiftversions.go b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/installversions.go
similarity index 63%
rename from pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/openshiftversions.go
rename to pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/installversions.go
index 6780035d3..93d5dfd94 100644
--- a/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/openshiftversions.go
+++ b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/installversions.go
@@ -27,29 +27,28 @@ import (
 	"github.com/Azure/go-autorest/tracing"
 )
 
-// OpenShiftVersionsClient is the rest API for Azure Red Hat OpenShift 4
-type OpenShiftVersionsClient struct {
+// InstallVersionsClient is the rest API for Azure Red Hat OpenShift 4
+type InstallVersionsClient struct {
 	BaseClient
 }
 
-// NewOpenShiftVersionsClient creates an instance of the OpenShiftVersionsClient client.
-func NewOpenShiftVersionsClient(subscriptionID string) OpenShiftVersionsClient {
-	return NewOpenShiftVersionsClientWithBaseURI(DefaultBaseURI, subscriptionID)
+// NewInstallVersionsClient creates an instance of the InstallVersionsClient client.
+func NewInstallVersionsClient(subscriptionID string) InstallVersionsClient {
+	return NewInstallVersionsClientWithBaseURI(DefaultBaseURI, subscriptionID)
 }
 
-// NewOpenShiftVersionsClientWithBaseURI creates an instance of the OpenShiftVersionsClient client using a custom
-// endpoint.  Use this when interacting with an Azure cloud that uses a non-standard base URI (sovereign clouds, Azure
-// stack).
-func NewOpenShiftVersionsClientWithBaseURI(baseURI string, subscriptionID string) OpenShiftVersionsClient {
-	return OpenShiftVersionsClient{NewWithBaseURI(baseURI, subscriptionID)}
+// NewInstallVersionsClientWithBaseURI creates an instance of the InstallVersionsClient client using a custom endpoint.
+// Use this when interacting with an Azure cloud that uses a non-standard base URI (sovereign clouds, Azure stack).
+func NewInstallVersionsClientWithBaseURI(baseURI string, subscriptionID string) InstallVersionsClient {
+	return InstallVersionsClient{NewWithBaseURI(baseURI, subscriptionID)}
 }
 
 // List the operation returns the installable OpenShift versions as strings.
 // Parameters:
 // location - the name of Azure region.
-func (client OpenShiftVersionsClient) List(ctx context.Context, location string) (result OpenShiftVersionList, err error) {
+func (client InstallVersionsClient) List(ctx context.Context, location string) (result ListString, err error) {
 	if tracing.IsEnabled() {
-		ctx = tracing.StartSpan(ctx, fqdn+"/OpenShiftVersionsClient.List")
+		ctx = tracing.StartSpan(ctx, fqdn+"/InstallVersionsClient.List")
 		defer func() {
 			sc := -1
 			if result.Response.Response != nil {
@@ -63,25 +62,25 @@ func (client OpenShiftVersionsClient) List(ctx context.Context, location string)
 			Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}},
 		{TargetValue: location,
 			Constraints: []validation.Constraint{{Target: "location", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil {
-		return result, validation.NewError("redhatopenshift.OpenShiftVersionsClient", "List", err.Error())
+		return result, validation.NewError("redhatopenshift.InstallVersionsClient", "List", err.Error())
 	}
 
 	req, err := client.ListPreparer(ctx, location)
 	if err != nil {
-		err = autorest.NewErrorWithError(err, "redhatopenshift.OpenShiftVersionsClient", "List", nil, "Failure preparing request")
+		err = autorest.NewErrorWithError(err, "redhatopenshift.InstallVersionsClient", "List", nil, "Failure preparing request")
 		return
 	}
 
 	resp, err := client.ListSender(req)
 	if err != nil {
 		result.Response = autorest.Response{Response: resp}
-		err = autorest.NewErrorWithError(err, "redhatopenshift.OpenShiftVersionsClient", "List", resp, "Failure sending request")
+		err = autorest.NewErrorWithError(err, "redhatopenshift.InstallVersionsClient", "List", resp, "Failure sending request")
 		return
 	}
 
 	result, err = client.ListResponder(resp)
 	if err != nil {
-		err = autorest.NewErrorWithError(err, "redhatopenshift.OpenShiftVersionsClient", "List", resp, "Failure responding to request")
+		err = autorest.NewErrorWithError(err, "redhatopenshift.InstallVersionsClient", "List", resp, "Failure responding to request")
 		return
 	}
 
@@ -89,7 +88,7 @@ func (client OpenShiftVersionsClient) List(ctx context.Context, location string)
 }
 
 // ListPreparer prepares the List request.
-func (client OpenShiftVersionsClient) ListPreparer(ctx context.Context, location string) (*http.Request, error) {
+func (client InstallVersionsClient) ListPreparer(ctx context.Context, location string) (*http.Request, error) {
 	pathParameters := map[string]interface{}{
 		"location":       autorest.Encode("path", location),
 		"subscriptionId": autorest.Encode("path", client.SubscriptionID),
@@ -110,17 +109,17 @@ func (client OpenShiftVersionsClient) ListPreparer(ctx context.Context, location
 
 // ListSender sends the List request. The method will close the
 // http.Response Body if it receives an error.
-func (client OpenShiftVersionsClient) ListSender(req *http.Request) (*http.Response, error) {
+func (client InstallVersionsClient) ListSender(req *http.Request) (*http.Response, error) {
 	return client.Send(req, azure.DoRetryWithRegistration(client.Client))
 }
 
 // ListResponder handles the response to the List request. The method always
 // closes the http.Response Body.
-func (client OpenShiftVersionsClient) ListResponder(resp *http.Response) (result OpenShiftVersionList, err error) {
+func (client InstallVersionsClient) ListResponder(resp *http.Response) (result ListString, err error) {
 	err = autorest.Respond(
 		resp,
 		azure.WithErrorUnlessStatusCode(http.StatusOK),
-		autorest.ByUnmarshallingJSON(&result),
+		autorest.ByUnmarshallingJSON(&result.Value),
 		autorest.ByClosing())
 	result.Response = autorest.Response{Response: resp}
 	return
diff --git a/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/models.go b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/models.go
index 080b54c62..f5762283c 100644
--- a/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/models.go
+++ b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/models.go
@@ -122,6 +122,12 @@ type IngressProfile struct {
 	IP *string `json:"ip,omitempty"`
 }
 
+// ListString ...
+type ListString struct {
+	autorest.Response `json:"-"`
+	Value             *[]string `json:"value,omitempty"`
+}
+
 // MachinePool machinePool represents a MachinePool
 type MachinePool struct {
 	autorest.Response `json:"-"`
@@ -748,6 +754,8 @@ type OpenShiftClusterProperties struct {
 	ApiserverProfile *APIServerProfile `json:"apiserverProfile,omitempty"`
 	// IngressProfiles - The cluster ingress profiles.
 	IngressProfiles *[]IngressProfile `json:"ingressProfiles,omitempty"`
+	// InstallVersion - The cluster install version.
+	InstallVersion *string `json:"installVersion,omitempty"`
 }
 
 // OpenShiftClustersCreateOrUpdateFuture an abstraction for monitoring and retrieving the results of a
@@ -937,44 +945,6 @@ func (oscu *OpenShiftClusterUpdate) UnmarshalJSON(body []byte) error {
 	return nil
 }
 
-// OpenShiftVersion openShiftVersion represents an OpenShift version that can be installed.
-type OpenShiftVersion struct {
-	// Properties - The properties for the OpenShiftVersion resource.
-	Properties *OpenShiftVersionProperties `json:"properties,omitempty"`
-	// ID - READ-ONLY; Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
-	ID *string `json:"id,omitempty"`
-	// Name - READ-ONLY; The name of the resource
-	Name *string `json:"name,omitempty"`
-	// Type - READ-ONLY; The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts"
-	Type *string `json:"type,omitempty"`
-	// SystemData - READ-ONLY; Azure Resource Manager metadata containing createdBy and modifiedBy information.
-	SystemData *SystemData `json:"systemData,omitempty"`
-}
-
-// MarshalJSON is the custom marshaler for OpenShiftVersion.
-func (osv OpenShiftVersion) MarshalJSON() ([]byte, error) {
-	objectMap := make(map[string]interface{})
-	if osv.Properties != nil {
-		objectMap["properties"] = osv.Properties
-	}
-	return json.Marshal(objectMap)
-}
-
-// OpenShiftVersionList openShiftVersionList represents a List of available versions.
-type OpenShiftVersionList struct {
-	autorest.Response `json:"-"`
-	// Value - The List of available versions.
-	Value *[]OpenShiftVersion `json:"value,omitempty"`
-	// NextLink - Next Link to next operation.
-	NextLink *string `json:"nextLink,omitempty"`
-}
-
-// OpenShiftVersionProperties openShiftVersionProperties represents the properties of an OpenShiftVersion.
-type OpenShiftVersionProperties struct {
-	// Version - Version represents the version to create the cluster at.
-	Version *string `json:"version,omitempty"`
-}
-
 // Operation operation represents an RP operation.
 type Operation struct {
 	// Name - Operation name: {provider}/{resource}/{operation}.
diff --git a/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/redhatopenshiftapi/interfaces.go b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/redhatopenshiftapi/interfaces.go
index 0c1aa0be1..8190d4fce 100644
--- a/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/redhatopenshiftapi/interfaces.go
+++ b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/redhatopenshiftapi/interfaces.go
@@ -33,12 +33,12 @@ type OperationsClientAPI interface {
 
 var _ OperationsClientAPI = (*redhatopenshift.OperationsClient)(nil)
 
-// OpenShiftVersionsClientAPI contains the set of methods on the OpenShiftVersionsClient type.
-type OpenShiftVersionsClientAPI interface {
-	List(ctx context.Context, location string) (result redhatopenshift.OpenShiftVersionList, err error)
+// InstallVersionsClientAPI contains the set of methods on the InstallVersionsClient type.
+type InstallVersionsClientAPI interface {
+	List(ctx context.Context, location string) (result redhatopenshift.ListString, err error)
 }
 
-var _ OpenShiftVersionsClientAPI = (*redhatopenshift.OpenShiftVersionsClient)(nil)
+var _ InstallVersionsClientAPI = (*redhatopenshift.InstallVersionsClient)(nil)
 
 // OpenShiftClustersClientAPI contains the set of methods on the OpenShiftClustersClient type.
 type OpenShiftClustersClientAPI interface {
diff --git a/pkg/cluster/install_version.go b/pkg/cluster/install_version.go
index 263e7da7a..92b83233f 100644
--- a/pkg/cluster/install_version.go
+++ b/pkg/cluster/install_version.go
@@ -23,7 +23,7 @@ func (m *manager) openShiftVersionFromVersion(ctx context.Context) (*api.OpenShi
 
 	activeOpenShiftVersions := make([]*api.OpenShiftVersion, 0)
 	for _, doc := range docs.OpenShiftVersionDocuments {
-		if doc.OpenShiftVersion.Properties.Enabled {
+		if doc.OpenShiftVersion.Enabled {
 			activeOpenShiftVersions = append(activeOpenShiftVersions, doc.OpenShiftVersion)
 		}
 	}
@@ -48,18 +48,17 @@ func (m *manager) openShiftVersionFromVersion(ctx context.Context) (*api.OpenShi
 		}
 
 		return &api.OpenShiftVersion{
-			Properties: api.OpenShiftVersionProperties{
-				Version:           version.InstallStream.Version.String(),
-				OpenShiftPullspec: openshiftPullSpec,
-				InstallerPullspec: installerPullSpec,
-				Enabled:           true,
-			}}, nil
+			Version:           version.InstallStream.Version.String(),
+			OpenShiftPullspec: openshiftPullSpec,
+			InstallerPullspec: installerPullSpec,
+			Enabled:           true,
+		}, nil
 	}
 
 	for _, active := range activeOpenShiftVersions {
-		if requestedInstallVersion == active.Properties.Version {
+		if requestedInstallVersion == active.Version {
 			if m.installViaHive {
-				active.Properties.OpenShiftPullspec = strings.Replace(active.Properties.OpenShiftPullspec, "quay.io", m.env.ACRDomain(), 1)
+				active.OpenShiftPullspec = strings.Replace(active.OpenShiftPullspec, "quay.io", m.env.ACRDomain(), 1)
 			}
 			return active, nil
 		}
diff --git a/pkg/cluster/nsg.go b/pkg/cluster/nsg.go
index 6421ca2a7..dec1258c5 100644
--- a/pkg/cluster/nsg.go
+++ b/pkg/cluster/nsg.go
@@ -31,7 +31,7 @@ func (m *manager) clusterNSG(infraID, location string) *arm.Resource {
 					SourceAddressPrefix:      to.StringPtr("*"),
 					DestinationAddressPrefix: to.StringPtr("*"),
 					Access:                   mgmtnetwork.SecurityRuleAccessAllow,
-					Priority:                 to.Int32Ptr(101),
+					Priority:                 to.Int32Ptr(120),
 					Direction:                mgmtnetwork.SecurityRuleDirectionInbound,
 				},
 				Name: to.StringPtr("apiserver_in"),
diff --git a/pkg/deploy/assets/aks-development.json b/pkg/deploy/assets/aks-development.json
index 591822ab6..3e6272e39 100644
--- a/pkg/deploy/assets/aks-development.json
+++ b/pkg/deploy/assets/aks-development.json
@@ -168,20 +168,6 @@
                 "description": "Specifies the address prefix of the subnet hosting the pods of the AKS cluster."
             }
         },
-        "gatewaySubnetName": {
-            "type": "string",
-            "defaultValue": "GatewaySubnet",
-            "metadata": {
-                "description": "Subnet name that will contain the App Service Environment"
-            }
-        },
-        "gatewaySubnetPrefix": {
-            "type": "string",
-            "defaultValue": "10.128.0.0/24",
-            "metadata": {
-                "description": "Subnet address prefix"
-            }
-        },
         "serviceCidr": {
             "type": "string",
             "defaultValue": "10.130.0.0/16",
@@ -265,10 +251,6 @@
             "metadata": {
                 "description": "Specifies the max graceful termination time interval in seconds for the auto-scaler of the AKS cluster."
             }
-        },
-        "vpnCACertificate": {
-            "type": "string",
-            "defaultValue": ""
         }
     },
     "variables": {
@@ -353,12 +335,6 @@
                                 }
                             ]
                         }
-                    },
-                    {
-                        "name": "[parameters('gatewaySubnetName')]",
-                        "properties": {
-                            "addressPrefix": "[parameters('gatewaySubnetPrefix')]"
-                        }
                     }
                 ]
             }
@@ -436,15 +412,39 @@
             }
         },
         {
-            "name": "aks-vpn-pip",
-            "type": "Microsoft.Network/publicIPAddresses",
+            "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+            "name": "[concat('dev-vpn-vnet/peering-', parameters('vnetName'))]",
+            "apiVersion": "2021-12-01",
             "location": "[resourceGroup().location]",
-            "apiVersion": "2020-08-01",
-            "sku": {
-                "name": "Basic"
-            },
+            "dependsOn": [
+                "[variables('vnetId')]"
+            ],
+            "properties": {
+                "allowVirtualNetworkAccess": true,
+                "allowForwardedTraffic": true,
+                "allowGatewayTransit": true,
+                "useRemoteGateways": false,
+                "remoteVirtualNetwork": {
+                    "id": "[variables('vnetId')]"
+                }
+            }
+        },
+        {
+            "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+            "name": "[concat(parameters('vnetName'), '/peering-dev-vpn-vnet')]",
+            "apiVersion": "2021-12-01",
+            "location": "[resourceGroup().location]",
+            "dependsOn": [
+                "[variables('vnetId')]"
+            ],
             "properties": {
-                "publicIPAllocationMethod": "Dynamic"
+                "allowVirtualNetworkAccess": true,
+                "allowForwardedTraffic": true,
+                "allowGatewayTransit": false,
+                "useRemoteGateways": true,
+                "remoteVirtualNetwork": {
+                    "id": "[resourceId('Microsoft.Network/virtualNetworks', 'dev-vpn-vnet')]"
+                }
             }
         },
         {
@@ -612,55 +612,6 @@
                 ],
                 "enableSoftDelete": true
             }
-        },
-        {
-            "type": "Microsoft.Network/virtualNetworkGateways",
-            "name": "aks-vpn",
-            "apiVersion": "2020-08-01",
-            "location": "[resourceGroup().location]",
-            "dependsOn": [
-                "[resourceId('Microsoft.Network/publicIPAddresses', 'aks-vpn-pip')]",
-                "[variables('vnetId')]",
-                "[parameters('aksClusterName')]"
-            ],
-            "properties": {
-                "ipConfigurations": [
-                    {
-                        "properties": {
-                            "subnet": {
-                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('gatewaySubnetName'))]"
-                            },
-                            "publicIPAddress": {
-                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', 'aks-vpn-pip')]"
-                            }
-                        },
-                        "name": "default"
-                    }
-                ],
-                "vpnType": "RouteBased",
-                "sku": {
-                    "name": "VpnGw1",
-                    "tier": "VpnGw1"
-                },
-                "vpnClientConfiguration": {
-                    "vpnClientAddressPool": {
-                        "addressPrefixes": [
-                            "192.168.254.0/24"
-                        ]
-                    },
-                    "vpnClientRootCertificates": [
-                        {
-                            "properties": {
-                                "publicCertData": "[parameters('vpnCACertificate')]"
-                            },
-                            "name": "aks-vpn-ca"
-                        }
-                    ],
-                    "vpnClientProtocols": [
-                        "OpenVPN"
-                    ]
-                }
-            }
         }
     ]
 }
diff --git a/pkg/deploy/assets/databases-development.json b/pkg/deploy/assets/databases-development.json
index 70e6d7518..24a362a0f 100644
--- a/pkg/deploy/assets/databases-development.json
+++ b/pkg/deploy/assets/databases-development.json
@@ -225,6 +225,15 @@
                             "/id"
                         ],
                         "kind": "Hash"
+                    },
+                    "uniqueKeyPolicy": {
+                        "uniqueKeys": [
+                            {
+                                "paths": [
+                                    "/key"
+                                ]
+                            }
+                        ]
                     }
                 },
                 "options": {}
diff --git a/pkg/deploy/assets/rp-production.json b/pkg/deploy/assets/rp-production.json
index 37a4c85a9..b25ddf074 100644
--- a/pkg/deploy/assets/rp-production.json
+++ b/pkg/deploy/assets/rp-production.json
@@ -982,6 +982,15 @@
                             "/id"
                         ],
                         "kind": "Hash"
+                    },
+                    "uniqueKeyPolicy": {
+                        "uniqueKeys": [
+                            {
+                                "paths": [
+                                    "/key"
+                                ]
+                            }
+                        ]
                     }
                 },
                 "options": {}
diff --git a/pkg/deploy/generator/resources_rp.go b/pkg/deploy/generator/resources_rp.go
index 69c4e2746..276a9e9e3 100644
--- a/pkg/deploy/generator/resources_rp.go
+++ b/pkg/deploy/generator/resources_rp.go
@@ -1794,6 +1794,15 @@ func (g *generator) database(databaseName string, addDependsOn bool) []*arm.Reso
 							},
 							Kind: mgmtdocumentdb.PartitionKindHash,
 						},
+						UniqueKeyPolicy: &mgmtdocumentdb.UniqueKeyPolicy{
+							UniqueKeys: &[]mgmtdocumentdb.UniqueKey{
+								{
+									Paths: &[]string{
+										"/key",
+									},
+								},
+							},
+						},
 					},
 					Options: &mgmtdocumentdb.CreateUpdateOptions{},
 				},
diff --git a/pkg/frontend/admin_openshiftcluster_approvecsr.go b/pkg/frontend/admin_openshiftcluster_approvecsr.go
deleted file mode 100644
index 7aef1c81e..000000000
--- a/pkg/frontend/admin_openshiftcluster_approvecsr.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package frontend
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-	"net/http"
-	"path/filepath"
-	"strings"
-
-	"github.com/gorilla/mux"
-	"github.com/sirupsen/logrus"
-
-	"github.com/Azure/ARO-RP/pkg/api"
-	"github.com/Azure/ARO-RP/pkg/database/cosmosdb"
-	"github.com/Azure/ARO-RP/pkg/frontend/middleware"
-)
-
-func (f *frontend) postAdminOpenShiftClusterApproveCSR(w http.ResponseWriter, r *http.Request) {
-	ctx := r.Context()
-	log := ctx.Value(middleware.ContextKeyLog).(*logrus.Entry)
-	r.URL.Path = filepath.Dir(r.URL.Path)
-
-	err := f._postAdminOpenShiftClusterApproveCSR(ctx, r, log)
-
-	adminReply(log, w, nil, nil, err)
-}
-
-func (f *frontend) _postAdminOpenShiftClusterApproveCSR(ctx context.Context, r *http.Request, log *logrus.Entry) error {
-	vars := mux.Vars(r)
-
-	csrName := r.URL.Query().Get("csrName")
-	if csrName != "" {
-		err := validateAdminKubernetesObjects(r.Method, "CertificateSigningRequest", "", csrName)
-		if err != nil {
-			return err
-		}
-	}
-
-	resourceID := strings.TrimPrefix(r.URL.Path, "/admin")
-
-	doc, err := f.dbOpenShiftClusters.Get(ctx, resourceID)
-	switch {
-	case cosmosdb.IsErrorStatusCode(err, http.StatusNotFound):
-		return api.NewCloudError(http.StatusNotFound, api.CloudErrorCodeResourceNotFound, "", "The Resource '%s/%s' under resource group '%s' was not found.", vars["resourceType"], vars["resourceName"], vars["resourceGroupName"])
-	case err != nil:
-		return err
-	}
-
-	k, err := f.kubeActionsFactory(log, f.env, doc.OpenShiftCluster)
-	if err != nil {
-		return err
-	}
-
-	if csrName != "" {
-		return k.ApproveCsr(ctx, csrName)
-	}
-
-	return k.ApproveAllCsrs(ctx)
-}
diff --git a/pkg/frontend/admin_openshiftversion_list.go b/pkg/frontend/admin_openshiftversion_list.go
index e6434904e..210cdedcd 100644
--- a/pkg/frontend/admin_openshiftversion_list.go
+++ b/pkg/frontend/admin_openshiftversion_list.go
@@ -37,9 +37,7 @@ func (f *frontend) getAdminOpenShiftVersions(w http.ResponseWriter, r *http.Requ
 		}
 	}
 
-	sort.Slice(vers, func(i, j int) bool {
-		return semver.New(vers[i].Properties.Version).LessThan(*semver.New(vers[j].Properties.Version))
-	})
+	sort.Slice(vers, func(i, j int) bool { return semver.New(vers[i].Version).LessThan(*semver.New(vers[j].Version)) })
 
 	b, err := json.MarshalIndent(converter.ToExternalList(vers), "", "    ")
 	adminReply(log, w, nil, b, err)
diff --git a/pkg/frontend/admin_openshiftversion_put.go b/pkg/frontend/admin_openshiftversion_put.go
index 84deeddc0..9eb11d26b 100644
--- a/pkg/frontend/admin_openshiftversion_put.go
+++ b/pkg/frontend/admin_openshiftversion_put.go
@@ -47,7 +47,7 @@ func (f *frontend) putAdminOpenShiftVersion(w http.ResponseWriter, r *http.Reque
 
 	if docs != nil {
 		for _, doc := range docs.OpenShiftVersionDocuments {
-			if doc.OpenShiftVersion.Properties.Version == version.Properties.Version {
+			if doc.OpenShiftVersion.Version == version.Version {
 				versionDoc = doc
 				break
 			}
diff --git a/pkg/frontend/adminactions/certificatesigningrequests.go b/pkg/frontend/adminactions/certificatesigningrequests.go
deleted file mode 100644
index aec407708..000000000
--- a/pkg/frontend/adminactions/certificatesigningrequests.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package adminactions
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-	"net/http"
-
-	certificatesv1 "k8s.io/api/certificates/v1"
-	corev1 "k8s.io/api/core/v1"
-	kerrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-
-	"github.com/Azure/ARO-RP/pkg/api"
-)
-
-func (k *kubeActions) ApproveCsr(ctx context.Context, csrName string) error {
-	csr, err := k.kubecli.CertificatesV1().CertificateSigningRequests().Get(ctx, csrName, metav1.GetOptions{})
-	if err != nil {
-		if kerrors.IsNotFound(err) {
-			return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeResourceNotFound, "", "certificate signing request '%s' was not found.", csrName)
-		}
-		return err
-	}
-
-	return k.updateCsr(ctx, csr)
-}
-
-func (k *kubeActions) ApproveAllCsrs(ctx context.Context) error {
-	csrs, err := k.kubecli.CertificatesV1().CertificateSigningRequests().List(ctx, metav1.ListOptions{})
-	if err != nil {
-		return err
-	}
-	for _, csr := range csrs.Items {
-		err = k.updateCsr(ctx, &csr)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func (k *kubeActions) updateCsr(ctx context.Context, csr *certificatesv1.CertificateSigningRequest) error {
-	modifiedCSR, hasCondition, err := addConditionIfNeeded(csr, string(certificatesv1.CertificateDenied), string(certificatesv1.CertificateApproved), "AROSupportApprove", "This CSR was approved by ARO support personnel.")
-
-	if err != nil {
-		return err
-	}
-	if !hasCondition {
-		_, err = k.kubecli.CertificatesV1().CertificateSigningRequests().UpdateApproval(ctx, modifiedCSR.Name, modifiedCSR, metav1.UpdateOptions{})
-	}
-	return err
-}
-
-func addConditionIfNeeded(csr *certificatesv1.CertificateSigningRequest, mustNotHaveConditionType, conditionType, reason, message string) (*certificatesv1.CertificateSigningRequest, bool, error) {
-	var alreadyHasCondition bool
-	for _, c := range csr.Status.Conditions {
-		if string(c.Type) == mustNotHaveConditionType {
-			return nil, false, api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodePropertyChangeNotAllowed, "", "certificate signing request %q is already %s", csr.Name, c.Type)
-		}
-		if string(c.Type) == conditionType {
-			alreadyHasCondition = true
-		}
-	}
-	if alreadyHasCondition {
-		return csr, true, nil
-	}
-	csr.Status.Conditions = append(csr.Status.Conditions, certificatesv1.CertificateSigningRequestCondition{
-		Type:           certificatesv1.RequestConditionType(conditionType),
-		Status:         corev1.ConditionTrue,
-		Reason:         reason,
-		Message:        message,
-		LastUpdateTime: metav1.Now(),
-	})
-	return csr, false, nil
-}
diff --git a/pkg/frontend/adminactions/kubeactions.go b/pkg/frontend/adminactions/kubeactions.go
index a63bb63a1..0180121b9 100644
--- a/pkg/frontend/adminactions/kubeactions.go
+++ b/pkg/frontend/adminactions/kubeactions.go
@@ -31,8 +31,6 @@ type KubeActions interface {
 	KubeDelete(ctx context.Context, groupKind, namespace, name string, force bool) error
 	CordonNode(ctx context.Context, nodeName string, unschedulable bool) error
 	DrainNode(ctx context.Context, nodeName string) error
-	ApproveCsr(ctx context.Context, csrName string) error
-	ApproveAllCsrs(ctx context.Context) error
 	Upgrade(ctx context.Context, upgradeY bool) error
 	KubeGetPodLogs(ctx context.Context, namespace, name, containerName string) ([]byte, error)
 }
diff --git a/pkg/frontend/frontend.go b/pkg/frontend/frontend.go
index 4687c4cb3..568c089e5 100644
--- a/pkg/frontend/frontend.go
+++ b/pkg/frontend/frontend.go
@@ -256,12 +256,6 @@ func (f *frontend) authenticatedRoutes(r *mux.Router) {
 	s.Methods(http.MethodPost).HandlerFunc(f.postAdminKubernetesObjects).Name("postAdminKubernetesObjects")
 	s.Methods(http.MethodDelete).HandlerFunc(f.deleteAdminKubernetesObjects).Name("deleteAdminKubernetesObjects")
 
-	s = r.
-		Path("/admin/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}/approvecsr").
-		Subrouter()
-
-	s.Methods(http.MethodPost).HandlerFunc(f.postAdminOpenShiftClusterApproveCSR).Name("postAdminOpenShiftClusterApproveCSR")
-
 	// Pod logs
 	s = r.
 		Path("/admin/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}/kubernetespodlogs").
diff --git a/pkg/frontend/openshiftversions_list.go b/pkg/frontend/installversions_list.go
similarity index 66%
rename from pkg/frontend/openshiftversions_list.go
rename to pkg/frontend/installversions_list.go
index be416c927..4fc03659a 100644
--- a/pkg/frontend/openshiftversions_list.go
+++ b/pkg/frontend/installversions_list.go
@@ -22,44 +22,40 @@ func (f *frontend) listInstallVersions(w http.ResponseWriter, r *http.Request) {
 	vars := mux.Vars(r)
 	log := ctx.Value(middleware.ContextKeyLog).(*logrus.Entry)
 
-	if f.apis[vars["api-version"]].OpenShiftVersionConverter == nil {
+	if f.apis[vars["api-version"]].InstallVersionsConverter == nil {
 		api.WriteError(w, http.StatusBadRequest, api.CloudErrorCodeInvalidResourceType, "", "The endpoint could not be found in the namespace '%s' for api version '%s'.", vars["resourceProviderNamespace"], vars["api-version"])
 		return
 	}
 
-	versions, err := f.getEnabledInstallVersions(ctx)
+	versions, err := f.getInstallVersions(ctx)
 	if err != nil {
 		log.Error(err)
 		api.WriteError(w, http.StatusInternalServerError, api.CloudErrorCodeInternalServerError, "", "Unable to list the available OpenShift versions in this region.")
 		return
 	}
 
-	converter := f.apis[vars["api-version"]].OpenShiftVersionConverter
+	converter := f.apis[vars["api-version"]].InstallVersionsConverter
 
-	b, err := json.MarshalIndent(converter.ToExternalList(([]*api.OpenShiftVersion)(versions)), "", "    ")
+	b, err := json.Marshal(converter.ToExternal((*api.InstallVersions)(&versions)))
 	reply(log, w, nil, b, err)
 }
 
-func (f *frontend) getEnabledInstallVersions(ctx context.Context) ([]*api.OpenShiftVersion, error) {
+func (f *frontend) getInstallVersions(ctx context.Context) ([]string, error) {
 	docs, err := f.dbOpenShiftVersions.ListAll(ctx)
 	if err != nil {
 		return nil, fmt.Errorf("unable to list the entries in the OpenShift versions database: %s", err.Error())
 	}
 
-	versions := make([]*api.OpenShiftVersion, 0)
+	versions := make([]string, 0)
 	for _, doc := range docs.OpenShiftVersionDocuments {
-		if doc.OpenShiftVersion.Properties.Enabled {
-			versions = append(versions, doc.OpenShiftVersion)
+		if doc.OpenShiftVersion.Enabled {
+			versions = append(versions, doc.OpenShiftVersion.Version)
 		}
 	}
 
 	// add the default from version.InstallStream, when we have no active versions
 	if len(versions) == 0 {
-		versions = append(versions, &api.OpenShiftVersion{
-			Properties: api.OpenShiftVersionProperties{
-				Version: version.InstallStream.Version.String(),
-			},
-		})
+		versions = append(versions, version.InstallStream.Version.String())
 	}
 
 	return versions, nil
diff --git a/pkg/frontend/openshiftcluster_putorpatch.go b/pkg/frontend/openshiftcluster_putorpatch.go
index eaf7b3ebf..69a4aa29e 100644
--- a/pkg/frontend/openshiftcluster_putorpatch.go
+++ b/pkg/frontend/openshiftcluster_putorpatch.go
@@ -65,6 +65,11 @@ func (f *frontend) _putOrPatchOpenShiftCluster(ctx context.Context, log *logrus.
 			return nil, err
 		}
 
+		installVersion, err := f.validateAndReturnInstallVersion(ctx, body)
+		if err != nil {
+			return nil, err
+		}
+
 		doc = &api.OpenShiftClusterDocument{
 			ID:  f.dbOpenShiftClusters.NewUUID(),
 			Key: path,
@@ -78,6 +83,9 @@ func (f *frontend) _putOrPatchOpenShiftCluster(ctx context.Context, log *logrus.
 					CreatedAt:           f.now().UTC(),
 					CreatedBy:           version.GitCommit,
 					ProvisionedBy:       version.GitCommit,
+					ClusterProfile: api.ClusterProfile{
+						Version: installVersion,
+					},
 				},
 			},
 		}
@@ -170,11 +178,6 @@ func (f *frontend) _putOrPatchOpenShiftCluster(ctx context.Context, log *logrus.
 	f.systemDataClusterDocEnricher(doc, systemData)
 
 	if isCreate {
-		err = f.validateInstallVersion(ctx, doc)
-		if err != nil {
-			return nil, err
-		}
-
 		// on create, make the cluster resourcegroup ID lower case to work
 		// around LB/PLS bug
 		doc.OpenShiftCluster.Properties.ClusterProfile.ResourceGroupID = strings.ToLower(doc.OpenShiftCluster.Properties.ClusterProfile.ResourceGroupID)
@@ -236,7 +239,7 @@ func (f *frontend) _putOrPatchOpenShiftCluster(ctx context.Context, log *logrus.
 	doc.OpenShiftCluster.Properties.ClusterProfile.PullSecret = ""
 	doc.OpenShiftCluster.Properties.ServicePrincipalProfile.ClientSecret = ""
 
-	b, err := json.MarshalIndent(converter.ToExternal(doc.OpenShiftCluster), "", "    ")
+	b, err := json.MarshalIndent(converter.ToExternal(doc.OpenShiftCluster), "", "\t")
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/frontend/validate.go b/pkg/frontend/validate.go
index 0d81c1760..0cab9ccc6 100644
--- a/pkg/frontend/validate.go
+++ b/pkg/frontend/validate.go
@@ -12,6 +12,7 @@ import (
 	"github.com/Azure/go-autorest/autorest/azure"
 
 	"github.com/Azure/ARO-RP/pkg/api"
+	"github.com/Azure/ARO-RP/pkg/api/components/installversion"
 	"github.com/Azure/ARO-RP/pkg/api/validate"
 	"github.com/Azure/ARO-RP/pkg/database/cosmosdb"
 	utilnamespace "github.com/Azure/ARO-RP/pkg/util/namespace"
@@ -166,41 +167,42 @@ func validateAdminVMSize(vmSize string) error {
 	return nil
 }
 
-// validateInstallVersion validates the install version set in the clusterprofile.version
-// TODO convert this into static validation instead of this receiver function in the vaidate for frontend.
-func (f *frontend) validateInstallVersion(ctx context.Context, doc *api.OpenShiftClusterDocument) error {
-	oc := doc.OpenShiftCluster
+func (f *frontend) validateAndReturnInstallVersion(ctx context.Context, body []byte) (string, error) {
+	oc, err := installversion.FromExternalBytes(body)
+	if err != nil {
+		return "", api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidRequestContent, "", "The request content was invalid and could not be deserialized: %q.", err)
+	}
+
 	// If this request is from an older API or the user never specified
 	// the version to install we default to the InstallStream.Version
-	if oc.Properties.ClusterProfile.Version == "" {
-		oc.Properties.ClusterProfile.Version = version.InstallStream.Version.String()
-		return nil
+	if len(oc.Properties.InstallVersion) == 0 {
+		return version.InstallStream.Version.String(), nil
 	}
 
-	errInvalidVersion := api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, "properties.clusterProfile.version", "The requested OpenShift version '%s' is invalid.", oc.Properties.ClusterProfile.Version)
+	errInvalidVersion := api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, "properties.installversion", "The requested OpenShift version '%s' is invalid.", oc.Properties.InstallVersion)
 
-	if !validate.RxInstallVersion.MatchString(oc.Properties.ClusterProfile.Version) {
-		return errInvalidVersion
+	if !validate.RxInstallVersion.MatchString(oc.Properties.InstallVersion) {
+		return "", errInvalidVersion
 	}
 
 	docs, err := f.dbOpenShiftVersions.ListAll(ctx)
 	if err != nil {
-		return err
+		return "", err
 	}
 
 	// If we have no OpenShiftVersion entries in CosmoDB, default to using the InstallStream.Version
 	if len(docs.OpenShiftVersionDocuments) == 0 {
-		if oc.Properties.ClusterProfile.Version != version.InstallStream.Version.String() {
-			return errInvalidVersion
+		if oc.Properties.InstallVersion != version.InstallStream.Version.String() {
+			return "", errInvalidVersion
 		}
-		return nil
+		return version.InstallStream.Version.String(), nil
 	}
 
 	for _, doc := range docs.OpenShiftVersionDocuments {
-		if oc.Properties.ClusterProfile.Version == doc.OpenShiftVersion.Properties.Version {
-			return nil
+		if oc.Properties.InstallVersion == doc.OpenShiftVersion.Version {
+			return oc.Properties.InstallVersion, nil
 		}
 	}
 
-	return errInvalidVersion
+	return "", errInvalidVersion
 }
diff --git a/pkg/hive/install.go b/pkg/hive/install.go
index c2921cde1..c78ff277a 100644
--- a/pkg/hive/install.go
+++ b/pkg/hive/install.go
@@ -187,8 +187,8 @@ func (c *clusterManager) clusterDeploymentForInstall(doc *api.OpenShiftClusterDo
 				Name: pullsecretSecretName,
 			},
 			Provisioning: &hivev1.Provisioning{
-				InstallerImageOverride: version.Properties.InstallerPullspec,
-				ReleaseImage:           version.Properties.OpenShiftPullspec,
+				InstallerImageOverride: version.InstallerPullspec,
+				ReleaseImage:           version.OpenShiftPullspec,
 				InstallConfigSecretRef: &corev1.LocalObjectReference{
 					Name: installConfigName,
 				},
diff --git a/pkg/installer/generateconfig.go b/pkg/installer/generateconfig.go
index f4a41db34..0c1559439 100644
--- a/pkg/installer/generateconfig.go
+++ b/pkg/installer/generateconfig.go
@@ -232,8 +232,8 @@ func (m *manager) generateInstallConfig(ctx context.Context) (*installconfig.Ins
 	}
 
 	image := &releaseimage.Image{}
-	if m.oc.Properties.ClusterProfile.Version == m.version.Properties.Version {
-		image.PullSpec = m.version.Properties.OpenShiftPullspec
+	if m.oc.Properties.ClusterProfile.Version == m.version.Version {
+		image.PullSpec = m.version.OpenShiftPullspec
 	} else {
 		return nil, nil, fmt.Errorf("unimplemented version %q", m.oc.Properties.ClusterProfile.Version)
 	}
diff --git a/pkg/swagger/examples.go b/pkg/swagger/examples.go
index b978e7ef7..c25e4eb6f 100644
--- a/pkg/swagger/examples.go
+++ b/pkg/swagger/examples.go
@@ -143,13 +143,13 @@ func (g *generator) generateExamples(outputDir string, s *Swagger) error {
 					case "#/definitions/SyncSetList":
 						body = g.exampleSyncSetListResponse()
 					case "#/definitions/MachinePool":
-						body = g.exampleMachinePoolResponse()
+						body = g.exampleSyncSetResponse()
 					case "#/definitions/MachinePoolList":
-						body = g.exampleMachinePoolListResponse()
+						body = g.exampleSyncSetListResponse()
 					case "#/definitions/SyncIdentityProvider":
-						body = g.exampleSyncIdentityProviderResponse()
+						body = g.exampleSyncSetResponse()
 					case "#/definitions/SyncIdentityProviderList":
-						body = g.exampleSyncIdentityProviderListResponse()
+						body = g.exampleSyncSetListResponse()
 					case "#/definitions/Secret":
 						body = g.exampleSecretResponse()
 					case "#/definitions/SecretList":
@@ -164,8 +164,8 @@ func (g *generator) generateExamples(outputDir string, s *Swagger) error {
 						body = g.exampleOpenShiftClusterListResponse()
 					case "#/definitions/OperationList":
 						body = g.exampleOperationListResponse()
-					case "#/definitions/OpenShiftVersionList":
-						body = g.exampleOpenShiftVersionListResponse()
+					case "#/definitions/InstallVersions":
+						body = g.exampleInstallVersions()
 					}
 				}
 
diff --git a/pkg/swagger/generator.go b/pkg/swagger/generator.go
index cfae26f20..b428c3b8a 100644
--- a/pkg/swagger/generator.go
+++ b/pkg/swagger/generator.go
@@ -41,7 +41,7 @@ type generator struct {
 	exampleOpenShiftClusterCredentialsResponse     func() interface{}
 	exampleOpenShiftClusterAdminKubeconfigResponse func() interface{}
 	exampleOpenShiftClusterListResponse            func() interface{}
-	exampleOpenShiftVersionListResponse            func() interface{}
+	exampleInstallVersions                         func() interface{}
 	exampleOperationListResponse                   func() interface{}
 
 	systemData         bool
@@ -120,7 +120,7 @@ var apis = map[string]*generator{
 		exampleOpenShiftClusterCredentialsResponse:     v20220904.ExampleOpenShiftClusterCredentialsResponse,
 		exampleOpenShiftClusterListResponse:            v20220904.ExampleOpenShiftClusterListResponse,
 		exampleOpenShiftClusterAdminKubeconfigResponse: v20220904.ExampleOpenShiftClusterAdminKubeconfigResponse,
-		exampleOpenShiftVersionListResponse:            v20220904.ExampleOpenShiftVersionListResponse,
+		exampleInstallVersions:                         v20220904.ExampleInstallVersionsResponse,
 		exampleOperationListResponse:                   api.ExampleOperationListResponse,
 
 		xmsEnum:            []string{"EncryptionAtHost", "FipsValidatedModules", "SoftwareDefinedNetwork", "Visibility"},
diff --git a/pkg/swagger/swagger.go b/pkg/swagger/swagger.go
index 51d9b7fe2..e55ac8acc 100644
--- a/pkg/swagger/swagger.go
+++ b/pkg/swagger/swagger.go
@@ -22,7 +22,6 @@ var proxyResources = []string{
 	"SyncIdentityProvider",
 	"MachinePool",
 	"Secret",
-	"OpenShiftVersion",
 }
 
 func Run(api, outputDir string) error {
@@ -103,12 +102,12 @@ func Run(api, outputDir string) error {
 	if g.installVersionList {
 		s.Paths["/subscriptions/{subscriptionId}/providers/Microsoft.RedHatOpenShift/locations/{location}/listinstallversions"] = &PathItem{
 			Get: &Operation{
-				Tags:        []string{"OpenShiftVersions"},
+				Tags:        []string{"InstallVersions"},
 				Summary:     "Lists all OpenShift versions available to install in the specified location.",
 				Description: "The operation returns the installable OpenShift versions as strings.",
-				OperationID: "OpenShiftVersions_List",
-				Parameters:  g.populateParameters(6, "OpenShiftVersionList", "OpenShift Versions"),
-				Responses:   g.populateResponses("OpenShiftVersionList", false, http.StatusOK),
+				OperationID: "InstallVersions_List",
+				Parameters:  g.populateParameters(6, "InstallVersions", "Install Versions"),
+				Responses:   g.populateResponses("InstallVersions", false, http.StatusOK),
 			},
 		}
 	}
@@ -128,7 +127,7 @@ func Run(api, outputDir string) error {
 	}
 
 	if g.installVersionList {
-		names = append(names, "OpenShiftVersionList")
+		names = append(names, "InstallVersions")
 	}
 
 	if g.clusterManager {
diff --git a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go
index 6946402d9..a7673d411 100644
--- a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go
+++ b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go
@@ -4,6 +4,8 @@ package network
 // Licensed under the Apache License 2.0.
 
 import (
+	"context"
+
 	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2020-08-01/network"
 	"github.com/Azure/go-autorest/autorest"
 
@@ -11,6 +13,8 @@ import (
 )
 
 type VirtualNetworkPeeringsClient interface {
+	CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, virtualNetworkPeeringName string, virtualNetworkPeeringParameters mgmtnetwork.VirtualNetworkPeering) (result mgmtnetwork.VirtualNetworkPeeringsCreateOrUpdateFuture, err error)
+	Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, virtualNetworkPeeringName string) (result mgmtnetwork.VirtualNetworkPeeringsDeleteFuture, err error)
 	VirtualNetworkPeeringsAddons
 }
 
diff --git a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings_addons.go b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings_addons.go
index 112e36a90..3ffd88887 100644
--- a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings_addons.go
+++ b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings_addons.go
@@ -5,12 +5,24 @@ package network
 
 import (
 	"context"
+
+	mgmtnetwork "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2020-08-01/network"
 )
 
 type VirtualNetworkPeeringsAddons interface {
+	CreateOrUpdateAndWait(ctx context.Context, resourceGroupName string, virtualNetworkName string, virtualNetworkPeeringName string, virtualNetworkPeeringParameters mgmtnetwork.VirtualNetworkPeering) (err error)
 	DeleteAndWait(ctx context.Context, resourceGroupName string, virtualNetworkName string, virtualNetworkPeeringName string) (err error)
 }
 
+func (c *virtualNetworkPeeringsClient) CreateOrUpdateAndWait(ctx context.Context, resourceGroupName string, virtualNetworkName string, virtualNetworkPeeringName string, virtualNetworkPeeringParameters mgmtnetwork.VirtualNetworkPeering) (err error) {
+	future, err := c.CreateOrUpdate(ctx, resourceGroupName, virtualNetworkName, virtualNetworkPeeringName, virtualNetworkPeeringParameters)
+	if err != nil {
+		return err
+	}
+
+	return future.WaitForCompletionRef(ctx, c.Client)
+}
+
 func (c *virtualNetworkPeeringsClient) DeleteAndWait(ctx context.Context, resourceGroupName string, virtualNetworkName string, virtualNetworkPeeringName string) (err error) {
 	future, err := c.VirtualNetworkPeeringsClient.Delete(ctx, resourceGroupName, virtualNetworkName, virtualNetworkPeeringName)
 	if err != nil {
diff --git a/pkg/util/cluster/cluster.go b/pkg/util/cluster/cluster.go
index 7245f2ca0..2b2b3f96c 100644
--- a/pkg/util/cluster/cluster.go
+++ b/pkg/util/cluster/cluster.go
@@ -20,6 +20,7 @@ import (
 	mgmtauthorization "github.com/Azure/azure-sdk-for-go/services/preview/authorization/mgmt/2018-09-01-preview/authorization"
 	mgmtfeatures "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-07-01/features"
 	"github.com/Azure/go-autorest/autorest"
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/Azure/go-autorest/autorest/azure/auth"
 	"github.com/Azure/go-autorest/autorest/to"
 	"github.com/sirupsen/logrus"
@@ -46,9 +47,10 @@ import (
 )
 
 type Cluster struct {
-	log *logrus.Entry
-	env env.Core
-	ci  bool
+	log          *logrus.Entry
+	env          env.Core
+	ci           bool
+	ciParentVnet string
 
 	deployments                       features.DeploymentsClient
 	groups                            features.ResourceGroupsClient
@@ -63,6 +65,7 @@ type Cluster struct {
 	routetables                       network.RouteTablesClient
 	roleassignments                   authorization.RoleAssignmentsClient
 	peerings                          network.VirtualNetworkPeeringsClient
+	ciParentVnetPeerings              network.VirtualNetworkPeeringsClient
 	vaultsClient                      keyvaultclient.VaultsClient
 }
 
@@ -121,6 +124,17 @@ func New(log *logrus.Entry, environment env.Core, ci bool) (*Cluster, error) {
 		vaultsClient:                      keyvaultclient.NewVaultsClient(environment.Environment(), environment.SubscriptionID(), authorizer),
 	}
 
+	// Only peer if CI=true and cluster is PublicCloud
+	if ci {
+		c.ciParentVnet = fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/virtualNetworks/dev-vpn-vnet", c.env.SubscriptionID(), c.env.ResourceGroup())
+		r, err := azure.ParseResourceID(c.ciParentVnet)
+		if err != nil {
+			return nil, err
+		}
+
+		c.ciParentVnetPeerings = network.NewVirtualNetworkPeeringsClient(environment.Environment(), r.SubscriptionID, authorizer)
+	}
+
 	return c, nil
 }
 
@@ -308,6 +322,12 @@ func (c *Cluster) Create(ctx context.Context, vnetResourceGroup, clusterName str
 		if err != nil {
 			return err
 		}
+
+		c.log.Info("peering subnets to CI infra")
+		err = c.peerSubnetsToCI(ctx, vnetResourceGroup, clusterName)
+		if err != nil {
+			return err
+		}
 	}
 
 	c.log.Info("done")
@@ -315,13 +335,15 @@ func (c *Cluster) Create(ctx context.Context, vnetResourceGroup, clusterName str
 }
 
 func (c *Cluster) generateSubnets() (vnetPrefix string, masterSubnet string, workerSubnet string) {
-	// pick a random /23 in the range [10.0.2.0, 10.128.0.0).  10.0.0.0 is used
-	// by dev-vnet to host CI; 10.128.0.0+ is used for pods.
+	// pick a random 23 in range [10.3.0.0, 10.127.255.0]
+	// 10.0.0.0 is used by dev-vnet to host CI
+	// 10.1.0.0 is used by rp-vnet to host Proxy VM
+	// 10.2.0.0 is used by dev-vpn-vnet to host VirtualNetworkGateway
 	var x, y int
+	rand.Seed(time.Now().UnixNano())
 	for x == 0 && y == 0 {
-		x, y = rand.Intn(128), 2*rand.Intn(128)
+		x, y = rand.Intn((124))+3, 2*rand.Intn(128)
 	}
-
 	vnetPrefix = fmt.Sprintf("10.%d.%d.0/23", x, y)
 	masterSubnet = fmt.Sprintf("10.%d.%d.0/24", x, y)
 	workerSubnet = fmt.Sprintf("10.%d.%d.0/24", x, y+1)
@@ -359,6 +381,14 @@ func (c *Cluster) Delete(ctx context.Context, vnetResourceGroup, clusterName str
 				errs = append(errs, err)
 			}
 		}
+		// Only do this if CI=true and cloud = Public Cloud
+		r, err := azure.ParseResourceID(c.ciParentVnet)
+		if err == nil {
+			err = c.ciParentVnetPeerings.DeleteAndWait(ctx, r.ResourceGroup, r.ResourceName, vnetResourceGroup+"-peer")
+		}
+		if err != nil {
+			errs = append(errs, err)
+		}
 	} else {
 		// Deleting the deployment does not clean up the associated resources
 		c.log.Info("deleting deployment")
@@ -574,3 +604,41 @@ func (c *Cluster) deleteRoleAssignments(ctx context.Context, vnetResourceGroup,
 
 	return nil
 }
+
+func (c *Cluster) peerSubnetsToCI(ctx context.Context, vnetResourceGroup, clusterName string) error {
+	cluster := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/virtualNetworks/dev-vnet", c.env.SubscriptionID(), vnetResourceGroup)
+
+	r, err := azure.ParseResourceID(c.ciParentVnet)
+	if err != nil {
+		return err
+	}
+
+	clusterProp := &mgmtnetwork.VirtualNetworkPeeringPropertiesFormat{
+		RemoteVirtualNetwork: &mgmtnetwork.SubResource{
+			ID: &c.ciParentVnet,
+		},
+		AllowVirtualNetworkAccess: to.BoolPtr(true),
+		AllowForwardedTraffic:     to.BoolPtr(true),
+		UseRemoteGateways:         to.BoolPtr(true),
+	}
+	rpProp := &mgmtnetwork.VirtualNetworkPeeringPropertiesFormat{
+		RemoteVirtualNetwork: &mgmtnetwork.SubResource{
+			ID: &cluster,
+		},
+		AllowVirtualNetworkAccess: to.BoolPtr(true),
+		AllowForwardedTraffic:     to.BoolPtr(true),
+		AllowGatewayTransit:       to.BoolPtr(true),
+	}
+
+	err = c.peerings.CreateOrUpdateAndWait(ctx, vnetResourceGroup, "dev-vnet", r.ResourceGroup+"-peer", mgmtnetwork.VirtualNetworkPeering{VirtualNetworkPeeringPropertiesFormat: clusterProp})
+	if err != nil {
+		return err
+	}
+
+	err = c.ciParentVnetPeerings.CreateOrUpdateAndWait(ctx, r.ResourceGroup, r.ResourceName, vnetResourceGroup+"-peer", mgmtnetwork.VirtualNetworkPeering{VirtualNetworkPeeringPropertiesFormat: rpProp})
+	if err != nil {
+		return err
+	}
+
+	return err
+}
diff --git a/pkg/util/mocks/adminactions/adminactions.go b/pkg/util/mocks/adminactions/adminactions.go
index 8e7b06491..75e0d6514 100644
--- a/pkg/util/mocks/adminactions/adminactions.go
+++ b/pkg/util/mocks/adminactions/adminactions.go
@@ -38,34 +38,6 @@ func (m *MockKubeActions) EXPECT() *MockKubeActionsMockRecorder {
 	return m.recorder
 }
 
-// ApproveAllCsrs mocks base method.
-func (m *MockKubeActions) ApproveAllCsrs(arg0 context.Context) error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ApproveAllCsrs", arg0)
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// ApproveAllCsrs indicates an expected call of ApproveAllCsrs.
-func (mr *MockKubeActionsMockRecorder) ApproveAllCsrs(arg0 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ApproveAllCsrs", reflect.TypeOf((*MockKubeActions)(nil).ApproveAllCsrs), arg0)
-}
-
-// ApproveCsr mocks base method.
-func (m *MockKubeActions) ApproveCsr(arg0 context.Context, arg1 string) error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ApproveCsr", arg0, arg1)
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// ApproveCsr indicates an expected call of ApproveCsr.
-func (mr *MockKubeActionsMockRecorder) ApproveCsr(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ApproveCsr", reflect.TypeOf((*MockKubeActions)(nil).ApproveCsr), arg0, arg1)
-}
-
 // CordonNode mocks base method.
 func (m *MockKubeActions) CordonNode(arg0 context.Context, arg1 string, arg2 bool) error {
 	m.ctrl.T.Helper()
diff --git a/pkg/util/mocks/azureclient/mgmt/network/network.go b/pkg/util/mocks/azureclient/mgmt/network/network.go
index b6912a8a1..15a1b9fa3 100644
--- a/pkg/util/mocks/azureclient/mgmt/network/network.go
+++ b/pkg/util/mocks/azureclient/mgmt/network/network.go
@@ -591,6 +591,50 @@ func (m *MockVirtualNetworkPeeringsClient) EXPECT() *MockVirtualNetworkPeeringsC
 	return m.recorder
 }
 
+// CreateOrUpdate mocks base method.
+func (m *MockVirtualNetworkPeeringsClient) CreateOrUpdate(arg0 context.Context, arg1, arg2, arg3 string, arg4 network.VirtualNetworkPeering) (network.VirtualNetworkPeeringsCreateOrUpdateFuture, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateOrUpdate", arg0, arg1, arg2, arg3, arg4)
+	ret0, _ := ret[0].(network.VirtualNetworkPeeringsCreateOrUpdateFuture)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// CreateOrUpdate indicates an expected call of CreateOrUpdate.
+func (mr *MockVirtualNetworkPeeringsClientMockRecorder) CreateOrUpdate(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockVirtualNetworkPeeringsClient)(nil).CreateOrUpdate), arg0, arg1, arg2, arg3, arg4)
+}
+
+// CreateOrUpdateAndWait mocks base method.
+func (m *MockVirtualNetworkPeeringsClient) CreateOrUpdateAndWait(arg0 context.Context, arg1, arg2, arg3 string, arg4 network.VirtualNetworkPeering) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateOrUpdateAndWait", arg0, arg1, arg2, arg3, arg4)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateOrUpdateAndWait indicates an expected call of CreateOrUpdateAndWait.
+func (mr *MockVirtualNetworkPeeringsClientMockRecorder) CreateOrUpdateAndWait(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdateAndWait", reflect.TypeOf((*MockVirtualNetworkPeeringsClient)(nil).CreateOrUpdateAndWait), arg0, arg1, arg2, arg3, arg4)
+}
+
+// Delete mocks base method.
+func (m *MockVirtualNetworkPeeringsClient) Delete(arg0 context.Context, arg1, arg2, arg3 string) (network.VirtualNetworkPeeringsDeleteFuture, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delete", arg0, arg1, arg2, arg3)
+	ret0, _ := ret[0].(network.VirtualNetworkPeeringsDeleteFuture)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockVirtualNetworkPeeringsClientMockRecorder) Delete(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockVirtualNetworkPeeringsClient)(nil).Delete), arg0, arg1, arg2, arg3)
+}
+
 // DeleteAndWait mocks base method.
 func (m *MockVirtualNetworkPeeringsClient) DeleteAndWait(arg0 context.Context, arg1, arg2, arg3 string) error {
 	m.ctrl.T.Helper()
diff --git a/python/az/aro/azext_aro/custom.py b/python/az/aro/azext_aro/custom.py
index 72efaedb1..fc7b814dd 100644
--- a/python/az/aro/azext_aro/custom.py
+++ b/python/az/aro/azext_aro/custom.py
@@ -106,8 +106,6 @@ def aro_create(cmd,  # pylint: disable=too-many-locals
             resource_group_id=(f"/subscriptions/{subscription_id}"
                                f"/resourceGroups/{cluster_resource_group or 'aro-' + random_id}"),
             fips_validated_modules='Enabled' if fips_validated_modules else 'Disabled',
-            install_version=install_version or '',
-
         ),
         service_principal_profile=openshiftcluster.ServicePrincipalProfile(
             client_id=client_id,
@@ -144,6 +142,7 @@ def aro_create(cmd,  # pylint: disable=too-many-locals
                 visibility=ingress_visibility or 'Public',
             )
         ],
+        install_version=install_version or '',
     )
 
     sp_obj_ids = [client_sp_id, rp_client_sp_id]
@@ -225,11 +224,7 @@ def aro_list_admin_credentials(cmd, client, resource_group_name, resource_name,
 
 
 def aro_get_versions(client, location):
-    openshift_verions = client.open_shift_versions.list(location)
-    versions = []
-    for ver in openshift_verions.additional_properties["value"]:
-        versions.append(ver["properties"]["version"])
-    return sorted(versions)
+    return client.install_versions.list(location)
 
 
 def aro_update(cmd,
diff --git a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/_azure_red_hat_open_shift_client.py b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/_azure_red_hat_open_shift_client.py
index fc91bcbf6..03ee33d08 100644
--- a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/_azure_red_hat_open_shift_client.py
+++ b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/_azure_red_hat_open_shift_client.py
@@ -23,7 +23,7 @@ from azure.mgmt.core import ARMPipelineClient
 
 from . import models
 from ._configuration import AzureRedHatOpenShiftClientConfiguration
-from .operations import MachinePoolsOperations, OpenShiftClustersOperations, OpenShiftVersionsOperations, Operations, SecretsOperations, SyncIdentityProvidersOperations, SyncSetsOperations
+from .operations import InstallVersionsOperations, MachinePoolsOperations, OpenShiftClustersOperations, Operations, SecretsOperations, SyncIdentityProvidersOperations, SyncSetsOperations
 
 if TYPE_CHECKING:
     # pylint: disable=unused-import,ungrouped-imports
@@ -37,9 +37,9 @@ class AzureRedHatOpenShiftClient(object):    # pylint: disable=too-many-instance
 
     :ivar operations: Operations operations
     :vartype operations: azure.mgmt.redhatopenshift.v2022_09_04.operations.Operations
-    :ivar open_shift_versions: OpenShiftVersionsOperations operations
-    :vartype open_shift_versions:
-     azure.mgmt.redhatopenshift.v2022_09_04.operations.OpenShiftVersionsOperations
+    :ivar install_versions: InstallVersionsOperations operations
+    :vartype install_versions:
+     azure.mgmt.redhatopenshift.v2022_09_04.operations.InstallVersionsOperations
     :ivar open_shift_clusters: OpenShiftClustersOperations operations
     :vartype open_shift_clusters:
      azure.mgmt.redhatopenshift.v2022_09_04.operations.OpenShiftClustersOperations
@@ -82,7 +82,7 @@ class AzureRedHatOpenShiftClient(object):    # pylint: disable=too-many-instance
         self._deserialize = Deserializer(client_models)
         self._serialize.client_side_validation = False
         self.operations = Operations(self._client, self._config, self._serialize, self._deserialize)
-        self.open_shift_versions = OpenShiftVersionsOperations(self._client, self._config, self._serialize, self._deserialize)
+        self.install_versions = InstallVersionsOperations(self._client, self._config, self._serialize, self._deserialize)
         self.open_shift_clusters = OpenShiftClustersOperations(self._client, self._config, self._serialize, self._deserialize)
         self.machine_pools = MachinePoolsOperations(self._client, self._config, self._serialize, self._deserialize)
         self.secrets = SecretsOperations(self._client, self._config, self._serialize, self._deserialize)
diff --git a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/__init__.py b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/__init__.py
index 4270ac1b4..5263ff679 100644
--- a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/__init__.py
+++ b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/__init__.py
@@ -31,9 +31,6 @@ try:
     from ._models_py3 import OpenShiftClusterCredentials
     from ._models_py3 import OpenShiftClusterList
     from ._models_py3 import OpenShiftClusterUpdate
-    from ._models_py3 import OpenShiftVersion
-    from ._models_py3 import OpenShiftVersionList
-    from ._models_py3 import OpenShiftVersionProperties
     from ._models_py3 import Operation
     from ._models_py3 import OperationList
     from ._models_py3 import ProxyResource
@@ -68,9 +65,6 @@ except (SyntaxError, ImportError):
     from ._models import OpenShiftClusterCredentials  # type: ignore
     from ._models import OpenShiftClusterList  # type: ignore
     from ._models import OpenShiftClusterUpdate  # type: ignore
-    from ._models import OpenShiftVersion  # type: ignore
-    from ._models import OpenShiftVersionList  # type: ignore
-    from ._models import OpenShiftVersionProperties  # type: ignore
     from ._models import Operation  # type: ignore
     from ._models import OperationList  # type: ignore
     from ._models import ProxyResource  # type: ignore
@@ -114,9 +108,6 @@ __all__ = [
     'OpenShiftClusterCredentials',
     'OpenShiftClusterList',
     'OpenShiftClusterUpdate',
-    'OpenShiftVersion',
-    'OpenShiftVersionList',
-    'OpenShiftVersionProperties',
     'Operation',
     'OperationList',
     'ProxyResource',
diff --git a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models.py b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models.py
index fd580ade3..71b5724f6 100644
--- a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models.py
+++ b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models.py
@@ -619,6 +619,8 @@ class OpenShiftCluster(TrackedResource):
     :vartype apiserver_profile: ~azure.mgmt.redhatopenshift.v2022_09_04.models.APIServerProfile
     :ivar ingress_profiles: The cluster ingress profiles.
     :vartype ingress_profiles: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+    :ivar install_version: The cluster install version.
+    :vartype install_version: str
     """
 
     _validation = {
@@ -645,6 +647,7 @@ class OpenShiftCluster(TrackedResource):
         'worker_profiles': {'key': 'properties.workerProfiles', 'type': '[WorkerProfile]'},
         'apiserver_profile': {'key': 'properties.apiserverProfile', 'type': 'APIServerProfile'},
         'ingress_profiles': {'key': 'properties.ingressProfiles', 'type': '[IngressProfile]'},
+        'install_version': {'key': 'properties.installVersion', 'type': 'str'},
     }
 
     def __init__(
@@ -678,6 +681,8 @@ class OpenShiftCluster(TrackedResource):
         :keyword ingress_profiles: The cluster ingress profiles.
         :paramtype ingress_profiles:
          list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+        :keyword install_version: The cluster install version.
+        :paramtype install_version: str
         """
         super(OpenShiftCluster, self).__init__(**kwargs)
         self.provisioning_state = kwargs.get('provisioning_state', None)
@@ -689,6 +694,7 @@ class OpenShiftCluster(TrackedResource):
         self.worker_profiles = kwargs.get('worker_profiles', None)
         self.apiserver_profile = kwargs.get('apiserver_profile', None)
         self.ingress_profiles = kwargs.get('ingress_profiles', None)
+        self.install_version = kwargs.get('install_version', None)
 
 
 class OpenShiftClusterAdminKubeconfig(msrest.serialization.Model):
@@ -802,6 +808,8 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
     :vartype apiserver_profile: ~azure.mgmt.redhatopenshift.v2022_09_04.models.APIServerProfile
     :ivar ingress_profiles: The cluster ingress profiles.
     :vartype ingress_profiles: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+    :ivar install_version: The cluster install version.
+    :vartype install_version: str
     """
 
     _validation = {
@@ -820,6 +828,7 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         'worker_profiles': {'key': 'properties.workerProfiles', 'type': '[WorkerProfile]'},
         'apiserver_profile': {'key': 'properties.apiserverProfile', 'type': 'APIServerProfile'},
         'ingress_profiles': {'key': 'properties.ingressProfiles', 'type': '[IngressProfile]'},
+        'install_version': {'key': 'properties.installVersion', 'type': 'str'},
     }
 
     def __init__(
@@ -851,6 +860,8 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         :keyword ingress_profiles: The cluster ingress profiles.
         :paramtype ingress_profiles:
          list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+        :keyword install_version: The cluster install version.
+        :paramtype install_version: str
         """
         super(OpenShiftClusterUpdate, self).__init__(**kwargs)
         self.tags = kwargs.get('tags', None)
@@ -864,106 +875,7 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         self.worker_profiles = kwargs.get('worker_profiles', None)
         self.apiserver_profile = kwargs.get('apiserver_profile', None)
         self.ingress_profiles = kwargs.get('ingress_profiles', None)
-
-
-class OpenShiftVersion(ProxyResource):
-    """OpenShiftVersion represents an OpenShift version that can be installed.
-
-    Variables are only populated by the server, and will be ignored when sending a request.
-
-    :ivar id: Fully qualified resource ID for the resource. Ex -
-     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
-    :vartype id: str
-    :ivar name: The name of the resource.
-    :vartype name: str
-    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
-     "Microsoft.Storage/storageAccounts".
-    :vartype type: str
-    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
-     information.
-    :vartype system_data: ~azure.mgmt.redhatopenshift.v2022_09_04.models.SystemData
-    :ivar properties: The properties for the OpenShiftVersion resource.
-    :vartype properties: ~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersionProperties
-    """
-
-    _validation = {
-        'id': {'readonly': True},
-        'name': {'readonly': True},
-        'type': {'readonly': True},
-        'system_data': {'readonly': True},
-    }
-
-    _attribute_map = {
-        'id': {'key': 'id', 'type': 'str'},
-        'name': {'key': 'name', 'type': 'str'},
-        'type': {'key': 'type', 'type': 'str'},
-        'system_data': {'key': 'systemData', 'type': 'SystemData'},
-        'properties': {'key': 'properties', 'type': 'OpenShiftVersionProperties'},
-    }
-
-    def __init__(
-        self,
-        **kwargs
-    ):
-        """
-        :keyword properties: The properties for the OpenShiftVersion resource.
-        :paramtype properties:
-         ~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersionProperties
-        """
-        super(OpenShiftVersion, self).__init__(**kwargs)
-        self.properties = kwargs.get('properties', None)
-
-
-class OpenShiftVersionList(msrest.serialization.Model):
-    """OpenShiftVersionList represents a List of available versions.
-
-    :ivar value: The List of available versions.
-    :vartype value: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersion]
-    :ivar next_link: Next Link to next operation.
-    :vartype next_link: str
-    """
-
-    _attribute_map = {
-        'value': {'key': 'value', 'type': '[OpenShiftVersion]'},
-        'next_link': {'key': 'nextLink', 'type': 'str'},
-    }
-
-    def __init__(
-        self,
-        **kwargs
-    ):
-        """
-        :keyword value: The List of available versions.
-        :paramtype value: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersion]
-        :keyword next_link: Next Link to next operation.
-        :paramtype next_link: str
-        """
-        super(OpenShiftVersionList, self).__init__(**kwargs)
-        self.value = kwargs.get('value', None)
-        self.next_link = kwargs.get('next_link', None)
-
-
-class OpenShiftVersionProperties(msrest.serialization.Model):
-    """OpenShiftVersionProperties represents the properties of an OpenShiftVersion.
-
-    :ivar version: Version represents the version to create the cluster at.
-    :vartype version: str
-    """
-
-    _attribute_map = {
-        'version': {'key': 'version', 'type': 'str'},
-    }
-
-    def __init__(
-        self,
-        **kwargs
-    ):
-        """
-        :keyword version: Version represents the version to create the cluster at.
-        :paramtype version: str
-        """
-        super(OpenShiftVersionProperties, self).__init__(**kwargs)
-        self.version = kwargs.get('version', None)
+        self.install_version = kwargs.get('install_version', None)
 
 
 class Operation(msrest.serialization.Model):
diff --git a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models_py3.py b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models_py3.py
index b9b6aacd8..1c06dedd3 100644
--- a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models_py3.py
+++ b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/models/_models_py3.py
@@ -668,6 +668,8 @@ class OpenShiftCluster(TrackedResource):
     :vartype apiserver_profile: ~azure.mgmt.redhatopenshift.v2022_09_04.models.APIServerProfile
     :ivar ingress_profiles: The cluster ingress profiles.
     :vartype ingress_profiles: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+    :ivar install_version: The cluster install version.
+    :vartype install_version: str
     """
 
     _validation = {
@@ -694,6 +696,7 @@ class OpenShiftCluster(TrackedResource):
         'worker_profiles': {'key': 'properties.workerProfiles', 'type': '[WorkerProfile]'},
         'apiserver_profile': {'key': 'properties.apiserverProfile', 'type': 'APIServerProfile'},
         'ingress_profiles': {'key': 'properties.ingressProfiles', 'type': '[IngressProfile]'},
+        'install_version': {'key': 'properties.installVersion', 'type': 'str'},
     }
 
     def __init__(
@@ -710,6 +713,7 @@ class OpenShiftCluster(TrackedResource):
         worker_profiles: Optional[List["WorkerProfile"]] = None,
         apiserver_profile: Optional["APIServerProfile"] = None,
         ingress_profiles: Optional[List["IngressProfile"]] = None,
+        install_version: Optional[str] = None,
         **kwargs
     ):
         """
@@ -739,6 +743,8 @@ class OpenShiftCluster(TrackedResource):
         :keyword ingress_profiles: The cluster ingress profiles.
         :paramtype ingress_profiles:
          list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+        :keyword install_version: The cluster install version.
+        :paramtype install_version: str
         """
         super(OpenShiftCluster, self).__init__(tags=tags, location=location, **kwargs)
         self.provisioning_state = provisioning_state
@@ -750,6 +756,7 @@ class OpenShiftCluster(TrackedResource):
         self.worker_profiles = worker_profiles
         self.apiserver_profile = apiserver_profile
         self.ingress_profiles = ingress_profiles
+        self.install_version = install_version
 
 
 class OpenShiftClusterAdminKubeconfig(msrest.serialization.Model):
@@ -871,6 +878,8 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
     :vartype apiserver_profile: ~azure.mgmt.redhatopenshift.v2022_09_04.models.APIServerProfile
     :ivar ingress_profiles: The cluster ingress profiles.
     :vartype ingress_profiles: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+    :ivar install_version: The cluster install version.
+    :vartype install_version: str
     """
 
     _validation = {
@@ -889,6 +898,7 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         'worker_profiles': {'key': 'properties.workerProfiles', 'type': '[WorkerProfile]'},
         'apiserver_profile': {'key': 'properties.apiserverProfile', 'type': 'APIServerProfile'},
         'ingress_profiles': {'key': 'properties.ingressProfiles', 'type': '[IngressProfile]'},
+        'install_version': {'key': 'properties.installVersion', 'type': 'str'},
     }
 
     def __init__(
@@ -904,6 +914,7 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         worker_profiles: Optional[List["WorkerProfile"]] = None,
         apiserver_profile: Optional["APIServerProfile"] = None,
         ingress_profiles: Optional[List["IngressProfile"]] = None,
+        install_version: Optional[str] = None,
         **kwargs
     ):
         """
@@ -931,6 +942,8 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         :keyword ingress_profiles: The cluster ingress profiles.
         :paramtype ingress_profiles:
          list[~azure.mgmt.redhatopenshift.v2022_09_04.models.IngressProfile]
+        :keyword install_version: The cluster install version.
+        :paramtype install_version: str
         """
         super(OpenShiftClusterUpdate, self).__init__(**kwargs)
         self.tags = tags
@@ -944,113 +957,7 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         self.worker_profiles = worker_profiles
         self.apiserver_profile = apiserver_profile
         self.ingress_profiles = ingress_profiles
-
-
-class OpenShiftVersion(ProxyResource):
-    """OpenShiftVersion represents an OpenShift version that can be installed.
-
-    Variables are only populated by the server, and will be ignored when sending a request.
-
-    :ivar id: Fully qualified resource ID for the resource. Ex -
-     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
-    :vartype id: str
-    :ivar name: The name of the resource.
-    :vartype name: str
-    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
-     "Microsoft.Storage/storageAccounts".
-    :vartype type: str
-    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
-     information.
-    :vartype system_data: ~azure.mgmt.redhatopenshift.v2022_09_04.models.SystemData
-    :ivar properties: The properties for the OpenShiftVersion resource.
-    :vartype properties: ~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersionProperties
-    """
-
-    _validation = {
-        'id': {'readonly': True},
-        'name': {'readonly': True},
-        'type': {'readonly': True},
-        'system_data': {'readonly': True},
-    }
-
-    _attribute_map = {
-        'id': {'key': 'id', 'type': 'str'},
-        'name': {'key': 'name', 'type': 'str'},
-        'type': {'key': 'type', 'type': 'str'},
-        'system_data': {'key': 'systemData', 'type': 'SystemData'},
-        'properties': {'key': 'properties', 'type': 'OpenShiftVersionProperties'},
-    }
-
-    def __init__(
-        self,
-        *,
-        properties: Optional["OpenShiftVersionProperties"] = None,
-        **kwargs
-    ):
-        """
-        :keyword properties: The properties for the OpenShiftVersion resource.
-        :paramtype properties:
-         ~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersionProperties
-        """
-        super(OpenShiftVersion, self).__init__(**kwargs)
-        self.properties = properties
-
-
-class OpenShiftVersionList(msrest.serialization.Model):
-    """OpenShiftVersionList represents a List of available versions.
-
-    :ivar value: The List of available versions.
-    :vartype value: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersion]
-    :ivar next_link: Next Link to next operation.
-    :vartype next_link: str
-    """
-
-    _attribute_map = {
-        'value': {'key': 'value', 'type': '[OpenShiftVersion]'},
-        'next_link': {'key': 'nextLink', 'type': 'str'},
-    }
-
-    def __init__(
-        self,
-        *,
-        value: Optional[List["OpenShiftVersion"]] = None,
-        next_link: Optional[str] = None,
-        **kwargs
-    ):
-        """
-        :keyword value: The List of available versions.
-        :paramtype value: list[~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersion]
-        :keyword next_link: Next Link to next operation.
-        :paramtype next_link: str
-        """
-        super(OpenShiftVersionList, self).__init__(**kwargs)
-        self.value = value
-        self.next_link = next_link
-
-
-class OpenShiftVersionProperties(msrest.serialization.Model):
-    """OpenShiftVersionProperties represents the properties of an OpenShiftVersion.
-
-    :ivar version: Version represents the version to create the cluster at.
-    :vartype version: str
-    """
-
-    _attribute_map = {
-        'version': {'key': 'version', 'type': 'str'},
-    }
-
-    def __init__(
-        self,
-        *,
-        version: Optional[str] = None,
-        **kwargs
-    ):
-        """
-        :keyword version: Version represents the version to create the cluster at.
-        :paramtype version: str
-        """
-        super(OpenShiftVersionProperties, self).__init__(**kwargs)
-        self.version = version
+        self.install_version = install_version
 
 
 class Operation(msrest.serialization.Model):
diff --git a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/__init__.py b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/__init__.py
index 3227f81cb..a70265e21 100644
--- a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/__init__.py
+++ b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/__init__.py
@@ -15,7 +15,7 @@
 # --------------------------------------------------------------------------
 
 from ._operations import Operations
-from ._open_shift_versions_operations import OpenShiftVersionsOperations
+from ._install_versions_operations import InstallVersionsOperations
 from ._open_shift_clusters_operations import OpenShiftClustersOperations
 from ._machine_pools_operations import MachinePoolsOperations
 from ._secrets_operations import SecretsOperations
@@ -24,7 +24,7 @@ from ._sync_sets_operations import SyncSetsOperations
 
 __all__ = [
     'Operations',
-    'OpenShiftVersionsOperations',
+    'InstallVersionsOperations',
     'OpenShiftClustersOperations',
     'MachinePoolsOperations',
     'SecretsOperations',
diff --git a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_open_shift_versions_operations.py b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_install_versions_operations.py
similarity index 91%
rename from python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_open_shift_versions_operations.py
rename to python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_install_versions_operations.py
index d51d26dc7..6136a0e3c 100644
--- a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_open_shift_versions_operations.py
+++ b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_install_versions_operations.py
@@ -30,7 +30,7 @@ from .._vendor import _convert_request, _format_url_section
 
 if TYPE_CHECKING:
     # pylint: disable=unused-import,ungrouped-imports
-    from typing import Any, Callable, Dict, Optional, TypeVar
+    from typing import Any, Callable, Dict, List, Optional, TypeVar
     T = TypeVar('T')
     ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]]
 
@@ -73,8 +73,8 @@ def build_list_request(
     )
 
 # fmt: on
-class OpenShiftVersionsOperations(object):
-    """OpenShiftVersionsOperations operations.
+class InstallVersionsOperations(object):
+    """InstallVersionsOperations operations.
 
     You should not instantiate this class directly. Instead, you should create a Client instance that
     instantiates it for you and attaches it as an attribute.
@@ -101,7 +101,7 @@ class OpenShiftVersionsOperations(object):
         location,  # type: str
         **kwargs  # type: Any
     ):
-        # type: (...) -> "_models.OpenShiftVersionList"
+        # type: (...) -> List[str]
         """Lists all OpenShift versions available to install in the specified location.
 
         The operation returns the installable OpenShift versions as strings.
@@ -109,11 +109,11 @@ class OpenShiftVersionsOperations(object):
         :param location: The name of Azure region.
         :type location: str
         :keyword callable cls: A custom type or function that will be passed the direct response
-        :return: OpenShiftVersionList, or the result of cls(response)
-        :rtype: ~azure.mgmt.redhatopenshift.v2022_09_04.models.OpenShiftVersionList
+        :return: list of str, or the result of cls(response)
+        :rtype: list[str]
         :raises: ~azure.core.exceptions.HttpResponseError
         """
-        cls = kwargs.pop('cls', None)  # type: ClsType["_models.OpenShiftVersionList"]
+        cls = kwargs.pop('cls', None)  # type: ClsType[List[str]]
         error_map = {
             401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
         }
@@ -142,7 +142,7 @@ class OpenShiftVersionsOperations(object):
             map_error(status_code=response.status_code, response=response, error_map=error_map)
             raise HttpResponseError(response=response, error_format=ARMErrorFormat)
 
-        deserialized = self._deserialize('OpenShiftVersionList', pipeline_response)
+        deserialized = self._deserialize('[str]', pipeline_response)
 
         if cls:
             return cls(pipeline_response, deserialized, {})
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/OpenShiftVersions_List.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/InstallVersions_List.json
similarity index 52%
rename from swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/OpenShiftVersions_List.json
rename to swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/InstallVersions_List.json
index 758a4c7e8..2ab1831af 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/OpenShiftVersions_List.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/InstallVersions_List.json
@@ -6,15 +6,9 @@
   },
   "responses": {
     "200": {
-      "body": {
-        "value": [
-          {
-            "properties": {
-              "version": "4.10.20"
-            }
-          }
-        ]
-      }
+      "body": [
+        "4.10.20"
+      ]
     }
   }
 }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_CreateOrUpdate.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_CreateOrUpdate.json
index 8eee039d4..82b54231c 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_CreateOrUpdate.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_CreateOrUpdate.json
@@ -14,21 +14,15 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/machinePools/myMachinePool",
-        "name": "myMachinePool",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/MachinePools",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiTWFjaGluZVBvb2wiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3Rlci13b3JrZXIiLAogICAgICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LVhYWFhYWFhYWFhYWCIKICAgIH0sCiAgICAic3BlYyI6IHsKICAgICAgICAiY2x1c3RlckRlcGxveW1lbnRSZWYiOiB7CiAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICB9LAogICAgICAgICJuYW1lIjogIndvcmtlciIsCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAiYXdzIjogewogICAgICAgICAgICAgICAgInJvb3RWb2x1bWUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlvcHMiOiAwLAogICAgICAgICAgICAgICAgICAgICJzaXplIjogMzAwLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdwMyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6ICJtNS54bGFyZ2UiLAogICAgICAgICAgICAgICAgInpvbmVzIjogWwogICAgICAgICAgICAgICAgICAgICJ1cy1lYXN0LTFhIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwbGljYXMiOiAyCiAgICB9LAogICAgInN0YXR1cyI6IHsKICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICBdCiAgICB9Cn0K"
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/machinePools/myMachinePool",
-        "name": "myMachinePool",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/MachinePools",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiTWFjaGluZVBvb2wiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3Rlci13b3JrZXIiLAogICAgICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LVhYWFhYWFhYWFhYWCIKICAgIH0sCiAgICAic3BlYyI6IHsKICAgICAgICAiY2x1c3RlckRlcGxveW1lbnRSZWYiOiB7CiAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICB9LAogICAgICAgICJuYW1lIjogIndvcmtlciIsCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAiYXdzIjogewogICAgICAgICAgICAgICAgInJvb3RWb2x1bWUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlvcHMiOiAwLAogICAgICAgICAgICAgICAgICAgICJzaXplIjogMzAwLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdwMyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6ICJtNS54bGFyZ2UiLAogICAgICAgICAgICAgICAgInpvbmVzIjogWwogICAgICAgICAgICAgICAgICAgICJ1cy1lYXN0LTFhIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwbGljYXMiOiAyCiAgICB9LAogICAgInN0YXR1cyI6IHsKICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICBdCiAgICB9Cn0K"
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Get.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Get.json
index c8ee4f0cc..5a9651690 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Get.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Get.json
@@ -9,11 +9,8 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/machinePools/myMachinePool",
-        "name": "myMachinePool",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/MachinePools",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiTWFjaGluZVBvb2wiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3Rlci13b3JrZXIiLAogICAgICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LVhYWFhYWFhYWFhYWCIKICAgIH0sCiAgICAic3BlYyI6IHsKICAgICAgICAiY2x1c3RlckRlcGxveW1lbnRSZWYiOiB7CiAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICB9LAogICAgICAgICJuYW1lIjogIndvcmtlciIsCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAiYXdzIjogewogICAgICAgICAgICAgICAgInJvb3RWb2x1bWUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlvcHMiOiAwLAogICAgICAgICAgICAgICAgICAgICJzaXplIjogMzAwLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdwMyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6ICJtNS54bGFyZ2UiLAogICAgICAgICAgICAgICAgInpvbmVzIjogWwogICAgICAgICAgICAgICAgICAgICJ1cy1lYXN0LTFhIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwbGljYXMiOiAyCiAgICB9LAogICAgInN0YXR1cyI6IHsKICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICBdCiAgICB9Cn0K"
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_List.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_List.json
index 5c3f9ed51..20795a189 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_List.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_List.json
@@ -10,11 +10,8 @@
       "body": {
         "value": [
           {
-            "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/machinePools/myMachinePool",
-            "name": "myMachinePool",
-            "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/MachinePools",
             "properties": {
-              "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiTWFjaGluZVBvb2wiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3Rlci13b3JrZXIiLAogICAgICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LVhYWFhYWFhYWFhYWCIKICAgIH0sCiAgICAic3BlYyI6IHsKICAgICAgICAiY2x1c3RlckRlcGxveW1lbnRSZWYiOiB7CiAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICB9LAogICAgICAgICJuYW1lIjogIndvcmtlciIsCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAiYXdzIjogewogICAgICAgICAgICAgICAgInJvb3RWb2x1bWUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlvcHMiOiAwLAogICAgICAgICAgICAgICAgICAgICJzaXplIjogMzAwLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdwMyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6ICJtNS54bGFyZ2UiLAogICAgICAgICAgICAgICAgInpvbmVzIjogWwogICAgICAgICAgICAgICAgICAgICJ1cy1lYXN0LTFhIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwbGljYXMiOiAyCiAgICB9LAogICAgInN0YXR1cyI6IHsKICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICBdCiAgICB9Cn0K"
+              "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
             }
           }
         ]
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Update.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Update.json
index 8eee039d4..82b54231c 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Update.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/MachinePools_Update.json
@@ -14,21 +14,15 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/machinePools/myMachinePool",
-        "name": "myMachinePool",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/MachinePools",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiTWFjaGluZVBvb2wiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3Rlci13b3JrZXIiLAogICAgICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LVhYWFhYWFhYWFhYWCIKICAgIH0sCiAgICAic3BlYyI6IHsKICAgICAgICAiY2x1c3RlckRlcGxveW1lbnRSZWYiOiB7CiAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICB9LAogICAgICAgICJuYW1lIjogIndvcmtlciIsCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAiYXdzIjogewogICAgICAgICAgICAgICAgInJvb3RWb2x1bWUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlvcHMiOiAwLAogICAgICAgICAgICAgICAgICAgICJzaXplIjogMzAwLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdwMyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6ICJtNS54bGFyZ2UiLAogICAgICAgICAgICAgICAgInpvbmVzIjogWwogICAgICAgICAgICAgICAgICAgICJ1cy1lYXN0LTFhIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwbGljYXMiOiAyCiAgICB9LAogICAgInN0YXR1cyI6IHsKICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICBdCiAgICB9Cn0K"
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/machinePools/myMachinePool",
-        "name": "myMachinePool",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/MachinePools",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiTWFjaGluZVBvb2wiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3Rlci13b3JrZXIiLAogICAgICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LVhYWFhYWFhYWFhYWCIKICAgIH0sCiAgICAic3BlYyI6IHsKICAgICAgICAiY2x1c3RlckRlcGxveW1lbnRSZWYiOiB7CiAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICB9LAogICAgICAgICJuYW1lIjogIndvcmtlciIsCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAiYXdzIjogewogICAgICAgICAgICAgICAgInJvb3RWb2x1bWUiOiB7CiAgICAgICAgICAgICAgICAgICAgImlvcHMiOiAwLAogICAgICAgICAgICAgICAgICAgICJzaXplIjogMzAwLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdwMyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6ICJtNS54bGFyZ2UiLAogICAgICAgICAgICAgICAgInpvbmVzIjogWwogICAgICAgICAgICAgICAgICAgICJ1cy1lYXN0LTFhIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwbGljYXMiOiAyCiAgICB9LAogICAgInN0YXR1cyI6IHsKICAgICAgICAiY29uZGl0aW9ucyI6IFsKICAgICAgICBdCiAgICB9Cn0K"
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_CreateOrUpdate.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_CreateOrUpdate.json
index 47b6bebc6..16fb1ef83 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_CreateOrUpdate.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_CreateOrUpdate.json
@@ -12,17 +12,11 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/secret/mySecret",
-        "name": "mySecret",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/Secrets",
         "properties": {}
       }
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/secret/mySecret",
-        "name": "mySecret",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/Secrets",
         "properties": {}
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Get.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Get.json
index c81b7b4e3..9ae1678a6 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Get.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Get.json
@@ -9,9 +9,6 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/secret/mySecret",
-        "name": "mySecret",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/Secrets",
         "properties": {}
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_List.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_List.json
index a771164aa..dc12e651c 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_List.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_List.json
@@ -10,9 +10,6 @@
       "body": {
         "value": [
           {
-            "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/secret/mySecret",
-            "name": "mySecret",
-            "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/Secrets",
             "properties": {}
           }
         ]
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Update.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Update.json
index 47b6bebc6..16fb1ef83 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Update.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/Secrets_Update.json
@@ -12,17 +12,11 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/secret/mySecret",
-        "name": "mySecret",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/Secrets",
         "properties": {}
       }
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/secret/mySecret",
-        "name": "mySecret",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/Secrets",
         "properties": {}
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_CreateOrUpdate.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_CreateOrUpdate.json
index ee9fee5dc..3830160e2 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_CreateOrUpdate.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_CreateOrUpdate.json
@@ -14,21 +14,15 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncidentityprovider/mySyncIdentityProvider",
-        "name": "mySyncIdentityProvider",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncIdentityProviders",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiU3luY0lkZW50aXR5UHJvdmlkZXIiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIsCiAgICAgICAgIm5hbWVzcGFjZSI6ICJhcm8tZjYwYWU4YTItYmNhMS00OTg3LTkwNTYtWFhYWFhYWFhYWFhYIgogICAgfSwKICAgICJzcGVjIjogewogICAgICAgICJjbHVzdGVyRGVwbG95bWVudFJlZnMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImlkZW50aXR5UHJvdmlkZXJzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiaHRwYXNzd2QiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpbGVEYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJodHBhc3N3ZC1zZWNyZXQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYXBwaW5nTWV0aG9kIjogImNsYWltIiwKICAgICAgICAgICAgICAgICJuYW1lIjogIkhUUGFzc3dkIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIkhUUGFzc3dkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgICJzdGF0dXMiOiB7fQp9Cg=="
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncidentityprovider/mySyncIdentityProvider",
-        "name": "mySyncIdentityProvider",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncIdentityProviders",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiU3luY0lkZW50aXR5UHJvdmlkZXIiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIsCiAgICAgICAgIm5hbWVzcGFjZSI6ICJhcm8tZjYwYWU4YTItYmNhMS00OTg3LTkwNTYtWFhYWFhYWFhYWFhYIgogICAgfSwKICAgICJzcGVjIjogewogICAgICAgICJjbHVzdGVyRGVwbG95bWVudFJlZnMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImlkZW50aXR5UHJvdmlkZXJzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiaHRwYXNzd2QiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpbGVEYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJodHBhc3N3ZC1zZWNyZXQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYXBwaW5nTWV0aG9kIjogImNsYWltIiwKICAgICAgICAgICAgICAgICJuYW1lIjogIkhUUGFzc3dkIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIkhUUGFzc3dkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgICJzdGF0dXMiOiB7fQp9Cg=="
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Get.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Get.json
index db09e723f..5a9651690 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Get.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Get.json
@@ -9,11 +9,8 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncidentityprovider/mySyncIdentityProvider",
-        "name": "mySyncIdentityProvider",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncIdentityProviders",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiU3luY0lkZW50aXR5UHJvdmlkZXIiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIsCiAgICAgICAgIm5hbWVzcGFjZSI6ICJhcm8tZjYwYWU4YTItYmNhMS00OTg3LTkwNTYtWFhYWFhYWFhYWFhYIgogICAgfSwKICAgICJzcGVjIjogewogICAgICAgICJjbHVzdGVyRGVwbG95bWVudFJlZnMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImlkZW50aXR5UHJvdmlkZXJzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiaHRwYXNzd2QiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpbGVEYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJodHBhc3N3ZC1zZWNyZXQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYXBwaW5nTWV0aG9kIjogImNsYWltIiwKICAgICAgICAgICAgICAgICJuYW1lIjogIkhUUGFzc3dkIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIkhUUGFzc3dkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgICJzdGF0dXMiOiB7fQp9Cg=="
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_List.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_List.json
index 924d6c278..20795a189 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_List.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_List.json
@@ -10,11 +10,8 @@
       "body": {
         "value": [
           {
-            "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncidentityprovider/mySyncIdentityProvider",
-            "name": "mySyncIdentityProvider",
-            "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncIdentityProviders",
             "properties": {
-              "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiU3luY0lkZW50aXR5UHJvdmlkZXIiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIsCiAgICAgICAgIm5hbWVzcGFjZSI6ICJhcm8tZjYwYWU4YTItYmNhMS00OTg3LTkwNTYtWFhYWFhYWFhYWFhYIgogICAgfSwKICAgICJzcGVjIjogewogICAgICAgICJjbHVzdGVyRGVwbG95bWVudFJlZnMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImlkZW50aXR5UHJvdmlkZXJzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiaHRwYXNzd2QiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpbGVEYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJodHBhc3N3ZC1zZWNyZXQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYXBwaW5nTWV0aG9kIjogImNsYWltIiwKICAgICAgICAgICAgICAgICJuYW1lIjogIkhUUGFzc3dkIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIkhUUGFzc3dkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgICJzdGF0dXMiOiB7fQp9Cg=="
+              "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
             }
           }
         ]
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Update.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Update.json
index ee9fee5dc..3830160e2 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Update.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncIdentityProviders_Update.json
@@ -14,21 +14,15 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncidentityprovider/mySyncIdentityProvider",
-        "name": "mySyncIdentityProvider",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncIdentityProviders",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiU3luY0lkZW50aXR5UHJvdmlkZXIiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIsCiAgICAgICAgIm5hbWVzcGFjZSI6ICJhcm8tZjYwYWU4YTItYmNhMS00OTg3LTkwNTYtWFhYWFhYWFhYWFhYIgogICAgfSwKICAgICJzcGVjIjogewogICAgICAgICJjbHVzdGVyRGVwbG95bWVudFJlZnMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImlkZW50aXR5UHJvdmlkZXJzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiaHRwYXNzd2QiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpbGVEYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJodHBhc3N3ZC1zZWNyZXQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYXBwaW5nTWV0aG9kIjogImNsYWltIiwKICAgICAgICAgICAgICAgICJuYW1lIjogIkhUUGFzc3dkIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIkhUUGFzc3dkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgICJzdGF0dXMiOiB7fQp9Cg=="
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncidentityprovider/mySyncIdentityProvider",
-        "name": "mySyncIdentityProvider",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncIdentityProviders",
         "properties": {
-          "resources": "ewogICAgImFwaVZlcnNpb24iOiAiaGl2ZS5vcGVuc2hpZnQuaW8vdjEiLAogICAgImtpbmQiOiAiU3luY0lkZW50aXR5UHJvdmlkZXIiLAogICAgIm1ldGFkYXRhIjogewogICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIsCiAgICAgICAgIm5hbWVzcGFjZSI6ICJhcm8tZjYwYWU4YTItYmNhMS00OTg3LTkwNTYtWFhYWFhYWFhYWFhYIgogICAgfSwKICAgICJzcGVjIjogewogICAgICAgICJjbHVzdGVyRGVwbG95bWVudFJlZnMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QtY2x1c3RlciIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImlkZW50aXR5UHJvdmlkZXJzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiaHRwYXNzd2QiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpbGVEYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJodHBhc3N3ZC1zZWNyZXQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtYXBwaW5nTWV0aG9kIjogImNsYWltIiwKICAgICAgICAgICAgICAgICJuYW1lIjogIkhUUGFzc3dkIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIkhUUGFzc3dkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgICJzdGF0dXMiOiB7fQp9Cg=="
+          "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
       }
     }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_CreateOrUpdate.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_CreateOrUpdate.json
index 2cd69fbfa..7533f1f40 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_CreateOrUpdate.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_CreateOrUpdate.json
@@ -14,9 +14,6 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncSets/mySyncSet",
-        "name": "mySyncSet",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncSets",
         "properties": {
           "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
@@ -24,9 +21,6 @@
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncSets/mySyncSet",
-        "name": "mySyncSet",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncSets",
         "properties": {
           "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Get.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Get.json
index 173cf5b92..5a9651690 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Get.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Get.json
@@ -9,9 +9,6 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncSets/mySyncSet",
-        "name": "mySyncSet",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncSets",
         "properties": {
           "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_List.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_List.json
index d46141a7a..20795a189 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_List.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_List.json
@@ -10,9 +10,6 @@
       "body": {
         "value": [
           {
-            "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncSets/mySyncSet",
-            "name": "mySyncSet",
-            "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncSets",
             "properties": {
               "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
             }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Update.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Update.json
index 2cd69fbfa..7533f1f40 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Update.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/SyncSets_Update.json
@@ -14,9 +14,6 @@
   "responses": {
     "200": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncSets/mySyncSet",
-        "name": "mySyncSet",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncSets",
         "properties": {
           "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
@@ -24,9 +21,6 @@
     },
     "201": {
       "body": {
-        "id": "/subscriptions/subscriptionId/resourceGroups/resourceGroup/providers/Microsoft.RedHatOpenShift/OpenShiftClusters/resourceName/syncSets/mySyncSet",
-        "name": "mySyncSet",
-        "type": "Microsoft.RedHatOpenShift/OpenShiftClusters/SyncSets",
         "properties": {
           "resources": "eyAKICAiYXBpVmVyc2lvbiI6ICJoaXZlLm9wZW5zaGlmdC5pby92MSIsCiAgImtpbmQiOiAiU3luY1NldCIsCiAgIm1ldGFkYXRhIjogewogICAgIm5hbWUiOiAic2FtcGxlIiwKICAgICJuYW1lc3BhY2UiOiAiYXJvLWY2MGFlOGEyLWJjYTEtNDk4Ny05MDU2LWYyZjZhMTgzN2NhYSIKICB9LAogICJzcGVjIjogewogICAgImNsdXN0ZXJEZXBsb3ltZW50UmVmcyI6IFtdLAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhcGlWZXJzaW9uIjogInYxIiwKICAgICAgICAia2luZCI6ICJDb25maWdNYXAiLAogICAgICAgICJtZXRhZGF0YSI6IHsKICAgICAgICAgICJuYW1lIjogIm15Y29uZmlnbWFwIgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0KfQo="
         }
diff --git a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json
index af32fdcc1..2075fac21 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json
@@ -56,11 +56,11 @@
     "/subscriptions/{subscriptionId}/providers/Microsoft.RedHatOpenShift/locations/{location}/listinstallversions": {
       "get": {
         "tags": [
-          "OpenShiftVersions"
+          "InstallVersions"
         ],
         "summary": "Lists all OpenShift versions available to install in the specified location.",
         "description": "The operation returns the installable OpenShift versions as strings.",
-        "operationId": "OpenShiftVersions_List",
+        "operationId": "InstallVersions_List",
         "parameters": [
           {
             "$ref": "../../../../../common-types/resource-management/v3/types.json#/parameters/ApiVersionParameter"
@@ -76,7 +76,7 @@
           "200": {
             "description": "OK",
             "schema": {
-              "$ref": "#/definitions/OpenShiftVersionList"
+              "$ref": "#/definitions/InstallVersions"
             }
           },
           "default": {
@@ -88,7 +88,7 @@
         },
         "x-ms-examples": {
           "Lists all OpenShift versions available to install in the specified location.": {
-            "$ref": "./examples/OpenShiftVersions_List.json"
+            "$ref": "./examples/InstallVersions_List.json"
           }
         }
       }
@@ -1801,6 +1801,18 @@
         }
       }
     },
+    "InstallVersion": {
+      "description": "InstallVersion is the OpenShift installation version string.",
+      "type": "string"
+    },
+    "InstallVersions": {
+      "description": "InstallVersions represents a List of OpenShift installable versions.",
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/InstallVersion"
+      },
+      "x-ms-identifiers": []
+    },
     "MachinePool": {
       "description": "MachinePool represents a MachinePool",
       "type": "object",
@@ -2013,6 +2025,10 @@
             "$ref": "#/definitions/IngressProfile"
           },
           "x-ms-identifiers": []
+        },
+        "installVersion": {
+          "description": "The cluster install version.",
+          "type": "string"
         }
       }
     },
@@ -2036,61 +2052,6 @@
         }
       }
     },
-    "OpenShiftVersion": {
-      "description": "OpenShiftVersion represents an OpenShift version that can be installed.",
-      "type": "object",
-      "allOf": [
-        {
-          "$ref": "../../../../../common-types/resource-management/v3/types.json#/definitions/ProxyResource"
-        }
-      ],
-      "properties": {
-        "id": {
-          "description": "The ID for the resource.",
-          "type": "string"
-        },
-        "name": {
-          "description": "Name of the resource.",
-          "type": "string"
-        },
-        "type": {
-          "description": "The resource type.",
-          "type": "string"
-        },
-        "properties": {
-          "$ref": "#/definitions/OpenShiftVersionProperties",
-          "description": "The properties for the OpenShiftVersion resource."
-        }
-      }
-    },
-    "OpenShiftVersionList": {
-      "description": "OpenShiftVersionList represents a List of available versions.",
-      "type": "object",
-      "properties": {
-        "value": {
-          "description": "The List of available versions.",
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/OpenShiftVersion"
-          },
-          "x-ms-identifiers": []
-        },
-        "nextLink": {
-          "description": "Next Link to next operation.",
-          "type": "string"
-        }
-      }
-    },
-    "OpenShiftVersionProperties": {
-      "description": "OpenShiftVersionProperties represents the properties of an OpenShiftVersion.",
-      "type": "object",
-      "properties": {
-        "version": {
-          "description": "Version represents the version to create the cluster at.",
-          "type": "string"
-        }
-      }
-    },
     "Operation": {
       "description": "Operation represents an RP operation.",
       "type": "object",


Test patch:
diff --git a/.pipelines/e2e.yml b/.pipelines/e2e.yml
index c1167206b..0b6a0b574 100644
--- a/.pipelines/e2e.yml
+++ b/.pipelines/e2e.yml
@@ -43,6 +43,9 @@ jobs:
       az account set -s $AZURE_SUBSCRIPTION_ID
 
       set -x
+
+      export PRIVATE_CLUSTER=true
+
       . ./hack/e2e/run-rp-and-e2e.sh
       trap 'set +e; kill_rp; clean_e2e_db; kill_vpn' EXIT
 
@@ -55,5 +58,9 @@ jobs:
       register_sub
 
       export CI=true
+
       make test-e2e
+
+      kill_vpn
+
   - template: ./templates/template-az-cli-logout.yml
diff --git a/hack/e2e/run-rp-and-e2e.sh b/hack/e2e/run-rp-and-e2e.sh
index e6e3cdfe5..0bf6a3ed5 100755
--- a/hack/e2e/run-rp-and-e2e.sh
+++ b/hack/e2e/run-rp-and-e2e.sh
@@ -76,6 +76,16 @@ clean_e2e_db(){
         --resource-group $RESOURCEGROUP >/dev/null
 }
 
+run_vpn() {
+    sudo openvpn --config secrets/$VPN --daemon --writepid vpnpid
+    sleep 10
+}
+
+kill_vpn() {
+    while read pid; do sudo kill $pid; done < vpnpid
+}
+
+
 # TODO: CLUSTER and is also recalculated in multiple places
 # in the billing pipelines :-(
 
diff --git a/pkg/api/admin/openshiftversion_validatestatic.go b/pkg/api/admin/openshiftversion_validatestatic.go
index 32ef1255b..7cebaba69 100644
--- a/pkg/api/admin/openshiftversion_validatestatic.go
+++ b/pkg/api/admin/openshiftversion_validatestatic.go
@@ -34,15 +34,15 @@ func (sv openShiftVersionStaticValidator) Static(_new interface{}, _current *api
 }
 
 func (sv openShiftVersionStaticValidator) validate(new *OpenShiftVersion, isCreate bool) error {
-	if new.Properties.Version == "" {
+	if new.Version == "" {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, "version", "Must be provided")
 	}
 
-	if new.Properties.InstallerPullspec == "" {
+	if new.InstallerPullspec == "" {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, "installerPullspec", "Must be provided")
 	}
 
-	if new.Properties.OpenShiftPullspec == "" {
+	if new.OpenShiftPullspec == "" {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, "openShiftPullspec", "Must be provided")
 	}
 	return nil
diff --git a/pkg/api/components/installversion/parse_test.go b/pkg/api/components/installversion/parse_test.go
new file mode 100644
index 000000000..cc0ed0241
--- /dev/null
+++ b/pkg/api/components/installversion/parse_test.go
@@ -0,0 +1,83 @@
+package installversion
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"encoding/json"
+	"testing"
+
+	v20200430 "github.com/Azure/ARO-RP/pkg/api/v20200430"
+	v20220904 "github.com/Azure/ARO-RP/pkg/api/v20220904"
+)
+
+func TestParsePreInstallAPI(t *testing.T) {
+	preInstallVersion := &v20200430.OpenShiftCluster{
+		Properties: v20200430.OpenShiftClusterProperties{
+			ClusterProfile: v20200430.ClusterProfile{
+				Domain: "example",
+			},
+		},
+	}
+
+	b, err := json.Marshal(preInstallVersion)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	ver, err := FromExternalBytes(b)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if ver.Properties.InstallVersion != "" {
+		t.Error(ver.Properties.InstallVersion)
+	}
+}
+
+func TestParsePostInstallAPI(t *testing.T) {
+	postInstallVersion := &v20220904.OpenShiftCluster{
+		Properties: v20220904.OpenShiftClusterProperties{
+			ClusterProfile: v20220904.ClusterProfile{
+				Domain: "example",
+			},
+		},
+	}
+
+	b, err := json.Marshal(postInstallVersion)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	ver, err := FromExternalBytes(b)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if ver.Properties.InstallVersion != "" {
+		t.Error(ver.Properties.InstallVersion)
+	}
+
+	postInstallVersionWithVersion := &v20220904.OpenShiftCluster{
+		Properties: v20220904.OpenShiftClusterProperties{
+			InstallVersion: "4.10.0",
+			ClusterProfile: v20220904.ClusterProfile{
+				Domain: "example",
+			},
+		},
+	}
+
+	b, err = json.Marshal(postInstallVersionWithVersion)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	ver, err = FromExternalBytes(b)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if ver.Properties.InstallVersion != "4.10.0" {
+		t.Error(ver.Properties.InstallVersion)
+	}
+}
diff --git a/pkg/api/v20191231preview/openshiftcluster_validatestatic.go b/pkg/api/v20191231preview/openshiftcluster_validatestatic.go
index f17af9e96..415ee7d4a 100644
--- a/pkg/api/v20191231preview/openshiftcluster_validatestatic.go
+++ b/pkg/api/v20191231preview/openshiftcluster_validatestatic.go
@@ -18,6 +18,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/pullsecret"
 	"github.com/Azure/ARO-RP/pkg/util/subnet"
 	"github.com/Azure/ARO-RP/pkg/util/uuid"
+	"github.com/Azure/ARO-RP/pkg/util/version"
 )
 
 type openShiftClusterStaticValidator struct {
@@ -148,6 +149,10 @@ func (sv openShiftClusterStaticValidator) validateClusterProfile(path string, cp
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".domain", "The provided domain '%s' is invalid.", cp.Domain)
 	}
 
+	if isCreate && cp.Version != version.InstallStream.Version.String() {
+		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".version", "The provided version '%s' is invalid.", cp.Version)
+	}
+
 	if !validate.RxResourceGroupID.MatchString(cp.ResourceGroupID) {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".resourceGroupId", "The provided resource group '%s' is invalid.", cp.ResourceGroupID)
 	}
diff --git a/pkg/api/v20191231preview/openshiftcluster_validatestatic_test.go b/pkg/api/v20191231preview/openshiftcluster_validatestatic_test.go
index 516995980..e90290659 100644
--- a/pkg/api/v20191231preview/openshiftcluster_validatestatic_test.go
+++ b/pkg/api/v20191231preview/openshiftcluster_validatestatic_test.go
@@ -317,6 +317,13 @@ func TestOpenShiftClusterStaticValidateClusterProfile(t *testing.T) {
 				oc.Properties.ClusterProfile.PullSecret = ""
 			},
 		},
+		{
+			name: "version invalid",
+			modify: func(oc *OpenShiftCluster) {
+				oc.Properties.ClusterProfile.Version = "invalid"
+			},
+			wantErr: "400: InvalidParameter: properties.clusterProfile.version: The provided version 'invalid' is invalid.",
+		},
 		{
 			name: "leading digit domain invalid",
 			modify: func(oc *OpenShiftCluster) {
diff --git a/pkg/api/v20200430/openshiftcluster_validatestatic.go b/pkg/api/v20200430/openshiftcluster_validatestatic.go
index 5f1fb9695..fa24f1e3d 100644
--- a/pkg/api/v20200430/openshiftcluster_validatestatic.go
+++ b/pkg/api/v20200430/openshiftcluster_validatestatic.go
@@ -18,6 +18,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/pullsecret"
 	"github.com/Azure/ARO-RP/pkg/util/subnet"
 	"github.com/Azure/ARO-RP/pkg/util/uuid"
+	"github.com/Azure/ARO-RP/pkg/util/version"
 )
 
 type openShiftClusterStaticValidator struct {
@@ -151,6 +152,10 @@ func (sv openShiftClusterStaticValidator) validateClusterProfile(path string, cp
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".domain", "The provided domain '%s' is invalid.", cp.Domain)
 	}
 
+	if isCreate && cp.Version != version.InstallStream.Version.String() {
+		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".version", "The provided version '%s' is invalid.", cp.Version)
+	}
+
 	if !validate.RxResourceGroupID.MatchString(cp.ResourceGroupID) {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".resourceGroupId", "The provided resource group '%s' is invalid.", cp.ResourceGroupID)
 	}
diff --git a/pkg/api/v20200430/openshiftcluster_validatestatic_test.go b/pkg/api/v20200430/openshiftcluster_validatestatic_test.go
index e0eda1cb7..e9e3cffa2 100644
--- a/pkg/api/v20200430/openshiftcluster_validatestatic_test.go
+++ b/pkg/api/v20200430/openshiftcluster_validatestatic_test.go
@@ -317,6 +317,13 @@ func TestOpenShiftClusterStaticValidateClusterProfile(t *testing.T) {
 				oc.Properties.ClusterProfile.PullSecret = ""
 			},
 		},
+		{
+			name: "version invalid",
+			modify: func(oc *OpenShiftCluster) {
+				oc.Properties.ClusterProfile.Version = "invalid"
+			},
+			wantErr: "400: InvalidParameter: properties.clusterProfile.version: The provided version 'invalid' is invalid.",
+		},
 		{
 			name: "leading digit domain invalid",
 			modify: func(oc *OpenShiftCluster) {
diff --git a/pkg/api/v20210901preview/openshiftcluster_validatestatic.go b/pkg/api/v20210901preview/openshiftcluster_validatestatic.go
index 350d07c0f..964643a76 100644
--- a/pkg/api/v20210901preview/openshiftcluster_validatestatic.go
+++ b/pkg/api/v20210901preview/openshiftcluster_validatestatic.go
@@ -18,6 +18,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/pullsecret"
 	"github.com/Azure/ARO-RP/pkg/util/subnet"
 	"github.com/Azure/ARO-RP/pkg/util/uuid"
+	"github.com/Azure/ARO-RP/pkg/util/version"
 )
 
 type openShiftClusterStaticValidator struct {
@@ -151,6 +152,10 @@ func (sv openShiftClusterStaticValidator) validateClusterProfile(path string, cp
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".domain", "The provided domain '%s' is invalid.", cp.Domain)
 	}
 
+	if isCreate && cp.Version != version.InstallStream.Version.String() {
+		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".version", "The provided version '%s' is invalid.", cp.Version)
+	}
+
 	if !validate.RxResourceGroupID.MatchString(cp.ResourceGroupID) {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".resourceGroupId", "The provided resource group '%s' is invalid.", cp.ResourceGroupID)
 	}
diff --git a/pkg/api/v20210901preview/openshiftcluster_validatestatic_test.go b/pkg/api/v20210901preview/openshiftcluster_validatestatic_test.go
index 3804ac05d..574915f45 100644
--- a/pkg/api/v20210901preview/openshiftcluster_validatestatic_test.go
+++ b/pkg/api/v20210901preview/openshiftcluster_validatestatic_test.go
@@ -334,6 +334,13 @@ func TestOpenShiftClusterStaticValidateClusterProfile(t *testing.T) {
 				oc.Properties.ClusterProfile.PullSecret = ""
 			},
 		},
+		{
+			name: "version invalid",
+			modify: func(oc *OpenShiftCluster) {
+				oc.Properties.ClusterProfile.Version = "invalid"
+			},
+			wantErr: "400: InvalidParameter: properties.clusterProfile.version: The provided version 'invalid' is invalid.",
+		},
 		{
 			name: "leading digit domain invalid",
 			modify: func(oc *OpenShiftCluster) {
diff --git a/pkg/api/v20220401/openshiftcluster_validatestatic.go b/pkg/api/v20220401/openshiftcluster_validatestatic.go
index 7d3e8ca75..4f30b8352 100644
--- a/pkg/api/v20220401/openshiftcluster_validatestatic.go
+++ b/pkg/api/v20220401/openshiftcluster_validatestatic.go
@@ -18,6 +18,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/pullsecret"
 	"github.com/Azure/ARO-RP/pkg/util/subnet"
 	"github.com/Azure/ARO-RP/pkg/util/uuid"
+	"github.com/Azure/ARO-RP/pkg/util/version"
 )
 
 type openShiftClusterStaticValidator struct {
@@ -151,6 +152,10 @@ func (sv openShiftClusterStaticValidator) validateClusterProfile(path string, cp
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".domain", "The provided domain '%s' is invalid.", cp.Domain)
 	}
 
+	if isCreate && cp.Version != version.InstallStream.Version.String() {
+		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".version", "The provided version '%s' is invalid.", cp.Version)
+	}
+
 	if !validate.RxResourceGroupID.MatchString(cp.ResourceGroupID) {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".resourceGroupId", "The provided resource group '%s' is invalid.", cp.ResourceGroupID)
 	}
diff --git a/pkg/api/v20220401/openshiftcluster_validatestatic_test.go b/pkg/api/v20220401/openshiftcluster_validatestatic_test.go
index f9962fbfd..4239e2cef 100644
--- a/pkg/api/v20220401/openshiftcluster_validatestatic_test.go
+++ b/pkg/api/v20220401/openshiftcluster_validatestatic_test.go
@@ -348,6 +348,13 @@ func TestOpenShiftClusterStaticValidateClusterProfile(t *testing.T) {
 				oc.Properties.ClusterProfile.PullSecret = ""
 			},
 		},
+		{
+			name: "version invalid",
+			modify: func(oc *OpenShiftCluster) {
+				oc.Properties.ClusterProfile.Version = "invalid"
+			},
+			wantErr: "400: InvalidParameter: properties.clusterProfile.version: The provided version 'invalid' is invalid.",
+		},
 		{
 			name: "leading digit domain invalid",
 			modify: func(oc *OpenShiftCluster) {
diff --git a/pkg/api/v20220904/openshiftcluster_validatestatic.go b/pkg/api/v20220904/openshiftcluster_validatestatic.go
index b7be995e7..80ccd968f 100644
--- a/pkg/api/v20220904/openshiftcluster_validatestatic.go
+++ b/pkg/api/v20220904/openshiftcluster_validatestatic.go
@@ -151,6 +151,10 @@ func (sv openShiftClusterStaticValidator) validateClusterProfile(path string, cp
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".domain", "The provided domain '%s' is invalid.", cp.Domain)
 	}
 
+	if isCreate && !validate.RxInstallVersion.MatchString(cp.Version) {
+		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".version", "The provided version '%s' is invalid.", cp.Version)
+	}
+
 	if !validate.RxResourceGroupID.MatchString(cp.ResourceGroupID) {
 		return api.NewCloudError(http.StatusBadRequest, api.CloudErrorCodeInvalidParameter, path+".resourceGroupId", "The provided resource group '%s' is invalid.", cp.ResourceGroupID)
 	}
diff --git a/pkg/api/v20220904/openshiftcluster_validatestatic_test.go b/pkg/api/v20220904/openshiftcluster_validatestatic_test.go
index 35c0784f2..1f1183bb8 100644
--- a/pkg/api/v20220904/openshiftcluster_validatestatic_test.go
+++ b/pkg/api/v20220904/openshiftcluster_validatestatic_test.go
@@ -363,6 +363,13 @@ func TestOpenShiftClusterStaticValidateClusterProfile(t *testing.T) {
 				oc.Properties.ClusterProfile.PullSecret = ""
 			},
 		},
+		{
+			name: "version invalid",
+			modify: func(oc *OpenShiftCluster) {
+				oc.Properties.ClusterProfile.Version = "invalid"
+			},
+			wantErr: "400: InvalidParameter: properties.clusterProfile.version: The provided version 'invalid' is invalid.",
+		},
 		{
 			name: "leading digit domain invalid",
 			modify: func(oc *OpenShiftCluster) {
diff --git a/pkg/cluster/install_version_test.go b/pkg/cluster/install_version_test.go
index f4737ae0e..a39f11516 100644
--- a/pkg/cluster/install_version_test.go
+++ b/pkg/cluster/install_version_test.go
@@ -50,11 +50,9 @@ func TestGetOpenShiftVersionFromVersion(t *testing.T) {
 			},
 			wantErrString: "",
 			want: &api.OpenShiftVersion{
-				Properties: api.OpenShiftVersionProperties{
-					Version:           version.InstallStream.Version.String(),
-					OpenShiftPullspec: version.InstallStream.PullSpec,
-					InstallerPullspec: fmt.Sprintf("%s/aro-installer:release-%d.%d", testACRDomain, version.InstallStream.Version.V[0], version.InstallStream.Version.V[1]),
-				},
+				Version:           version.InstallStream.Version.String(),
+				OpenShiftPullspec: version.InstallStream.PullSpec,
+				InstallerPullspec: fmt.Sprintf("%s/aro-installer:release-%d.%d", testACRDomain, version.InstallStream.Version.V[0], version.InstallStream.Version.V[1]),
 			},
 		},
 		{
@@ -63,17 +61,13 @@ func TestGetOpenShiftVersionFromVersion(t *testing.T) {
 				f.AddOpenShiftVersionDocuments(
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version: "4.10.20",
-								Enabled: true,
-							},
+							Version: "4.10.20",
+							Enabled: true,
 						},
 					}, &api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version: "4.10.27",
-								Enabled: true,
-							},
+							Version: "4.10.27",
+							Enabled: true,
 						},
 					},
 				)
@@ -129,9 +123,9 @@ func TestGetOpenShiftVersionFromVersion(t *testing.T) {
 			}
 
 			if tt.want != nil {
-				assert.Equal(t, tt.want.Properties.Version, version.Properties.Version, "Version does not match")
-				assert.Equal(t, tt.want.Properties.OpenShiftPullspec, version.Properties.OpenShiftPullspec, "OpenShiftPullspec does not match")
-				assert.Equal(t, tt.want.Properties.InstallerPullspec, version.Properties.InstallerPullspec, "InstallerPullspec does not match")
+				assert.Equal(t, tt.want.Version, version.Version, "Version does not match")
+				assert.Equal(t, tt.want.OpenShiftPullspec, version.OpenShiftPullspec, "OpenShiftPullspec does not match")
+				assert.Equal(t, tt.want.InstallerPullspec, version.InstallerPullspec, "InstallerPullspec does not match")
 			}
 		})
 	}
diff --git a/pkg/frontend/admin_openshiftcluster_approvecsr_test.go b/pkg/frontend/admin_openshiftcluster_approvecsr_test.go
deleted file mode 100644
index 5de793122..000000000
--- a/pkg/frontend/admin_openshiftcluster_approvecsr_test.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package frontend
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-	"fmt"
-	"net/http"
-	"strings"
-	"testing"
-
-	"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/frontend/adminactions"
-	"github.com/Azure/ARO-RP/pkg/metrics/noop"
-	mock_adminactions "github.com/Azure/ARO-RP/pkg/util/mocks/adminactions"
-)
-
-func TestAdminApproveCSR(t *testing.T) {
-	mockSubID := "00000000-0000-0000-0000-000000000000"
-	mockTenantID := "00000000-0000-0000-0000-000000000000"
-	ctx := context.Background()
-
-	type test struct {
-		name           string
-		resourceID     string
-		csrName        string
-		mocks          func(*test, *mock_adminactions.MockKubeActions)
-		method         string
-		wantStatusCode int
-		wantResponse   []byte
-		wantError      string
-	}
-
-	for _, tt := range []*test{
-		{
-			method:     http.MethodPost,
-			name:       "single csr",
-			resourceID: fmt.Sprintf("/subscriptions/%s/resourcegroups/resourceGroup/providers/Microsoft.RedHatOpenShift/openShiftClusters/resourceName", mockSubID),
-			csrName:    "aro-csr",
-			mocks: func(tt *test, k *mock_adminactions.MockKubeActions) {
-				k.EXPECT().
-					ApproveCsr(gomock.Any(), tt.csrName).
-					Return(nil)
-			},
-			wantStatusCode: http.StatusOK,
-		},
-		{
-			method:     http.MethodPost,
-			name:       "all csrs",
-			resourceID: fmt.Sprintf("/subscriptions/%s/resourcegroups/resourceGroup/providers/Microsoft.RedHatOpenShift/openShiftClusters/resourceName", mockSubID),
-			mocks: func(tt *test, k *mock_adminactions.MockKubeActions) {
-				k.EXPECT().
-					ApproveAllCsrs(gomock.Any()).
-					Return(nil)
-			},
-			wantStatusCode: http.StatusOK,
-		},
-	} {
-		t.Run(fmt.Sprintf("%s: %s", tt.method, tt.name), func(t *testing.T) {
-			ti := newTestInfra(t).WithOpenShiftClusters().WithSubscriptions()
-			defer ti.done()
-
-			k := mock_adminactions.NewMockKubeActions(ti.controller)
-			tt.mocks(tt, k)
-
-			ti.fixture.AddOpenShiftClusterDocuments(&api.OpenShiftClusterDocument{
-				Key: strings.ToLower(tt.resourceID),
-				OpenShiftCluster: &api.OpenShiftCluster{
-					ID:   tt.resourceID,
-					Name: "resourceName",
-					Type: "Microsoft.RedHatOpenShift/openshiftClusters",
-				},
-			})
-			ti.fixture.AddSubscriptionDocuments(&api.SubscriptionDocument{
-				ID: mockSubID,
-				Subscription: &api.Subscription{
-					State: api.SubscriptionStateRegistered,
-					Properties: &api.SubscriptionProperties{
-						TenantID: mockTenantID,
-					},
-				},
-			})
-
-			err := ti.buildFixtures(nil)
-			if err != nil {
-				t.Fatal(err)
-			}
-
-			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.clusterManagerDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, nil, api.APIs, &noop.Noop{}, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster) (adminactions.KubeActions, error) {
-				return k, nil
-			}, nil, nil)
-
-			if err != nil {
-				t.Fatal(err)
-			}
-
-			go f.Run(ctx, nil, nil)
-
-			resp, b, err := ti.request(tt.method,
-				fmt.Sprintf("https://server/admin%s/approvecsr?csrName=%s", tt.resourceID, tt.csrName),
-				nil, nil)
-			if err != nil {
-				t.Fatal(err)
-			}
-
-			err = validateResponse(resp, b, tt.wantStatusCode, tt.wantError, tt.wantResponse)
-			if err != nil {
-				t.Error(err)
-			}
-		})
-	}
-}
diff --git a/pkg/frontend/admin_openshiftversion_list_test.go b/pkg/frontend/admin_openshiftversion_list_test.go
index ec6f65b3d..82e4077a6 100644
--- a/pkg/frontend/admin_openshiftversion_list_test.go
+++ b/pkg/frontend/admin_openshiftversion_list_test.go
@@ -40,33 +40,25 @@ func TestOpenShiftVersionList(t *testing.T) {
 				f.AddOpenShiftVersionDocuments(
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version:           "4.10.0",
-								Enabled:           true,
-								OpenShiftPullspec: "a:a/b",
-							},
+							Version:           "4.10.0",
+							Enabled:           true,
+							OpenShiftPullspec: "a:a/b",
 						},
 					},
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-
-								Version:           "4.9.9",
-								Enabled:           true,
-								OpenShiftPullspec: "a:a/b",
-								InstallerPullspec: "b:b/c",
-							},
+							Version:           "4.9.9",
+							Enabled:           true,
+							OpenShiftPullspec: "a:a/b",
+							InstallerPullspec: "b:b/c",
 						},
 					},
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-
-								Version:           "4.10.1",
-								Enabled:           false,
-								OpenShiftPullspec: "a:a/b",
-								InstallerPullspec: "b:b/c",
-							},
+							Version:           "4.10.1",
+							Enabled:           false,
+							OpenShiftPullspec: "a:a/b",
+							InstallerPullspec: "b:b/c",
 						},
 					},
 				)
@@ -75,27 +67,21 @@ func TestOpenShiftVersionList(t *testing.T) {
 			wantResponse: &admin.OpenShiftVersionList{
 				OpenShiftVersions: []*admin.OpenShiftVersion{
 					{
-						Properties: admin.OpenShiftVersionProperties{
-							Version:           "4.9.9",
-							Enabled:           true,
-							OpenShiftPullspec: "a:a/b",
-							InstallerPullspec: "b:b/c",
-						},
+						Version:           "4.9.9",
+						Enabled:           true,
+						OpenShiftPullspec: "a:a/b",
+						InstallerPullspec: "b:b/c",
 					},
 					{
-						Properties: admin.OpenShiftVersionProperties{
-							Version:           "4.10.0",
-							Enabled:           true,
-							OpenShiftPullspec: "a:a/b",
-						},
+						Version:           "4.10.0",
+						Enabled:           true,
+						OpenShiftPullspec: "a:a/b",
 					},
 					{
-						Properties: admin.OpenShiftVersionProperties{
-							Version:           "4.10.1",
-							Enabled:           false,
-							OpenShiftPullspec: "a:a/b",
-							InstallerPullspec: "b:b/c",
-						},
+						Version:           "4.10.1",
+						Enabled:           false,
+						OpenShiftPullspec: "a:a/b",
+						InstallerPullspec: "b:b/c",
 					},
 				},
 			},
diff --git a/pkg/frontend/admin_openshiftversion_put_test.go b/pkg/frontend/admin_openshiftversion_put_test.go
index ae5387531..080d44709 100644
--- a/pkg/frontend/admin_openshiftversion_put_test.go
+++ b/pkg/frontend/admin_openshiftversion_put_test.go
@@ -34,42 +34,34 @@ func TestOpenShiftVersionPut(t *testing.T) {
 				f.AddOpenShiftVersionDocuments(
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version:           "4.10.0",
-								Enabled:           true,
-								OpenShiftPullspec: "a:a/b",
-							},
+							Version:           "4.10.0",
+							Enabled:           true,
+							OpenShiftPullspec: "a:a/b",
 						},
 					},
 				)
 			},
 			body: &admin.OpenShiftVersion{
-				Properties: admin.OpenShiftVersionProperties{
-					Version:           "4.10.0",
-					Enabled:           false,
-					OpenShiftPullspec: "c:c/d",
-					InstallerPullspec: "d:d/e",
-				},
+				Version:           "4.10.0",
+				Enabled:           false,
+				OpenShiftPullspec: "c:c/d",
+				InstallerPullspec: "d:d/e",
 			},
 			wantStatusCode: http.StatusOK,
 			wantResponse: &admin.OpenShiftVersion{
-				Properties: admin.OpenShiftVersionProperties{
-					Version:           "4.10.0",
-					Enabled:           false,
-					OpenShiftPullspec: "c:c/d",
-					InstallerPullspec: "d:d/e",
-				},
+				Version:           "4.10.0",
+				Enabled:           false,
+				OpenShiftPullspec: "c:c/d",
+				InstallerPullspec: "d:d/e",
 			},
 			wantDocuments: []*api.OpenShiftVersionDocument{
 				{
 					ID: "07070707-0707-0707-0707-070707070001",
 					OpenShiftVersion: &api.OpenShiftVersion{
-						Properties: api.OpenShiftVersionProperties{
-							Version:           "4.10.0",
-							Enabled:           false,
-							OpenShiftPullspec: "c:c/d",
-							InstallerPullspec: "d:d/e",
-						},
+						Version:           "4.10.0",
+						Enabled:           false,
+						OpenShiftPullspec: "c:c/d",
+						InstallerPullspec: "d:d/e",
 					},
 				},
 			},
@@ -80,52 +72,42 @@ func TestOpenShiftVersionPut(t *testing.T) {
 				f.AddOpenShiftVersionDocuments(
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version:           "4.10.0",
-								Enabled:           true,
-								OpenShiftPullspec: "a:a/b",
-							},
+							Version:           "4.10.0",
+							Enabled:           true,
+							OpenShiftPullspec: "a:a/b",
 						},
 					},
 				)
 			},
 			body: &admin.OpenShiftVersion{
-				Properties: admin.OpenShiftVersionProperties{
-					Version:           "4.10.1",
-					Enabled:           true,
-					OpenShiftPullspec: "f:f/g",
-					InstallerPullspec: "g:g/h",
-				},
+				Version:           "4.10.1",
+				Enabled:           true,
+				OpenShiftPullspec: "f:f/g",
+				InstallerPullspec: "g:g/h",
 			},
 			wantStatusCode: http.StatusCreated,
 			wantResponse: &admin.OpenShiftVersion{
-				Properties: admin.OpenShiftVersionProperties{
-					Version:           "4.10.1",
-					Enabled:           true,
-					OpenShiftPullspec: "f:f/g",
-					InstallerPullspec: "g:g/h",
-				},
+				Version:           "4.10.1",
+				Enabled:           true,
+				OpenShiftPullspec: "f:f/g",
+				InstallerPullspec: "g:g/h",
 			},
 			wantDocuments: []*api.OpenShiftVersionDocument{
 				{
 					ID: "07070707-0707-0707-0707-070707070001",
 					OpenShiftVersion: &api.OpenShiftVersion{
-						Properties: api.OpenShiftVersionProperties{
-							Version:           "4.10.0",
-							Enabled:           true,
-							OpenShiftPullspec: "a:a/b",
-						},
+						Version:           "4.10.0",
+						Enabled:           true,
+						OpenShiftPullspec: "a:a/b",
 					},
 				},
 				{
 					ID: "07070707-0707-0707-0707-070707070002",
 					OpenShiftVersion: &api.OpenShiftVersion{
-						Properties: api.OpenShiftVersionProperties{
-							Version:           "4.10.1",
-							Enabled:           true,
-							OpenShiftPullspec: "f:f/g",
-							InstallerPullspec: "g:g/h",
-						},
+						Version:           "4.10.1",
+						Enabled:           true,
+						OpenShiftPullspec: "f:f/g",
+						InstallerPullspec: "g:g/h",
 					},
 				},
 			},
@@ -136,22 +118,18 @@ func TestOpenShiftVersionPut(t *testing.T) {
 				f.AddOpenShiftVersionDocuments(
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version:           "4.10.0",
-								Enabled:           true,
-								OpenShiftPullspec: "a:a/b",
-								InstallerPullspec: "d:d/e",
-							},
+							Version:           "4.10.0",
+							Enabled:           true,
+							OpenShiftPullspec: "a:a/b",
+							InstallerPullspec: "d:d/e",
 						},
 					},
 				)
 			},
 			body: &admin.OpenShiftVersion{
-				Properties: admin.OpenShiftVersionProperties{
-					Version:           "4.10.0",
-					Enabled:           true,
-					OpenShiftPullspec: "c:c/d",
-				},
+				Version:           "4.10.0",
+				Enabled:           true,
+				OpenShiftPullspec: "c:c/d",
 			},
 			wantStatusCode: http.StatusBadRequest,
 			wantError:      "400: InvalidParameter: installerPullspec: Must be provided",
@@ -159,12 +137,10 @@ func TestOpenShiftVersionPut(t *testing.T) {
 				{
 					ID: "07070707-0707-0707-0707-070707070001",
 					OpenShiftVersion: &api.OpenShiftVersion{
-						Properties: api.OpenShiftVersionProperties{
-							Version:           "4.10.0",
-							Enabled:           true,
-							OpenShiftPullspec: "a:a/b",
-							InstallerPullspec: "d:d/e",
-						},
+						Version:           "4.10.0",
+						Enabled:           true,
+						OpenShiftPullspec: "a:a/b",
+						InstallerPullspec: "d:d/e",
 					},
 				},
 			},
@@ -175,22 +151,18 @@ func TestOpenShiftVersionPut(t *testing.T) {
 				f.AddOpenShiftVersionDocuments(
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version:           "4.10.0",
-								Enabled:           true,
-								OpenShiftPullspec: "a:a/b",
-								InstallerPullspec: "d:d/e",
-							},
+							Version:           "4.10.0",
+							Enabled:           true,
+							OpenShiftPullspec: "a:a/b",
+							InstallerPullspec: "d:d/e",
 						},
 					},
 				)
 			},
 			body: &admin.OpenShiftVersion{
-				Properties: admin.OpenShiftVersionProperties{
-					Version:           "4.10.0",
-					Enabled:           true,
-					InstallerPullspec: "c:c/d",
-				},
+				Version:           "4.10.0",
+				Enabled:           true,
+				InstallerPullspec: "c:c/d",
 			},
 			wantStatusCode: http.StatusBadRequest,
 			wantError:      "400: InvalidParameter: openShiftPullspec: Must be provided",
@@ -198,12 +170,10 @@ func TestOpenShiftVersionPut(t *testing.T) {
 				{
 					ID: "07070707-0707-0707-0707-070707070001",
 					OpenShiftVersion: &api.OpenShiftVersion{
-						Properties: api.OpenShiftVersionProperties{
-							Version:           "4.10.0",
-							Enabled:           true,
-							OpenShiftPullspec: "a:a/b",
-							InstallerPullspec: "d:d/e",
-						},
+						Version:           "4.10.0",
+						Enabled:           true,
+						OpenShiftPullspec: "a:a/b",
+						InstallerPullspec: "d:d/e",
 					},
 				},
 			},
diff --git a/pkg/frontend/openshiftversions_list_test.go b/pkg/frontend/installversions_list_test.go
similarity index 67%
rename from pkg/frontend/openshiftversions_list_test.go
rename to pkg/frontend/installversions_list_test.go
index ff4663b91..97083d210 100644
--- a/pkg/frontend/openshiftversions_list_test.go
+++ b/pkg/frontend/installversions_list_test.go
@@ -11,8 +11,6 @@ import (
 	"sort"
 	"testing"
 
-	"github.com/coreos/go-semver/semver"
-
 	"github.com/Azure/ARO-RP/pkg/api"
 	v20220904 "github.com/Azure/ARO-RP/pkg/api/v20220904"
 	"github.com/Azure/ARO-RP/pkg/metrics/noop"
@@ -30,7 +28,7 @@ func TestListInstallVersions(t *testing.T) {
 		name           string
 		fixture        func(f *testdatabase.Fixture)
 		wantStatusCode int
-		wantResponse   v20220904.OpenShiftVersionList
+		wantResponse   *v20220904.InstallVersions
 		wantError      string
 	}
 
@@ -49,14 +47,8 @@ func TestListInstallVersions(t *testing.T) {
 				})
 			},
 			wantStatusCode: http.StatusOK,
-			wantResponse: v20220904.OpenShiftVersionList{
-				OpenShiftVersions: []*v20220904.OpenShiftVersion{
-					{
-						Properties: v20220904.OpenShiftVersionProperties{
-							Version: version.InstallStream.Version.String(),
-						},
-					},
-				},
+			wantResponse: &v20220904.InstallVersions{
+				v20220904.InstallVersion((v20220904.InstallVersion)(version.InstallStream.Version.String())),
 			},
 		},
 		{
@@ -74,43 +66,27 @@ func TestListInstallVersions(t *testing.T) {
 				f.AddOpenShiftVersionDocuments(
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version: "4.10.20",
-								Enabled: false,
-							},
+							Version: "4.10.20",
+							Enabled: false,
 						},
 					}, &api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version: "4.10.27",
-								Enabled: true,
-							},
+							Version: "4.10.27",
+							Enabled: true,
 						},
 					},
 					&api.OpenShiftVersionDocument{
 						OpenShiftVersion: &api.OpenShiftVersion{
-							Properties: api.OpenShiftVersionProperties{
-								Version: "4.11.5",
-								Enabled: true,
-							},
+							Version: "4.11.5",
+							Enabled: true,
 						},
 					},
 				)
 			},
 			wantStatusCode: http.StatusOK,
-			wantResponse: v20220904.OpenShiftVersionList{
-				OpenShiftVersions: []*v20220904.OpenShiftVersion{
-					{
-						Properties: v20220904.OpenShiftVersionProperties{
-							Version: "4.10.27",
-						},
-					},
-					{
-						Properties: v20220904.OpenShiftVersionProperties{
-							Version: "4.11.5",
-						},
-					},
-				},
+			wantResponse: &v20220904.InstallVersions{
+				"4.10.27",
+				"4.11.5",
 			},
 		},
 	} {
@@ -138,31 +114,20 @@ func TestListInstallVersions(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			// sort the response as the version order might be changed
 			if b != nil {
-				var v v20220904.OpenShiftVersionList
+				var v []string
 				if err = json.Unmarshal(b, &v); err != nil {
 					t.Error(err)
 				}
 
-				sort.Slice(v.OpenShiftVersions, func(i, j int) bool {
-					return semver.New(v.OpenShiftVersions[i].Properties.Version).LessThan(*semver.New(v.OpenShiftVersions[j].Properties.Version))
-				})
-
+				sort.Strings(v)
 				b, err = json.Marshal(v)
 				if err != nil {
 					t.Error(err)
 				}
 			}
 
-			// marshal the expected response into a []byte otherwise
-			// it will compare zero values to omitempty json tags
-			want, err := json.Marshal(tt.wantResponse)
-			if err != nil {
-				t.Error(err)
-			}
-
-			err = validateResponse(resp, b, tt.wantStatusCode, tt.wantError, want)
+			err = validateResponse(resp, b, tt.wantStatusCode, tt.wantError, tt.wantResponse)
 			if err != nil {
 				t.Error(err)
 			}
diff --git a/pkg/frontend/openshiftcluster_putorpatch_test.go b/pkg/frontend/openshiftcluster_putorpatch_test.go
index a56f8a78e..6e37a39f3 100644
--- a/pkg/frontend/openshiftcluster_putorpatch_test.go
+++ b/pkg/frontend/openshiftcluster_putorpatch_test.go
@@ -672,7 +672,7 @@ func TestPutOrPatchOpenShiftCluster(t *testing.T) {
 		{
 			name: "create a new cluster",
 			request: func(oc *v20200430.OpenShiftCluster) {
-				oc.Properties.ClusterProfile.Version = "4.10.20"
+				oc.Properties.ClusterProfile.Version = "4.3.0"
 			},
 			fixture: func(f *testdatabase.Fixture) {
 				f.AddSubscriptionDocuments(&api.SubscriptionDocument{
@@ -708,7 +708,7 @@ func TestPutOrPatchOpenShiftCluster(t *testing.T) {
 							CreatedAt:           mockCurrentTime,
 							CreatedBy:           version.GitCommit,
 							ClusterProfile: api.ClusterProfile{
-								Version:              "4.10.20",
+								Version:              "4.3.0",
 								FipsValidatedModules: api.FipsValidatedModulesDisabled,
 							},
 							NetworkProfile: api.NetworkProfile{
@@ -735,7 +735,7 @@ func TestPutOrPatchOpenShiftCluster(t *testing.T) {
 				Properties: v20200430.OpenShiftClusterProperties{
 					ProvisioningState: v20200430.ProvisioningStateCreating,
 					ClusterProfile: v20200430.ClusterProfile{
-						Version: "4.10.20",
+						Version: "4.3.0",
 					},
 				},
 			},
@@ -1314,7 +1314,7 @@ func TestPutOrPatchOpenShiftCluster(t *testing.T) {
 						Properties: api.OpenShiftClusterProperties{
 							ProvisioningState: api.ProvisioningStateCreating,
 							ClusterProfile: api.ClusterProfile{
-								Version:              "4.10.20",
+								Version:              "4.3.0",
 								ResourceGroupID:      fmt.Sprintf("/subscriptions/%s/resourcegroups/aro-vjb21wca", mockSubID),
 								FipsValidatedModules: api.FipsValidatedModulesDisabled,
 							},
@@ -1359,7 +1359,7 @@ func TestPutOrPatchOpenShiftCluster(t *testing.T) {
 						Properties: api.OpenShiftClusterProperties{
 							ProvisioningState: api.ProvisioningStateCreating,
 							ClusterProfile: api.ClusterProfile{
-								Version:              "4.10.20",
+								Version:              "4.3.0",
 								FipsValidatedModules: api.FipsValidatedModulesDisabled,
 							},
 							NetworkProfile: api.NetworkProfile{
diff --git a/test/e2e/adminapi_csr.go b/test/e2e/adminapi_csr.go
deleted file mode 100644
index 214fde555..000000000
--- a/test/e2e/adminapi_csr.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package e2e
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-	"encoding/base64"
-	"net/http"
-	"net/url"
-	"strconv"
-
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/gomega"
-
-	certificatesv1 "k8s.io/api/certificates/v1"
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-var _ = Describe("[Admin API] CertificateSigningRequest action", func() {
-	BeforeEach(skipIfNotInDevelopmentEnv)
-
-	const prefix = "e2e-test-csr"
-	const namespace = "openshift"
-	const csrCount = 4
-	const csrdataStr = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ3BEQ0NBWXdDQVFBd1h6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdNQWtOUE1ROHdEUVlEVlFRSApEQVpFWlc1MlpYSXhFakFRQmdOVkJBb01DVTFwWTNKdmMyOW1kREVNTUFvR0ExVUVDd3dEUVZKUE1SQXdEZ1lEClZRUUREQWRsTW1VdVlYSnZNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWxqWUUKcnFkU0hvV1p2MVdHSnN1RFZsaGExVU1BVnJiUk0xWjJHaWZJMzNETlBUWGFmQnN1QVI2ZGVCQVgyWmpybUozNQpuekNBZ0k5d1ltdlYwN3JtTEFYQlloRnJiTWtNN1pSU1ZFT01hL2ZXdlN5ZjJVQWxSdm5Jd0JmRkgwS1pRSGg5Cm5aV3RIZHQxSzRuZ3ZnM1NuQ3JEU0NBRUhsS2hoN3Jua1pyRkdrMldabFFoVklWUXFReFFzdmx3VStvWlhnNjQKdmpleDRuc3BZaXFXMERzakl6RzFsSEszWHczN3RGeWhNNzJ4SjByblBYVTRGWkJsWXUzWkVqOFVhSFBoTlcrdgpqZmg2c0hCbWFkcHpEMWRuNDJ4eXgrUGhOaCtKWTVVT3ZWWnR2MWx5UU44eEswL0VjK0Mvcm1mOWZPYmdFSkNVCm00Z3pFSXhhVGhCVURsN1JHd0lEQVFBQm9BQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQnYvVHdUR0JvL20KcVJVK0djZ3Bsa3I1aDlKQVdSZjNNazV3Z1o0ZmlSZm85UEVaYUxJWkZYQ0V0elNHV3JZenFjbFpZQ3JuRmUySQpzdHdNUU8yb1pQUzNvcUVIcWs5Uk0rbzRUVmtkSldjY3hKV3RMY3JoTWRwVjVMc3VMam1qRS9jeDcrbEtUZkh1Cno0eDllYzJTajhnZmV3SFowZTkzZjFTT3ZhVGFMaTQrT3JkM3FTT0NyNE5ZSGhvVDJiM0pBUFpMSmkvVEFpb1gKOUxJNFJpVXNSSWlMUm45VDZidzczM0FLMkpNMXREWU9Tc0hXdmJrZ3FDOFlHMmpYUW9LNUpZOWdTN0V5TkF6NwpjT1plbkkwK2dVeE1leUlNN2I0S05YWFQ3NmxVdHZ5M2N3LzhwVmxQU01pTDFVZ2RpMXFZMDl0MW9FMmU4YnljCm5GdWhZOW5ERU53PQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K"
-
-	It("should be able to approve one or multiple CSRs", func() {
-
-		csrDataEncoded := []byte(csrdataStr)
-		csrDataDecoded := make([]byte, base64.StdEncoding.DecodedLen(len(csrDataEncoded)))
-		csrDataLength, err := base64.StdEncoding.Decode(csrDataDecoded, csrDataEncoded)
-		Expect(err).NotTo(HaveOccurred())
-		csrData := csrDataDecoded[:csrDataLength]
-
-		By("creating mock CSRs via Kubernetes API")
-		for i := 0; i < csrCount; i++ {
-			csr := mockCSR(prefix+strconv.Itoa(i), namespace, csrData)
-			_, err := clients.Kubernetes.CertificatesV1().CertificateSigningRequests().Create(context.Background(), csr, metav1.CreateOptions{})
-			Expect(err).NotTo(HaveOccurred())
-		}
-
-		defer func() {
-			By("deleting the mock CSRs via Kubernetes API")
-			for i := 0; i < csrCount; i++ {
-				err := clients.Kubernetes.CertificatesV1().CertificateSigningRequests().Delete(context.Background(), prefix+strconv.Itoa(i), metav1.DeleteOptions{})
-				Expect(err).NotTo(HaveOccurred())
-			}
-		}()
-
-		testCSRApproveOK(prefix+"0", namespace)
-		testCSRMassApproveOK(prefix, namespace, csrCount)
-	})
-})
-
-func testCSRApproveOK(objName, namespace string) {
-	By("approving the CSR via RP admin API")
-	params := url.Values{
-		"csrName": []string{objName},
-	}
-	resp, err := adminRequest(context.Background(), http.MethodPost, "/admin"+resourceIDFromEnv()+"/approvecsr", params, nil, nil)
-	Expect(err).NotTo(HaveOccurred())
-	Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-	By("checking that the CSR was approved via Kubernetes API")
-	testcsr, err := clients.Kubernetes.CertificatesV1().CertificateSigningRequests().Get(context.Background(), objName, metav1.GetOptions{})
-	Expect(err).NotTo(HaveOccurred())
-
-	approved := false
-	for _, condition := range testcsr.Status.Conditions {
-		if condition.Type == certificatesv1.CertificateApproved {
-			Expect(condition.Status).To(Equal(corev1.ConditionTrue))
-			Expect(condition.Reason).To(Equal("AROSupportApprove"))
-			Expect(condition.Message).To(Equal("This CSR was approved by ARO support personnel."))
-			approved = true
-		}
-	}
-	Expect(approved).Should(BeTrue())
-}
-
-func testCSRMassApproveOK(namePrefix, namespace string, csrCount int) {
-	By("approving all CSRs via RP admin API")
-	resp, err := adminRequest(context.Background(), http.MethodPost, "/admin"+resourceIDFromEnv()+"/approvecsr", nil, nil, nil)
-	Expect(err).NotTo(HaveOccurred())
-	Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-	By("checking that all CSRs were approved via Kubernetes API")
-	for i := 1; i < csrCount; i++ {
-		testcsr, err := clients.Kubernetes.CertificatesV1().CertificateSigningRequests().Get(context.Background(), namePrefix+strconv.Itoa(i), metav1.GetOptions{})
-		Expect(err).NotTo(HaveOccurred())
-
-		approved := false
-		for _, condition := range testcsr.Status.Conditions {
-			if condition.Type == certificatesv1.CertificateApproved {
-				Expect(condition.Status).To(Equal(corev1.ConditionTrue))
-				Expect(condition.Reason).To(Equal("AROSupportApprove"))
-				Expect(condition.Message).To(Equal("This CSR was approved by ARO support personnel."))
-				approved = true
-			}
-		}
-
-		Expect(approved).Should(BeTrue())
-	}
-}
-
-func mockCSR(objName, namespace string, csrData []byte) *certificatesv1.CertificateSigningRequest {
-	csr := &certificatesv1.CertificateSigningRequest{
-		// Username, UID, Groups will be injected by API server.
-		TypeMeta: metav1.TypeMeta{Kind: "CertificateSigningRequest"},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      objName,
-			Namespace: namespace,
-		},
-		Spec: certificatesv1.CertificateSigningRequestSpec{
-			Request:    csrData,
-			Usages:     []certificatesv1.KeyUsage{certificatesv1.UsageClientAuth},
-			SignerName: "kubernetes.io/kube-apiserver-client",
-		},
-	}
-
-	return csr
-}