Repository: Azure/ARO-RP
Pull request #2356 (2022-08-29 06:37:36)

API 2022-09-04: install-version parameter activation and version listing fixes
### Which issue this PR addresses:

Fixes part one of https://dev.azure.com/msazure/AzureRedHatOpenShift/_workitems/edit/15345318

### What this PR does / why we need it:

Fixes:
1. An issue with not generating example `List_Install_Versions.json` body content and incorrect parameter listing.
2. Passing the `InstallVersion` to the correct cluster object for the `az aro create` functionality.
3. Adds a custom type for the `InstallVersion` in order for the the auto-rest API generation to create a string list return type instead of an object.
4. Accepts, validates, and sends the `install-version` parameter to the API, during the `az aro create` process.

The aro module has also had a minor version bump to 1.0.7, due to the new `get-versions` functionality as well as the `install-version` selection parameter for cluster creation.

### Test plan for issue:

Tested locally and the API will be submitted for verification.

### Is there any documentation that needs to be updated for this PR?

Yes, we need to update the `az aro create` documentation: https://docs.microsoft.com/en-us/cli/azure/aro?view=azure-cli-latest#az-aro-create

ross-bryan: /azp run ci
azure-pipelines[bot]: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>

Patch:
diff --git a/.sha256sum b/.sha256sum
index 2ed42ff1e..eef566c33 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
-cd94fd7a7ec5b67cb158d156606c65c203d4c46707aa7b4b7397d0a5188a2798  swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json
+4c3d8755c87f9b749a0ff6c76fae08d44225f7aa7becd913936a883bfe9ecfe3  swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/redhatopenshift.json
diff --git a/pkg/api/v20220904/installversions.go b/pkg/api/v20220904/installversions.go
index fcc366ea7..17cc4ac10 100644
--- a/pkg/api/v20220904/installversions.go
+++ b/pkg/api/v20220904/installversions.go
@@ -4,4 +4,4 @@ package v20220904
 // Licensed under the Apache License 2.0.
 
 // InstallVersions represents a List of OpenShift installable versions.
-type InstallVersions []string
+type InstallVersions []InstallVersion
diff --git a/pkg/api/v20220904/installversions_convert.go b/pkg/api/v20220904/installversions_convert.go
index f5652b553..eeb079f5c 100644
--- a/pkg/api/v20220904/installversions_convert.go
+++ b/pkg/api/v20220904/installversions_convert.go
@@ -7,6 +7,6 @@ import "github.com/Azure/ARO-RP/pkg/api"
 
 type installVersionsConverter struct{}
 
-func (*installVersionsConverter) ToExternal(iov *api.InstallVersions) interface{} {
-	return iov
+func (*installVersionsConverter) ToExternal(installVersions *api.InstallVersions) interface{} {
+	return installVersions
 }
diff --git a/pkg/api/v20220904/openshiftcluster.go b/pkg/api/v20220904/openshiftcluster.go
index 376acc2f1..73f8cbf9d 100644
--- a/pkg/api/v20220904/openshiftcluster.go
+++ b/pkg/api/v20220904/openshiftcluster.go
@@ -36,9 +36,6 @@ type OpenShiftCluster struct {
 
 	// The cluster properties.
 	Properties OpenShiftClusterProperties `json:"properties,omitempty"`
-
-	// The cluster install version.
-	InstallVersion string `json:"installVersion,omitempty"`
 }
 
 // Tags represents an OpenShift cluster's tags.
@@ -72,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.
@@ -87,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/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/list.go b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/list.go
index f83f30e75..b0940334a 100644
--- a/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/list.go
+++ b/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift/list.go
@@ -46,7 +46,7 @@ func NewListClientWithBaseURI(baseURI string, subscriptionID string) ListClient
 // Versions the operation returns the installable OpenShift versions as strings.
 // Parameters:
 // location - the name of Azure region.
-func (client ListClient) Versions(ctx context.Context, location string) (result SetObject, err error) {
+func (client ListClient) Versions(ctx context.Context, location string) (result ListString, err error) {
 	if tracing.IsEnabled() {
 		ctx = tracing.StartSpan(ctx, fqdn+"/ListClient.Versions")
 		defer func() {
@@ -115,7 +115,7 @@ func (client ListClient) VersionsSender(req *http.Request) (*http.Response, erro
 
 // VersionsResponder handles the response to the Versions request. The method always
 // closes the http.Response Body.
-func (client ListClient) VersionsResponder(resp *http.Response) (result SetObject, err error) {
+func (client ListClient) VersionsResponder(resp *http.Response) (result ListString, err error) {
 	err = autorest.Respond(
 		resp,
 		azure.WithErrorUnlessStatusCode(http.StatusOK),
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 87de8b37e..feb399e8e 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"`
+}
+
 // MasterProfile masterProfile represents a master profile.
 type MasterProfile struct {
 	// VMSize - The size of the master VMs.
@@ -452,6 +458,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
@@ -583,8 +591,6 @@ type OpenShiftClusterUpdate struct {
 	Tags map[string]*string `json:"tags"`
 	// OpenShiftClusterProperties - The cluster properties.
 	*OpenShiftClusterProperties `json:"properties,omitempty"`
-	// InstallVersion - The cluster install version.
-	InstallVersion *string `json:"installVersion,omitempty"`
 	// SystemData - READ-ONLY; The system meta data relating to this resource.
 	SystemData *SystemData `json:"systemData,omitempty"`
 }
@@ -598,9 +604,6 @@ func (oscu OpenShiftClusterUpdate) MarshalJSON() ([]byte, error) {
 	if oscu.OpenShiftClusterProperties != nil {
 		objectMap["properties"] = oscu.OpenShiftClusterProperties
 	}
-	if oscu.InstallVersion != nil {
-		objectMap["installVersion"] = oscu.InstallVersion
-	}
 	return json.Marshal(objectMap)
 }
 
@@ -631,15 +634,6 @@ func (oscu *OpenShiftClusterUpdate) UnmarshalJSON(body []byte) error {
 				}
 				oscu.OpenShiftClusterProperties = &openShiftClusterProperties
 			}
-		case "installVersion":
-			if v != nil {
-				var installVersion string
-				err = json.Unmarshal(*v, &installVersion)
-				if err != nil {
-					return err
-				}
-				oscu.InstallVersion = &installVersion
-			}
 		case "systemData":
 			if v != nil {
 				var systemData SystemData
@@ -869,12 +863,6 @@ type ServicePrincipalProfile struct {
 	ClientSecret *string `json:"clientSecret,omitempty"`
 }
 
-// SetObject ...
-type SetObject struct {
-	autorest.Response `json:"-"`
-	Value             interface{} `json:"value,omitempty"`
-}
-
 // SystemData metadata pertaining to creation and last modification of the resource.
 type SystemData struct {
 	// CreatedBy - The identity that created the resource.
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 a8942b3aa..bd2068682 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,7 +33,7 @@ var _ OperationsClientAPI = (*redhatopenshift.OperationsClient)(nil)
 
 // ListClientAPI contains the set of methods on the ListClient type.
 type ListClientAPI interface {
-	Versions(ctx context.Context, location string) (result redhatopenshift.SetObject, err error)
+	Versions(ctx context.Context, location string) (result redhatopenshift.ListString, err error)
 }
 
 var _ ListClientAPI = (*redhatopenshift.ListClient)(nil)
diff --git a/pkg/swagger/examples.go b/pkg/swagger/examples.go
index c27e4c7c6..215391ab8 100644
--- a/pkg/swagger/examples.go
+++ b/pkg/swagger/examples.go
@@ -54,6 +54,11 @@ func (g *generator) generateExamples(outputDir string, s *Swagger) error {
 							Name:      "resourceGroupName",
 							Parameter: "resourceGroup",
 						})
+					case "../../../../../common-types/resource-management/" + g.commonTypesVersion + "/types.json#/parameters/LocationParameter":
+						example.Parameters = append(example.Parameters, NameParameter{
+							Name:      "location",
+							Parameter: "location",
+						})
 					}
 				case Parameter:
 					switch param.Name {
@@ -99,6 +104,8 @@ func (g *generator) generateExamples(outputDir string, s *Swagger) error {
 						body = g.exampleOpenShiftClusterListResponse()
 					case "#/definitions/OperationList":
 						body = g.exampleOperationListResponse()
+					case "#/definitions/InstallVersions":
+						body = g.exampleInstallVersions()
 					}
 				}
 
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/openshiftclusters.go b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/openshiftclusters.go
new file mode 100644
index 000000000..49ef3580e
--- /dev/null
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/openshiftclusters.go
@@ -0,0 +1,54 @@
+package redhatopenshift
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"context"
+	"crypto/tls"
+	"net/http"
+	"time"
+
+	"github.com/Azure/go-autorest/autorest"
+
+	mgmtredhatopenshift20220904 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift"
+	"github.com/Azure/ARO-RP/pkg/env"
+	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+)
+
+// OpenShiftClustersClient is a minimal interface for azure OpenshiftClustersClient
+type OpenShiftClustersClient interface {
+	ListCredentials(ctx context.Context, resourceGroupName string, resourceName string) (result mgmtredhatopenshift20220904.OpenShiftClusterCredentials, err error)
+	Get(ctx context.Context, resourceGroupName string, resourceName string) (result mgmtredhatopenshift20220904.OpenShiftCluster, err error)
+	OpenShiftClustersClientAddons
+}
+
+type openShiftClustersClient struct {
+	mgmtredhatopenshift20220904.OpenShiftClustersClient
+}
+
+var _ OpenShiftClustersClient = &openShiftClustersClient{}
+
+// NewOpenShiftClustersClient creates a new OpenShiftClustersClient
+func NewOpenShiftClustersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) OpenShiftClustersClient {
+	var client mgmtredhatopenshift20220904.OpenShiftClustersClient
+	if env.IsLocalDevelopmentMode() {
+		client = mgmtredhatopenshift20220904.NewOpenShiftClustersClientWithBaseURI("https://localhost:8443", subscriptionID)
+		client.Sender = &http.Client{
+			Transport: &http.Transport{
+				TLSClientConfig: &tls.Config{
+					InsecureSkipVerify: true, // #nosec G402
+				},
+			},
+		}
+	} else {
+		client = mgmtredhatopenshift20220904.NewOpenShiftClustersClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
+		client.Authorizer = authorizer
+	}
+	client.PollingDelay = 10 * time.Second
+	client.PollingDuration = 2 * time.Hour
+
+	return &openShiftClustersClient{
+		OpenShiftClustersClient: client,
+	}
+}
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/openshiftclusters_addons.go b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/openshiftclusters_addons.go
new file mode 100644
index 000000000..9bc04d990
--- /dev/null
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/openshiftclusters_addons.go
@@ -0,0 +1,72 @@
+package redhatopenshift
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"context"
+
+	mgmtredhatopenshift20220904 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift"
+)
+
+// OpenShiftClustersClientAddons contains addons for OpenShiftClustersClient
+type OpenShiftClustersClientAddons interface {
+	CreateOrUpdateAndWait(ctx context.Context, resourceGroupName string, resourceName string, parameters mgmtredhatopenshift20220904.OpenShiftCluster) error
+	DeleteAndWait(ctx context.Context, resourceGroupName string, resourceName string) error
+	List(ctx context.Context) (clusters []mgmtredhatopenshift20220904.OpenShiftCluster, err error)
+	ListByResourceGroup(ctx context.Context, resourceGroupName string) (clusters []mgmtredhatopenshift20220904.OpenShiftCluster, err error)
+}
+
+func (c *openShiftClustersClient) CreateOrUpdateAndWait(ctx context.Context, resourceGroupName string, resourceName string, parameters mgmtredhatopenshift20220904.OpenShiftCluster) error {
+	future, err := c.CreateOrUpdate(ctx, resourceGroupName, resourceName, parameters)
+	if err != nil {
+		return err
+	}
+
+	return future.WaitForCompletionRef(ctx, c.Client)
+}
+
+func (c *openShiftClustersClient) DeleteAndWait(ctx context.Context, resourceGroupName string, resourceName string) error {
+	future, err := c.Delete(ctx, resourceGroupName, resourceName)
+	if err != nil {
+		return err
+	}
+
+	return future.WaitForCompletionRef(ctx, c.Client)
+}
+
+func (c *openShiftClustersClient) List(ctx context.Context) (clusters []mgmtredhatopenshift20220904.OpenShiftCluster, err error) {
+	page, err := c.OpenShiftClustersClient.ListMethod(ctx)
+	if err != nil {
+		return nil, err
+	}
+
+	for page.NotDone() {
+		clusters = append(clusters, page.Values()...)
+
+		err = page.NextWithContext(ctx)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return clusters, nil
+}
+
+func (c *openShiftClustersClient) ListByResourceGroup(ctx context.Context, resourceGroupName string) (clusters []mgmtredhatopenshift20220904.OpenShiftCluster, err error) {
+	page, err := c.OpenShiftClustersClient.ListByResourceGroup(ctx, resourceGroupName)
+	if err != nil {
+		return nil, err
+	}
+
+	for page.NotDone() {
+		clusters = append(clusters, page.Values()...)
+
+		err = page.NextWithContext(ctx)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return clusters, nil
+}
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/operations.go b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/operations.go
new file mode 100644
index 000000000..fda8ff1cd
--- /dev/null
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/operations.go
@@ -0,0 +1,48 @@
+package redhatopenshift
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"crypto/tls"
+	"net/http"
+
+	"github.com/Azure/go-autorest/autorest"
+
+	mgmtredhatopenshift20220904 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift"
+	"github.com/Azure/ARO-RP/pkg/env"
+	"github.com/Azure/ARO-RP/pkg/util/azureclient"
+)
+
+// OperationsClient is a minimal interface for azure OperationsClient
+type OperationsClient interface {
+	OperationsClientAddons
+}
+
+type operationsClient struct {
+	mgmtredhatopenshift20220904.OperationsClient
+}
+
+var _ OperationsClient = &operationsClient{}
+
+// NewOperationsClient creates a new OperationsClient
+func NewOperationsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) OperationsClient {
+	var client mgmtredhatopenshift20220904.OperationsClient
+	if env.IsLocalDevelopmentMode() {
+		client = mgmtredhatopenshift20220904.NewOperationsClientWithBaseURI("https://localhost:8443", subscriptionID)
+		client.Sender = &http.Client{
+			Transport: &http.Transport{
+				TLSClientConfig: &tls.Config{
+					InsecureSkipVerify: true, // #nosec G402
+				},
+			},
+		}
+	} else {
+		client = mgmtredhatopenshift20220904.NewOperationsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID)
+		client.Authorizer = authorizer
+	}
+
+	return &operationsClient{
+		OperationsClient: client,
+	}
+}
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/operations_addons.go b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/operations_addons.go
new file mode 100644
index 000000000..ab6a3b483
--- /dev/null
+++ b/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift/operations_addons.go
@@ -0,0 +1,33 @@
+package redhatopenshift
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"context"
+
+	mgmtredhatopenshift20220904 "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2022-09-04/redhatopenshift"
+)
+
+// OperationsClientAddons contains addons for OperationsClient
+type OperationsClientAddons interface {
+	List(ctx context.Context) (operations []mgmtredhatopenshift20220904.Operation, err error)
+}
+
+func (c *operationsClient) List(ctx context.Context) (operations []mgmtredhatopenshift20220904.Operation, err error) {
+	page, err := c.OperationsClient.List(ctx)
+	if err != nil {
+		return nil, err
+	}
+
+	for page.NotDone() {
+		operations = append(operations, page.Values()...)
+
+		err = page.NextWithContext(ctx)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return operations, nil
+}
diff --git a/pkg/util/cluster/cluster.go b/pkg/util/cluster/cluster.go
index 6375d1e64..f148ad6ff 100644
--- a/pkg/util/cluster/cluster.go
+++ b/pkg/util/cluster/cluster.go
@@ -40,6 +40,7 @@ import (
 	redhatopenshift20200430 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift"
 	redhatopenshift20210901preview "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2021-09-01-preview/redhatopenshift"
 	redhatopenshift20220401 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2022-04-01/redhatopenshift"
+	redhatopenshift20220904 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift"
 	"github.com/Azure/ARO-RP/pkg/util/rbac"
 	"github.com/Azure/ARO-RP/pkg/util/uuid"
 )
@@ -56,6 +57,7 @@ type Cluster struct {
 	openshiftclustersv20200430        redhatopenshift20200430.OpenShiftClustersClient
 	openshiftclustersv20210901preview redhatopenshift20210901preview.OpenShiftClustersClient
 	openshiftclustersv20220401        redhatopenshift20220401.OpenShiftClustersClient
+	openshiftclustersv20220904        redhatopenshift20220904.OpenShiftClustersClient
 	securitygroups                    network.SecurityGroupsClient
 	subnets                           network.SubnetsClient
 	routetables                       network.RouteTablesClient
@@ -108,6 +110,7 @@ func New(log *logrus.Entry, environment env.Core, ci bool) (*Cluster, error) {
 		openshiftclustersv20200430:        redhatopenshift20200430.NewOpenShiftClustersClient(environment.Environment(), environment.SubscriptionID(), authorizer),
 		openshiftclustersv20210901preview: redhatopenshift20210901preview.NewOpenShiftClustersClient(environment.Environment(), environment.SubscriptionID(), authorizer),
 		openshiftclustersv20220401:        redhatopenshift20220401.NewOpenShiftClustersClient(environment.Environment(), environment.SubscriptionID(), authorizer),
+		openshiftclustersv20220904:        redhatopenshift20220904.NewOpenShiftClustersClient(environment.Environment(), environment.SubscriptionID(), authorizer),
 		applications:                      graphrbac.NewApplicationsClient(environment.Environment(), environment.TenantID(), graphAuthorizer),
 		serviceprincipals:                 graphrbac.NewServicePrincipalClient(environment.Environment(), environment.TenantID(), graphAuthorizer),
 		securitygroups:                    network.NewSecurityGroupsClient(environment.Environment(), environment.SubscriptionID(), authorizer),
diff --git a/python/az/aro/HISTORY.rst b/python/az/aro/HISTORY.rst
index 85c311b4d..c5a7f9541 100644
--- a/python/az/aro/HISTORY.rst
+++ b/python/az/aro/HISTORY.rst
@@ -50,3 +50,8 @@ Release History
 1.0.6
 ++++++
 * Fixed backwards compatibility with Python3.6
+
+1.0.7
+++++++
+* Add support for get-versions (lists available installation versions of OpenShift per location)
+* Adds an aro create 'install-version' parameter (for specifying the cluster installation version)
diff --git a/python/az/aro/azext_aro/_help.py b/python/az/aro/azext_aro/_help.py
index 58751d65c..06047ad78 100644
--- a/python/az/aro/azext_aro/_help.py
+++ b/python/az/aro/azext_aro/_help.py
@@ -15,6 +15,8 @@ helps['aro create'] = """
   examples:
   - name: Create a cluster.
     text: az aro create --resource-group MyResourceGroup --name MyCluster --vnet MyVnet --master-subnet MyMasterSubnet --worker-subnet MyWorkerSubnet
+  - name: Create a cluster with a supported OpenShift version.
+    text: az aro create --resource-group MyResourceGroup --name MyCluster --vnet MyVnet --master-subnet MyMasterSubnet --worker-subnet MyWorkerSubnet --install-version X.Y.Z
   - name: Create a cluster with 5 compute nodes and Red Hat pull secret.
     text: az aro create --resource-group MyResourceGroup --name MyCluster --vnet MyVnet --master-subnet MyMasterSubnet --worker-subnet MyWorkerSubnet --worker-count 5 --pull-secret @pullsecret.txt
   - name: Create a private cluster.
diff --git a/python/az/aro/azext_aro/_params.py b/python/az/aro/azext_aro/_params.py
index fb305677e..955353624 100644
--- a/python/az/aro/azext_aro/_params.py
+++ b/python/az/aro/azext_aro/_params.py
@@ -16,6 +16,7 @@ from azext_aro._validators import validate_vnet_resource_group_name
 from azext_aro._validators import validate_worker_count
 from azext_aro._validators import validate_worker_vm_disk_size_gb
 from azext_aro._validators import validate_refresh_cluster_credentials
+from azext_aro._validators import validate_install_version_format
 from azure.cli.core.commands.parameters import name_type
 from azure.cli.core.commands.parameters import get_enum_type, get_three_state_flag
 from azure.cli.core.commands.parameters import resource_group_name_type
@@ -53,6 +54,10 @@ def load_arguments(self, _):
                    help='Client secret of cluster service principal.',
                    validator=validate_client_secret(isCreate=True))
 
+        c.argument('install_version',
+                   help='OpenShift version to use for cluster creation.',
+                   validator=validate_install_version_format)
+
         c.argument('pod_cidr',
                    help='CIDR of pod network. Must be a minimum of /18 or larger.',
                    validator=validate_cidr('pod_cidr'))
diff --git a/python/az/aro/azext_aro/_validators.py b/python/az/aro/azext_aro/_validators.py
index a17fa76f9..8d2569613 100644
--- a/python/az/aro/azext_aro/_validators.py
+++ b/python/az/aro/azext_aro/_validators.py
@@ -253,3 +253,10 @@ def validate_refresh_cluster_credentials(namespace):
         return
     if namespace.client_secret is not None or namespace.client_id is not None:
         raise RequiredArgumentMissingError('--client-id and --client-secret must be not set with --refresh-credentials.')  # pylint: disable=line-too-long
+
+
+def validate_install_version_format(namespace):
+    if namespace.install_version is not None and not re.match(r'^' +
+                                                              r'[4-9]{1}\.[0-9]{1,2}\.[0-9]{1,2}' +
+                                                              r'$', namespace.install_version):
+        raise InvalidArgumentValueError('--install-version is invalid')
diff --git a/python/az/aro/azext_aro/custom.py b/python/az/aro/azext_aro/custom.py
index 4e556c5c6..ce9ef32d0 100644
--- a/python/az/aro/azext_aro/custom.py
+++ b/python/az/aro/azext_aro/custom.py
@@ -58,6 +58,7 @@ def aro_create(cmd,  # pylint: disable=too-many-locals
                apiserver_visibility=None,
                ingress_visibility=None,
                tags=None,
+               install_version=None,
                no_wait=False):
     if not rp_mode_development():
         resource_client = get_mgmt_service_client(
@@ -141,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]
diff --git a/python/az/aro/setup.py b/python/az/aro/setup.py
index 5730ffb04..e7734ba10 100644
--- a/python/az/aro/setup.py
+++ b/python/az/aro/setup.py
@@ -11,7 +11,7 @@ except ImportError:
     from distutils import log as logger
     logger.warn("Wheel is not available, disabling bdist_wheel hook")
 
-VERSION = '1.0.6'
+VERSION = '1.0.7'
 
 # The full list of classifiers is available at
 # https://pypi.python.org/pypi?%3Aaction=list_classifiers
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 c2f637d92..f93a26113 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
@@ -479,6 +479,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 = {
@@ -505,6 +507,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__(
@@ -538,6 +541,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)
@@ -549,6 +554,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):
@@ -639,8 +645,6 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
 
     :ivar tags: A set of tags. The resource tags.
     :vartype tags: dict[str, str]
-    :ivar install_version: The cluster install version.
-    :vartype install_version: str
     :ivar system_data: The system meta data relating to this resource.
     :vartype system_data: ~azure.mgmt.redhatopenshift.v2022_09_04.models.SystemData
     :ivar provisioning_state: The cluster provisioning state. Possible values include:
@@ -664,6 +668,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 = {
@@ -672,7 +678,6 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
 
     _attribute_map = {
         'tags': {'key': 'tags', 'type': '{str}'},
-        'install_version': {'key': 'installVersion', 'type': 'str'},
         'system_data': {'key': 'systemData', 'type': 'SystemData'},
         'provisioning_state': {'key': 'properties.provisioningState', 'type': 'str'},
         'cluster_profile': {'key': 'properties.clusterProfile', 'type': 'ClusterProfile'},
@@ -683,6 +688,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__(
@@ -692,8 +698,6 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         """
         :keyword tags: A set of tags. The resource tags.
         :paramtype tags: dict[str, str]
-        :keyword install_version: The cluster install version.
-        :paramtype install_version: str
         :keyword provisioning_state: The cluster provisioning state. Possible values include:
          "AdminUpdating", "Creating", "Deleting", "Failed", "Succeeded", "Updating".
         :paramtype provisioning_state: str or
@@ -716,10 +720,11 @@ 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)
-        self.install_version = kwargs.get('install_version', None)
         self.system_data = None
         self.provisioning_state = kwargs.get('provisioning_state', None)
         self.cluster_profile = kwargs.get('cluster_profile', None)
@@ -730,6 +735,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)
+        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 92311e601..089a75e4d 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
@@ -522,6 +522,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 = {
@@ -548,6 +550,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__(
@@ -564,6 +567,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
     ):
         """
@@ -593,6 +597,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
@@ -604,6 +610,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):
@@ -702,8 +709,6 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
 
     :ivar tags: A set of tags. The resource tags.
     :vartype tags: dict[str, str]
-    :ivar install_version: The cluster install version.
-    :vartype install_version: str
     :ivar system_data: The system meta data relating to this resource.
     :vartype system_data: ~azure.mgmt.redhatopenshift.v2022_09_04.models.SystemData
     :ivar provisioning_state: The cluster provisioning state. Possible values include:
@@ -727,6 +732,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 = {
@@ -735,7 +742,6 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
 
     _attribute_map = {
         'tags': {'key': 'tags', 'type': '{str}'},
-        'install_version': {'key': 'installVersion', 'type': 'str'},
         'system_data': {'key': 'systemData', 'type': 'SystemData'},
         'provisioning_state': {'key': 'properties.provisioningState', 'type': 'str'},
         'cluster_profile': {'key': 'properties.clusterProfile', 'type': 'ClusterProfile'},
@@ -746,13 +752,13 @@ 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__(
         self,
         *,
         tags: Optional[Dict[str, str]] = None,
-        install_version: Optional[str] = None,
         provisioning_state: Optional[Union[str, "ProvisioningState"]] = None,
         cluster_profile: Optional["ClusterProfile"] = None,
         console_profile: Optional["ConsoleProfile"] = None,
@@ -762,13 +768,12 @@ 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
     ):
         """
         :keyword tags: A set of tags. The resource tags.
         :paramtype tags: dict[str, str]
-        :keyword install_version: The cluster install version.
-        :paramtype install_version: str
         :keyword provisioning_state: The cluster provisioning state. Possible values include:
          "AdminUpdating", "Creating", "Deleting", "Failed", "Succeeded", "Updating".
         :paramtype provisioning_state: str or
@@ -791,10 +796,11 @@ 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
-        self.install_version = install_version
         self.system_data = None
         self.provisioning_state = provisioning_state
         self.cluster_profile = cluster_profile
@@ -805,6 +811,7 @@ class OpenShiftClusterUpdate(msrest.serialization.Model):
         self.worker_profiles = worker_profiles
         self.apiserver_profile = apiserver_profile
         self.ingress_profiles = ingress_profiles
+        self.install_version = install_version
 
 
 class Operation(msrest.serialization.Model):
diff --git a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_list_operations.py b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_list_operations.py
index b162f57bb..4fc3d6bc0 100644
--- a/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_list_operations.py
+++ b/python/client/azure/mgmt/redhatopenshift/v2022_09_04/operations/_list_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]]
 
@@ -101,7 +101,7 @@ class ListOperations(object):
         location,  # type: str
         **kwargs  # type: Any
     ):
-        # type: (...) -> Any
+        # 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 ListOperations(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: any, or the result of cls(response)
-        :rtype: any
+        :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[Any]
+        cls = kwargs.pop('cls', None)  # type: ClsType[List[str]]
         error_map = {
             401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
         }
@@ -142,7 +142,7 @@ class ListOperations(object):
             map_error(status_code=response.status_code, response=response, error_map=error_map)
             raise HttpResponseError(response=response, error_format=ARMErrorFormat)
 
-        deserialized = self._deserialize('object', 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/List_Install_Versions.json b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/List_Install_Versions.json
index 5d3b857bb..2ab1831af 100644
--- a/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/List_Install_Versions.json
+++ b/swagger/redhatopenshift/resource-manager/Microsoft.RedHatOpenShift/stable/2022-09-04/examples/List_Install_Versions.json
@@ -1,9 +1,14 @@
 {
   "parameters": {
     "api-version": "2022-09-04",
-    "subscriptionId": "subscriptionId"
+    "subscriptionId": "subscriptionId",
+    "location": "location"
   },
   "responses": {
-    "200": {}
+    "200": {
+      "body": [
+        "4.10.20"
+      ]
+    }
   }
 }
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 9529e31f1..4b350ff2c 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
@@ -641,8 +641,17 @@
         }
       }
     },
+    "InstallVersion": {
+      "description": "InstallVersion is the OpenShift installation version string.",
+      "type": "string"
+    },
     "InstallVersions": {
-      "description": "InstallVersions represents a List of OpenShift installable versions."
+      "description": "InstallVersions represents a List of OpenShift installable versions.",
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/InstallVersion"
+      },
+      "x-ms-identifiers": []
     },
     "MasterProfile": {
       "description": "MasterProfile represents a master profile.",
@@ -796,6 +805,10 @@
             "$ref": "#/definitions/IngressProfile"
           },
           "x-ms-identifiers": []
+        },
+        "installVersion": {
+          "description": "The cluster install version.",
+          "type": "string"
         }
       }
     },
@@ -812,10 +825,6 @@
           "description": "The cluster properties.",
           "x-ms-client-flatten": true
         },
-        "installVersion": {
-          "description": "The cluster install version.",
-          "type": "string"
-        },
         "systemData": {
           "$ref": "../../../../../common-types/resource-management/v3/types.json#/definitions/systemData",
           "description": "The system meta data relating to this resource.",


Test patch:
diff --git a/pkg/frontend/installversions_list_test.go b/pkg/frontend/installversions_list_test.go
index f8e7a0ea3..4c1de28a8 100644
--- a/pkg/frontend/installversions_list_test.go
+++ b/pkg/frontend/installversions_list_test.go
@@ -42,7 +42,7 @@ func TestListInstallVersions(t *testing.T) {
 			mocks:                   func(t *test, mka *mock_adminactions.MockKubeActions) {},
 			wantStatusCode:          http.StatusOK,
 			wantResponseContentType: "application/json",
-			wantResponse:            &v20220904.InstallVersions{version.InstallStream.Version.String()},
+			wantResponse:            &v20220904.InstallVersions{(v20220904.InstallVersion)(version.InstallStream.Version.String())},
 		},
 	} {
 		t.Run(fmt.Sprintf("%s: %s", method, tt.name), func(t *testing.T) {
diff --git a/test/e2e/setup.go b/test/e2e/setup.go
index 4fd59106a..51d78bed7 100644
--- a/test/e2e/setup.go
+++ b/test/e2e/setup.go
@@ -32,6 +32,7 @@ import (
 	redhatopenshift20200430 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2020-04-30/redhatopenshift"
 	redhatopenshift20210901preview "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2021-09-01-preview/redhatopenshift"
 	redhatopenshift20220401 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2022-04-01/redhatopenshift"
+	redhatopenshift20220904 "github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift/2022-09-04/redhatopenshift"
 	"github.com/Azure/ARO-RP/pkg/util/cluster"
 	"github.com/Azure/ARO-RP/test/util/kubeadminkubeconfig"
 )
@@ -43,6 +44,8 @@ type clientSet struct {
 	Operationsv20210901preview        redhatopenshift20210901preview.OperationsClient
 	OpenshiftClustersv20220401        redhatopenshift20220401.OpenShiftClustersClient
 	Operationsv20220401               redhatopenshift20220401.OperationsClient
+	OpenshiftClustersv20220904        redhatopenshift20220904.OpenShiftClustersClient
+	Operationsv20220904               redhatopenshift20220904.OperationsClient
 
 	VirtualMachines       compute.VirtualMachinesClient
 	Resources             features.ResourcesClient