diff --git a/linter_exclusions.yml b/linter_exclusions.yml index 723306f2dbd..8e2a7cf6f60 100644 --- a/linter_exclusions.yml +++ b/linter_exclusions.yml @@ -804,6 +804,21 @@ aro create: enable_preconfigured_nsg: rule_exclusions: - option_length_too_long +aro hcp cluster create: + parameters: + managed_resource_group_name: + rule_exclusions: + - parameter_should_not_end_in_resource_group +aro identity create-required: + parameters: + vnet_resource_group_name: + rule_exclusions: + - parameter_should_not_end_in_resource_group +aro identity get-required: + parameters: + vnet_resource_group_name: + rule_exclusions: + - parameter_should_not_end_in_resource_group aro validate: parameters: cluster_resource_group: diff --git a/src/azure-cli-core/azure/cli/core/helpIndex.latest.json b/src/azure-cli-core/azure/cli/core/helpIndex.latest.json index cc17eca7cb4..38be3ee1203 100644 --- a/src/azure-cli-core/azure/cli/core/helpIndex.latest.json +++ b/src/azure-cli-core/azure/cli/core/helpIndex.latest.json @@ -40,7 +40,7 @@ "tags": "" }, "aro": { - "summary": "Manage Azure Red Hat OpenShift clusters.", + "summary": "Manage Azure Red Hat OpenShift resource types.", "tags": "" }, "backup": { diff --git a/src/azure-cli/azure/cli/command_modules/aro/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/__init__.py index 35c06a0a781..8a6f10eedec 100644 --- a/src/azure-cli/azure/cli/command_modules/aro/__init__.py +++ b/src/azure-cli/azure/cli/command_modules/aro/__init__.py @@ -13,6 +13,9 @@ from azure.cli.core.commands import CliCommandType from azure.cli.core.aaz import load_aaz_command_table from . import aaz +from .azext_aro_hcp._help import helps as _helps # pylint: disable=unused-import +from .azext_aro_hcp._params import load_arguments as load_hcp_arguments +from .azext_aro_hcp.commands import load_command_table as load_hcp_command_table class AroCommandsLoader(AzCommandsLoader): @@ -34,10 +37,12 @@ def load_command_table(self, args): args=args ) load_command_table(self, args) + load_hcp_command_table(self, args) return self.command_table def load_arguments(self, command): load_arguments(self, command) + load_hcp_arguments(self, command) COMMAND_LOADER_CLS = AroCommandsLoader diff --git a/src/azure-cli/azure/cli/command_modules/aro/_help.py b/src/azure-cli/azure/cli/command_modules/aro/_help.py index adafaff0421..54370fcaf2c 100644 --- a/src/azure-cli/azure/cli/command_modules/aro/_help.py +++ b/src/azure-cli/azure/cli/command_modules/aro/_help.py @@ -8,12 +8,12 @@ helps['aro'] = """ type: group - short-summary: Manage Azure Red Hat OpenShift clusters. + short-summary: Manage Azure Red Hat OpenShift Standard clusters. """ helps['aro create'] = """ type: command - short-summary: Create a cluster. + short-summary: Create an Azure Red Hat OpenShift Standard cluster. examples: - name: Create a cluster. text: az aro create --resource-group MyResourceGroup --name MyCluster --vnet MyVnet --master-subnet MyMasterSubnet --worker-subnet MyWorkerSubnet @@ -27,7 +27,7 @@ helps['aro validate'] = """ type: command - short-summary: Validate permissions required to create a cluster. + short-summary: Validate permissions required to create an Azure Red Hat OpenShift Standard cluster. examples: - name: Validate permissions. text: az aro validate --resource-group MyGroup --name MyName --vnet MyVnet --master-subnet MyMasterSubnet --worker-subnet MyWorkerSubnet @@ -37,7 +37,7 @@ helps['aro list'] = """ type: command - short-summary: List clusters. + short-summary: List Azure Red Hat OpenShift Standard clusters. examples: - name: List clusters. text: az aro list @@ -47,7 +47,7 @@ helps['aro get-versions'] = """ type: command - short-summary: List versions available for installation. + short-summary: List versions available for installation for Azure Red Hat OpenShift Standard clusters. examples: - name: List install versions available for the East US region. text: az aro get-versions --location eastus @@ -57,7 +57,7 @@ helps['aro delete'] = """ type: command - short-summary: Delete a cluster. + short-summary: Delete an Azure Red Hat OpenShift Standard cluster. examples: - name: Delete a cluster. text: az aro delete --name MyCluster --resource-group MyResourceGroup @@ -65,7 +65,7 @@ helps['aro show'] = """ type: command - short-summary: Get the details of a cluster. + short-summary: Get the details of an Azure Red Hat OpenShift Standard cluster. examples: - name: Get the details of a cluster. text: az aro show --name MyCluster --resource-group MyResourceGroup @@ -73,7 +73,7 @@ helps['aro update'] = """ type: command - short-summary: Update a cluster. + short-summary: Update an Azure Red Hat OpenShift Standard cluster. examples: - name: Update a cluster. text: az aro update --name MyCluster --resource-group MyResourceGroup @@ -81,7 +81,7 @@ helps['aro list-credentials'] = """ type: command - short-summary: List credentials of a cluster. + short-summary: List credentials of an Azure Red Hat OpenShift Standard cluster. examples: - name: List credentials of a cluster. text: az aro list-credentials --name MyCluster --resource-group MyResourceGroup @@ -89,7 +89,7 @@ helps['aro get-admin-kubeconfig'] = """ type: command - short-summary: List admin kubeconfig of a cluster. + short-summary: List admin kubeconfig of an Azure Red Hat OpenShift Standard cluster. examples: - name: List admin kubeconfig of a cluster. The default is to save it in a file named "kubeconfig". text: az aro get-admin-kubeconfig --name MyCluster --resource-group MyResourceGroup @@ -97,23 +97,23 @@ helps['aro wait'] = """ type: command - short-summary: Wait for a cluster to reach a desired state. + short-summary: Wait for an Azure Red Hat OpenShift Standard cluster to reach a desired state. long-summary: If an operation on a cluster was interrupted or was started with `--no-wait`, use this command to wait for it to complete. """ helps['aro identity'] = """ type: group - short-summary: Manage identities related to Azure Red Hat OpenShift clusters. + short-summary: Manage identities related to Azure Red Hat OpenShift Standard clusters. """ helps['aro identity get-required'] = """ type: command short-summary: Get required identities - long-summary: Get required identities for creating a cluster with managed identities. + long-summary: Get required identities for creating an Azure Red Hat OpenShift Standard cluster with managed identities. """ helps['aro identity create-required'] = """ type: command short-summary: Create required identities - long-summary: Create required identities to prepare for creating a cluster with managed identities. + long-summary: Create required identities to prepare for creating an Azure Red Hat OpenShift Standard cluster with managed identities. """ diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/__cmd_group.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/__cmd_group.py new file mode 100644 index 00000000000..fe7d9d1cc04 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "aro", +) +class __CMDGroup(AAZCommandGroup): + """Manage Azure Red Hat OpenShift resource types + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/__init__.py new file mode 100644 index 00000000000..5a9d61963d6 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/__init__.py @@ -0,0 +1,11 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/__cmd_group.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/__cmd_group.py new file mode 100644 index 00000000000..d10c7c9844b --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "aro hcp", +) +class __CMDGroup(AAZCommandGroup): + """Manage Azure Red Hat OpenShift with hosted control plane resource types + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/__init__.py new file mode 100644 index 00000000000..dfe9c49067d --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/__init__.py @@ -0,0 +1,12 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._get_versions import * diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/_get_versions.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/_get_versions.py new file mode 100644 index 00000000000..82a156381fe --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/_get_versions.py @@ -0,0 +1,214 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp get-versions", +) +class GetVersions(AAZCommand): + """List Azure Red Hat OpenShift with hosted control plane versions + + :example: List available OpenShift versions in a location + az aro hcp get-versions --location eastus + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/providers/microsoft.redhatopenshift/locations/{}/hcpopenshiftversions", "2026-10-01"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.location = AAZResourceLocationArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.HcpOpenShiftVersionsList(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class HcpOpenShiftVersionsList(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/providers/Microsoft.RedHatOpenShift/locations/{location}/hcpOpenShiftVersions", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "location", self.ctx.args.location, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.channel_group = AAZStrType( + serialized_name="channelGroup", + flags={"required": True}, + ) + properties.enabled = AAZBoolType( + flags={"required": True}, + ) + properties.end_of_life_timestamp = AAZStrType( + serialized_name="endOfLifeTimestamp", + flags={"required": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _GetVersionsHelper: + """Helper class for GetVersions""" + + +__all__ = ["GetVersions"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/__cmd_group.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/__cmd_group.py new file mode 100644 index 00000000000..21127b9971a --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "aro hcp cluster", +) +class __CMDGroup(AAZCommandGroup): + """Manage Azure Red Hat OpenShift with hosted control plane clusters + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/__init__.py new file mode 100644 index 00000000000..86cad61cac0 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/__init__.py @@ -0,0 +1,19 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._create import * +from ._delete import * +from ._list import * +from ._request_credential import * +from ._revoke_credential import * +from ._show import * +from ._update import * +from ._wait import * diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_create.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_create.py new file mode 100644 index 00000000000..136c7124831 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_create.py @@ -0,0 +1,1047 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster create", +) +class Create(AAZCommand): + """Create an Azure Red Hat OpenShift with hosted control plane cluster + + :example: Create a cluster + az aro hcp cluster create --resource-group MyResourceGroup --name MyCluster --location eastus --version 4.19.0 --channel-group stable --network-type OVNKubernetes --managed-resource-group-name MyManagedRG --subnet-id --mi-user-assigned --service-managed-identity --control-plane-operators "{cluster-api-azure:}" --data-plane-operators "{cloud-network-config:}" + + :example: Create a cluster with customer-managed ETCD encryption + az aro hcp cluster create --resource-group MyResourceGroup --name MyCluster --location eastus --version 4.19.0 --channel-group stable --network-type OVNKubernetes --subnet-id --etcd-encryption-type KMS --key-management-mode CustomerManaged --kms-vault-name MyKeyVault --kms-active-key "{name:MyKey,version:}" --mi-user-assigned --service-managed-identity --control-plane-operators "{cluster-api-azure:}" --data-plane-operators "{cloud-network-config:}" + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + + # define Arg Group "API" + + _args_schema = cls._args_schema + _args_schema.authorized_cidrs = AAZListArg( + options=["--authorized-cidrs"], + arg_group="API", + help="The list of authorized IPv4 CIDR blocks allowed to access the API server. Maximum 500 entries.", + fmt=AAZListArgFormat( + max_length=500, + ), + ) + _args_schema.api_visibility = AAZStrArg( + options=["--api-visibility"], + arg_group="API", + help="The internet visibility of the OpenShift API server", + default="Public", + enum={"Private": "Private", "Public": "Public"}, + ) + + authorized_cidrs = cls._args_schema.authorized_cidrs + authorized_cidrs.Element = AAZStrArg() + + # define Arg Group "Autoscaling" + + _args_schema = cls._args_schema + _args_schema.max_node_provision_time = AAZIntArg( + options=["--node-provision-time", "--max-node-provision-time"], + arg_group="Autoscaling", + help="maxNodeProvisionTimeSeconds is the maximum time to wait for node provisioning before considering the provisioning to be unsuccessful. The default is 900 seconds, or 15 minutes.", + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.max_nodes_total = AAZIntArg( + options=["--max-nodes-total"], + arg_group="Autoscaling", + help="maxNodesTotal is the maximum allowable number of nodes. The autoscaler will not grow the cluster beyond this number. If omitted, the autoscaler will not have a maximum limit.", + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.max_pod_grace_period = AAZIntArg( + options=["--max-pod-grace-period"], + arg_group="Autoscaling", + help="maxPodGracePeriodSeconds is the maximum amount of time in seconds to wait for graceful pod termination before scaling down a NodePool.", + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.pod_priority_threshold = AAZIntArg( + options=["--pod-priority-threshold"], + arg_group="Autoscaling", + help="podPriorityThreshold enables users to schedule \"best-effort\" pods, which shouldn't trigger autoscaler actions, but only run when there are spare resources available. The default is -10. See the following for more details: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-does-cluster-autoscaler-work-with-pod-priority-and-preemption", + ) + + # define Arg Group "ClusterImageRegistry" + + _args_schema = cls._args_schema + _args_schema.image_registry_state = AAZStrArg( + options=["--image-registry-state"], + arg_group="ClusterImageRegistry", + help="state indicates the desired ImageStream-backed cluster image registry installation mode. This can only be set during cluster creation and cannot be changed after cluster creation. Enabled means the ImageStream-backed image registry will be run as pods on worker nodes in the cluster. Disabled means the ImageStream-backed image registry will not be present in the cluster. The default is Enabled.", + default="Enabled", + enum={"Disabled": "Disabled", "Enabled": "Enabled"}, + ) + + # define Arg Group "DNS" + + _args_schema = cls._args_schema + _args_schema.base_domain_prefix = AAZStrArg( + options=["--base-domain-prefix"], + arg_group="DNS", + help="BaseDomainPrefix is the base domain prefix for the cluster ingress. It will be used to configure ingress in the cluster through the subdomain \"BaseDomainPrefix.BaseDomain\".", + fmt=AAZStrArgFormat( + pattern="^[a-z]([-a-z0-9]*[a-z0-9])?$", + max_length=15, + ), + ) + + # define Arg Group "Etcd Encryption" + + _args_schema = cls._args_schema + _args_schema.etcd_encryption_type = AAZStrArg( + options=["--etcd-encryption-type"], + arg_group="Etcd Encryption", + help="The encryption type used. By default, \"KMS\" is used.", + default="KMS", + enum={"KMS": "KMS"}, + ) + _args_schema.kms_active_key = AAZObjectArg( + options=["--kms-active-key"], + arg_group="Etcd Encryption", + help="The details of the active key.", + ) + _args_schema.key_vault_type = AAZStrArg( + options=["--key-vault-type"], + arg_group="Etcd Encryption", + help="The type of keyvault used for KMS encryption. Defaults to KeyVault when absent.", + default="KeyVault", + enum={"KeyVault": "KeyVault", "ManagedHSM": "ManagedHSM"}, + ) + _args_schema.kms_vault_name = AAZStrArg( + options=["--kms-vault-name"], + arg_group="Etcd Encryption", + help="vaultName is the name of the keyvault that contains the secret.", + fmt=AAZStrArgFormat( + max_length=255, + min_length=1, + ), + ) + _args_schema.vault_visibility = AAZStrArg( + options=["--vault-visibility"], + arg_group="Etcd Encryption", + help="visibility of the keyvault that contains the secret.", + enum={"Private": "Private", "Public": "Public"}, + ) + _args_schema.key_management_mode = AAZStrArg( + options=["--key-management-mode"], + arg_group="Etcd Encryption", + help="Specify the key management strategy used for the encryption key that encrypts the ETCD data.", + default="PlatformManaged", + enum={"CustomerManaged": "CustomerManaged"}, + ) + + kms_active_key = cls._args_schema.kms_active_key + kms_active_key.name = AAZStrArg( + options=["name"], + help="name is the name of the keyvault key used for encryption/decryption.", + required=True, + fmt=AAZStrArgFormat( + max_length=255, + min_length=1, + ), + ) + kms_active_key.version = AAZStrArg( + options=["version"], + help="version contains the version of the key to use.", + required=True, + fmt=AAZStrArgFormat( + max_length=255, + min_length=1, + ), + ) + + # define Arg Group "Identity" + + _args_schema = cls._args_schema + _args_schema.user_assigned_identities = AAZDictArg( + options=["--uami", "--user-assigned-identities"], + arg_group="Identity", + help="The identities assigned to this resource by the user.", + ) + _args_schema.container_registry_managed_identity = AAZResourceIdArg( + options=["--container-registry-mi", "--container-registry-managed-identity"], + arg_group="Identity", + help="The user-assigned managed identity used for container registry image pulls.", + ) + + user_assigned_identities = cls._args_schema.user_assigned_identities + user_assigned_identities.Element = AAZObjectArg( + nullable=True, + blank={}, + ) + + # define Arg Group "Ingress" + + _args_schema = cls._args_schema + _args_schema.ingress_visibility = AAZStrArg( + options=["--ingress-visibility"], + arg_group="Ingress", + help="The visibility of the default OpenShift ingress controller", + default="Public", + enum={"Disabled": "Disabled", "Private": "Private", "Public": "Public"}, + ) + + # define Arg Group "Network" + + _args_schema = cls._args_schema + _args_schema.host_prefix = AAZIntArg( + options=["--host-prefix"], + arg_group="Network", + help="Network host prefix", + default=23, + ) + _args_schema.machine_cidr = AAZStrArg( + options=["--machine-cidr"], + arg_group="Network", + help="The CIDR block from which to assign machine IP addresses", + default="10.0.0.0/16", + ) + _args_schema.network_type = AAZStrArg( + options=["--network-type"], + arg_group="Network", + help="The main controller responsible for rendering the core networking components", + default="OVNKubernetes", + enum={"OVNKubernetes": "OVNKubernetes", "Other": "Other"}, + ) + _args_schema.pod_cidr = AAZStrArg( + options=["--pod-cidr"], + arg_group="Network", + help="The CIDR of the pod IP addresses", + default="10.128.0.0/14", + ) + _args_schema.service_cidr = AAZStrArg( + options=["--service-cidr"], + arg_group="Network", + help="The CIDR block for assigned service IPs", + default="172.30.0.0/16", + ) + + # define Arg Group "Platform" + + _args_schema = cls._args_schema + _args_schema.managed_resource_group_name = AAZStrArg( + options=["--managed-rg-name", "--managed-resource-group-name"], + arg_group="Platform", + help="The name of the resource group to put cluster resources in. If not specified then a unique name is generated from the following pattern \"aro-hcp-\" + clusterName + \"-\" + UUID where clusterName means the hcpOpenShiftClusters resource name (up to 45 characters) followed by a 16-byte universally unique identifier per RFC 4122.", + ) + _args_schema.nsg = AAZResourceIdArg( + options=["--nsg"], + arg_group="Platform", + help="ResourceId for the NSG (network security group) attached to the cluster subnet Note that NSGs cannot be reused for other ARO-HCP clusters.", + ) + _args_schema.operators_authentication = AAZObjectArg( + options=["--operators-auth", "--operators-authentication"], + arg_group="Platform", + help="The configuration that the operators of the cluster have to authenticate to Azure", + ) + _args_schema.outbound_type = AAZStrArg( + options=["--outbound-type"], + arg_group="Platform", + help="The core outgoing configuration", + default="LoadBalancer", + enum={"LoadBalancer": "LoadBalancer"}, + ) + _args_schema.subnet_id = AAZResourceIdArg( + options=["--subnet-id"], + arg_group="Platform", + help="The Azure resource ID of the worker subnet. Note that a subnet cannot be reused between ARO-HCP Clusters.", + ) + _args_schema.vnet_integration_subnet_id = AAZResourceIdArg( + options=["--vnet-int-subnet-id", "--vnet-integration-subnet-id"], + arg_group="Platform", + help="The Azure resource ID of a subnet that enables direct, private network connectivity between the hosted control plane and your cluster's nodes. This subnet must be dedicated to ARO HCP and cannot be shared with the cluster subnet or any node pool subnets.", + ) + + operators_authentication = cls._args_schema.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectArg( + options=["user-assigned-identities"], + help="Represents the information related to Azure User-Assigned managed identities needed to perform Operators authentication based on Azure User-Assigned Managed Identities", + required=True, + ) + + user_assigned_identities = cls._args_schema.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictArg( + options=["control-plane-operators"], + help="The set of Azure User-Assigned Managed Identities leveraged for the Control Plane operators of the cluster. The set of required managed identities is dependent on the Cluster's OpenShift version.", + required=True, + ) + user_assigned_identities.data_plane_operators = AAZDictArg( + options=["data-plane-operators"], + help="The set of Azure User-Assigned Managed Identities leveraged for the Data Plane operators of the cluster. The set of required managed identities is dependent on the Cluster's OpenShift version.", + required=True, + ) + user_assigned_identities.service_managed_identity = AAZResourceIdArg( + options=["service-managed-identity"], + help="Represents the information associated to an Azure User-Assigned Managed Identity whose purpose is to perform service level actions.", + required=True, + ) + + control_plane_operators = cls._args_schema.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZResourceIdArg() + + data_plane_operators = cls._args_schema.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZResourceIdArg() + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.crypto_restrictions = AAZStrArg( + options=["--crypto-restrictions"], + arg_group="Properties", + help="Cryptographic restrictions for kernel and userspace libraries", + default="None", + enum={"FIPS": "FIPS", "None": "None"}, + ) + _args_schema.image_digest_mirrors = AAZListArg( + options=["--image-digest-mirrors"], + arg_group="Properties", + help="imageDigestMirrors is a set of rules to allow pulling images from a mirrored registry by using digest specifications. WARNING: Updating this array will redeploy all node pools in the cluster.", + fmt=AAZListArgFormat( + max_length=240, + ), + ) + _args_schema.node_drain_timeout = AAZIntArg( + options=["--node-drain-timeout"], + arg_group="Properties", + help={"short-summary": "nodeDrainTimeoutMinutes is the grace period for how long Pod Disruption Budget-protected workloads will be respected during any node draining operation. After this grace period, any workloads protected by Pod Disruption Budgets that have not been successfully drained from a node will be forcibly evicted. This is especially relevant to cluster upgrades. Valid values are in minutes and from 0 to 10080 minutes (1 week). 0 means that the MachinePool can be drained without any time limitation. This value is used as a default for all NodePools. It can be overridden by specifying nodeDrainTimeoutMinutes for a given NodePool", "long-summary": "Valid values are from 0 to 10080 minutes (1 week). 0 means that the NodePool can be drained without any time limitation. If unset the cluster value is used as a default."}, + fmt=AAZIntArgFormat( + maximum=10080, + minimum=0, + ), + ) + + image_digest_mirrors = cls._args_schema.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectArg() + + _element = cls._args_schema.image_digest_mirrors.Element + _element.mirrors = AAZListArg( + options=["mirrors"], + help="mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their digests. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec. Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. mirrors uses one of the following formats: * host[:port] * host[:port]/namespace[/namespace...] * host[:port]/namespace[/namespace...]/repo for more information about the format, see: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + required=True, + fmt=AAZListArgFormat( + max_length=255, + min_length=1, + ), + ) + _element.source = AAZStrArg( + options=["source"], + help="source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname, e.g. docker.io, quay.io, or registry.redhat.io, will match the image pull specification of the corresponding registry. source uses one of the following formats: * host[:port] * host[:port]/namespace[/namespace...] * host[:port]/namespace[/namespace...]/repo * [*.]host for more information about the format, see: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + required=True, + fmt=AAZStrArgFormat( + max_length=255, + ), + ) + + mirrors = cls._args_schema.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrArg( + fmt=AAZStrArgFormat( + max_length=255, + ), + ) + + # define Arg Group "Resource" + + _args_schema = cls._args_schema + _args_schema.location = AAZResourceLocationArg( + arg_group="Resource", + help="The geo-location where the resource lives", + required=True, + fmt=AAZResourceLocationArgFormat( + resource_group_arg="resource_group", + ), + ) + _args_schema.tags = AAZDictArg( + options=["--tags"], + arg_group="Resource", + help="Resource tags.", + ) + + tags = cls._args_schema.tags + tags.Element = AAZStrArg() + + # define Arg Group "Version" + + _args_schema = cls._args_schema + _args_schema.channel_group = AAZStrArg( + options=["--channel-group"], + arg_group="Version", + help="ChannelGroup is the name of the set to which this version belongs. Each version belongs to only a single set. If not specified, the default value is 'stable'.", + ) + _args_schema.version = AAZStrArg( + options=["--version"], + arg_group="Version", + help="The desired X.Y version of the cluster control plane.", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.HcpOpenShiftClustersCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class HcpOpenShiftClustersCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("location", AAZStrType, ".location", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("properties", AAZObjectType) + _builder.set_prop("tags", AAZDictType, ".tags") + + identity = _builder.get(".identity") + if identity is not None: + identity.set_prop("userAssignedIdentities", AAZDictType, ".user_assigned_identities") + + user_assigned_identities = _builder.get(".identity.userAssignedIdentities") + if user_assigned_identities is not None: + user_assigned_identities.set_elements(AAZObjectType, ".", typ_kwargs={"nullable": True}) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("api", AAZObjectType) + properties.set_prop("autoscaling", AAZObjectType) + properties.set_prop("clusterImageRegistry", AAZObjectType) + properties.set_prop("cryptoRestrictions", AAZStrType, ".crypto_restrictions") + properties.set_prop("dns", AAZObjectType) + properties.set_prop("etcd", AAZObjectType) + properties.set_prop("imageDigestMirrors", AAZListType, ".image_digest_mirrors") + properties.set_prop("ingress", AAZObjectType) + properties.set_prop("network", AAZObjectType) + properties.set_prop("nodeDrainTimeoutMinutes", AAZIntType, ".node_drain_timeout") + properties.set_prop("platform", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("version", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + + api = _builder.get(".properties.api") + if api is not None: + api.set_prop("authorizedCidrs", AAZListType, ".authorized_cidrs") + api.set_prop("visibility", AAZStrType, ".api_visibility") + + authorized_cidrs = _builder.get(".properties.api.authorizedCidrs") + if authorized_cidrs is not None: + authorized_cidrs.set_elements(AAZStrType, ".") + + autoscaling = _builder.get(".properties.autoscaling") + if autoscaling is not None: + autoscaling.set_prop("maxNodeProvisionTimeSeconds", AAZIntType, ".max_node_provision_time") + autoscaling.set_prop("maxNodesTotal", AAZIntType, ".max_nodes_total") + autoscaling.set_prop("maxPodGracePeriodSeconds", AAZIntType, ".max_pod_grace_period") + autoscaling.set_prop("podPriorityThreshold", AAZIntType, ".pod_priority_threshold") + + cluster_image_registry = _builder.get(".properties.clusterImageRegistry") + if cluster_image_registry is not None: + cluster_image_registry.set_prop("state", AAZStrType, ".image_registry_state") + + dns = _builder.get(".properties.dns") + if dns is not None: + dns.set_prop("baseDomainPrefix", AAZStrType, ".base_domain_prefix") + + etcd = _builder.get(".properties.etcd") + if etcd is not None: + etcd.set_prop("dataEncryption", AAZObjectType) + + data_encryption = _builder.get(".properties.etcd.dataEncryption") + if data_encryption is not None: + data_encryption.set_prop("customerManaged", AAZObjectType) + data_encryption.set_prop("keyManagementMode", AAZStrType, ".key_management_mode", typ_kwargs={"flags": {"required": True}}) + + customer_managed = _builder.get(".properties.etcd.dataEncryption.customerManaged") + if customer_managed is not None: + customer_managed.set_prop("encryptionType", AAZStrType, ".etcd_encryption_type") + customer_managed.set_prop("kms", AAZObjectType) + + kms = _builder.get(".properties.etcd.dataEncryption.customerManaged.kms") + if kms is not None: + kms.set_prop("activeKey", AAZObjectType, ".kms_active_key", typ_kwargs={"flags": {"required": True}}) + kms.set_prop("keyVaultType", AAZStrType, ".key_vault_type") + kms.set_prop("vaultName", AAZStrType, ".kms_vault_name", typ_kwargs={"flags": {"required": True}}) + kms.set_prop("visibility", AAZStrType, ".vault_visibility", typ_kwargs={"flags": {"required": True}}) + + active_key = _builder.get(".properties.etcd.dataEncryption.customerManaged.kms.activeKey") + if active_key is not None: + active_key.set_prop("name", AAZStrType, ".name", typ_kwargs={"flags": {"required": True}}) + active_key.set_prop("version", AAZStrType, ".version", typ_kwargs={"flags": {"required": True}}) + + image_digest_mirrors = _builder.get(".properties.imageDigestMirrors") + if image_digest_mirrors is not None: + image_digest_mirrors.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.imageDigestMirrors[]") + if _elements is not None: + _elements.set_prop("mirrors", AAZListType, ".mirrors", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("source", AAZStrType, ".source", typ_kwargs={"flags": {"required": True}}) + + mirrors = _builder.get(".properties.imageDigestMirrors[].mirrors") + if mirrors is not None: + mirrors.set_elements(AAZStrType, ".") + + ingress = _builder.get(".properties.ingress") + if ingress is not None: + ingress.set_prop("type", AAZStrType, ".ingress_visibility") + + network = _builder.get(".properties.network") + if network is not None: + network.set_prop("hostPrefix", AAZIntType, ".host_prefix") + network.set_prop("machineCidr", AAZStrType, ".machine_cidr") + network.set_prop("networkType", AAZStrType, ".network_type") + network.set_prop("podCidr", AAZStrType, ".pod_cidr") + network.set_prop("serviceCidr", AAZStrType, ".service_cidr") + + platform = _builder.get(".properties.platform") + if platform is not None: + platform.set_prop("containerRegistry", AAZObjectType) + platform.set_prop("managedResourceGroup", AAZStrType, ".managed_resource_group_name") + platform.set_prop("networkSecurityGroupId", AAZStrType, ".nsg", typ_kwargs={"flags": {"required": True}}) + platform.set_prop("operatorsAuthentication", AAZObjectType, ".operators_authentication", typ_kwargs={"flags": {"required": True}}) + platform.set_prop("outboundType", AAZStrType, ".outbound_type") + platform.set_prop("subnetId", AAZStrType, ".subnet_id", typ_kwargs={"flags": {"required": True}}) + platform.set_prop("vnetIntegrationSubnetId", AAZStrType, ".vnet_integration_subnet_id", typ_kwargs={"flags": {"required": True}}) + + container_registry = _builder.get(".properties.platform.containerRegistry") + if container_registry is not None: + container_registry.set_prop("managedIdentity", AAZStrType, ".container_registry_managed_identity") + + operators_authentication = _builder.get(".properties.platform.operatorsAuthentication") + if operators_authentication is not None: + operators_authentication.set_prop("userAssignedIdentities", AAZObjectType, ".user_assigned_identities", typ_kwargs={"flags": {"required": True}}) + + user_assigned_identities = _builder.get(".properties.platform.operatorsAuthentication.userAssignedIdentities") + if user_assigned_identities is not None: + user_assigned_identities.set_prop("controlPlaneOperators", AAZDictType, ".control_plane_operators", typ_kwargs={"flags": {"required": True}}) + user_assigned_identities.set_prop("dataPlaneOperators", AAZDictType, ".data_plane_operators", typ_kwargs={"flags": {"required": True}}) + user_assigned_identities.set_prop("serviceManagedIdentity", AAZStrType, ".service_managed_identity", typ_kwargs={"flags": {"required": True}}) + + control_plane_operators = _builder.get(".properties.platform.operatorsAuthentication.userAssignedIdentities.controlPlaneOperators") + if control_plane_operators is not None: + control_plane_operators.set_elements(AAZStrType, ".") + + data_plane_operators = _builder.get(".properties.platform.operatorsAuthentication.userAssignedIdentities.dataPlaneOperators") + if data_plane_operators is not None: + data_plane_operators.set_elements(AAZStrType, ".") + + version = _builder.get(".properties.version") + if version is not None: + version.set_prop("channelGroup", AAZStrType, ".channel_group") + version.set_prop("id", AAZStrType, ".version", typ_kwargs={"flags": {"required": True}}) + + tags = _builder.get(".tags") + if tags is not None: + tags.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.identity = AAZIdentityObjectType() + _schema_on_200_201.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.tags = AAZDictType() + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200_201.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200_201.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200_201.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.api = AAZObjectType() + properties.autoscaling = AAZObjectType() + properties.cluster_image_registry = AAZObjectType( + serialized_name="clusterImageRegistry", + ) + properties.console = AAZObjectType( + flags={"read_only": True}, + ) + properties.crypto_restrictions = AAZStrType( + serialized_name="cryptoRestrictions", + ) + properties.dns = AAZObjectType() + properties.etcd = AAZObjectType() + properties.image_digest_mirrors = AAZListType( + serialized_name="imageDigestMirrors", + ) + properties.ingress = AAZObjectType() + properties.network = AAZObjectType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.version = AAZObjectType( + flags={"required": True}, + ) + + api = cls._schema_on_200_201.properties.api + api.authorized_cidrs = AAZListType( + serialized_name="authorizedCidrs", + ) + api.url = AAZStrType( + flags={"read_only": True}, + ) + api.visibility = AAZStrType() + + authorized_cidrs = cls._schema_on_200_201.properties.api.authorized_cidrs + authorized_cidrs.Element = AAZStrType() + + autoscaling = cls._schema_on_200_201.properties.autoscaling + autoscaling.max_node_provision_time_seconds = AAZIntType( + serialized_name="maxNodeProvisionTimeSeconds", + ) + autoscaling.max_nodes_total = AAZIntType( + serialized_name="maxNodesTotal", + ) + autoscaling.max_pod_grace_period_seconds = AAZIntType( + serialized_name="maxPodGracePeriodSeconds", + ) + autoscaling.pod_priority_threshold = AAZIntType( + serialized_name="podPriorityThreshold", + ) + + cluster_image_registry = cls._schema_on_200_201.properties.cluster_image_registry + cluster_image_registry.state = AAZStrType() + + console = cls._schema_on_200_201.properties.console + console.url = AAZStrType( + flags={"read_only": True}, + ) + + dns = cls._schema_on_200_201.properties.dns + dns.base_domain = AAZStrType( + serialized_name="baseDomain", + flags={"read_only": True}, + ) + dns.base_domain_prefix = AAZStrType( + serialized_name="baseDomainPrefix", + ) + + etcd = cls._schema_on_200_201.properties.etcd + etcd.data_encryption = AAZObjectType( + serialized_name="dataEncryption", + ) + + data_encryption = cls._schema_on_200_201.properties.etcd.data_encryption + data_encryption.customer_managed = AAZObjectType( + serialized_name="customerManaged", + ) + data_encryption.key_management_mode = AAZStrType( + serialized_name="keyManagementMode", + flags={"required": True}, + ) + + customer_managed = cls._schema_on_200_201.properties.etcd.data_encryption.customer_managed + customer_managed.encryption_type = AAZStrType( + serialized_name="encryptionType", + ) + customer_managed.kms = AAZObjectType() + + kms = cls._schema_on_200_201.properties.etcd.data_encryption.customer_managed.kms + kms.active_key = AAZObjectType( + serialized_name="activeKey", + flags={"required": True}, + ) + kms.key_vault_type = AAZStrType( + serialized_name="keyVaultType", + ) + kms.vault_name = AAZStrType( + serialized_name="vaultName", + flags={"required": True}, + ) + kms.visibility = AAZStrType( + flags={"required": True}, + ) + + active_key = cls._schema_on_200_201.properties.etcd.data_encryption.customer_managed.kms.active_key + active_key.name = AAZStrType( + flags={"required": True}, + ) + active_key.version = AAZStrType( + flags={"required": True}, + ) + + image_digest_mirrors = cls._schema_on_200_201.properties.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.image_digest_mirrors.Element + _element.mirrors = AAZListType( + flags={"required": True}, + ) + _element.source = AAZStrType( + flags={"required": True}, + ) + + mirrors = cls._schema_on_200_201.properties.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrType() + + ingress = cls._schema_on_200_201.properties.ingress + ingress.type = AAZStrType() + + network = cls._schema_on_200_201.properties.network + network.host_prefix = AAZIntType( + serialized_name="hostPrefix", + ) + network.machine_cidr = AAZStrType( + serialized_name="machineCidr", + ) + network.network_type = AAZStrType( + serialized_name="networkType", + ) + network.pod_cidr = AAZStrType( + serialized_name="podCidr", + ) + network.service_cidr = AAZStrType( + serialized_name="serviceCidr", + ) + + platform = cls._schema_on_200_201.properties.platform + platform.container_registry = AAZObjectType( + serialized_name="containerRegistry", + ) + platform.issuer_url = AAZStrType( + serialized_name="issuerUrl", + flags={"read_only": True}, + ) + platform.managed_resource_group = AAZStrType( + serialized_name="managedResourceGroup", + ) + platform.network_security_group_id = AAZStrType( + serialized_name="networkSecurityGroupId", + flags={"required": True}, + ) + platform.operators_authentication = AAZObjectType( + serialized_name="operatorsAuthentication", + flags={"required": True}, + ) + platform.outbound_type = AAZStrType( + serialized_name="outboundType", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + flags={"required": True}, + ) + platform.vnet_integration_subnet_id = AAZStrType( + serialized_name="vnetIntegrationSubnetId", + flags={"required": True}, + ) + + container_registry = cls._schema_on_200_201.properties.platform.container_registry + container_registry.managed_identity = AAZStrType( + serialized_name="managedIdentity", + ) + + operators_authentication = cls._schema_on_200_201.properties.platform.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectType( + serialized_name="userAssignedIdentities", + flags={"required": True}, + ) + + user_assigned_identities = cls._schema_on_200_201.properties.platform.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictType( + serialized_name="controlPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.data_plane_operators = AAZDictType( + serialized_name="dataPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.service_managed_identity = AAZStrType( + serialized_name="serviceManagedIdentity", + flags={"required": True}, + ) + + control_plane_operators = cls._schema_on_200_201.properties.platform.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZStrType() + + data_plane_operators = cls._schema_on_200_201.properties.platform.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZStrType() + + status = cls._schema_on_200_201.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200_201.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200_201.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + version = cls._schema_on_200_201.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200_201.tags + tags.Element = AAZStrType() + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + +__all__ = ["Create"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_delete.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_delete.py new file mode 100644 index 00000000000..d8f0b878bfa --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_delete.py @@ -0,0 +1,166 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete an Azure Red Hat OpenShift with hosted control plane cluster + + :example: Delete a cluster + az aro hcp cluster delete --resource-group MyResourceGroup --name MyCluster --yes + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.HcpOpenShiftClustersDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class HcpOpenShiftClustersDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_list.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_list.py new file mode 100644 index 00000000000..7b6ba70176e --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_list.py @@ -0,0 +1,937 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster list", +) +class List(AAZCommand): + """List Azure Red Hat OpenShift with hosted control plane clusters + + :example: List clusters in a resource group + az aro hcp cluster list --resource-group MyResourceGroup + + :example: List clusters in the subscription + az aro hcp cluster list + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters", "2026-10-01"], + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters", "2026-10-01"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.resource_group = AAZResourceGroupNameArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + condition_0 = has_value(self.ctx.subscription_id) and has_value(self.ctx.args.resource_group) is not True + condition_1 = has_value(self.ctx.args.resource_group) and has_value(self.ctx.subscription_id) + if condition_0: + self.HcpOpenShiftClustersListBySubscription(ctx=self.ctx)() + if condition_1: + self.HcpOpenShiftClustersListByResourceGroup(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class HcpOpenShiftClustersListBySubscription(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.identity = AAZIdentityObjectType() + _element.location = AAZStrType( + flags={"required": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.tags = AAZDictType() + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.value.Element.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.value.Element.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.value.Element.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.api = AAZObjectType() + properties.autoscaling = AAZObjectType() + properties.cluster_image_registry = AAZObjectType( + serialized_name="clusterImageRegistry", + ) + properties.console = AAZObjectType( + flags={"read_only": True}, + ) + properties.crypto_restrictions = AAZStrType( + serialized_name="cryptoRestrictions", + ) + properties.dns = AAZObjectType() + properties.etcd = AAZObjectType() + properties.image_digest_mirrors = AAZListType( + serialized_name="imageDigestMirrors", + ) + properties.ingress = AAZObjectType() + properties.network = AAZObjectType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.version = AAZObjectType( + flags={"required": True}, + ) + + api = cls._schema_on_200.value.Element.properties.api + api.authorized_cidrs = AAZListType( + serialized_name="authorizedCidrs", + ) + api.url = AAZStrType( + flags={"read_only": True}, + ) + api.visibility = AAZStrType() + + authorized_cidrs = cls._schema_on_200.value.Element.properties.api.authorized_cidrs + authorized_cidrs.Element = AAZStrType() + + autoscaling = cls._schema_on_200.value.Element.properties.autoscaling + autoscaling.max_node_provision_time_seconds = AAZIntType( + serialized_name="maxNodeProvisionTimeSeconds", + ) + autoscaling.max_nodes_total = AAZIntType( + serialized_name="maxNodesTotal", + ) + autoscaling.max_pod_grace_period_seconds = AAZIntType( + serialized_name="maxPodGracePeriodSeconds", + ) + autoscaling.pod_priority_threshold = AAZIntType( + serialized_name="podPriorityThreshold", + ) + + cluster_image_registry = cls._schema_on_200.value.Element.properties.cluster_image_registry + cluster_image_registry.state = AAZStrType() + + console = cls._schema_on_200.value.Element.properties.console + console.url = AAZStrType( + flags={"read_only": True}, + ) + + dns = cls._schema_on_200.value.Element.properties.dns + dns.base_domain = AAZStrType( + serialized_name="baseDomain", + flags={"read_only": True}, + ) + dns.base_domain_prefix = AAZStrType( + serialized_name="baseDomainPrefix", + ) + + etcd = cls._schema_on_200.value.Element.properties.etcd + etcd.data_encryption = AAZObjectType( + serialized_name="dataEncryption", + ) + + data_encryption = cls._schema_on_200.value.Element.properties.etcd.data_encryption + data_encryption.customer_managed = AAZObjectType( + serialized_name="customerManaged", + ) + data_encryption.key_management_mode = AAZStrType( + serialized_name="keyManagementMode", + flags={"required": True}, + ) + + customer_managed = cls._schema_on_200.value.Element.properties.etcd.data_encryption.customer_managed + customer_managed.encryption_type = AAZStrType( + serialized_name="encryptionType", + ) + customer_managed.kms = AAZObjectType() + + kms = cls._schema_on_200.value.Element.properties.etcd.data_encryption.customer_managed.kms + kms.active_key = AAZObjectType( + serialized_name="activeKey", + flags={"required": True}, + ) + kms.key_vault_type = AAZStrType( + serialized_name="keyVaultType", + ) + kms.vault_name = AAZStrType( + serialized_name="vaultName", + flags={"required": True}, + ) + kms.visibility = AAZStrType( + flags={"required": True}, + ) + + active_key = cls._schema_on_200.value.Element.properties.etcd.data_encryption.customer_managed.kms.active_key + active_key.name = AAZStrType( + flags={"required": True}, + ) + active_key.version = AAZStrType( + flags={"required": True}, + ) + + image_digest_mirrors = cls._schema_on_200.value.Element.properties.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.image_digest_mirrors.Element + _element.mirrors = AAZListType( + flags={"required": True}, + ) + _element.source = AAZStrType( + flags={"required": True}, + ) + + mirrors = cls._schema_on_200.value.Element.properties.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrType() + + ingress = cls._schema_on_200.value.Element.properties.ingress + ingress.type = AAZStrType() + + network = cls._schema_on_200.value.Element.properties.network + network.host_prefix = AAZIntType( + serialized_name="hostPrefix", + ) + network.machine_cidr = AAZStrType( + serialized_name="machineCidr", + ) + network.network_type = AAZStrType( + serialized_name="networkType", + ) + network.pod_cidr = AAZStrType( + serialized_name="podCidr", + ) + network.service_cidr = AAZStrType( + serialized_name="serviceCidr", + ) + + platform = cls._schema_on_200.value.Element.properties.platform + platform.container_registry = AAZObjectType( + serialized_name="containerRegistry", + ) + platform.issuer_url = AAZStrType( + serialized_name="issuerUrl", + flags={"read_only": True}, + ) + platform.managed_resource_group = AAZStrType( + serialized_name="managedResourceGroup", + ) + platform.network_security_group_id = AAZStrType( + serialized_name="networkSecurityGroupId", + flags={"required": True}, + ) + platform.operators_authentication = AAZObjectType( + serialized_name="operatorsAuthentication", + flags={"required": True}, + ) + platform.outbound_type = AAZStrType( + serialized_name="outboundType", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + flags={"required": True}, + ) + platform.vnet_integration_subnet_id = AAZStrType( + serialized_name="vnetIntegrationSubnetId", + flags={"required": True}, + ) + + container_registry = cls._schema_on_200.value.Element.properties.platform.container_registry + container_registry.managed_identity = AAZStrType( + serialized_name="managedIdentity", + ) + + operators_authentication = cls._schema_on_200.value.Element.properties.platform.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectType( + serialized_name="userAssignedIdentities", + flags={"required": True}, + ) + + user_assigned_identities = cls._schema_on_200.value.Element.properties.platform.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictType( + serialized_name="controlPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.data_plane_operators = AAZDictType( + serialized_name="dataPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.service_managed_identity = AAZStrType( + serialized_name="serviceManagedIdentity", + flags={"required": True}, + ) + + control_plane_operators = cls._schema_on_200.value.Element.properties.platform.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZStrType() + + data_plane_operators = cls._schema_on_200.value.Element.properties.platform.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZStrType() + + status = cls._schema_on_200.value.Element.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200.value.Element.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.value.Element.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + version = cls._schema_on_200.value.Element.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.value.Element.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + class HcpOpenShiftClustersListByResourceGroup(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.identity = AAZIdentityObjectType() + _element.location = AAZStrType( + flags={"required": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.tags = AAZDictType() + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.value.Element.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.value.Element.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.value.Element.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.api = AAZObjectType() + properties.autoscaling = AAZObjectType() + properties.cluster_image_registry = AAZObjectType( + serialized_name="clusterImageRegistry", + ) + properties.console = AAZObjectType( + flags={"read_only": True}, + ) + properties.crypto_restrictions = AAZStrType( + serialized_name="cryptoRestrictions", + ) + properties.dns = AAZObjectType() + properties.etcd = AAZObjectType() + properties.image_digest_mirrors = AAZListType( + serialized_name="imageDigestMirrors", + ) + properties.ingress = AAZObjectType() + properties.network = AAZObjectType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.version = AAZObjectType( + flags={"required": True}, + ) + + api = cls._schema_on_200.value.Element.properties.api + api.authorized_cidrs = AAZListType( + serialized_name="authorizedCidrs", + ) + api.url = AAZStrType( + flags={"read_only": True}, + ) + api.visibility = AAZStrType() + + authorized_cidrs = cls._schema_on_200.value.Element.properties.api.authorized_cidrs + authorized_cidrs.Element = AAZStrType() + + autoscaling = cls._schema_on_200.value.Element.properties.autoscaling + autoscaling.max_node_provision_time_seconds = AAZIntType( + serialized_name="maxNodeProvisionTimeSeconds", + ) + autoscaling.max_nodes_total = AAZIntType( + serialized_name="maxNodesTotal", + ) + autoscaling.max_pod_grace_period_seconds = AAZIntType( + serialized_name="maxPodGracePeriodSeconds", + ) + autoscaling.pod_priority_threshold = AAZIntType( + serialized_name="podPriorityThreshold", + ) + + cluster_image_registry = cls._schema_on_200.value.Element.properties.cluster_image_registry + cluster_image_registry.state = AAZStrType() + + console = cls._schema_on_200.value.Element.properties.console + console.url = AAZStrType( + flags={"read_only": True}, + ) + + dns = cls._schema_on_200.value.Element.properties.dns + dns.base_domain = AAZStrType( + serialized_name="baseDomain", + flags={"read_only": True}, + ) + dns.base_domain_prefix = AAZStrType( + serialized_name="baseDomainPrefix", + ) + + etcd = cls._schema_on_200.value.Element.properties.etcd + etcd.data_encryption = AAZObjectType( + serialized_name="dataEncryption", + ) + + data_encryption = cls._schema_on_200.value.Element.properties.etcd.data_encryption + data_encryption.customer_managed = AAZObjectType( + serialized_name="customerManaged", + ) + data_encryption.key_management_mode = AAZStrType( + serialized_name="keyManagementMode", + flags={"required": True}, + ) + + customer_managed = cls._schema_on_200.value.Element.properties.etcd.data_encryption.customer_managed + customer_managed.encryption_type = AAZStrType( + serialized_name="encryptionType", + ) + customer_managed.kms = AAZObjectType() + + kms = cls._schema_on_200.value.Element.properties.etcd.data_encryption.customer_managed.kms + kms.active_key = AAZObjectType( + serialized_name="activeKey", + flags={"required": True}, + ) + kms.key_vault_type = AAZStrType( + serialized_name="keyVaultType", + ) + kms.vault_name = AAZStrType( + serialized_name="vaultName", + flags={"required": True}, + ) + kms.visibility = AAZStrType( + flags={"required": True}, + ) + + active_key = cls._schema_on_200.value.Element.properties.etcd.data_encryption.customer_managed.kms.active_key + active_key.name = AAZStrType( + flags={"required": True}, + ) + active_key.version = AAZStrType( + flags={"required": True}, + ) + + image_digest_mirrors = cls._schema_on_200.value.Element.properties.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.image_digest_mirrors.Element + _element.mirrors = AAZListType( + flags={"required": True}, + ) + _element.source = AAZStrType( + flags={"required": True}, + ) + + mirrors = cls._schema_on_200.value.Element.properties.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrType() + + ingress = cls._schema_on_200.value.Element.properties.ingress + ingress.type = AAZStrType() + + network = cls._schema_on_200.value.Element.properties.network + network.host_prefix = AAZIntType( + serialized_name="hostPrefix", + ) + network.machine_cidr = AAZStrType( + serialized_name="machineCidr", + ) + network.network_type = AAZStrType( + serialized_name="networkType", + ) + network.pod_cidr = AAZStrType( + serialized_name="podCidr", + ) + network.service_cidr = AAZStrType( + serialized_name="serviceCidr", + ) + + platform = cls._schema_on_200.value.Element.properties.platform + platform.container_registry = AAZObjectType( + serialized_name="containerRegistry", + ) + platform.issuer_url = AAZStrType( + serialized_name="issuerUrl", + flags={"read_only": True}, + ) + platform.managed_resource_group = AAZStrType( + serialized_name="managedResourceGroup", + ) + platform.network_security_group_id = AAZStrType( + serialized_name="networkSecurityGroupId", + flags={"required": True}, + ) + platform.operators_authentication = AAZObjectType( + serialized_name="operatorsAuthentication", + flags={"required": True}, + ) + platform.outbound_type = AAZStrType( + serialized_name="outboundType", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + flags={"required": True}, + ) + platform.vnet_integration_subnet_id = AAZStrType( + serialized_name="vnetIntegrationSubnetId", + flags={"required": True}, + ) + + container_registry = cls._schema_on_200.value.Element.properties.platform.container_registry + container_registry.managed_identity = AAZStrType( + serialized_name="managedIdentity", + ) + + operators_authentication = cls._schema_on_200.value.Element.properties.platform.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectType( + serialized_name="userAssignedIdentities", + flags={"required": True}, + ) + + user_assigned_identities = cls._schema_on_200.value.Element.properties.platform.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictType( + serialized_name="controlPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.data_plane_operators = AAZDictType( + serialized_name="dataPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.service_managed_identity = AAZStrType( + serialized_name="serviceManagedIdentity", + flags={"required": True}, + ) + + control_plane_operators = cls._schema_on_200.value.Element.properties.platform.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZStrType() + + data_plane_operators = cls._schema_on_200.value.Element.properties.platform.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZStrType() + + status = cls._schema_on_200.value.Element.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200.value.Element.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.value.Element.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + version = cls._schema_on_200.value.Element.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.value.Element.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + +__all__ = ["List"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_request_credential.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_request_credential.py new file mode 100644 index 00000000000..3d64f4d7ff3 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_request_credential.py @@ -0,0 +1,206 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster request-credential", +) +class RequestCredential(AAZCommand): + """Request a temporary credential for your Azure Red Hat OpenShift with hosted control plane cluster + + :example: Request a temporary admin credential + az aro hcp cluster request-credential --admin --resource-group MyResourceGroup --name MyCluster + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/requestadmincredential", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + + # define Arg Group "Body" + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.HcpOpenShiftClustersRequestAdminCredential(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class HcpOpenShiftClustersRequestAdminCredential(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/requestAdminCredential", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.expiration_timestamp = AAZStrType( + serialized_name="expirationTimestamp", + flags={"read_only": True}, + ) + _schema_on_200.kubeconfig = AAZStrType( + flags={"secret": True, "read_only": True}, + ) + + return cls._schema_on_200 + + +class _RequestCredentialHelper: + """Helper class for RequestCredential""" + + +__all__ = ["RequestCredential"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_revoke_credential.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_revoke_credential.py new file mode 100644 index 00000000000..52b1a049e11 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_revoke_credential.py @@ -0,0 +1,141 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster revoke-credential", +) +class RevokeCredential(AAZCommand): + """Revoke all credentials for your Azure Red Hat OpenShift with hosted control plane cluster + + :example: Revoke all admin credentials + az aro hcp cluster revoke-credential --resource-group MyResourceGroup --name MyCluster + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/revokecredentials", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.HcpOpenShiftClustersRevokeCredentials(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class HcpOpenShiftClustersRevokeCredentials(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + None, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/revokeCredentials", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + +class _RevokeCredentialHelper: + """Helper class for RevokeCredential""" + + +__all__ = ["RevokeCredential"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_show.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_show.py new file mode 100644 index 00000000000..e3bd14176be --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_show.py @@ -0,0 +1,505 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster show", +) +class Show(AAZCommand): + """Get an Azure Red Hat OpenShift with hosted control plane cluster + + :example: Show a cluster + az aro hcp cluster show --resource-group MyResourceGroup --name MyCluster + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}", "2026-10-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.HcpOpenShiftClustersGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class HcpOpenShiftClustersGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.tags = AAZDictType() + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.api = AAZObjectType() + properties.autoscaling = AAZObjectType() + properties.cluster_image_registry = AAZObjectType( + serialized_name="clusterImageRegistry", + ) + properties.console = AAZObjectType( + flags={"read_only": True}, + ) + properties.crypto_restrictions = AAZStrType( + serialized_name="cryptoRestrictions", + ) + properties.dns = AAZObjectType() + properties.etcd = AAZObjectType() + properties.image_digest_mirrors = AAZListType( + serialized_name="imageDigestMirrors", + ) + properties.ingress = AAZObjectType() + properties.network = AAZObjectType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.version = AAZObjectType( + flags={"required": True}, + ) + + api = cls._schema_on_200.properties.api + api.authorized_cidrs = AAZListType( + serialized_name="authorizedCidrs", + ) + api.url = AAZStrType( + flags={"read_only": True}, + ) + api.visibility = AAZStrType() + + authorized_cidrs = cls._schema_on_200.properties.api.authorized_cidrs + authorized_cidrs.Element = AAZStrType() + + autoscaling = cls._schema_on_200.properties.autoscaling + autoscaling.max_node_provision_time_seconds = AAZIntType( + serialized_name="maxNodeProvisionTimeSeconds", + ) + autoscaling.max_nodes_total = AAZIntType( + serialized_name="maxNodesTotal", + ) + autoscaling.max_pod_grace_period_seconds = AAZIntType( + serialized_name="maxPodGracePeriodSeconds", + ) + autoscaling.pod_priority_threshold = AAZIntType( + serialized_name="podPriorityThreshold", + ) + + cluster_image_registry = cls._schema_on_200.properties.cluster_image_registry + cluster_image_registry.state = AAZStrType() + + console = cls._schema_on_200.properties.console + console.url = AAZStrType( + flags={"read_only": True}, + ) + + dns = cls._schema_on_200.properties.dns + dns.base_domain = AAZStrType( + serialized_name="baseDomain", + flags={"read_only": True}, + ) + dns.base_domain_prefix = AAZStrType( + serialized_name="baseDomainPrefix", + ) + + etcd = cls._schema_on_200.properties.etcd + etcd.data_encryption = AAZObjectType( + serialized_name="dataEncryption", + ) + + data_encryption = cls._schema_on_200.properties.etcd.data_encryption + data_encryption.customer_managed = AAZObjectType( + serialized_name="customerManaged", + ) + data_encryption.key_management_mode = AAZStrType( + serialized_name="keyManagementMode", + flags={"required": True}, + ) + + customer_managed = cls._schema_on_200.properties.etcd.data_encryption.customer_managed + customer_managed.encryption_type = AAZStrType( + serialized_name="encryptionType", + ) + customer_managed.kms = AAZObjectType() + + kms = cls._schema_on_200.properties.etcd.data_encryption.customer_managed.kms + kms.active_key = AAZObjectType( + serialized_name="activeKey", + flags={"required": True}, + ) + kms.key_vault_type = AAZStrType( + serialized_name="keyVaultType", + ) + kms.vault_name = AAZStrType( + serialized_name="vaultName", + flags={"required": True}, + ) + kms.visibility = AAZStrType( + flags={"required": True}, + ) + + active_key = cls._schema_on_200.properties.etcd.data_encryption.customer_managed.kms.active_key + active_key.name = AAZStrType( + flags={"required": True}, + ) + active_key.version = AAZStrType( + flags={"required": True}, + ) + + image_digest_mirrors = cls._schema_on_200.properties.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.image_digest_mirrors.Element + _element.mirrors = AAZListType( + flags={"required": True}, + ) + _element.source = AAZStrType( + flags={"required": True}, + ) + + mirrors = cls._schema_on_200.properties.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrType() + + ingress = cls._schema_on_200.properties.ingress + ingress.type = AAZStrType() + + network = cls._schema_on_200.properties.network + network.host_prefix = AAZIntType( + serialized_name="hostPrefix", + ) + network.machine_cidr = AAZStrType( + serialized_name="machineCidr", + ) + network.network_type = AAZStrType( + serialized_name="networkType", + ) + network.pod_cidr = AAZStrType( + serialized_name="podCidr", + ) + network.service_cidr = AAZStrType( + serialized_name="serviceCidr", + ) + + platform = cls._schema_on_200.properties.platform + platform.container_registry = AAZObjectType( + serialized_name="containerRegistry", + ) + platform.issuer_url = AAZStrType( + serialized_name="issuerUrl", + flags={"read_only": True}, + ) + platform.managed_resource_group = AAZStrType( + serialized_name="managedResourceGroup", + ) + platform.network_security_group_id = AAZStrType( + serialized_name="networkSecurityGroupId", + flags={"required": True}, + ) + platform.operators_authentication = AAZObjectType( + serialized_name="operatorsAuthentication", + flags={"required": True}, + ) + platform.outbound_type = AAZStrType( + serialized_name="outboundType", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + flags={"required": True}, + ) + platform.vnet_integration_subnet_id = AAZStrType( + serialized_name="vnetIntegrationSubnetId", + flags={"required": True}, + ) + + container_registry = cls._schema_on_200.properties.platform.container_registry + container_registry.managed_identity = AAZStrType( + serialized_name="managedIdentity", + ) + + operators_authentication = cls._schema_on_200.properties.platform.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectType( + serialized_name="userAssignedIdentities", + flags={"required": True}, + ) + + user_assigned_identities = cls._schema_on_200.properties.platform.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictType( + serialized_name="controlPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.data_plane_operators = AAZDictType( + serialized_name="dataPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.service_managed_identity = AAZStrType( + serialized_name="serviceManagedIdentity", + flags={"required": True}, + ) + + control_plane_operators = cls._schema_on_200.properties.platform.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZStrType() + + data_plane_operators = cls._schema_on_200.properties.platform.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZStrType() + + status = cls._schema_on_200.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + version = cls._schema_on_200.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + +__all__ = ["Show"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_update.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_update.py new file mode 100644 index 00000000000..d6c26da6288 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_update.py @@ -0,0 +1,998 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster update", +) +class Update(AAZCommand): + """Update an Azure Red Hat OpenShift with hosted control plane cluster + + :example: Update cluster tags + az aro hcp cluster update --resource-group MyResourceGroup --name MyCluster --tags env=prod team=platform + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + + # define Arg Group "Api" + + _args_schema = cls._args_schema + _args_schema.authorized_cidrs = AAZListArg( + options=["--authorized-cidrs"], + arg_group="Api", + help="The list of authorized IPv4 CIDR blocks allowed to access the API server. Maximum 500 entries.", + nullable=True, + fmt=AAZListArgFormat( + max_length=500, + ), + ) + + authorized_cidrs = cls._args_schema.authorized_cidrs + authorized_cidrs.Element = AAZStrArg( + nullable=True, + ) + + # define Arg Group "Autoscaling" + + _args_schema = cls._args_schema + _args_schema.max_node_provision_time = AAZIntArg( + options=["--node-provision-time", "--max-node-provision-time"], + arg_group="Autoscaling", + help="maxNodeProvisionTimeSeconds is the maximum time to wait for node provisioning before considering the provisioning to be unsuccessful. The default is 900 seconds, or 15 minutes.", + nullable=True, + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.max_nodes_total = AAZIntArg( + options=["--max-nodes-total"], + arg_group="Autoscaling", + help="maxNodesTotal is the maximum allowable number of nodes. The autoscaler will not grow the cluster beyond this number. If omitted, the autoscaler will not have a maximum limit.", + nullable=True, + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.max_pod_grace_period = AAZIntArg( + options=["--max-pod-grace-period"], + arg_group="Autoscaling", + help="maxPodGracePeriodSeconds is the maximum amount of time in seconds to wait for graceful pod termination before scaling down a NodePool.", + nullable=True, + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.pod_priority_threshold = AAZIntArg( + options=["--pod-priority-threshold"], + arg_group="Autoscaling", + help="podPriorityThreshold enables users to schedule \"best-effort\" pods, which shouldn't trigger autoscaler actions, but only run when there are spare resources available. The default is -10. See the following for more details: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-does-cluster-autoscaler-work-with-pod-priority-and-preemption", + nullable=True, + ) + + # define Arg Group "Etcd Encryption" + + _args_schema = cls._args_schema + _args_schema.kms_active_key_version = AAZStrArg( + options=["--kms-active-key-version"], + arg_group="Etcd Encryption", + help="version contains the version of the key to use.", + fmt=AAZStrArgFormat( + max_length=255, + min_length=1, + ), + ) + + # define Arg Group "Identity" + + _args_schema = cls._args_schema + _args_schema.user_assigned_identities = AAZDictArg( + options=["--uami", "--user-assigned-identities"], + arg_group="Identity", + help="The identities assigned to this resource by the user.", + nullable=True, + ) + _args_schema.container_registry_managed_identity = AAZResourceIdArg( + options=["--container-registry-mi", "--container-registry-managed-identity"], + arg_group="Identity", + help="The user-assigned managed identity used for container registry image pulls.", + nullable=True, + ) + + user_assigned_identities = cls._args_schema.user_assigned_identities + user_assigned_identities.Element = AAZObjectArg( + nullable=True, + blank={}, + ) + + # define Arg Group "Platform" + + _args_schema = cls._args_schema + _args_schema.operators_authentication = AAZObjectArg( + options=["--operators-authentication"], + arg_group="Platform", + help="The configuration that the operators of the cluster have to authenticate to Azure", + ) + + operators_authentication = cls._args_schema.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectArg( + options=["user-assigned-identities"], + help="Represents the information related to Azure User-Assigned managed identities needed to perform Operators authentication based on Azure User-Assigned Managed Identities", + ) + + user_assigned_identities = cls._args_schema.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictArg( + options=["control-plane-operators"], + help="The set of Azure User-Assigned Managed Identities leveraged for the Control Plane operators of the cluster. The set of required managed identities is dependent on the Cluster's OpenShift version.", + ) + user_assigned_identities.data_plane_operators = AAZDictArg( + options=["data-plane-operators"], + help="The set of Azure User-Assigned Managed Identities leveraged for the Data Plane operators of the cluster. The set of required managed identities is dependent on the Cluster's OpenShift version.", + ) + user_assigned_identities.service_managed_identity = AAZResourceIdArg( + options=["service-managed-identity"], + help="Represents the information associated to an Azure User-Assigned Managed Identity whose purpose is to perform service level actions.", + ) + + control_plane_operators = cls._args_schema.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZResourceIdArg( + nullable=True, + ) + + data_plane_operators = cls._args_schema.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZResourceIdArg( + nullable=True, + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.image_digest_mirrors = AAZListArg( + options=["--image-digest-mirrors"], + arg_group="Properties", + help="imageDigestMirrors is a set of rules to allow pulling images from a mirrored registry by using digest specifications. WARNING: Updating this array will redeploy all node pools in the cluster.", + nullable=True, + fmt=AAZListArgFormat( + max_length=240, + ), + ) + _args_schema.node_drain_timeout = AAZIntArg( + options=["--node-drain-timeout"], + arg_group="Properties", + help={"short-summary": "nodeDrainTimeoutMinutes is the grace period for how long Pod Disruption Budget-protected workloads will be respected during any node draining operation. After this grace period, any workloads protected by Pod Disruption Budgets that have not been successfully drained from a node will be forcibly evicted. This is especially relevant to cluster upgrades. Valid values are in minutes and from 0 to 10080 minutes (1 week). 0 means that the MachinePool can be drained without any time limitation. This value is used as a default for all NodePools. It can be overridden by specifying nodeDrainTimeoutMinutes for a given NodePool", "long-summary": "Valid values are from 0 to 10080 minutes (1 week). 0 means that the NodePool can be drained without any time limitation. If unset the cluster value is used as a default."}, + nullable=True, + fmt=AAZIntArgFormat( + maximum=10080, + minimum=0, + ), + ) + + image_digest_mirrors = cls._args_schema.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_schema.image_digest_mirrors.Element + _element.mirrors = AAZListArg( + options=["mirrors"], + help="mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their digests. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec. Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. mirrors uses one of the following formats: * host[:port] * host[:port]/namespace[/namespace...] * host[:port]/namespace[/namespace...]/repo for more information about the format, see: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + fmt=AAZListArgFormat( + max_length=255, + min_length=1, + ), + ) + _element.source = AAZStrArg( + options=["source"], + help="source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname, e.g. docker.io, quay.io, or registry.redhat.io, will match the image pull specification of the corresponding registry. source uses one of the following formats: * host[:port] * host[:port]/namespace[/namespace...] * host[:port]/namespace[/namespace...]/repo * [*.]host for more information about the format, see: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + fmt=AAZStrArgFormat( + max_length=255, + ), + ) + + mirrors = cls._args_schema.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrArg( + nullable=True, + fmt=AAZStrArgFormat( + max_length=255, + ), + ) + + # define Arg Group "Resource" + + _args_schema = cls._args_schema + _args_schema.tags = AAZDictArg( + options=["--tags"], + arg_group="Resource", + help="Resource tags.", + nullable=True, + ) + + tags = cls._args_schema.tags + tags.Element = AAZStrArg( + nullable=True, + ) + + # define Arg Group "Version" + + _args_schema = cls._args_schema + _args_schema.channel_group = AAZStrArg( + options=["--channel-group"], + arg_group="Version", + help="ChannelGroup is the name of the set to which this version belongs. Each version belongs to only a single set. If not specified, the default value is 'stable'.", + nullable=True, + ) + _args_schema.version = AAZStrArg( + options=["--version"], + arg_group="Version", + help="ID is the desired X.Y version of the cluster control plane.", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.HcpOpenShiftClustersGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.HcpOpenShiftClustersCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class HcpOpenShiftClustersGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_hcp_open_shift_cluster_read(cls._schema_on_200) + + return cls._schema_on_200 + + class HcpOpenShiftClustersCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_hcp_open_shift_cluster_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("properties", AAZObjectType) + _builder.set_prop("tags", AAZDictType, ".tags") + + identity = _builder.get(".identity") + if identity is not None: + identity.set_prop("userAssignedIdentities", AAZDictType, ".user_assigned_identities") + + user_assigned_identities = _builder.get(".identity.userAssignedIdentities") + if user_assigned_identities is not None: + user_assigned_identities.set_elements(AAZObjectType, ".", typ_kwargs={"nullable": True}) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("api", AAZObjectType) + properties.set_prop("autoscaling", AAZObjectType) + properties.set_prop("etcd", AAZObjectType) + properties.set_prop("imageDigestMirrors", AAZListType, ".image_digest_mirrors") + properties.set_prop("nodeDrainTimeoutMinutes", AAZIntType, ".node_drain_timeout") + properties.set_prop("platform", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("version", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + + api = _builder.get(".properties.api") + if api is not None: + api.set_prop("authorizedCidrs", AAZListType, ".authorized_cidrs") + + authorized_cidrs = _builder.get(".properties.api.authorizedCidrs") + if authorized_cidrs is not None: + authorized_cidrs.set_elements(AAZStrType, ".") + + autoscaling = _builder.get(".properties.autoscaling") + if autoscaling is not None: + autoscaling.set_prop("maxNodeProvisionTimeSeconds", AAZIntType, ".max_node_provision_time") + autoscaling.set_prop("maxNodesTotal", AAZIntType, ".max_nodes_total") + autoscaling.set_prop("maxPodGracePeriodSeconds", AAZIntType, ".max_pod_grace_period") + autoscaling.set_prop("podPriorityThreshold", AAZIntType, ".pod_priority_threshold") + + etcd = _builder.get(".properties.etcd") + if etcd is not None: + etcd.set_prop("dataEncryption", AAZObjectType) + + data_encryption = _builder.get(".properties.etcd.dataEncryption") + if data_encryption is not None: + data_encryption.set_prop("customerManaged", AAZObjectType) + + customer_managed = _builder.get(".properties.etcd.dataEncryption.customerManaged") + if customer_managed is not None: + customer_managed.set_prop("kms", AAZObjectType) + + kms = _builder.get(".properties.etcd.dataEncryption.customerManaged.kms") + if kms is not None: + kms.set_prop("activeKey", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + + active_key = _builder.get(".properties.etcd.dataEncryption.customerManaged.kms.activeKey") + if active_key is not None: + active_key.set_prop("version", AAZStrType, ".kms_active_key_version", typ_kwargs={"flags": {"required": True}}) + + image_digest_mirrors = _builder.get(".properties.imageDigestMirrors") + if image_digest_mirrors is not None: + image_digest_mirrors.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.imageDigestMirrors[]") + if _elements is not None: + _elements.set_prop("mirrors", AAZListType, ".mirrors", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("source", AAZStrType, ".source", typ_kwargs={"flags": {"required": True}}) + + mirrors = _builder.get(".properties.imageDigestMirrors[].mirrors") + if mirrors is not None: + mirrors.set_elements(AAZStrType, ".") + + platform = _builder.get(".properties.platform") + if platform is not None: + platform.set_prop("containerRegistry", AAZObjectType) + platform.set_prop("operatorsAuthentication", AAZObjectType, ".operators_authentication", typ_kwargs={"flags": {"required": True}}) + + container_registry = _builder.get(".properties.platform.containerRegistry") + if container_registry is not None: + container_registry.set_prop("managedIdentity", AAZStrType, ".container_registry_managed_identity") + + operators_authentication = _builder.get(".properties.platform.operatorsAuthentication") + if operators_authentication is not None: + operators_authentication.set_prop("userAssignedIdentities", AAZObjectType, ".user_assigned_identities", typ_kwargs={"flags": {"required": True}}) + + user_assigned_identities = _builder.get(".properties.platform.operatorsAuthentication.userAssignedIdentities") + if user_assigned_identities is not None: + user_assigned_identities.set_prop("controlPlaneOperators", AAZDictType, ".control_plane_operators", typ_kwargs={"flags": {"required": True}}) + user_assigned_identities.set_prop("dataPlaneOperators", AAZDictType, ".data_plane_operators", typ_kwargs={"flags": {"required": True}}) + user_assigned_identities.set_prop("serviceManagedIdentity", AAZStrType, ".service_managed_identity", typ_kwargs={"flags": {"required": True}}) + + control_plane_operators = _builder.get(".properties.platform.operatorsAuthentication.userAssignedIdentities.controlPlaneOperators") + if control_plane_operators is not None: + control_plane_operators.set_elements(AAZStrType, ".") + + data_plane_operators = _builder.get(".properties.platform.operatorsAuthentication.userAssignedIdentities.dataPlaneOperators") + if data_plane_operators is not None: + data_plane_operators.set_elements(AAZStrType, ".") + + version = _builder.get(".properties.version") + if version is not None: + version.set_prop("channelGroup", AAZStrType, ".channel_group") + version.set_prop("id", AAZStrType, ".version", typ_kwargs={"flags": {"required": True}}) + + tags = _builder.get(".tags") + if tags is not None: + tags.set_elements(AAZStrType, ".") + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + _schema_hcp_open_shift_cluster_read = None + + @classmethod + def _build_schema_hcp_open_shift_cluster_read(cls, _schema): + if cls._schema_hcp_open_shift_cluster_read is not None: + _schema.id = cls._schema_hcp_open_shift_cluster_read.id + _schema.identity = cls._schema_hcp_open_shift_cluster_read.identity + _schema.location = cls._schema_hcp_open_shift_cluster_read.location + _schema.name = cls._schema_hcp_open_shift_cluster_read.name + _schema.properties = cls._schema_hcp_open_shift_cluster_read.properties + _schema.system_data = cls._schema_hcp_open_shift_cluster_read.system_data + _schema.tags = cls._schema_hcp_open_shift_cluster_read.tags + _schema.type = cls._schema_hcp_open_shift_cluster_read.type + return + + cls._schema_hcp_open_shift_cluster_read = _schema_hcp_open_shift_cluster_read = AAZObjectType() + + hcp_open_shift_cluster_read = _schema_hcp_open_shift_cluster_read + hcp_open_shift_cluster_read.id = AAZStrType( + flags={"read_only": True}, + ) + hcp_open_shift_cluster_read.identity = AAZIdentityObjectType() + hcp_open_shift_cluster_read.location = AAZStrType( + flags={"required": True}, + ) + hcp_open_shift_cluster_read.name = AAZStrType( + flags={"read_only": True}, + ) + hcp_open_shift_cluster_read.properties = AAZObjectType() + hcp_open_shift_cluster_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + hcp_open_shift_cluster_read.tags = AAZDictType() + hcp_open_shift_cluster_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_hcp_open_shift_cluster_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_hcp_open_shift_cluster_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_hcp_open_shift_cluster_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_hcp_open_shift_cluster_read.properties + properties.api = AAZObjectType() + properties.autoscaling = AAZObjectType() + properties.cluster_image_registry = AAZObjectType( + serialized_name="clusterImageRegistry", + ) + properties.console = AAZObjectType( + flags={"read_only": True}, + ) + properties.crypto_restrictions = AAZStrType( + serialized_name="cryptoRestrictions", + ) + properties.dns = AAZObjectType() + properties.etcd = AAZObjectType() + properties.image_digest_mirrors = AAZListType( + serialized_name="imageDigestMirrors", + ) + properties.ingress = AAZObjectType() + properties.network = AAZObjectType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.version = AAZObjectType( + flags={"required": True}, + ) + + api = _schema_hcp_open_shift_cluster_read.properties.api + api.authorized_cidrs = AAZListType( + serialized_name="authorizedCidrs", + ) + api.url = AAZStrType( + flags={"read_only": True}, + ) + api.visibility = AAZStrType() + + authorized_cidrs = _schema_hcp_open_shift_cluster_read.properties.api.authorized_cidrs + authorized_cidrs.Element = AAZStrType() + + autoscaling = _schema_hcp_open_shift_cluster_read.properties.autoscaling + autoscaling.max_node_provision_time_seconds = AAZIntType( + serialized_name="maxNodeProvisionTimeSeconds", + ) + autoscaling.max_nodes_total = AAZIntType( + serialized_name="maxNodesTotal", + ) + autoscaling.max_pod_grace_period_seconds = AAZIntType( + serialized_name="maxPodGracePeriodSeconds", + ) + autoscaling.pod_priority_threshold = AAZIntType( + serialized_name="podPriorityThreshold", + ) + + cluster_image_registry = _schema_hcp_open_shift_cluster_read.properties.cluster_image_registry + cluster_image_registry.state = AAZStrType() + + console = _schema_hcp_open_shift_cluster_read.properties.console + console.url = AAZStrType( + flags={"read_only": True}, + ) + + dns = _schema_hcp_open_shift_cluster_read.properties.dns + dns.base_domain = AAZStrType( + serialized_name="baseDomain", + flags={"read_only": True}, + ) + dns.base_domain_prefix = AAZStrType( + serialized_name="baseDomainPrefix", + ) + + etcd = _schema_hcp_open_shift_cluster_read.properties.etcd + etcd.data_encryption = AAZObjectType( + serialized_name="dataEncryption", + ) + + data_encryption = _schema_hcp_open_shift_cluster_read.properties.etcd.data_encryption + data_encryption.customer_managed = AAZObjectType( + serialized_name="customerManaged", + ) + data_encryption.key_management_mode = AAZStrType( + serialized_name="keyManagementMode", + flags={"required": True}, + ) + + customer_managed = _schema_hcp_open_shift_cluster_read.properties.etcd.data_encryption.customer_managed + customer_managed.encryption_type = AAZStrType( + serialized_name="encryptionType", + ) + customer_managed.kms = AAZObjectType() + + kms = _schema_hcp_open_shift_cluster_read.properties.etcd.data_encryption.customer_managed.kms + kms.active_key = AAZObjectType( + serialized_name="activeKey", + flags={"required": True}, + ) + kms.key_vault_type = AAZStrType( + serialized_name="keyVaultType", + ) + kms.vault_name = AAZStrType( + serialized_name="vaultName", + flags={"required": True}, + ) + kms.visibility = AAZStrType( + flags={"required": True}, + ) + + active_key = _schema_hcp_open_shift_cluster_read.properties.etcd.data_encryption.customer_managed.kms.active_key + active_key.name = AAZStrType( + flags={"required": True}, + ) + active_key.version = AAZStrType( + flags={"required": True}, + ) + + image_digest_mirrors = _schema_hcp_open_shift_cluster_read.properties.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectType() + + _element = _schema_hcp_open_shift_cluster_read.properties.image_digest_mirrors.Element + _element.mirrors = AAZListType( + flags={"required": True}, + ) + _element.source = AAZStrType( + flags={"required": True}, + ) + + mirrors = _schema_hcp_open_shift_cluster_read.properties.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrType() + + ingress = _schema_hcp_open_shift_cluster_read.properties.ingress + ingress.type = AAZStrType() + + network = _schema_hcp_open_shift_cluster_read.properties.network + network.host_prefix = AAZIntType( + serialized_name="hostPrefix", + ) + network.machine_cidr = AAZStrType( + serialized_name="machineCidr", + ) + network.network_type = AAZStrType( + serialized_name="networkType", + ) + network.pod_cidr = AAZStrType( + serialized_name="podCidr", + ) + network.service_cidr = AAZStrType( + serialized_name="serviceCidr", + ) + + platform = _schema_hcp_open_shift_cluster_read.properties.platform + platform.container_registry = AAZObjectType( + serialized_name="containerRegistry", + ) + platform.issuer_url = AAZStrType( + serialized_name="issuerUrl", + flags={"read_only": True}, + ) + platform.managed_resource_group = AAZStrType( + serialized_name="managedResourceGroup", + ) + platform.network_security_group_id = AAZStrType( + serialized_name="networkSecurityGroupId", + flags={"required": True}, + ) + platform.operators_authentication = AAZObjectType( + serialized_name="operatorsAuthentication", + flags={"required": True}, + ) + platform.outbound_type = AAZStrType( + serialized_name="outboundType", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + flags={"required": True}, + ) + platform.vnet_integration_subnet_id = AAZStrType( + serialized_name="vnetIntegrationSubnetId", + flags={"required": True}, + ) + + container_registry = _schema_hcp_open_shift_cluster_read.properties.platform.container_registry + container_registry.managed_identity = AAZStrType( + serialized_name="managedIdentity", + ) + + operators_authentication = _schema_hcp_open_shift_cluster_read.properties.platform.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectType( + serialized_name="userAssignedIdentities", + flags={"required": True}, + ) + + user_assigned_identities = _schema_hcp_open_shift_cluster_read.properties.platform.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictType( + serialized_name="controlPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.data_plane_operators = AAZDictType( + serialized_name="dataPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.service_managed_identity = AAZStrType( + serialized_name="serviceManagedIdentity", + flags={"required": True}, + ) + + control_plane_operators = _schema_hcp_open_shift_cluster_read.properties.platform.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZStrType() + + data_plane_operators = _schema_hcp_open_shift_cluster_read.properties.platform.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZStrType() + + status = _schema_hcp_open_shift_cluster_read.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = _schema_hcp_open_shift_cluster_read.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = _schema_hcp_open_shift_cluster_read.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = _schema_hcp_open_shift_cluster_read.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = _schema_hcp_open_shift_cluster_read.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + version = _schema_hcp_open_shift_cluster_read.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = _schema_hcp_open_shift_cluster_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = _schema_hcp_open_shift_cluster_read.tags + tags.Element = AAZStrType() + + _schema.id = cls._schema_hcp_open_shift_cluster_read.id + _schema.identity = cls._schema_hcp_open_shift_cluster_read.identity + _schema.location = cls._schema_hcp_open_shift_cluster_read.location + _schema.name = cls._schema_hcp_open_shift_cluster_read.name + _schema.properties = cls._schema_hcp_open_shift_cluster_read.properties + _schema.system_data = cls._schema_hcp_open_shift_cluster_read.system_data + _schema.tags = cls._schema_hcp_open_shift_cluster_read.tags + _schema.type = cls._schema_hcp_open_shift_cluster_read.type + + +__all__ = ["Update"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_wait.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_wait.py new file mode 100644 index 00000000000..90cee511c2f --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/_wait.py @@ -0,0 +1,501 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}", "2026-10-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.HcpOpenShiftClustersGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class HcpOpenShiftClustersGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.tags = AAZDictType() + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.api = AAZObjectType() + properties.autoscaling = AAZObjectType() + properties.cluster_image_registry = AAZObjectType( + serialized_name="clusterImageRegistry", + ) + properties.console = AAZObjectType( + flags={"read_only": True}, + ) + properties.crypto_restrictions = AAZStrType( + serialized_name="cryptoRestrictions", + ) + properties.dns = AAZObjectType() + properties.etcd = AAZObjectType() + properties.image_digest_mirrors = AAZListType( + serialized_name="imageDigestMirrors", + ) + properties.ingress = AAZObjectType() + properties.network = AAZObjectType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.version = AAZObjectType( + flags={"required": True}, + ) + + api = cls._schema_on_200.properties.api + api.authorized_cidrs = AAZListType( + serialized_name="authorizedCidrs", + ) + api.url = AAZStrType( + flags={"read_only": True}, + ) + api.visibility = AAZStrType() + + authorized_cidrs = cls._schema_on_200.properties.api.authorized_cidrs + authorized_cidrs.Element = AAZStrType() + + autoscaling = cls._schema_on_200.properties.autoscaling + autoscaling.max_node_provision_time_seconds = AAZIntType( + serialized_name="maxNodeProvisionTimeSeconds", + ) + autoscaling.max_nodes_total = AAZIntType( + serialized_name="maxNodesTotal", + ) + autoscaling.max_pod_grace_period_seconds = AAZIntType( + serialized_name="maxPodGracePeriodSeconds", + ) + autoscaling.pod_priority_threshold = AAZIntType( + serialized_name="podPriorityThreshold", + ) + + cluster_image_registry = cls._schema_on_200.properties.cluster_image_registry + cluster_image_registry.state = AAZStrType() + + console = cls._schema_on_200.properties.console + console.url = AAZStrType( + flags={"read_only": True}, + ) + + dns = cls._schema_on_200.properties.dns + dns.base_domain = AAZStrType( + serialized_name="baseDomain", + flags={"read_only": True}, + ) + dns.base_domain_prefix = AAZStrType( + serialized_name="baseDomainPrefix", + ) + + etcd = cls._schema_on_200.properties.etcd + etcd.data_encryption = AAZObjectType( + serialized_name="dataEncryption", + ) + + data_encryption = cls._schema_on_200.properties.etcd.data_encryption + data_encryption.customer_managed = AAZObjectType( + serialized_name="customerManaged", + ) + data_encryption.key_management_mode = AAZStrType( + serialized_name="keyManagementMode", + flags={"required": True}, + ) + + customer_managed = cls._schema_on_200.properties.etcd.data_encryption.customer_managed + customer_managed.encryption_type = AAZStrType( + serialized_name="encryptionType", + ) + customer_managed.kms = AAZObjectType() + + kms = cls._schema_on_200.properties.etcd.data_encryption.customer_managed.kms + kms.active_key = AAZObjectType( + serialized_name="activeKey", + flags={"required": True}, + ) + kms.key_vault_type = AAZStrType( + serialized_name="keyVaultType", + ) + kms.vault_name = AAZStrType( + serialized_name="vaultName", + flags={"required": True}, + ) + kms.visibility = AAZStrType( + flags={"required": True}, + ) + + active_key = cls._schema_on_200.properties.etcd.data_encryption.customer_managed.kms.active_key + active_key.name = AAZStrType( + flags={"required": True}, + ) + active_key.version = AAZStrType( + flags={"required": True}, + ) + + image_digest_mirrors = cls._schema_on_200.properties.image_digest_mirrors + image_digest_mirrors.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.image_digest_mirrors.Element + _element.mirrors = AAZListType( + flags={"required": True}, + ) + _element.source = AAZStrType( + flags={"required": True}, + ) + + mirrors = cls._schema_on_200.properties.image_digest_mirrors.Element.mirrors + mirrors.Element = AAZStrType() + + ingress = cls._schema_on_200.properties.ingress + ingress.type = AAZStrType() + + network = cls._schema_on_200.properties.network + network.host_prefix = AAZIntType( + serialized_name="hostPrefix", + ) + network.machine_cidr = AAZStrType( + serialized_name="machineCidr", + ) + network.network_type = AAZStrType( + serialized_name="networkType", + ) + network.pod_cidr = AAZStrType( + serialized_name="podCidr", + ) + network.service_cidr = AAZStrType( + serialized_name="serviceCidr", + ) + + platform = cls._schema_on_200.properties.platform + platform.container_registry = AAZObjectType( + serialized_name="containerRegistry", + ) + platform.issuer_url = AAZStrType( + serialized_name="issuerUrl", + flags={"read_only": True}, + ) + platform.managed_resource_group = AAZStrType( + serialized_name="managedResourceGroup", + ) + platform.network_security_group_id = AAZStrType( + serialized_name="networkSecurityGroupId", + flags={"required": True}, + ) + platform.operators_authentication = AAZObjectType( + serialized_name="operatorsAuthentication", + flags={"required": True}, + ) + platform.outbound_type = AAZStrType( + serialized_name="outboundType", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + flags={"required": True}, + ) + platform.vnet_integration_subnet_id = AAZStrType( + serialized_name="vnetIntegrationSubnetId", + flags={"required": True}, + ) + + container_registry = cls._schema_on_200.properties.platform.container_registry + container_registry.managed_identity = AAZStrType( + serialized_name="managedIdentity", + ) + + operators_authentication = cls._schema_on_200.properties.platform.operators_authentication + operators_authentication.user_assigned_identities = AAZObjectType( + serialized_name="userAssignedIdentities", + flags={"required": True}, + ) + + user_assigned_identities = cls._schema_on_200.properties.platform.operators_authentication.user_assigned_identities + user_assigned_identities.control_plane_operators = AAZDictType( + serialized_name="controlPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.data_plane_operators = AAZDictType( + serialized_name="dataPlaneOperators", + flags={"required": True}, + ) + user_assigned_identities.service_managed_identity = AAZStrType( + serialized_name="serviceManagedIdentity", + flags={"required": True}, + ) + + control_plane_operators = cls._schema_on_200.properties.platform.operators_authentication.user_assigned_identities.control_plane_operators + control_plane_operators.Element = AAZStrType() + + data_plane_operators = cls._schema_on_200.properties.platform.operators_authentication.user_assigned_identities.data_plane_operators + data_plane_operators.Element = AAZStrType() + + status = cls._schema_on_200.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + version = cls._schema_on_200.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + +__all__ = ["Wait"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/__cmd_group.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/__cmd_group.py new file mode 100644 index 00000000000..42b26d15bcc --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "aro hcp cluster external-auth", +) +class __CMDGroup(AAZCommandGroup): + """Manage Azure Red Hat OpenShift with hosted control plane external authentication + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/__init__.py new file mode 100644 index 00000000000..db73033039b --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/__init__.py @@ -0,0 +1,17 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._create import * +from ._delete import * +from ._list import * +from ._show import * +from ._update import * +from ._wait import * diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_create.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_create.py new file mode 100644 index 00000000000..87b41de874d --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_create.py @@ -0,0 +1,613 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster external-auth create", +) +class Create(AAZCommand): + """Create an Azure Red Hat OpenShift with hosted control plane external authentication instance + + :example: Create an external authentication provider + az aro hcp cluster external-auth create --resource-group MyResourceGroup --cluster-name MyCluster --name MyExternalAuth --issuer-url https://login.microsoftonline.com//v2.0 --issuer-audience --username-claim email --client client-id= component-name=console auth-client-namespace=openshift-console type=Confidential + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/externalauths/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the External Authentication", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + + # define Arg Group "Claim" + + _args_schema = cls._args_schema + _args_schema.validation_rules = AAZListArg( + options=["--validation-rules"], + arg_group="Claim", + help="The claim validation rules.", + ) + + validation_rules = cls._args_schema.validation_rules + validation_rules.Element = AAZObjectArg() + + _element = cls._args_schema.validation_rules.Element + _element.required_claim = AAZObjectArg( + options=["required-claim"], + help="The required claim rule to be applied.", + ) + _element.type = AAZStrArg( + options=["type"], + help="This configures the type of the validation rule. It defaults to \"RequiredClaim\"", + default="RequiredClaim", + enum={"RequiredClaim": "RequiredClaim"}, + ) + + required_claim = cls._args_schema.validation_rules.Element.required_claim + required_claim.claim = AAZStrArg( + options=["claim"], + help="Claim name for the validation profile claim is a required field that configures the name of the required claim.", + required=True, + fmt=AAZStrArgFormat( + min_length=1, + ), + ) + required_claim.required_value = AAZStrArg( + options=["required-value"], + help="Required value requiredValue is a required field that configures the value that 'claim' must have when taken from the incoming JWT claims. If the value in the JWT claims does not match, the token will be rejected for authentication.", + required=True, + fmt=AAZStrArgFormat( + min_length=1, + ), + ) + + # define Arg Group "Groups" + + _args_schema = cls._args_schema + _args_schema.claim = AAZStrArg( + options=["--claim"], + arg_group="Groups", + help="Claim name of the external profile", + fmt=AAZStrArgFormat( + max_length=256, + min_length=1, + ), + ) + _args_schema.prefix = AAZStrArg( + options=["--prefix"], + arg_group="Groups", + help="Prefix for the claim external profile. If this is specified, prefixPolicy will be set to \"Prefix\" by default.", + ) + + # define Arg Group "Issuer" + + _args_schema = cls._args_schema + _args_schema.issuer_audience = AAZListArg( + options=["--issuer-audience"], + arg_group="Issuer", + help="This configures the acceptable audiences for JWT tokens issued by the identity provider. At least one of the entries must match the 'aud' claim in the JWT token.", + fmt=AAZListArgFormat( + max_length=10, + min_length=1, + ), + ) + _args_schema.issuer_ca = AAZStrArg( + options=["--issuer-ca"], + arg_group="Issuer", + help="The issuer of the token. Certificate bundle to use to validate server certificates for the configured URL. It must be PEM encoded and when not specified, the system trust is used.", + ) + _args_schema.issuer_url = AAZStrArg( + options=["--issuer-url"], + arg_group="Issuer", + help="This configures the URL used to issue tokens by the identity provider. The Kubernetes API server determines how authentication tokens should be handled by matching the 'iss' claim in the JWT to the issuerURL of configured identity providers. issuerURL must use the 'https' scheme.", + ) + + issuer_audience = cls._args_schema.issuer_audience + issuer_audience.Element = AAZStrArg() + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.clients = AAZListArg( + options=["--clients"], + singular_options=["--client"], + arg_group="Properties", + help="External Auth OIDC clients. There must not be more than 20 entries and entries must have unique namespace/name pairs.", + fmt=AAZListArgFormat( + max_length=20, + ), + ) + + clients = cls._args_schema.clients + clients.Element = AAZObjectArg() + + _element = cls._args_schema.clients.Element + _element.client_id = AAZStrArg( + options=["client-id"], + help="External Auth client id. The clientId must appear in the audience field of the TokenIssuerProfile.", + required=True, + fmt=AAZStrArgFormat( + min_length=1, + ), + ) + _element.auth_client_namespace = AAZStrArg( + options=["auth-client-namespace"], + help="The namespace of the external Auth client. This specifies the namespace in which the platform component being configured to use the identity provider as an authentication mode is running. It is used in combination with name as a unique identifier.", + required=True, + fmt=AAZStrArgFormat( + max_length=63, + min_length=1, + ), + ) + _element.component_name = AAZStrArg( + options=["component-name"], + help="The name of the external auth client. This specifies the name of the platform component being configured to use the identity provider as an authentication mode. It is used in combination with namespace as a unique identifier.", + required=True, + fmt=AAZStrArgFormat( + max_length=256, + min_length=1, + ), + ) + _element.extra_scopes = AAZListArg( + options=["extra-scopes"], + singular_options=["extra-scope"], + help="External auth client scopes. This is useful if you have configured claim mappings that requires specific scopes to be requested beyond the standard OIDC scopes. When omitted, no additional scopes are requested.", + ) + _element.type = AAZStrArg( + options=["type"], + help="Determines the OIDC provider client type.", + required=True, + enum={"Confidential": "Confidential", "Public": "Public"}, + ) + + extra_scopes = cls._args_schema.clients.Element.extra_scopes + extra_scopes.Element = AAZStrArg() + + # define Arg Group "Username" + + _args_schema = cls._args_schema + _args_schema.username_claim = AAZStrArg( + options=["--username-claim"], + arg_group="Username", + help="Claim name of the external profile", + fmt=AAZStrArgFormat( + max_length=256, + min_length=1, + ), + ) + _args_schema.username_prefix = AAZStrArg( + options=["--username-prefix"], + arg_group="Username", + help="Prefix for the claim external profile. Must be set when the prefixPolicy field is set to 'Prefix' and must be unset otherwise.", + ) + _args_schema.username_prefix_policy = AAZStrArg( + options=["--username-prefix-policy"], + arg_group="Username", + help="Prefix policy is an optional field that configures how a prefix should be applied to the value of the JWT claim specified in the 'claim' field. Allowed values are 'Prefix', 'NoPrefix', and 'None'. If not specified, the default policy is 'None'. When set to 'Prefix', the value specified in the prefix field will be prepended to the value of the JWT claim. The prefix field must be set when prefixPolicy is 'Prefix'. When set to 'NoPrefix', no prefix will be prepended to the value of the JWT claim. When set to 'None', this means no opinion and the platform is left to choose any prefixes that are applied which is subject to change over time. Currently, the platform prepends `{issuerURL}#` to the value of the JWT claim when the claim is not 'email'. As an example, consider the following scenario: `prefix` is unset, `issuerURL` is set to `https://myoidc.tld`, the JWT claims include \"username\":\"userA\" and \"email\":\"userA", + enum={"NoPrefix": "NoPrefix", "None": "None", "Prefix": "Prefix"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.ExternalAuthsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class ExternalAuthsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/externalAuths/{externalAuthName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "externalAuthName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("claim", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("clients", AAZListType, ".clients") + properties.set_prop("issuer", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + + claim = _builder.get(".properties.claim") + if claim is not None: + claim.set_prop("mappings", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + claim.set_prop("validationRules", AAZListType, ".validation_rules") + + mappings = _builder.get(".properties.claim.mappings") + if mappings is not None: + mappings.set_prop("groups", AAZObjectType) + mappings.set_prop("username", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + + groups = _builder.get(".properties.claim.mappings.groups") + if groups is not None: + groups.set_prop("claim", AAZStrType, ".claim", typ_kwargs={"flags": {"required": True}}) + groups.set_prop("prefix", AAZStrType, ".prefix") + + username = _builder.get(".properties.claim.mappings.username") + if username is not None: + username.set_prop("claim", AAZStrType, ".username_claim", typ_kwargs={"flags": {"required": True}}) + username.set_prop("prefix", AAZStrType, ".username_prefix") + username.set_prop("prefixPolicy", AAZStrType, ".username_prefix_policy") + + validation_rules = _builder.get(".properties.claim.validationRules") + if validation_rules is not None: + validation_rules.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.claim.validationRules[]") + if _elements is not None: + _elements.set_prop("requiredClaim", AAZObjectType, ".required_claim") + _elements.set_prop("type", AAZStrType, ".type") + + required_claim = _builder.get(".properties.claim.validationRules[].requiredClaim") + if required_claim is not None: + required_claim.set_prop("claim", AAZStrType, ".claim", typ_kwargs={"flags": {"required": True}}) + required_claim.set_prop("requiredValue", AAZStrType, ".required_value", typ_kwargs={"flags": {"required": True}}) + + clients = _builder.get(".properties.clients") + if clients is not None: + clients.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.clients[]") + if _elements is not None: + _elements.set_prop("clientId", AAZStrType, ".client_id", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("component", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("extraScopes", AAZListType, ".extra_scopes") + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + + component = _builder.get(".properties.clients[].component") + if component is not None: + component.set_prop("authClientNamespace", AAZStrType, ".auth_client_namespace", typ_kwargs={"flags": {"required": True}}) + component.set_prop("name", AAZStrType, ".component_name", typ_kwargs={"flags": {"required": True}}) + + extra_scopes = _builder.get(".properties.clients[].extraScopes") + if extra_scopes is not None: + extra_scopes.set_elements(AAZStrType, ".") + + issuer = _builder.get(".properties.issuer") + if issuer is not None: + issuer.set_prop("audiences", AAZListType, ".issuer_audience", typ_kwargs={"flags": {"required": True}}) + issuer.set_prop("ca", AAZStrType, ".issuer_ca") + issuer.set_prop("url", AAZStrType, ".issuer_url", typ_kwargs={"flags": {"required": True}}) + + audiences = _builder.get(".properties.issuer.audiences") + if audiences is not None: + audiences.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.claim = AAZObjectType( + flags={"required": True}, + ) + properties.clients = AAZListType() + properties.issuer = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + + claim = cls._schema_on_200_201.properties.claim + claim.mappings = AAZObjectType( + flags={"required": True}, + ) + claim.validation_rules = AAZListType( + serialized_name="validationRules", + ) + + mappings = cls._schema_on_200_201.properties.claim.mappings + mappings.groups = AAZObjectType() + mappings.username = AAZObjectType( + flags={"required": True}, + ) + + groups = cls._schema_on_200_201.properties.claim.mappings.groups + groups.claim = AAZStrType( + flags={"required": True}, + ) + groups.prefix = AAZStrType() + + username = cls._schema_on_200_201.properties.claim.mappings.username + username.claim = AAZStrType( + flags={"required": True}, + ) + username.prefix = AAZStrType() + username.prefix_policy = AAZStrType( + serialized_name="prefixPolicy", + ) + + validation_rules = cls._schema_on_200_201.properties.claim.validation_rules + validation_rules.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.claim.validation_rules.Element + _element.required_claim = AAZObjectType( + serialized_name="requiredClaim", + ) + _element.type = AAZStrType() + + required_claim = cls._schema_on_200_201.properties.claim.validation_rules.Element.required_claim + required_claim.claim = AAZStrType( + flags={"required": True}, + ) + required_claim.required_value = AAZStrType( + serialized_name="requiredValue", + flags={"required": True}, + ) + + clients = cls._schema_on_200_201.properties.clients + clients.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.clients.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"required": True}, + ) + _element.component = AAZObjectType( + flags={"required": True}, + ) + _element.extra_scopes = AAZListType( + serialized_name="extraScopes", + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + component = cls._schema_on_200_201.properties.clients.Element.component + component.auth_client_namespace = AAZStrType( + serialized_name="authClientNamespace", + flags={"required": True}, + ) + component.name = AAZStrType( + flags={"required": True}, + ) + + extra_scopes = cls._schema_on_200_201.properties.clients.Element.extra_scopes + extra_scopes.Element = AAZStrType() + + issuer = cls._schema_on_200_201.properties.issuer + issuer.audiences = AAZListType( + flags={"required": True}, + ) + issuer.ca = AAZStrType() + issuer.url = AAZStrType( + flags={"required": True}, + ) + + audiences = cls._schema_on_200_201.properties.issuer.audiences + audiences.Element = AAZStrType() + + status = cls._schema_on_200_201.properties.status + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200_201.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + +__all__ = ["Create"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_delete.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_delete.py new file mode 100644 index 00000000000..3b705f971a9 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_delete.py @@ -0,0 +1,179 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster external-auth delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete an Azure Red Hat OpenShift with hosted control plane external authentication instance + + :example: Delete an external authentication provider + az aro hcp cluster external-auth delete --resource-group MyResourceGroup --cluster-name MyCluster --name MyExternalAuth --yes + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/externalauths/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the External Authentication", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.ExternalAuthsDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class ExternalAuthsDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/externalAuths/{externalAuthName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "externalAuthName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_list.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_list.py new file mode 100644 index 00000000000..34c514dcade --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_list.py @@ -0,0 +1,344 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster external-auth list", +) +class List(AAZCommand): + """List Azure Red Hat OpenShift with hosted control plane external authentication instances + + :example: List external authentication providers of a cluster + az aro hcp cluster external-auth list --resource-group MyResourceGroup --cluster-name MyCluster + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/externalauths", "2026-10-01"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.ExternalAuthsListByParent(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class ExternalAuthsListByParent(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/externalAuths", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.claim = AAZObjectType( + flags={"required": True}, + ) + properties.clients = AAZListType() + properties.issuer = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + + claim = cls._schema_on_200.value.Element.properties.claim + claim.mappings = AAZObjectType( + flags={"required": True}, + ) + claim.validation_rules = AAZListType( + serialized_name="validationRules", + ) + + mappings = cls._schema_on_200.value.Element.properties.claim.mappings + mappings.groups = AAZObjectType() + mappings.username = AAZObjectType( + flags={"required": True}, + ) + + groups = cls._schema_on_200.value.Element.properties.claim.mappings.groups + groups.claim = AAZStrType( + flags={"required": True}, + ) + groups.prefix = AAZStrType() + + username = cls._schema_on_200.value.Element.properties.claim.mappings.username + username.claim = AAZStrType( + flags={"required": True}, + ) + username.prefix = AAZStrType() + username.prefix_policy = AAZStrType( + serialized_name="prefixPolicy", + ) + + validation_rules = cls._schema_on_200.value.Element.properties.claim.validation_rules + validation_rules.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.claim.validation_rules.Element + _element.required_claim = AAZObjectType( + serialized_name="requiredClaim", + ) + _element.type = AAZStrType() + + required_claim = cls._schema_on_200.value.Element.properties.claim.validation_rules.Element.required_claim + required_claim.claim = AAZStrType( + flags={"required": True}, + ) + required_claim.required_value = AAZStrType( + serialized_name="requiredValue", + flags={"required": True}, + ) + + clients = cls._schema_on_200.value.Element.properties.clients + clients.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.clients.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"required": True}, + ) + _element.component = AAZObjectType( + flags={"required": True}, + ) + _element.extra_scopes = AAZListType( + serialized_name="extraScopes", + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + component = cls._schema_on_200.value.Element.properties.clients.Element.component + component.auth_client_namespace = AAZStrType( + serialized_name="authClientNamespace", + flags={"required": True}, + ) + component.name = AAZStrType( + flags={"required": True}, + ) + + extra_scopes = cls._schema_on_200.value.Element.properties.clients.Element.extra_scopes + extra_scopes.Element = AAZStrType() + + issuer = cls._schema_on_200.value.Element.properties.issuer + issuer.audiences = AAZListType( + flags={"required": True}, + ) + issuer.ca = AAZStrType() + issuer.url = AAZStrType( + flags={"required": True}, + ) + + audiences = cls._schema_on_200.value.Element.properties.issuer.audiences + audiences.Element = AAZStrType() + + status = cls._schema_on_200.value.Element.properties.status + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.value.Element.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + +__all__ = ["List"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_show.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_show.py new file mode 100644 index 00000000000..a8a109ca3be --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_show.py @@ -0,0 +1,345 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster external-auth show", +) +class Show(AAZCommand): + """Get an Azure Red Hat OpenShift with hosted control plane external authentication instance + + :example: Show an external authentication provider + az aro hcp cluster external-auth show --resource-group MyResourceGroup --cluster-name MyCluster --name MyExternalAuth + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/externalauths/{}", "2026-10-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the External Authentication", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.ExternalAuthsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class ExternalAuthsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/externalAuths/{externalAuthName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "externalAuthName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.claim = AAZObjectType( + flags={"required": True}, + ) + properties.clients = AAZListType() + properties.issuer = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + + claim = cls._schema_on_200.properties.claim + claim.mappings = AAZObjectType( + flags={"required": True}, + ) + claim.validation_rules = AAZListType( + serialized_name="validationRules", + ) + + mappings = cls._schema_on_200.properties.claim.mappings + mappings.groups = AAZObjectType() + mappings.username = AAZObjectType( + flags={"required": True}, + ) + + groups = cls._schema_on_200.properties.claim.mappings.groups + groups.claim = AAZStrType( + flags={"required": True}, + ) + groups.prefix = AAZStrType() + + username = cls._schema_on_200.properties.claim.mappings.username + username.claim = AAZStrType( + flags={"required": True}, + ) + username.prefix = AAZStrType() + username.prefix_policy = AAZStrType( + serialized_name="prefixPolicy", + ) + + validation_rules = cls._schema_on_200.properties.claim.validation_rules + validation_rules.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.claim.validation_rules.Element + _element.required_claim = AAZObjectType( + serialized_name="requiredClaim", + ) + _element.type = AAZStrType() + + required_claim = cls._schema_on_200.properties.claim.validation_rules.Element.required_claim + required_claim.claim = AAZStrType( + flags={"required": True}, + ) + required_claim.required_value = AAZStrType( + serialized_name="requiredValue", + flags={"required": True}, + ) + + clients = cls._schema_on_200.properties.clients + clients.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.clients.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"required": True}, + ) + _element.component = AAZObjectType( + flags={"required": True}, + ) + _element.extra_scopes = AAZListType( + serialized_name="extraScopes", + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + component = cls._schema_on_200.properties.clients.Element.component + component.auth_client_namespace = AAZStrType( + serialized_name="authClientNamespace", + flags={"required": True}, + ) + component.name = AAZStrType( + flags={"required": True}, + ) + + extra_scopes = cls._schema_on_200.properties.clients.Element.extra_scopes + extra_scopes.Element = AAZStrType() + + issuer = cls._schema_on_200.properties.issuer + issuer.audiences = AAZListType( + flags={"required": True}, + ) + issuer.ca = AAZStrType() + issuer.url = AAZStrType( + flags={"required": True}, + ) + + audiences = cls._schema_on_200.properties.issuer.audiences + audiences.Element = AAZStrType() + + status = cls._schema_on_200.properties.status + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + +__all__ = ["Show"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_update.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_update.py new file mode 100644 index 00000000000..00d7caeef49 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_update.py @@ -0,0 +1,772 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster external-auth update", +) +class Update(AAZCommand): + """Update an Azure Red Hat OpenShift with hosted control plane external authentication instance + + :example: Update the username claim of an external authentication provider + az aro hcp cluster external-auth update --resource-group MyResourceGroup --cluster-name MyCluster --name MyExternalAuth --username-claim sub + + :example: Update an external authentication provider to remove any existing clients + az aro hcp cluster external-auth update --resource-group MyResourceGroup --cluster-name MyCluster --name MyExternalAuth --clients "[]" + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/externalauths/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the External Authentication", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + + # define Arg Group "Claim" + + _args_schema = cls._args_schema + _args_schema.validation_rules = AAZListArg( + options=["--validation-rules"], + arg_group="Claim", + help="The claim validation rules.", + nullable=True, + ) + + validation_rules = cls._args_schema.validation_rules + validation_rules.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_schema.validation_rules.Element + _element.required_claim = AAZObjectArg( + options=["required-claim"], + help="The required claim rule to be applied.", + nullable=True, + ) + _element.type = AAZStrArg( + options=["type"], + help="This configures the type of the validation rule. It defaults to \"RequiredClaim\"", + nullable=True, + enum={"RequiredClaim": "RequiredClaim"}, + ) + + required_claim = cls._args_schema.validation_rules.Element.required_claim + required_claim.claim = AAZStrArg( + options=["claim"], + help="Claim name for the validation profile claim is a required field that configures the name of the required claim.", + fmt=AAZStrArgFormat( + min_length=1, + ), + ) + required_claim.required_value = AAZStrArg( + options=["required-value"], + help="Required value requiredValue is a required field that configures the value that 'claim' must have when taken from the incoming JWT claims. If the value in the JWT claims does not match, the token will be rejected for authentication.", + fmt=AAZStrArgFormat( + min_length=1, + ), + ) + + # define Arg Group "Groups" + + _args_schema = cls._args_schema + _args_schema.claim = AAZStrArg( + options=["--claim"], + arg_group="Groups", + help="Claim name of the external profile", + fmt=AAZStrArgFormat( + max_length=256, + min_length=1, + ), + ) + _args_schema.prefix = AAZStrArg( + options=["--prefix"], + arg_group="Groups", + help="Prefix for the claim external profile. If this is specified, prefixPolicy will be set to \"Prefix\" by default.", + nullable=True, + ) + + # define Arg Group "Issuer" + + _args_schema = cls._args_schema + _args_schema.issuer_audience = AAZListArg( + options=["--issuer-audience"], + arg_group="Issuer", + help="This configures the acceptable audiences for JWT tokens issued by the identity provider. At least one of the entries must match the 'aud' claim in the JWT token.", + fmt=AAZListArgFormat( + max_length=10, + min_length=1, + ), + ) + _args_schema.issuer_ca = AAZStrArg( + options=["--issuer-ca"], + arg_group="Issuer", + help="The issuer of the token. Certificate bundle to use to validate server certificates for the configured URL. It must be PEM encoded and when not specified, the system trust is used.", + nullable=True, + ) + _args_schema.issuer_url = AAZStrArg( + options=["--issuer-url"], + arg_group="Issuer", + help="This configures the URL used to issue tokens by the identity provider. The Kubernetes API server determines how authentication tokens should be handled by matching the 'iss' claim in the JWT to the issuerURL of configured identity providers. issuerURL must use the 'https' scheme.", + ) + + issuer_audience = cls._args_schema.issuer_audience + issuer_audience.Element = AAZStrArg( + nullable=True, + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.clients = AAZListArg( + options=["--clients"], + singular_options=["--client"], + arg_group="Properties", + help="External Auth OIDC clients. There must not be more than 20 entries and entries must have unique namespace/name pairs.", + nullable=True, + fmt=AAZListArgFormat( + max_length=20, + ), + ) + + clients = cls._args_schema.clients + clients.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_schema.clients.Element + _element.client_id = AAZStrArg( + options=["client-id"], + help="External Auth client id. The clientId must appear in the audience field of the TokenIssuerProfile.", + fmt=AAZStrArgFormat( + min_length=1, + ), + ) + _element.auth_client_namespace = AAZStrArg( + options=["auth-client-namespace"], + help="The namespace of the external Auth client. This specifies the namespace in which the platform component being configured to use the identity provider as an authentication mode is running. It is used in combination with name as a unique identifier.", + fmt=AAZStrArgFormat( + max_length=63, + min_length=1, + ), + ) + _element.component_name = AAZStrArg( + options=["component-name"], + help="The name of the external auth client. This specifies the name of the platform component being configured to use the identity provider as an authentication mode. It is used in combination with namespace as a unique identifier.", + fmt=AAZStrArgFormat( + max_length=256, + min_length=1, + ), + ) + _element.extra_scopes = AAZListArg( + options=["extra-scopes"], + singular_options=["extra-scope"], + help="External auth client scopes. This is useful if you have configured claim mappings that requires specific scopes to be requested beyond the standard OIDC scopes. When omitted, no additional scopes are requested.", + nullable=True, + ) + _element.type = AAZStrArg( + options=["type"], + help="Determines the OIDC provider client type.", + enum={"Confidential": "Confidential", "Public": "Public"}, + ) + + extra_scopes = cls._args_schema.clients.Element.extra_scopes + extra_scopes.Element = AAZStrArg( + nullable=True, + ) + + # define Arg Group "Username" + + _args_schema = cls._args_schema + _args_schema.username_claim = AAZStrArg( + options=["--username-claim"], + arg_group="Username", + help="Claim name of the external profile", + fmt=AAZStrArgFormat( + max_length=256, + min_length=1, + ), + ) + _args_schema.username_prefix = AAZStrArg( + options=["--username-prefix"], + arg_group="Username", + help="Prefix for the claim external profile. Must be set when the prefixPolicy field is set to 'Prefix' and must be unset otherwise.", + nullable=True, + ) + _args_schema.username_prefix_policy = AAZStrArg( + options=["--username-prefix-policy"], + arg_group="Username", + help="Prefix policy is an optional field that configures how a prefix should be applied to the value of the JWT claim specified in the 'claim' field. Allowed values are 'Prefix', 'NoPrefix', and 'None'. If not specified, the default policy is 'None'. When set to 'Prefix', the value specified in the prefix field will be prepended to the value of the JWT claim. The prefix field must be set when prefixPolicy is 'Prefix'. When set to 'NoPrefix', no prefix will be prepended to the value of the JWT claim. When set to 'None', this means no opinion and the platform is left to choose any prefixes that are applied which is subject to change over time. Currently, the platform prepends `{issuerURL}#` to the value of the JWT claim when the claim is not 'email'. As an example, consider the following scenario: `prefix` is unset, `issuerURL` is set to `https://myoidc.tld`, the JWT claims include \"username\":\"userA\" and \"email\":\"userA", + nullable=True, + enum={"NoPrefix": "NoPrefix", "None": "None", "Prefix": "Prefix"}, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.ExternalAuthsGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.ExternalAuthsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class ExternalAuthsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/externalAuths/{externalAuthName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "externalAuthName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_external_auth_read(cls._schema_on_200) + + return cls._schema_on_200 + + class ExternalAuthsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/externalAuths/{externalAuthName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "externalAuthName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_external_auth_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("properties", AAZObjectType) + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("claim", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("clients", AAZListType, ".clients") + properties.set_prop("issuer", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + + claim = _builder.get(".properties.claim") + if claim is not None: + claim.set_prop("mappings", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + claim.set_prop("validationRules", AAZListType, ".validation_rules") + + mappings = _builder.get(".properties.claim.mappings") + if mappings is not None: + mappings.set_prop("groups", AAZObjectType) + mappings.set_prop("username", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + + groups = _builder.get(".properties.claim.mappings.groups") + if groups is not None: + groups.set_prop("claim", AAZStrType, ".claim", typ_kwargs={"flags": {"required": True}}) + groups.set_prop("prefix", AAZStrType, ".prefix") + + username = _builder.get(".properties.claim.mappings.username") + if username is not None: + username.set_prop("claim", AAZStrType, ".username_claim", typ_kwargs={"flags": {"required": True}}) + username.set_prop("prefix", AAZStrType, ".username_prefix") + username.set_prop("prefixPolicy", AAZStrType, ".username_prefix_policy") + + validation_rules = _builder.get(".properties.claim.validationRules") + if validation_rules is not None: + validation_rules.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.claim.validationRules[]") + if _elements is not None: + _elements.set_prop("requiredClaim", AAZObjectType, ".required_claim") + _elements.set_prop("type", AAZStrType, ".type") + + required_claim = _builder.get(".properties.claim.validationRules[].requiredClaim") + if required_claim is not None: + required_claim.set_prop("claim", AAZStrType, ".claim", typ_kwargs={"flags": {"required": True}}) + required_claim.set_prop("requiredValue", AAZStrType, ".required_value", typ_kwargs={"flags": {"required": True}}) + + clients = _builder.get(".properties.clients") + if clients is not None: + clients.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.clients[]") + if _elements is not None: + _elements.set_prop("clientId", AAZStrType, ".client_id", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("component", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("extraScopes", AAZListType, ".extra_scopes") + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + + component = _builder.get(".properties.clients[].component") + if component is not None: + component.set_prop("authClientNamespace", AAZStrType, ".auth_client_namespace", typ_kwargs={"flags": {"required": True}}) + component.set_prop("name", AAZStrType, ".component_name", typ_kwargs={"flags": {"required": True}}) + + extra_scopes = _builder.get(".properties.clients[].extraScopes") + if extra_scopes is not None: + extra_scopes.set_elements(AAZStrType, ".") + + issuer = _builder.get(".properties.issuer") + if issuer is not None: + issuer.set_prop("audiences", AAZListType, ".issuer_audience", typ_kwargs={"flags": {"required": True}}) + issuer.set_prop("ca", AAZStrType, ".issuer_ca") + issuer.set_prop("url", AAZStrType, ".issuer_url", typ_kwargs={"flags": {"required": True}}) + + audiences = _builder.get(".properties.issuer.audiences") + if audiences is not None: + audiences.set_elements(AAZStrType, ".") + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + _schema_external_auth_read = None + + @classmethod + def _build_schema_external_auth_read(cls, _schema): + if cls._schema_external_auth_read is not None: + _schema.id = cls._schema_external_auth_read.id + _schema.name = cls._schema_external_auth_read.name + _schema.properties = cls._schema_external_auth_read.properties + _schema.system_data = cls._schema_external_auth_read.system_data + _schema.type = cls._schema_external_auth_read.type + return + + cls._schema_external_auth_read = _schema_external_auth_read = AAZObjectType() + + external_auth_read = _schema_external_auth_read + external_auth_read.id = AAZStrType( + flags={"read_only": True}, + ) + external_auth_read.name = AAZStrType( + flags={"read_only": True}, + ) + external_auth_read.properties = AAZObjectType() + external_auth_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + external_auth_read.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = _schema_external_auth_read.properties + properties.claim = AAZObjectType( + flags={"required": True}, + ) + properties.clients = AAZListType() + properties.issuer = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + + claim = _schema_external_auth_read.properties.claim + claim.mappings = AAZObjectType( + flags={"required": True}, + ) + claim.validation_rules = AAZListType( + serialized_name="validationRules", + ) + + mappings = _schema_external_auth_read.properties.claim.mappings + mappings.groups = AAZObjectType() + mappings.username = AAZObjectType( + flags={"required": True}, + ) + + groups = _schema_external_auth_read.properties.claim.mappings.groups + groups.claim = AAZStrType( + flags={"required": True}, + ) + groups.prefix = AAZStrType() + + username = _schema_external_auth_read.properties.claim.mappings.username + username.claim = AAZStrType( + flags={"required": True}, + ) + username.prefix = AAZStrType() + username.prefix_policy = AAZStrType( + serialized_name="prefixPolicy", + ) + + validation_rules = _schema_external_auth_read.properties.claim.validation_rules + validation_rules.Element = AAZObjectType() + + _element = _schema_external_auth_read.properties.claim.validation_rules.Element + _element.required_claim = AAZObjectType( + serialized_name="requiredClaim", + ) + _element.type = AAZStrType() + + required_claim = _schema_external_auth_read.properties.claim.validation_rules.Element.required_claim + required_claim.claim = AAZStrType( + flags={"required": True}, + ) + required_claim.required_value = AAZStrType( + serialized_name="requiredValue", + flags={"required": True}, + ) + + clients = _schema_external_auth_read.properties.clients + clients.Element = AAZObjectType() + + _element = _schema_external_auth_read.properties.clients.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"required": True}, + ) + _element.component = AAZObjectType( + flags={"required": True}, + ) + _element.extra_scopes = AAZListType( + serialized_name="extraScopes", + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + component = _schema_external_auth_read.properties.clients.Element.component + component.auth_client_namespace = AAZStrType( + serialized_name="authClientNamespace", + flags={"required": True}, + ) + component.name = AAZStrType( + flags={"required": True}, + ) + + extra_scopes = _schema_external_auth_read.properties.clients.Element.extra_scopes + extra_scopes.Element = AAZStrType() + + issuer = _schema_external_auth_read.properties.issuer + issuer.audiences = AAZListType( + flags={"required": True}, + ) + issuer.ca = AAZStrType() + issuer.url = AAZStrType( + flags={"required": True}, + ) + + audiences = _schema_external_auth_read.properties.issuer.audiences + audiences.Element = AAZStrType() + + status = _schema_external_auth_read.properties.status + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + conditions = _schema_external_auth_read.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = _schema_external_auth_read.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_data = _schema_external_auth_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + _schema.id = cls._schema_external_auth_read.id + _schema.name = cls._schema_external_auth_read.name + _schema.properties = cls._schema_external_auth_read.properties + _schema.system_data = cls._schema_external_auth_read.system_data + _schema.type = cls._schema_external_auth_read.type + + +__all__ = ["Update"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_wait.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_wait.py new file mode 100644 index 00000000000..f8a4db1b548 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/external_auth/_wait.py @@ -0,0 +1,341 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster external-auth wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/externalauths/{}", "2026-10-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The name of the External Authentication", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.ExternalAuthsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class ExternalAuthsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/externalAuths/{externalAuthName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "externalAuthName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.claim = AAZObjectType( + flags={"required": True}, + ) + properties.clients = AAZListType() + properties.issuer = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + + claim = cls._schema_on_200.properties.claim + claim.mappings = AAZObjectType( + flags={"required": True}, + ) + claim.validation_rules = AAZListType( + serialized_name="validationRules", + ) + + mappings = cls._schema_on_200.properties.claim.mappings + mappings.groups = AAZObjectType() + mappings.username = AAZObjectType( + flags={"required": True}, + ) + + groups = cls._schema_on_200.properties.claim.mappings.groups + groups.claim = AAZStrType( + flags={"required": True}, + ) + groups.prefix = AAZStrType() + + username = cls._schema_on_200.properties.claim.mappings.username + username.claim = AAZStrType( + flags={"required": True}, + ) + username.prefix = AAZStrType() + username.prefix_policy = AAZStrType( + serialized_name="prefixPolicy", + ) + + validation_rules = cls._schema_on_200.properties.claim.validation_rules + validation_rules.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.claim.validation_rules.Element + _element.required_claim = AAZObjectType( + serialized_name="requiredClaim", + ) + _element.type = AAZStrType() + + required_claim = cls._schema_on_200.properties.claim.validation_rules.Element.required_claim + required_claim.claim = AAZStrType( + flags={"required": True}, + ) + required_claim.required_value = AAZStrType( + serialized_name="requiredValue", + flags={"required": True}, + ) + + clients = cls._schema_on_200.properties.clients + clients.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.clients.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"required": True}, + ) + _element.component = AAZObjectType( + flags={"required": True}, + ) + _element.extra_scopes = AAZListType( + serialized_name="extraScopes", + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + component = cls._schema_on_200.properties.clients.Element.component + component.auth_client_namespace = AAZStrType( + serialized_name="authClientNamespace", + flags={"required": True}, + ) + component.name = AAZStrType( + flags={"required": True}, + ) + + extra_scopes = cls._schema_on_200.properties.clients.Element.extra_scopes + extra_scopes.Element = AAZStrType() + + issuer = cls._schema_on_200.properties.issuer + issuer.audiences = AAZListType( + flags={"required": True}, + ) + issuer.ca = AAZStrType() + issuer.url = AAZStrType( + flags={"required": True}, + ) + + audiences = cls._schema_on_200.properties.issuer.audiences + audiences.Element = AAZStrType() + + status = cls._schema_on_200.properties.status + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + +__all__ = ["Wait"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/__cmd_group.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/__cmd_group.py new file mode 100644 index 00000000000..c8e61c28e0f --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "aro hcp cluster nodepool", +) +class __CMDGroup(AAZCommandGroup): + """Manage Azure Red Hat OpenShift with hosted control plane node pools + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/__init__.py new file mode 100644 index 00000000000..db73033039b --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/__init__.py @@ -0,0 +1,17 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._create import * +from ._delete import * +from ._list import * +from ._show import * +from ._update import * +from ._wait import * diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_create.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_create.py new file mode 100644 index 00000000000..f74f2f8e563 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_create.py @@ -0,0 +1,663 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster nodepool create", +) +class Create(AAZCommand): + """Create an Azure Red Hat OpenShift with hosted control plane node pool + + :example: Create a node pool + az aro hcp cluster nodepool create --resource-group MyResourceGroup --cluster-name MyCluster --name MyNodePool --location eastus --replicas 3 --vm-size Standard_D8s_v3 --version 4.19.0 --channel-group stable + + :example: Create an autoscaling node pool with labels, taints and disk config + az aro hcp cluster nodepool create --resource-group MyResourceGroup --cluster-name MyCluster --name MyNodePool --location eastus --vm-size Standard_D8s_v3 --version 4.19.0 --channel-group stable --min-replicas 1 --max-replicas 5 --disk-size 128 --disk-storage-account-type Premium_LRS --auto-repair true --labels "[{key:tier,value:frontend}]" --taints "[{key:dedicated,value:gpu,effect:NoSchedule}]" + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/nodepools/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The Name of the Node Pool", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + + # define Arg Group "Autoscaling" + + _args_schema = cls._args_schema + _args_schema.max_replicas = AAZIntArg( + options=["--max-replicas"], + arg_group="Autoscaling", + help="The maximum number of nodes in the node pool. Validation: - Minimum: 0 (must be >= min) - Maximum: 200 (only when availabilityZone is not specified) - No maximum when availabilityZone is specified", + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.min_replicas = AAZIntArg( + options=["--min-replicas"], + arg_group="Autoscaling", + help="The minimum number of nodes in the node pool. Validation: - Minimum: 0 - Maximum: 200 (only when availabilityZone is not specified) - No maximum when availabilityZone is specified", + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + + # define Arg Group "Identity" + + # define Arg Group "OS Disk" + + _args_schema = cls._args_schema + _args_schema.disk_storage_account_type = AAZStrArg( + options=["--disk-storage-type", "--disk-storage-account-type"], + arg_group="OS Disk", + help={"short-summary": "The type of the disk storage account - https://learn.microsoft.com/en-us/azure/virtual-machines/disks-types", "long-summary": "https://learn.microsoft.com/en-us/azure/virtual-machines/disks-types"}, + default="Premium_LRS", + enum={"Premium_LRS": "Premium_LRS", "StandardSSD_LRS": "StandardSSD_LRS", "Standard_LRS": "Standard_LRS"}, + ) + _args_schema.disk_type = AAZStrArg( + options=["--disk-type"], + arg_group="OS Disk", + help={"short-summary": "The type of the OS disk. - https://learn.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks", "long-summary": "https://learn.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks"}, + default="Managed", + enum={"Ephemeral": "Ephemeral", "Managed": "Managed"}, + ) + _args_schema.disk_encryption_set = AAZResourceIdArg( + options=["--disk-encryption-set"], + arg_group="OS Disk", + help={"short-summary": "The ID of the DiskEncryptionSet resource to use to encrypt the OS disks for the VMs. This needs to exist in the same subscription id listed in the Hosted Cluster, HostedCluster.Spec.Platform.Azure.SubscriptionID. DiskEncryptionSetID should also exist in a resource group under the same subscription id and the same location listed in the Hosted Cluster, HostedCluster.Spec.Platform.Azure.Location. Details on how to create a Disk Encryption Set can be found here: https://learn.microsoft.com/en-us/azure/virtual-machines/disks-enable-customer-managed-keys-portal#set-up-your-disk-encryption-set", "long-summary": "https://learn.microsoft.com/en-us/azure/virtual-machines/disks-enable-customer-managed-keys-portal#set-up-your-disk-encryption-set"}, + ) + _args_schema.disk_size = AAZIntArg( + options=["--disk-size"], + arg_group="OS Disk", + help="The OS disk size in GiB. Maximum is 4095 GiB for Managed disks. For Ephemeral disks, the maximum is 2040 GiB; Azure may enforce a lower effective limit based on the selected VM size's local cache, temp, or NVMe capacity.", + default=64, + fmt=AAZIntArgFormat( + maximum=4095, + minimum=64, + ), + ) + + # define Arg Group "Platform" + + _args_schema = cls._args_schema + _args_schema.availability_zone = AAZStrArg( + options=["--availability-zone"], + arg_group="Platform", + help={"short-summary": "The availability zone for the node pool.", "long-summary": "Please read the documentation to see which regions support availability zones - https://learn.microsoft.com/en-us/azure/availability-zones/az-overview"}, + ) + _args_schema.encryption_at_host = AAZBoolArg( + options=["--encryption-at-host"], + arg_group="Platform", + help={"short-summary": "Whether to enable host based OS and data drive encryption. - https://learn.microsoft.com/en-us/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data", "long-summary": "https://learn.microsoft.com/en-us/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data"}, + default=False, + ) + _args_schema.subnet_id = AAZResourceIdArg( + options=["--subnet-id"], + arg_group="Platform", + help="The Azure resource ID of the worker subnet. Note that a subnet cannot be reused between ARO-HCP Clusters.", + ) + _args_schema.vm_size = AAZStrArg( + options=["--vm-size"], + arg_group="Platform", + help="The VM size according to the documentation: - https://learn.microsoft.com/en-us/azure/virtual-machines/sizes", + ) + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.auto_repair = AAZBoolArg( + options=["--auto-repair"], + arg_group="Properties", + help="Auto-repair", + default=True, + ) + _args_schema.labels = AAZListArg( + options=["--labels"], + arg_group="Properties", + help="Kubernetes labels to propagate to the NodePool Nodes. Note that when the labels are updated this is only applied to newly create nodes in the NodePool, existing node labels remain unchanged.", + ) + _args_schema.node_drain_timeout = AAZIntArg( + options=["--node-drain-timeout"], + arg_group="Properties", + help={"short-summary": "nodeDrainTimeoutMinutes is the grace period for how long Pod Disruption Budget-protected workloads will be respected during any node draining operation. After this grace period, any workloads protected by Pod Disruption Budgets that have not been successfully drained from a node will be forcibly evicted. This is especially relevant to cluster upgrades. Valid values are from 0 to 10080 minutes (1 week) . 0 means that the NodePool can be drained without any time limitation. If unset the cluster nodeDrainTimeoutMinutes value is used as a default.", "long-summary": "Valid values are from 0 to 10080 minutes (1 week). 0 means that the NodePool can be drained without any time limitation. If unset the cluster value is used as a default."}, + ) + _args_schema.replicas = AAZIntArg( + options=["--replicas"], + arg_group="Properties", + help="The number of worker nodes, it cannot be used together with autoscaling. Validation: - Minimum: 0 - Maximum: 200 (only when availabilityZone is not specified) - No maximum when availabilityZone is specified", + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.taints = AAZListArg( + options=["--taints"], + arg_group="Properties", + help="Taints for the nodes.", + ) + + labels = cls._args_schema.labels + labels.Element = AAZObjectArg() + + _element = cls._args_schema.labels.Element + _element.key = AAZStrArg( + options=["key"], + help="The key of the label", + required=True, + ) + _element.value = AAZStrArg( + options=["value"], + help="The value of the label", + ) + + taints = cls._args_schema.taints + taints.Element = AAZObjectArg() + + _element = cls._args_schema.taints.Element + _element.effect = AAZStrArg( + options=["effect"], + help="The effect of the taint", + required=True, + enum={"NoExecute": "NoExecute", "NoSchedule": "NoSchedule", "PreferNoSchedule": "PreferNoSchedule"}, + ) + _element.key = AAZStrArg( + options=["key"], + help="The key of the taint", + required=True, + fmt=AAZStrArgFormat( + max_length=316, + min_length=1, + ), + ) + _element.value = AAZStrArg( + options=["value"], + help="The value of the taint", + fmt=AAZStrArgFormat( + max_length=63, + ), + ) + + # define Arg Group "Resource" + + _args_schema = cls._args_schema + _args_schema.location = AAZResourceLocationArg( + arg_group="Resource", + help="The geo-location where the resource lives", + required=True, + fmt=AAZResourceLocationArgFormat( + resource_group_arg="resource_group", + ), + ) + _args_schema.tags = AAZDictArg( + options=["--tags"], + arg_group="Resource", + help="Resource tags.", + ) + + tags = cls._args_schema.tags + tags.Element = AAZStrArg() + + # define Arg Group "Version" + + _args_schema = cls._args_schema + _args_schema.channel_group = AAZStrArg( + options=["--channel-group"], + arg_group="Version", + help="ChannelGroup is the name of the set to which this version belongs. Each version belongs to only a single set. If not specified, the default value is 'stable'.", + ) + _args_schema.version = AAZStrArg( + options=["--version"], + arg_group="Version", + help="ID is the desired X.Y version of the cluster control plane.", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.NodePoolsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class NodePoolsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/nodePools/{nodePoolName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "nodePoolName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("location", AAZStrType, ".location", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("properties", AAZObjectType) + _builder.set_prop("tags", AAZDictType, ".tags") + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("autoRepair", AAZBoolType, ".auto_repair") + properties.set_prop("autoScaling", AAZObjectType) + properties.set_prop("labels", AAZListType, ".labels") + properties.set_prop("nodeDrainTimeoutMinutes", AAZIntType, ".node_drain_timeout") + properties.set_prop("platform", AAZObjectType, ".", typ_kwargs={"flags": {"required": True}}) + properties.set_prop("replicas", AAZIntType, ".replicas") + properties.set_prop("taints", AAZListType, ".taints") + properties.set_prop("version", AAZObjectType) + + auto_scaling = _builder.get(".properties.autoScaling") + if auto_scaling is not None: + auto_scaling.set_prop("max", AAZIntType, ".max_replicas") + auto_scaling.set_prop("min", AAZIntType, ".min_replicas") + + labels = _builder.get(".properties.labels") + if labels is not None: + labels.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.labels[]") + if _elements is not None: + _elements.set_prop("key", AAZStrType, ".key", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("value", AAZStrType, ".value") + + platform = _builder.get(".properties.platform") + if platform is not None: + platform.set_prop("availabilityZone", AAZStrType, ".availability_zone") + platform.set_prop("enableEncryptionAtHost", AAZBoolType, ".encryption_at_host") + platform.set_prop("osDisk", AAZObjectType) + platform.set_prop("subnetId", AAZStrType, ".subnet_id") + platform.set_prop("vmSize", AAZStrType, ".vm_size", typ_kwargs={"flags": {"required": True}}) + + os_disk = _builder.get(".properties.platform.osDisk") + if os_disk is not None: + os_disk.set_prop("diskStorageAccountType", AAZStrType, ".disk_storage_account_type") + os_disk.set_prop("diskType", AAZStrType, ".disk_type") + os_disk.set_prop("encryptionSetId", AAZStrType, ".disk_encryption_set") + os_disk.set_prop("sizeGiB", AAZIntType, ".disk_size") + + taints = _builder.get(".properties.taints") + if taints is not None: + taints.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.taints[]") + if _elements is not None: + _elements.set_prop("effect", AAZStrType, ".effect", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("key", AAZStrType, ".key", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("value", AAZStrType, ".value") + + version = _builder.get(".properties.version") + if version is not None: + version.set_prop("channelGroup", AAZStrType, ".channel_group") + version.set_prop("id", AAZStrType, ".version", typ_kwargs={"flags": {"required": True}}) + + tags = _builder.get(".tags") + if tags is not None: + tags.set_elements(AAZStrType, ".") + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + + _schema_on_200_201 = cls._schema_on_200_201 + _schema_on_200_201.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.identity = AAZIdentityObjectType() + _schema_on_200_201.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200_201.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200_201.properties = AAZObjectType() + _schema_on_200_201.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200_201.tags = AAZDictType() + _schema_on_200_201.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200_201.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200_201.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200_201.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200_201.properties + properties.auto_repair = AAZBoolType( + serialized_name="autoRepair", + ) + properties.auto_scaling = AAZObjectType( + serialized_name="autoScaling", + ) + properties.labels = AAZListType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.replicas = AAZIntType() + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.taints = AAZListType() + properties.version = AAZObjectType() + + auto_scaling = cls._schema_on_200_201.properties.auto_scaling + auto_scaling.max = AAZIntType() + auto_scaling.min = AAZIntType() + + labels = cls._schema_on_200_201.properties.labels + labels.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.labels.Element + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + platform = cls._schema_on_200_201.properties.platform + platform.availability_zone = AAZStrType( + serialized_name="availabilityZone", + ) + platform.enable_encryption_at_host = AAZBoolType( + serialized_name="enableEncryptionAtHost", + ) + platform.os_disk = AAZObjectType( + serialized_name="osDisk", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + ) + platform.vm_size = AAZStrType( + serialized_name="vmSize", + flags={"required": True}, + ) + + os_disk = cls._schema_on_200_201.properties.platform.os_disk + os_disk.disk_storage_account_type = AAZStrType( + serialized_name="diskStorageAccountType", + ) + os_disk.disk_type = AAZStrType( + serialized_name="diskType", + ) + os_disk.encryption_set_id = AAZStrType( + serialized_name="encryptionSetId", + ) + os_disk.size_gi_b = AAZIntType( + serialized_name="sizeGiB", + ) + + status = cls._schema_on_200_201.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200_201.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200_201.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + taints = cls._schema_on_200_201.properties.taints + taints.Element = AAZObjectType() + + _element = cls._schema_on_200_201.properties.taints.Element + _element.effect = AAZStrType( + flags={"required": True}, + ) + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + version = cls._schema_on_200_201.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200_201.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200_201.tags + tags.Element = AAZStrType() + + return cls._schema_on_200_201 + + +class _CreateHelper: + """Helper class for Create""" + + +__all__ = ["Create"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_delete.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_delete.py new file mode 100644 index 00000000000..4405fc2f93b --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_delete.py @@ -0,0 +1,179 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster nodepool delete", + confirmation="Are you sure you want to perform this operation?", +) +class Delete(AAZCommand): + """Delete an Azure Red Hat OpenShift with hosted control plane node pool + + :example: Delete a node pool + az aro hcp cluster nodepool delete --resource-group MyResourceGroup --cluster-name MyCluster --name MyNodePool --yes + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/nodepools/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, None) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The Name of the Node Pool", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + yield self.NodePoolsDelete(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + class NodePoolsDelete(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [204]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_204, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "location"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/nodePools/{nodePoolName}", + **self.url_parameters + ) + + @property + def method(self): + return "DELETE" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "nodePoolName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + def on_204(self, session): + pass + + def on_200_201(self, session): + pass + + +class _DeleteHelper: + """Helper class for Delete""" + + +__all__ = ["Delete"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_list.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_list.py new file mode 100644 index 00000000000..9a4872389c2 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_list.py @@ -0,0 +1,380 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster nodepool list", +) +class List(AAZCommand): + """List Azure Red Hat OpenShift with hosted control plane node pools + + :example: List node pools of a cluster + az aro hcp cluster nodepool list --resource-group MyResourceGroup --cluster-name MyCluster + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/nodepools", "2026-10-01"], + ] + } + + AZ_SUPPORT_PAGINATION = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_paging(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.NodePoolsListByParent(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance.value, client_flatten=True) + next_link = self.deserialize_output(self.ctx.vars.instance.next_link) + return result, next_link + + class NodePoolsListByParent(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/nodePools", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.next_link = AAZStrType( + serialized_name="nextLink", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.id = AAZStrType( + flags={"read_only": True}, + ) + _element.identity = AAZIdentityObjectType() + _element.location = AAZStrType( + flags={"required": True}, + ) + _element.name = AAZStrType( + flags={"read_only": True}, + ) + _element.properties = AAZObjectType() + _element.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _element.tags = AAZDictType() + _element.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.value.Element.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.value.Element.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.value.Element.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.value.Element.properties + properties.auto_repair = AAZBoolType( + serialized_name="autoRepair", + ) + properties.auto_scaling = AAZObjectType( + serialized_name="autoScaling", + ) + properties.labels = AAZListType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.replicas = AAZIntType() + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.taints = AAZListType() + properties.version = AAZObjectType() + + auto_scaling = cls._schema_on_200.value.Element.properties.auto_scaling + auto_scaling.max = AAZIntType() + auto_scaling.min = AAZIntType() + + labels = cls._schema_on_200.value.Element.properties.labels + labels.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.labels.Element + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + platform = cls._schema_on_200.value.Element.properties.platform + platform.availability_zone = AAZStrType( + serialized_name="availabilityZone", + ) + platform.enable_encryption_at_host = AAZBoolType( + serialized_name="enableEncryptionAtHost", + ) + platform.os_disk = AAZObjectType( + serialized_name="osDisk", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + ) + platform.vm_size = AAZStrType( + serialized_name="vmSize", + flags={"required": True}, + ) + + os_disk = cls._schema_on_200.value.Element.properties.platform.os_disk + os_disk.disk_storage_account_type = AAZStrType( + serialized_name="diskStorageAccountType", + ) + os_disk.disk_type = AAZStrType( + serialized_name="diskType", + ) + os_disk.encryption_set_id = AAZStrType( + serialized_name="encryptionSetId", + ) + os_disk.size_gi_b = AAZIntType( + serialized_name="sizeGiB", + ) + + status = cls._schema_on_200.value.Element.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200.value.Element.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.value.Element.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + taints = cls._schema_on_200.value.Element.properties.taints + taints.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element.properties.taints.Element + _element.effect = AAZStrType( + flags={"required": True}, + ) + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + version = cls._schema_on_200.value.Element.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.value.Element.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.value.Element.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _ListHelper: + """Helper class for List""" + + +__all__ = ["List"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_show.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_show.py new file mode 100644 index 00000000000..b29d63c213d --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_show.py @@ -0,0 +1,381 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster nodepool show", +) +class Show(AAZCommand): + """Get an Azure Red Hat OpenShift with hosted control plane node pool + + :example: Show a node pool + az aro hcp cluster nodepool show --resource-group MyResourceGroup --cluster-name MyCluster --name MyNodePool + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/nodepools/{}", "2026-10-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The Name of the Node Pool", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.NodePoolsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class NodePoolsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/nodePools/{nodePoolName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "nodePoolName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.tags = AAZDictType() + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.auto_repair = AAZBoolType( + serialized_name="autoRepair", + ) + properties.auto_scaling = AAZObjectType( + serialized_name="autoScaling", + ) + properties.labels = AAZListType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.replicas = AAZIntType() + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.taints = AAZListType() + properties.version = AAZObjectType() + + auto_scaling = cls._schema_on_200.properties.auto_scaling + auto_scaling.max = AAZIntType() + auto_scaling.min = AAZIntType() + + labels = cls._schema_on_200.properties.labels + labels.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.labels.Element + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + platform = cls._schema_on_200.properties.platform + platform.availability_zone = AAZStrType( + serialized_name="availabilityZone", + ) + platform.enable_encryption_at_host = AAZBoolType( + serialized_name="enableEncryptionAtHost", + ) + platform.os_disk = AAZObjectType( + serialized_name="osDisk", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + ) + platform.vm_size = AAZStrType( + serialized_name="vmSize", + flags={"required": True}, + ) + + os_disk = cls._schema_on_200.properties.platform.os_disk + os_disk.disk_storage_account_type = AAZStrType( + serialized_name="diskStorageAccountType", + ) + os_disk.disk_type = AAZStrType( + serialized_name="diskType", + ) + os_disk.encryption_set_id = AAZStrType( + serialized_name="encryptionSetId", + ) + os_disk.size_gi_b = AAZIntType( + serialized_name="sizeGiB", + ) + + status = cls._schema_on_200.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + taints = cls._schema_on_200.properties.taints + taints.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.taints.Element + _element.effect = AAZStrType( + flags={"required": True}, + ) + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + version = cls._schema_on_200.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _ShowHelper: + """Helper class for Show""" + + +__all__ = ["Show"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_update.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_update.py new file mode 100644 index 00000000000..4188067ab44 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_update.py @@ -0,0 +1,735 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster nodepool update", +) +class Update(AAZCommand): + """Update an Azure Red Hat OpenShift with hosted control plane node pool + + :example: Scale a node pool + az aro hcp cluster nodepool update --resource-group MyResourceGroup --cluster-name MyCluster --name MyNodePool --replicas 5 + """ + + _aaz_info = { + "version": "2026-10-01", + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/nodepools/{}", "2026-10-01"], + ] + } + + AZ_SUPPORT_NO_WAIT = True + + AZ_SUPPORT_GENERIC_UPDATE = True + + def _handler(self, command_args): + super()._handler(command_args) + return self.build_lro_poller(self._execute_operations, self._output) + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The Name of the Node Pool", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + + # define Arg Group "Autoscaling" + + _args_schema = cls._args_schema + _args_schema.max_replicas = AAZIntArg( + options=["--max-replicas"], + arg_group="Autoscaling", + help="The maximum number of nodes in the node pool. Validation: - Minimum: 0 (must be >= min) - Maximum: 200 (only when availabilityZone is not specified) - No maximum when availabilityZone is specified", + nullable=True, + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.min_replicas = AAZIntArg( + options=["--min-replicas"], + arg_group="Autoscaling", + help="The minimum number of nodes in the node pool. Validation: - Minimum: 0 - Maximum: 200 (only when availabilityZone is not specified) - No maximum when availabilityZone is specified", + nullable=True, + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + + # define Arg Group "Identity" + + # define Arg Group "Properties" + + _args_schema = cls._args_schema + _args_schema.labels = AAZListArg( + options=["--labels"], + arg_group="Properties", + help="Kubernetes labels to propagate to the NodePool Nodes. Note that when the labels are updated this is only applied to newly create nodes in the NodePool, existing node labels remain unchanged.", + nullable=True, + ) + _args_schema.node_drain_timeout = AAZIntArg( + options=["--node-drain-timeout"], + arg_group="Properties", + help={"short-summary": "nodeDrainTimeoutMinutes is the grace period for how long Pod Disruption Budget-protected workloads will be respected during any node draining operation. After this grace period, any workloads protected by Pod Disruption Budgets that have not been successfully drained from a node will be forcibly evicted. This is especially relevant to cluster upgrades. Valid values are from 0 to 10080 minutes (1 week) . 0 means that the NodePool can be drained without any time limitation. If unset the cluster nodeDrainTimeoutMinutes value is used as a default.", "long-summary": "Valid values are from 0 to 10080 minutes (1 week). 0 means that the NodePool can be drained without any time limitation. If unset the cluster value is used as a default."}, + nullable=True, + ) + _args_schema.replicas = AAZIntArg( + options=["--replicas"], + arg_group="Properties", + help="The number of worker nodes, it cannot be used together with autoscaling. Validation: - Minimum: 0 - Maximum: 200 (only when availabilityZone is not specified) - No maximum when availabilityZone is specified", + nullable=True, + fmt=AAZIntArgFormat( + minimum=0, + ), + ) + _args_schema.taints = AAZListArg( + options=["--taints"], + arg_group="Properties", + help="Taints for the nodes.", + nullable=True, + ) + + labels = cls._args_schema.labels + labels.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_schema.labels.Element + _element.key = AAZStrArg( + options=["key"], + help="The key of the label", + ) + _element.value = AAZStrArg( + options=["value"], + help="The value of the label", + nullable=True, + ) + + taints = cls._args_schema.taints + taints.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_schema.taints.Element + _element.effect = AAZStrArg( + options=["effect"], + help="The effect of the taint", + enum={"NoExecute": "NoExecute", "NoSchedule": "NoSchedule", "PreferNoSchedule": "PreferNoSchedule"}, + ) + _element.key = AAZStrArg( + options=["key"], + help="The key of the taint", + fmt=AAZStrArgFormat( + max_length=316, + min_length=1, + ), + ) + _element.value = AAZStrArg( + options=["value"], + help="The value of the taint", + nullable=True, + fmt=AAZStrArgFormat( + max_length=63, + ), + ) + + # define Arg Group "Resource" + + _args_schema = cls._args_schema + _args_schema.tags = AAZDictArg( + options=["--tags"], + arg_group="Resource", + help="Resource tags.", + nullable=True, + ) + + tags = cls._args_schema.tags + tags.Element = AAZStrArg( + nullable=True, + ) + + # define Arg Group "Version" + + _args_schema = cls._args_schema + _args_schema.channel_group = AAZStrArg( + options=["--channel-group"], + arg_group="Version", + help="ChannelGroup is the name of the set to which this version belongs. Each version belongs to only a single set. If not specified, the default value is 'stable'.", + nullable=True, + ) + _args_schema.version = AAZStrArg( + options=["--version"], + arg_group="Version", + help="ID is the desired X.Y version of the cluster control plane.", + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.NodePoolsGet(ctx=self.ctx)() + self.pre_instance_update(self.ctx.vars.instance) + self.InstanceUpdateByJson(ctx=self.ctx)() + self.InstanceUpdateByGeneric(ctx=self.ctx)() + self.post_instance_update(self.ctx.vars.instance) + yield self.NodePoolsCreateOrUpdate(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + @register_callback + def pre_instance_update(self, instance): + pass + + @register_callback + def post_instance_update(self, instance): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class NodePoolsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/nodePools/{nodePoolName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "nodePoolName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + _UpdateHelper._build_schema_node_pool_read(cls._schema_on_200) + + return cls._schema_on_200 + + class NodePoolsCreateOrUpdate(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [202]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + if session.http_response.status_code in [200, 201]: + return self.client.build_lro_polling( + self.ctx.args.no_wait, + session, + self.on_200_201, + self.on_error, + lro_options={"final-state-via": "azure-async-operation"}, + path_format_arguments=self.url_parameters, + ) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/nodePools/{nodePoolName}", + **self.url_parameters + ) + + @property + def method(self): + return "PUT" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "nodePoolName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + value=self.ctx.vars.instance, + ) + + return self.serialize_content(_content_value) + + def on_200_201(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200_201 + ) + + _schema_on_200_201 = None + + @classmethod + def _build_schema_on_200_201(cls): + if cls._schema_on_200_201 is not None: + return cls._schema_on_200_201 + + cls._schema_on_200_201 = AAZObjectType() + _UpdateHelper._build_schema_node_pool_read(cls._schema_on_200_201) + + return cls._schema_on_200_201 + + class InstanceUpdateByJson(AAZJsonInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance(self.ctx.vars.instance) + + def _update_instance(self, instance): + _instance_value, _builder = self.new_content_builder( + self.ctx.args, + value=instance, + typ=AAZObjectType + ) + _builder.set_prop("identity", AAZIdentityObjectType) + _builder.set_prop("properties", AAZObjectType) + _builder.set_prop("tags", AAZDictType, ".tags") + + properties = _builder.get(".properties") + if properties is not None: + properties.set_prop("autoScaling", AAZObjectType) + properties.set_prop("labels", AAZListType, ".labels") + properties.set_prop("nodeDrainTimeoutMinutes", AAZIntType, ".node_drain_timeout") + properties.set_prop("replicas", AAZIntType, ".replicas") + properties.set_prop("taints", AAZListType, ".taints") + properties.set_prop("version", AAZObjectType) + + auto_scaling = _builder.get(".properties.autoScaling") + if auto_scaling is not None: + auto_scaling.set_prop("max", AAZIntType, ".max_replicas") + auto_scaling.set_prop("min", AAZIntType, ".min_replicas") + + labels = _builder.get(".properties.labels") + if labels is not None: + labels.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.labels[]") + if _elements is not None: + _elements.set_prop("key", AAZStrType, ".key", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("value", AAZStrType, ".value") + + taints = _builder.get(".properties.taints") + if taints is not None: + taints.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".properties.taints[]") + if _elements is not None: + _elements.set_prop("effect", AAZStrType, ".effect", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("key", AAZStrType, ".key", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("value", AAZStrType, ".value") + + version = _builder.get(".properties.version") + if version is not None: + version.set_prop("channelGroup", AAZStrType, ".channel_group") + version.set_prop("id", AAZStrType, ".version", typ_kwargs={"flags": {"required": True}}) + + tags = _builder.get(".tags") + if tags is not None: + tags.set_elements(AAZStrType, ".") + + return _instance_value + + class InstanceUpdateByGeneric(AAZGenericInstanceUpdateOperation): + + def __call__(self, *args, **kwargs): + self._update_instance_by_generic( + self.ctx.vars.instance, + self.ctx.generic_update_args + ) + + +class _UpdateHelper: + """Helper class for Update""" + + _schema_node_pool_read = None + + @classmethod + def _build_schema_node_pool_read(cls, _schema): + if cls._schema_node_pool_read is not None: + _schema.id = cls._schema_node_pool_read.id + _schema.identity = cls._schema_node_pool_read.identity + _schema.location = cls._schema_node_pool_read.location + _schema.name = cls._schema_node_pool_read.name + _schema.properties = cls._schema_node_pool_read.properties + _schema.system_data = cls._schema_node_pool_read.system_data + _schema.tags = cls._schema_node_pool_read.tags + _schema.type = cls._schema_node_pool_read.type + return + + cls._schema_node_pool_read = _schema_node_pool_read = AAZObjectType() + + node_pool_read = _schema_node_pool_read + node_pool_read.id = AAZStrType( + flags={"read_only": True}, + ) + node_pool_read.identity = AAZIdentityObjectType() + node_pool_read.location = AAZStrType( + flags={"required": True}, + ) + node_pool_read.name = AAZStrType( + flags={"read_only": True}, + ) + node_pool_read.properties = AAZObjectType() + node_pool_read.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + node_pool_read.tags = AAZDictType() + node_pool_read.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = _schema_node_pool_read.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = _schema_node_pool_read.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = _schema_node_pool_read.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = _schema_node_pool_read.properties + properties.auto_repair = AAZBoolType( + serialized_name="autoRepair", + ) + properties.auto_scaling = AAZObjectType( + serialized_name="autoScaling", + ) + properties.labels = AAZListType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.replicas = AAZIntType() + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.taints = AAZListType() + properties.version = AAZObjectType() + + auto_scaling = _schema_node_pool_read.properties.auto_scaling + auto_scaling.max = AAZIntType() + auto_scaling.min = AAZIntType() + + labels = _schema_node_pool_read.properties.labels + labels.Element = AAZObjectType() + + _element = _schema_node_pool_read.properties.labels.Element + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + platform = _schema_node_pool_read.properties.platform + platform.availability_zone = AAZStrType( + serialized_name="availabilityZone", + ) + platform.enable_encryption_at_host = AAZBoolType( + serialized_name="enableEncryptionAtHost", + ) + platform.os_disk = AAZObjectType( + serialized_name="osDisk", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + ) + platform.vm_size = AAZStrType( + serialized_name="vmSize", + flags={"required": True}, + ) + + os_disk = _schema_node_pool_read.properties.platform.os_disk + os_disk.disk_storage_account_type = AAZStrType( + serialized_name="diskStorageAccountType", + ) + os_disk.disk_type = AAZStrType( + serialized_name="diskType", + ) + os_disk.encryption_set_id = AAZStrType( + serialized_name="encryptionSetId", + ) + os_disk.size_gi_b = AAZIntType( + serialized_name="sizeGiB", + ) + + status = _schema_node_pool_read.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = _schema_node_pool_read.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = _schema_node_pool_read.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = _schema_node_pool_read.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = _schema_node_pool_read.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + taints = _schema_node_pool_read.properties.taints + taints.Element = AAZObjectType() + + _element = _schema_node_pool_read.properties.taints.Element + _element.effect = AAZStrType( + flags={"required": True}, + ) + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + version = _schema_node_pool_read.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = _schema_node_pool_read.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = _schema_node_pool_read.tags + tags.Element = AAZStrType() + + _schema.id = cls._schema_node_pool_read.id + _schema.identity = cls._schema_node_pool_read.identity + _schema.location = cls._schema_node_pool_read.location + _schema.name = cls._schema_node_pool_read.name + _schema.properties = cls._schema_node_pool_read.properties + _schema.system_data = cls._schema_node_pool_read.system_data + _schema.tags = cls._schema_node_pool_read.tags + _schema.type = cls._schema_node_pool_read.type + + +__all__ = ["Update"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_wait.py b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_wait.py new file mode 100644 index 00000000000..d2e91d7beec --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/aaz/latest/aro/hcp/cluster/nodepool/_wait.py @@ -0,0 +1,377 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "aro hcp cluster nodepool wait", +) +class Wait(AAZWaitCommand): + """Place the CLI in a waiting state until a condition is met. + """ + + _aaz_info = { + "resources": [ + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.redhatopenshift/hcpopenshiftclusters/{}/nodepools/{}", "2026-10-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "" + + _args_schema = cls._args_schema + _args_schema.cluster_name = AAZStrArg( + options=["-c", "--cluster-name"], + help="The name of the Azure Red Hat OpenShift with hosted control plane cluster", + required=True, + id_part="name", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,52}[a-zA-Z0-9])?$", + ), + ) + _args_schema.name = AAZStrArg( + options=["-n", "--name"], + help="The Name of the Node Pool", + required=True, + id_part="child_name_1", + fmt=AAZStrArgFormat( + pattern="^[a-zA-Z]([-a-zA-Z0-9]{0,13}[a-zA-Z0-9])?$", + ), + ) + _args_schema.resource_group = AAZResourceGroupNameArg( + required=True, + ) + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.NodePoolsGet(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=False) + return result + + class NodePoolsGet(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/{hcpOpenShiftClusterName}/nodePools/{nodePoolName}", + **self.url_parameters + ) + + @property + def method(self): + return "GET" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def url_parameters(self): + parameters = { + **self.serialize_url_param( + "hcpOpenShiftClusterName", self.ctx.args.cluster_name, + required=True, + ), + **self.serialize_url_param( + "nodePoolName", self.ctx.args.name, + required=True, + ), + **self.serialize_url_param( + "resourceGroupName", self.ctx.args.resource_group, + required=True, + ), + **self.serialize_url_param( + "subscriptionId", self.ctx.subscription_id, + required=True, + ), + } + return parameters + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2026-10-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.id = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.identity = AAZIdentityObjectType() + _schema_on_200.location = AAZStrType( + flags={"required": True}, + ) + _schema_on_200.name = AAZStrType( + flags={"read_only": True}, + ) + _schema_on_200.properties = AAZObjectType() + _schema_on_200.system_data = AAZObjectType( + serialized_name="systemData", + flags={"read_only": True}, + ) + _schema_on_200.tags = AAZDictType() + _schema_on_200.type = AAZStrType( + flags={"read_only": True}, + ) + + identity = cls._schema_on_200.identity + identity.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + identity.tenant_id = AAZStrType( + serialized_name="tenantId", + flags={"read_only": True}, + ) + identity.type = AAZStrType( + flags={"required": True}, + ) + identity.user_assigned_identities = AAZDictType( + serialized_name="userAssignedIdentities", + ) + + user_assigned_identities = cls._schema_on_200.identity.user_assigned_identities + user_assigned_identities.Element = AAZObjectType( + nullable=True, + ) + + _element = cls._schema_on_200.identity.user_assigned_identities.Element + _element.client_id = AAZStrType( + serialized_name="clientId", + flags={"read_only": True}, + ) + _element.principal_id = AAZStrType( + serialized_name="principalId", + flags={"read_only": True}, + ) + + properties = cls._schema_on_200.properties + properties.auto_repair = AAZBoolType( + serialized_name="autoRepair", + ) + properties.auto_scaling = AAZObjectType( + serialized_name="autoScaling", + ) + properties.labels = AAZListType() + properties.node_drain_timeout_minutes = AAZIntType( + serialized_name="nodeDrainTimeoutMinutes", + ) + properties.platform = AAZObjectType( + flags={"required": True}, + ) + properties.provisioning_state = AAZStrType( + serialized_name="provisioningState", + flags={"read_only": True}, + ) + properties.replicas = AAZIntType() + properties.status = AAZObjectType( + flags={"read_only": True}, + ) + properties.taints = AAZListType() + properties.version = AAZObjectType() + + auto_scaling = cls._schema_on_200.properties.auto_scaling + auto_scaling.max = AAZIntType() + auto_scaling.min = AAZIntType() + + labels = cls._schema_on_200.properties.labels + labels.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.labels.Element + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + platform = cls._schema_on_200.properties.platform + platform.availability_zone = AAZStrType( + serialized_name="availabilityZone", + ) + platform.enable_encryption_at_host = AAZBoolType( + serialized_name="enableEncryptionAtHost", + ) + platform.os_disk = AAZObjectType( + serialized_name="osDisk", + ) + platform.subnet_id = AAZStrType( + serialized_name="subnetId", + ) + platform.vm_size = AAZStrType( + serialized_name="vmSize", + flags={"required": True}, + ) + + os_disk = cls._schema_on_200.properties.platform.os_disk + os_disk.disk_storage_account_type = AAZStrType( + serialized_name="diskStorageAccountType", + ) + os_disk.disk_type = AAZStrType( + serialized_name="diskType", + ) + os_disk.encryption_set_id = AAZStrType( + serialized_name="encryptionSetId", + ) + os_disk.size_gi_b = AAZIntType( + serialized_name="sizeGiB", + ) + + status = cls._schema_on_200.properties.status + status.active_versions = AAZListType( + serialized_name="activeVersions", + flags={"read_only": True}, + ) + status.conditions = AAZListType( + flags={"read_only": True}, + ) + + active_versions = cls._schema_on_200.properties.status.active_versions + active_versions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.active_versions.Element + _element.version = AAZStrType( + flags={"read_only": True}, + ) + + conditions = cls._schema_on_200.properties.status.conditions + conditions.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.status.conditions.Element + _element.last_transition_time = AAZStrType( + serialized_name="lastTransitionTime", + flags={"read_only": True}, + ) + _element.message = AAZStrType( + flags={"read_only": True}, + ) + _element.reason = AAZStrType( + flags={"read_only": True}, + ) + _element.status = AAZStrType( + flags={"read_only": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + taints = cls._schema_on_200.properties.taints + taints.Element = AAZObjectType() + + _element = cls._schema_on_200.properties.taints.Element + _element.effect = AAZStrType( + flags={"required": True}, + ) + _element.key = AAZStrType( + flags={"required": True}, + ) + _element.value = AAZStrType() + + version = cls._schema_on_200.properties.version + version.channel_group = AAZStrType( + serialized_name="channelGroup", + ) + version.id = AAZStrType( + flags={"required": True}, + ) + + system_data = cls._schema_on_200.system_data + system_data.created_at = AAZStrType( + serialized_name="createdAt", + ) + system_data.created_by = AAZStrType( + serialized_name="createdBy", + ) + system_data.created_by_type = AAZStrType( + serialized_name="createdByType", + ) + system_data.last_modified_at = AAZStrType( + serialized_name="lastModifiedAt", + ) + system_data.last_modified_by = AAZStrType( + serialized_name="lastModifiedBy", + ) + system_data.last_modified_by_type = AAZStrType( + serialized_name="lastModifiedByType", + ) + + tags = cls._schema_on_200.tags + tags.Element = AAZStrType() + + return cls._schema_on_200 + + +class _WaitHelper: + """Helper class for Wait""" + + +__all__ = ["Wait"] diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/__init__.py similarity index 89% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/__init__.py rename to src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/__init__.py index dbe3d10ce7c..5757aea3175 100644 --- a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/__init__.py +++ b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/__init__.py @@ -1,5 +1,6 @@ # -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools # -------------------------------------------------------------------------------------------- -# Licensed under the Apache License 2.0. diff --git a/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_format.py b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_format.py new file mode 100644 index 00000000000..dad7b3055b3 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_format.py @@ -0,0 +1,72 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import collections +import re + + +def _parse_semver(version_str): + match = re.match(r'(\d+)\.(\d+)\.(\d+)', version_str or '') + if match: + return tuple(int(x) for x in match.groups()) + return (0, 0, 0) + + +def _major_minor(version_str): + """Return the "Major.Minor" (X.Y) string for a version name, or '' if unparseable.""" + match = re.match(r'(\d+)\.(\d+)', version_str or '') + if match: + return '{}.{}'.format(*match.groups()) + return '' + + +def _version_row(result): + props = result.get('properties', {}) + return collections.OrderedDict( + Name=result.get('name', ''), + ChannelGroup=props.get('channelGroup', ''), + ) + + +def cluster_show_table_format(result): + return [_cluster_row(result)] + + +def cluster_list_table_format(results): + return [_cluster_row(r) for r in results] + + +def _cluster_row(result): + props = result.get('properties', {}) + version = props.get('version', {}) + api = props.get('api', {}) + return collections.OrderedDict( + Name=result.get('name', ''), + Location=result.get('location', ''), + ResourceGroup=result.get('resourceGroup', ''), + Version=version.get('id', ''), + ProvisioningState=props.get('provisioningState', ''), + ApiServerUrl=api.get('url', ''), + ) + + +def nodepool_show_table_format(result): + return [_nodepool_row(result)] + + +def nodepool_list_table_format(results): + return [_nodepool_row(r) for r in results] + + +def _nodepool_row(result): + props = result.get('properties', {}) + version = props.get('version', {}) + platform = props.get('platform', {}) + return collections.OrderedDict( + Name=result.get('name', ''), + Version=version.get('id', ''), + VmSize=platform.get('vmSize', ''), + ProvisioningState=props.get('provisioningState', ''), + ) diff --git a/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_help.py b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_help.py new file mode 100644 index 00000000000..126d5d00714 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_help.py @@ -0,0 +1,11 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=line-too-long +# pylint: disable=too-many-lines + +from knack.help_files import helps # pylint: disable=unused-import diff --git a/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_kubeconfig.py b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_kubeconfig.py new file mode 100644 index 00000000000..f1d82fde6f0 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_kubeconfig.py @@ -0,0 +1,221 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +# Kubeconfig merge helpers, adapted from azure-cli's acs command module +# (azure/cli/command_modules/acs/custom.py) so that +# `az aro hcp cluster request-credential` merges into an existing kubeconfig +# the same way `az aks get-credentials` does. + +import base64 +import errno +import os +import platform +import stat +import tempfile + +import yaml +from azure.cli.core.azclierror import FileOperationError +from knack.log import get_logger +from knack.prompting import NoTTYException, prompt_y_n +from knack.util import CLIError + +logger = get_logger(__name__) + + +def load_kubernetes_configuration(filename): + try: + with open(filename, encoding="utf-8") as stream: + return yaml.safe_load(stream) + except OSError as ex: + if getattr(ex, "errno", 0) == errno.ENOENT: + raise CLIError("{} does not exist".format(filename)) from ex + if getattr(ex, "errno", 0) in (errno.EACCES, errno.EPERM): + raise FileOperationError( + "Permission denied when trying to read {}. " + "Please ensure you have read access to this file, or specify a different file path " + "using the --file/-f argument.".format(filename) + ) from ex + raise + except (yaml.parser.ParserError, UnicodeDecodeError) as ex: + raise CLIError("Error parsing {} ({})".format(filename, str(ex))) from ex + + +def _handle_merge(existing, addition, key, replace): + if not addition.get(key, False): + return + if key not in existing: + raise FileOperationError( + "No such key '{}' in existing config, please confirm whether it is a valid config file. " + "May back up this config file, delete it and retry the command.".format(key) + ) + if not existing.get(key): + existing[key] = addition[key] + return + + for i in addition[key]: + for j in existing[key]: + if not i.get("name", False) or not j.get("name", False): + continue + if i["name"] == j["name"]: + if replace or i == j: + existing[key].remove(j) + else: + msg = "A different object named {} already exists in your kubeconfig file.\nOverwrite?" + overwrite = False + try: + overwrite = prompt_y_n(msg.format(i["name"])) + except NoTTYException: + pass + if overwrite: + existing[key].remove(j) + else: + msg = "A different object named {} already exists in {} in your kubeconfig file." + raise CLIError(msg.format(i["name"], key)) + existing[key].append(i) + + +def merge_kubernetes_configurations(existing_file, addition_file, replace, context_name=None): + existing = load_kubernetes_configuration(existing_file) + addition = load_kubernetes_configuration(addition_file) + + if addition is None: + raise CLIError("failed to load additional configuration from {}".format(addition_file)) + + if context_name is not None: + addition["contexts"][0]["name"] = context_name + addition["contexts"][0]["context"]["cluster"] = context_name + addition["clusters"][0]["name"] = context_name + addition["current-context"] = context_name + + if existing is None: + existing = addition + else: + _handle_merge(existing, addition, "clusters", replace) + _handle_merge(existing, addition, "users", replace) + _handle_merge(existing, addition, "contexts", replace) + existing["current-context"] = addition["current-context"] + + # check that ~/.kube/config is only read- and writable by its owner + if platform.system() != "Windows" and not os.path.islink(existing_file): + existing_file_perms = "{:o}".format(stat.S_IMODE(os.lstat(existing_file).st_mode)) + if not existing_file_perms.endswith("600"): + logger.warning( + '%s has permissions "%s".\nIt should be readable and writable only by its owner.', + existing_file, + existing_file_perms, + ) + + # Refuse to write through a symlink + if os.path.islink(existing_file): + raise CLIError( + 'Kubeconfig path "{}" is a symbolic link. ' + "Refusing to write to prevent symlink-following attacks.".format(existing_file) + ) + + # Atomic write: write to a temp file in the same directory, then replace + parent_dir = os.path.dirname(existing_file) or "." + tmp_fd, tmp_path = tempfile.mkstemp(dir=parent_dir) + try: + with os.fdopen(tmp_fd, "w") as stream: + yaml.safe_dump(existing, stream, default_flow_style=False) + # Preserve existing file permissions if available, otherwise default to 0600 + if os.path.exists(existing_file): + existing_mode = stat.S_IMODE(os.stat(existing_file).st_mode) + os.chmod(tmp_path, existing_mode) + else: + os.chmod(tmp_path, 0o600) + os.replace(tmp_path, existing_file) + except Exception as ex: # pylint: disable=broad-except + try: + os.unlink(tmp_path) + except OSError: + pass + if isinstance(ex, OSError) and getattr(ex, "errno", 0) in (errno.EACCES, errno.EPERM, errno.EROFS): + raise FileOperationError( + "Permission denied when trying to write to {}. " + "Please ensure you have write access to this file, or specify a different file path " + "using the --file/-f argument.".format(existing_file) + ) from ex + raise + + current_context = addition.get("current-context", "UNKNOWN") + logger.warning('Merged "%s" as current context in %s', current_context, existing_file) + + +def print_or_merge_credentials(path, kubeconfig, overwrite_existing, context_name): + """Merge an unencrypted kubeconfig into the file at the specified path, or print it to + stdout if the path is "-". + """ + # Special case for printing to stdout + if path == "-": + if context_name is not None: + config = yaml.safe_load(kubeconfig) + config["contexts"][0]["name"] = context_name + config["contexts"][0]["context"]["cluster"] = context_name + config["clusters"][0]["name"] = context_name + config["current-context"] = context_name + kubeconfig = yaml.safe_dump(config, default_flow_style=False) + print(kubeconfig) + return + + # ensure that at least an empty ~/.kube/config exists + directory = os.path.dirname(path) + if directory and not os.path.exists(directory): + try: + os.makedirs(directory) + except OSError as ex: + if ex.errno != errno.EEXIST: + raise + if not os.path.exists(path): + with os.fdopen(os.open(path, os.O_CREAT | os.O_WRONLY, 0o600), "wt"): + pass + + # merge the new kubeconfig into the existing one + fd, temp_path = tempfile.mkstemp() + additional_file = os.fdopen(fd, "w+t") + try: + additional_file.write(kubeconfig) + additional_file.flush() + merge_kubernetes_configurations(path, temp_path, overwrite_existing, context_name) + except yaml.YAMLError as ex: + raise FileOperationError("Failed to merge credentials to kube config file: {}".format(ex)) from ex + finally: + additional_file.close() + os.remove(temp_path) + + +def _generate_admin_credential_request(): + from cryptography import x509 + from cryptography.hazmat.primitives import hashes, serialization + from cryptography.hazmat.primitives.asymmetric import rsa + from cryptography.x509.oid import NameOID + + private_key = rsa.generate_private_key(public_exponent=65537, key_size=4096) + subject = x509.Name([ + x509.NameAttribute(NameOID.COMMON_NAME, "system:customer-break-glass:system-admin"), + x509.NameAttribute(NameOID.ORGANIZATION_NAME, "system:masters"), + ]) + csr = x509.CertificateSigningRequestBuilder().subject_name(subject).sign(private_key, hashes.SHA256()) + + private_key_pem = private_key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.PKCS8, + encryption_algorithm=serialization.NoEncryption(), + ) + csr_pem = csr.public_bytes(serialization.Encoding.PEM).decode("ascii") + return private_key_pem, csr_pem + + +def _embed_private_key(kubeconfig, private_key_pem, user_name): + config = yaml.safe_load(kubeconfig) + user = next(item for item in config["users"] if item["name"] == "admin") + + user["user"]["client-key-data"] = base64.b64encode(private_key_pem).decode("ascii") + user["user"].pop("client-key", None) + user["name"] = user_name + for context in config["contexts"]: + if context["context"].get("user") == "admin": + context["context"]["user"] = user_name + return yaml.safe_dump(config, default_flow_style=False) diff --git a/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_params.py b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_params.py new file mode 100644 index 00000000000..cfcec717c9c --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/_params.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + + +def load_arguments(self, _): # pylint: disable=unused-argument + pass diff --git a/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/commands.py b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/commands.py new file mode 100644 index 00000000000..a93d217c869 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/commands.py @@ -0,0 +1,37 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + +# from azure.cli.core.commands import CliCommandType + + +def load_command_table(self, _): # pylint: disable=unused-argument + with self.command_group("aro hcp cluster"): + from .custom import ClusterCreate, ClusterUpdate, RequestCredential + from ..aaz.latest.aro.hcp.cluster._list import List + from ..aaz.latest.aro.hcp.cluster._show import Show + from ._format import cluster_list_table_format, cluster_show_table_format + self.command_table["aro hcp cluster create"] = ClusterCreate(loader=self) + self.command_table["aro hcp cluster update"] = ClusterUpdate(loader=self) + self.command_table["aro hcp cluster request-credential"] = RequestCredential(loader=self) + self.command_table["aro hcp cluster list"] = List(loader=self, table_transformer=cluster_list_table_format) + self.command_table["aro hcp cluster show"] = Show(loader=self, table_transformer=cluster_show_table_format) + + with self.command_group("aro hcp cluster nodepool"): + from .custom import NodepoolCreate + from ..aaz.latest.aro.hcp.cluster.nodepool._list import List as NodepoolList + from ..aaz.latest.aro.hcp.cluster.nodepool._show import Show as NodepoolShow + from ._format import nodepool_list_table_format, nodepool_show_table_format + self.command_table["aro hcp cluster nodepool create"] = NodepoolCreate(loader=self) + self.command_table["aro hcp cluster nodepool list"] = NodepoolList(loader=self, table_transformer=nodepool_list_table_format) # pylint: disable=line-too-long + self.command_table["aro hcp cluster nodepool show"] = NodepoolShow(loader=self, table_transformer=nodepool_show_table_format) # pylint: disable=line-too-long + + with self.command_group("aro hcp"): + from .custom import GetVersions + self.command_table["aro hcp get-versions"] = GetVersions(loader=self) diff --git a/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/custom.py b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/custom.py new file mode 100644 index 00000000000..4901b0e0787 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/azext_aro_hcp/custom.py @@ -0,0 +1,599 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + +import os + +from azure.cli.core.aaz import ( + AAZBoolArg, + AAZListArg, + AAZObjectArg, + AAZStrArg, + AAZUndefined, + has_value, +) +from azure.cli.core.azclierror import InvalidArgumentValueError +from azure.mgmt.core.tools import is_valid_resource_id, parse_resource_id, resource_id +from knack.log import get_logger + +from ..aaz.latest.aro.hcp.cluster._create import Create as _ClusterCreate +from ..aaz.latest.aro.hcp.cluster._show import Show as _ClusterShow +from ..aaz.latest.aro.hcp.cluster._update import Update as _ClusterUpdate +from ..aaz.latest.aro.hcp.cluster._request_credential import RequestCredential as _RequestCredential +from ..aaz.latest.aro.hcp.cluster.nodepool._create import Create as _NodepoolCreate +from ..aaz.latest.aro.hcp._get_versions import GetVersions as _GetVersions + +logger = get_logger(__name__) + + +# This subclass facilitates the `--IDENTITY-FLAG OPERATOR_NAME IDENTITY` positional argument +# formatting while still maintaining the underlying AAZListArg behavior. +class _AAZIdentityPairArg(AAZListArg): + + def to_cmd_arg(self, name, **kwargs): + arg = super().to_cmd_arg(name, **kwargs) + arg.help = self._help.get("short-summary") + return arg + + def _build_cmd_action(self): + from azure.cli.core.aaz._arg_action import ( # pylint: disable=protected-access + AAZArgActionOperations, + AAZListArgAction, + _ELEMENT_APPEND_KEY, + ) + + class Action(AAZListArgAction): + _schema = self + + def __call__(self, parser, namespace, values, option_string=None): + if len(values) != 2: + raise InvalidArgumentValueError( + "{} expects OPERATOR_NAME IDENTITY.".format(option_string) + ) + if not isinstance(getattr(namespace, self.dest), AAZArgActionOperations): + setattr(namespace, self.dest, AAZArgActionOperations()) + element_action = self._schema.Element._build_cmd_action() + element = element_action.format_data({ + "name": values[0], + "resource_id": values[1], + }) + getattr(namespace, self.dest).add(element, _ELEMENT_APPEND_KEY) + + return Action + + +def _build_operator_identity_arg(options, help_text, required=True): + identity_arg = _AAZIdentityPairArg( + options=options, + arg_group="Identity", + help=help_text, + required=required, + ) + identity_arg.Element = AAZObjectArg() + identity_arg.Element.name = AAZStrArg( + options=["name"], + required=True, + ) + identity_arg.Element.resource_id = AAZStrArg( + options=["resource-id"], + required=True, + ) + return identity_arg + + +def _resolve_identity_resource_id(identity, subnet_id): + if is_valid_resource_id(identity): + return identity + + subnet = parse_resource_id(subnet_id) + subscription = subnet.get("subscription") + resource_group = subnet.get("resource_group") + if not subscription or not resource_group: + raise InvalidArgumentValueError( + "Unable to resolve identity name '{}' because platform.subnetId is not a valid " + "Azure resource ID.".format(identity) + ) + + return resource_id( + subscription=subscription, + resource_group=resource_group, + namespace="Microsoft.ManagedIdentity", + type="userAssignedIdentities", + name=identity, + ) + + +def _operator_identities(argument, option, subnet_id): + identities = {} + for identity in argument: + name = identity.name.to_serialized_data() + if name in identities: + raise InvalidArgumentValueError( + "Duplicate name '{}' supplied for {}.".format(name, option) + ) + identities[name] = _resolve_identity_resource_id( + identity.resource_id.to_serialized_data(), + subnet_id, + ) + return identities + + +def _default_kubeconfig_path(): + return os.path.join(os.path.expanduser("~"), ".kube", "config") + + +class ClusterCreate(_ClusterCreate): + AZ_HELP = { + **_ClusterCreate.AZ_HELP, + "examples": [ + { + "name": "Create a cluster", + "text": "az aro hcp cluster create --resource-group MyResourceGroup --name MyCluster " + "--location eastus --version 4.19 --channel-group stable --network-type OVNKubernetes " + "--subnet-id " + "--vnet-integration-subnet-id " + "--nsg " + "--key-management-mode CustomerManaged " + "--kms-vault-name MyKeyVault " + "--kms-active-key \"{name:MyKey,version:}\" " + "--vault-visibility Public " + "--assign-service-managed-identity " + "--assign-control-plane-operator-identity cluster-api-azure " + " " + "--assign-control-plane-operator-identity control-plane " + " " + "--assign-control-plane-operator-identity cloud-controller-manager " + " " + "--assign-control-plane-operator-identity ingress " + "--assign-control-plane-operator-identity disk-csi-driver " + " " + "--assign-control-plane-operator-identity file-csi-driver " + " " + "--assign-control-plane-operator-identity image-registry " + " " + "--assign-control-plane-operator-identity cloud-network-config " + " " + "--assign-control-plane-operator-identity kms " + "--assign-data-plane-operator-identity disk-csi-driver " + " " + "--assign-data-plane-operator-identity file-csi-driver " + " " + "--assign-data-plane-operator-identity image-registry " + "", + }, + ], + } + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + args_schema = super()._build_arguments_schema(*args, **kwargs) + if hasattr(args_schema, "assign_control_plane_operator_identity"): + return args_schema + + args_schema.key_management_mode._default = AAZUndefined # pylint: disable=protected-access + args_schema.key_management_mode._required = True # pylint: disable=protected-access + args_schema.nsg._required = True # pylint: disable=protected-access + args_schema.version._required = True # pylint: disable=protected-access + args_schema.subnet_id._required = True # pylint: disable=protected-access + args_schema.vnet_integration_subnet_id._required = True # pylint: disable=protected-access + + args_schema.user_assigned_identities._registered = False # pylint: disable=protected-access + args_schema.operators_authentication._registered = False # pylint: disable=protected-access + args_schema.container_registry_managed_identity._registered = False # pylint: disable=protected-access + + args_schema.assign_control_plane_operator_identity = _build_operator_identity_arg( + ["--control-plane-identity", "--assign-control-plane-operator-identity"], + "Assign a user-assigned identity to a control plane operator. " + "Usage: --assign-control-plane-operator-identity OPERATOR_NAME IDENTITY. " + "IDENTITY is a resource ID or the name of an identity in the cluster subnet's resource group. " + "Repeat the argument to assign more identities.", + ) + args_schema.assign_data_plane_operator_identity = _build_operator_identity_arg( + ["--data-plane-identity", "--assign-data-plane-operator-identity"], + "Assign a user-assigned identity to a data plane operator. " + "Usage: --assign-data-plane-operator-identity OPERATOR_NAME IDENTITY. " + "IDENTITY is a resource ID or the name of an identity in the cluster subnet's resource group. " + "Repeat the argument to assign more identities.", + ) + args_schema.assign_service_managed_identity = AAZStrArg( + options=["--service-identity", "--assign-service-managed-identity"], + arg_group="Identity", + help="Assign the user-assigned identity used for service-level actions by resource ID " + "or by name when it is in the cluster subnet's resource group.", + required=True, + ) + args_schema.assign_container_registry_managed_identity = AAZStrArg( + options=[ + "--registry-identity", + "--assign-container-registry-managed-identity", + ], + arg_group="Identity", + help="Assign the user-assigned identity used for container registry image pulls " + "by resource ID or by name when it is in the cluster subnet's resource group.", + ) + return args_schema + + def pre_operations(self): + args = self.ctx.args + subnet_id = args.subnet_id.to_serialized_data() + control_plane = _operator_identities( + args.assign_control_plane_operator_identity, + "--assign-control-plane-operator-identity", + subnet_id, + ) + data_plane = _operator_identities( + args.assign_data_plane_operator_identity, + "--assign-data-plane-operator-identity", + subnet_id, + ) + service = _resolve_identity_resource_id( + args.assign_service_managed_identity.to_serialized_data(), + subnet_id, + ) + if has_value(args.assign_container_registry_managed_identity): + args.container_registry_managed_identity = _resolve_identity_resource_id( + args.assign_container_registry_managed_identity.to_serialized_data(), + subnet_id, + ) + + args.user_assigned_identities = { + resource_id: {} + for resource_id in set(control_plane.values()) | {service} + } + args.operators_authentication = { + "user_assigned_identities": { + "control_plane_operators": control_plane, + "data_plane_operators": data_plane, + "service_managed_identity": service, + } + } + + class HcpOpenShiftClustersCreateOrUpdate(_ClusterCreate.HcpOpenShiftClustersCreateOrUpdate): + + @property + def content(self): + _content = super().content + if _content and "identity" in _content: + _content["identity"]["type"] = "UserAssigned" + elif _content: + _content["identity"] = {"type": "UserAssigned"} + return _content + + +class NodepoolCreate(_NodepoolCreate): + AZ_HELP = { + **_NodepoolCreate.AZ_HELP, + "examples": [ + { + "name": "Create a node pool", + "text": "az aro hcp cluster nodepool create --resource-group MyResourceGroup " + "--cluster-name MyCluster --name MyNodePool --replicas 3 " + "--vm-size Standard_D8s_v3 --version 4.19.0 --channel-group stable", + }, + { + "name": "Create an autoscaling node pool with labels, taints and disk config", + "text": "az aro hcp cluster nodepool create --resource-group MyResourceGroup " + "--cluster-name MyCluster --name MyNodePool --vm-size Standard_D8s_v3 " + "--version 4.19.0 --channel-group stable --min-replicas 1 --max-replicas 5 " + "--disk-size 128 --disk-storage-account-type Premium_LRS --auto-repair true " + "--labels \"[{key:tier,value:frontend}]\" " + "--taints \"[{key:dedicated,value:gpu,effect:NoSchedule}]\"", + }, + ], + } + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + args_schema = super()._build_arguments_schema(*args, **kwargs) + args_schema.vm_size._required = True # pylint: disable=protected-access + args_schema.version._required = True # pylint: disable=protected-access + args_schema.location._registered = False # pylint: disable=protected-access + args_schema.location._required = False # pylint: disable=protected-access + return args_schema + + def pre_operations(self): + args = self.ctx.args + cluster = _ClusterShow(cli_ctx=self.cli_ctx)(command_args={ + "resource_group": args.resource_group.to_serialized_data(), + "name": args.cluster_name.to_serialized_data(), + }) + args.location = cluster["location"] + + +class ClusterUpdate(_ClusterUpdate): + AZ_HELP = { + "type": "command", + "short-summary": "Update an Azure Red Hat OpenShift with hosted control plane cluster", + "long-summary": None, + "examples": [ + { + "name": "Update cluster tags", + "text": "az aro hcp cluster update --resource-group MyResourceGroup " + "--name MyCluster --tags env=prod team=platform", + }, + { + "name": "Update cluster operator identities", + "text": "az aro hcp cluster update --resource-group MyResourceGroup --name MyCluster " + "--assign-service-managed-identity " + "--assign-control-plane-operator-identity cluster-api-azure " + " --assign-data-plane-operator-identity " + "disk-csi-driver ", + }, + ], + } + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + args_schema = super()._build_arguments_schema(*args, **kwargs) + if hasattr(args_schema, "assign_control_plane_operator_identity"): + return args_schema + + args_schema.user_assigned_identities._registered = False # pylint: disable=protected-access + args_schema.operators_authentication._registered = False # pylint: disable=protected-access + args_schema.container_registry_managed_identity._registered = False # pylint: disable=protected-access + + args_schema.assign_control_plane_operator_identity = _build_operator_identity_arg( + ["--control-plane-identity", "--assign-control-plane-operator-identity"], + "Assign user-assigned identities to control plane operators. " + "Usage: --assign-control-plane-operator-identity OPERATOR_NAME IDENTITY. " + "IDENTITY is a resource ID or the name of an identity in the cluster subnet's resource group. " + "Repeat the argument to assign more identities. Existing operators not specified are preserved.", + required=False, + ) + args_schema.assign_data_plane_operator_identity = _build_operator_identity_arg( + ["--data-plane-identity", "--assign-data-plane-operator-identity"], + "Assign user-assigned identities to data plane operators. " + "Usage: --assign-data-plane-operator-identity OPERATOR_NAME IDENTITY. " + "IDENTITY is a resource ID or the name of an identity in the cluster subnet's resource group. " + "Repeat the argument to assign more identities. Existing operators not specified are preserved.", + required=False, + ) + args_schema.assign_service_managed_identity = AAZStrArg( + options=["--service-identity", "--assign-service-managed-identity"], + arg_group="Identity", + help="Assign the user-assigned identity used for service-level actions by resource ID " + "or by name when it is in the cluster subnet's resource group.", + ) + args_schema.assign_container_registry_managed_identity = AAZStrArg( + options=[ + "--registry-identity", + "--assign-container-registry-managed-identity", + ], + arg_group="Identity", + help="Assign the user-assigned identity used for container registry image pulls " + "by resource ID or by name when it is in the cluster subnet's resource group.", + ) + return args_schema + + def pre_instance_update(self, instance): + args = self.ctx.args + control_plane_arg = args.assign_control_plane_operator_identity + data_plane_arg = args.assign_data_plane_operator_identity + service_arg = args.assign_service_managed_identity + container_registry_arg = args.assign_container_registry_managed_identity + has_operator_identity_arg = any(has_value(arg) for arg in ( + control_plane_arg, + data_plane_arg, + service_arg, + )) + if not has_operator_identity_arg and not has_value(container_registry_arg): + return + + platform = instance.properties.platform + subnet_id = platform.subnet_id.to_serialized_data() + if has_value(container_registry_arg): + args.container_registry_managed_identity = _resolve_identity_resource_id( + container_registry_arg.to_serialized_data(), + subnet_id, + ) + + if not has_operator_identity_arg: + return + + operator_identities = platform.operators_authentication.user_assigned_identities + + if has_value(control_plane_arg): + control_plane = operator_identities.control_plane_operators.to_serialized_data() + control_plane.update(_operator_identities( + control_plane_arg, + "--assign-control-plane-operator-identity", + subnet_id, + )) + operator_identities.control_plane_operators = control_plane + + if has_value(data_plane_arg): + data_plane = operator_identities.data_plane_operators.to_serialized_data() + data_plane.update(_operator_identities( + data_plane_arg, + "--assign-data-plane-operator-identity", + subnet_id, + )) + operator_identities.data_plane_operators = data_plane + + if has_value(service_arg): + service = _resolve_identity_resource_id( + service_arg.to_serialized_data(), + subnet_id, + ) + operator_identities.service_managed_identity = service + + assigned_resource_ids = set(operator_identities.control_plane_operators.to_serialized_data().values()) + assigned_resource_ids.add(operator_identities.service_managed_identity.to_serialized_data()) + instance.identity.user_assigned_identities = { + resource_id: {} for resource_id in assigned_resource_ids + } + + +class GetVersions(_GetVersions): + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + args_schema = super()._build_arguments_schema(*args, **kwargs) + args_schema.control_plane = AAZBoolArg( + options=["--control-plane"], + help="List the distinct Major.Minor (X.Y) versions per channel group available for the control plane. " + "Use one of these with 'cluster create --version', which takes an X.Y version.", + default=False, + ) + args_schema.node_pools = AAZBoolArg( + options=["--node-pools"], + help="List all available full X.Y.Z versions for node pools. " + "Use one of these with 'nodepool create --version', which requires a full X.Y.Z version.", + default=False, + ) + return args_schema + + def _output(self, *args, **kwargs): + from azure.cli.core.azclierror import MutuallyExclusiveArgumentError + from ._format import _parse_semver, _major_minor, _version_row + + result, next_link = super()._output(*args, **kwargs) + + control_plane = has_value(self.ctx.args.control_plane) and self.ctx.args.control_plane.to_serialized_data() + node_pools = has_value(self.ctx.args.node_pools) and self.ctx.args.node_pools.to_serialized_data() + + if control_plane and node_pools: + raise MutuallyExclusiveArgumentError( + "--control-plane and --node-pools cannot be used together." + ) + + if not result: + return result, next_link + + # Keep enabled versions only, ascending by semver. + enabled = [v for v in result if v.get('properties', {}).get('enabled', True)] + enabled.sort(key=lambda v: _parse_semver(v.get('name', ''))) + + if control_plane: + # Distinct Major.Minor (X.Y) versions, ascending. 'cluster create --version' + # takes an X.Y version. + rows = [] + seen = set() + for v in enabled: + xy = _major_minor(v.get('name', '')) + row = _version_row(v) + version_channel = (xy, row['ChannelGroup']) + if not xy or version_channel in seen: + continue + seen.add(version_channel) + row['Name'] = xy + rows.append(row) + else: + # Default (and --node-pools): all enabled full X.Y.Z versions, ascending. + # 'nodepool create --version' requires a full X.Y.Z version, so the bare + # 'get-versions' output matches the node-pools listing. + rows = [_version_row(v) for v in enabled] + + return rows, next_link + + +class RequestCredential(_RequestCredential): + + AZ_SUPPORT_NO_WAIT = False + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._private_key_pem = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + args_schema = super()._build_arguments_schema(*args, **kwargs) + args_schema.name._id_part = None # pylint: disable=protected-access + args_schema.no_wait = AAZBoolArg(default=False, registered=False) + args_schema.certificate_signing_request = AAZStrArg( + options=["--certificate-signing-request"], + ) + args_schema.certificate_signing_request._registered = False # pylint: disable=protected-access + args_schema.admin = AAZBoolArg( + options=["-a", "--admin"], + help="Get cluster administrator credentials. Default: cluster user credentials.", + default=False, + ) + args_schema.file = AAZStrArg( + options=["-f", "--file"], + help="Kubernetes configuration file to update. Use \"-\" to print the kubeconfig to stdout instead.", + default=_default_kubeconfig_path(), + ) + args_schema.context_name = AAZStrArg( + options=["--context"], + help="If specified, overwrite the default context name.", + required=False, + ) + args_schema.overwrite_existing = AAZBoolArg( + options=["--overwrite-existing"], + help="Overwrite any existing cluster entry with the same name.", + default=False, + ) + return args_schema + + def _handler(self, command_args): + from ._kubeconfig import _generate_admin_credential_request + + if not command_args.get("admin"): + raise InvalidArgumentValueError( + "Requesting a non-admin credential is not supported yet. Specify --admin/-a to request an admin credential." # pylint: disable=line-too-long + ) + private_key_pem, command_args["certificate_signing_request"] = _generate_admin_credential_request() + self._private_key_pem = private_key_pem + try: + return super()._handler(command_args) + except Exception: + if hasattr(self, "_private_key_pem"): + del self._private_key_pem + raise + + def _output(self, *args, **kwargs): + from ._kubeconfig import _embed_private_key, print_or_merge_credentials + + private_key_pem = getattr(self, "_private_key_pem", None) + if private_key_pem is None: + return super()._output(*args, **kwargs) + del self._private_key_pem + + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True, secret_hidden=False) + if not result or "kubeconfig" not in result: + return result + + kubeconfig = result["kubeconfig"].replace("\\n", "\n") + user_name = "{}-{}-admin".format( + self.ctx.args.resource_group.to_serialized_data(), + self.ctx.args.name.to_serialized_data(), + ) + kubeconfig = _embed_private_key(kubeconfig, private_key_pem, user_name) + path = self.ctx.args.file.to_serialized_data() + if has_value(self.ctx.args.context_name): + context_name = self.ctx.args.context_name.to_serialized_data() + else: + # Default to an AKS-style "-admin" context. The API returns a + # generic "admin" context, so without this every cluster would merge into the + # same context name and collide in the kubeconfig. + context_name = "{}-admin".format(self.ctx.args.name.to_serialized_data()) + overwrite_existing = bool(self.ctx.args.overwrite_existing.to_serialized_data()) if has_value(self.ctx.args.overwrite_existing) else False # pylint: disable=line-too-long + + # honor $KUBECONFIG when the caller kept the default path + if path == _default_kubeconfig_path() and os.environ.get("KUBECONFIG"): + first = os.environ["KUBECONFIG"].split(os.pathsep)[0] + if first: + path = os.path.expanduser(first) + elif path != "-": + path = os.path.expanduser(path) + + print_or_merge_credentials(path, kubeconfig, overwrite_existing, context_name) + return None + + class HcpOpenShiftClustersRequestAdminCredential( + _RequestCredential.HcpOpenShiftClustersRequestAdminCredential): + + @property + def content(self): + content = super().content + content["certificateSigningRequest"] = ( + self.ctx.args.certificate_signing_request.to_serialized_data() + ) + return content diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/__init__.py similarity index 100% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/__init__.py rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/__init__.py diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/recordings/test_aro_hcp_cluster_lifecycle.yaml b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/recordings/test_aro_hcp_cluster_lifecycle.yaml new file mode 100644 index 00000000000..e1227b2903c --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/recordings/test_aro_hcp_cluster_lifecycle.yaml @@ -0,0 +1,8962 @@ +interactions: +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - network nsg create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005?api-version=2022-01-01 + response: + body: + string: '{"name":"clihcp-nsg000005","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005","etag":"W/\"b84009e3-96d2-4467-adca-f1bc8474aae2\"","type":"Microsoft.Network/networkSecurityGroups","location":"uksouth","properties":{"provisioningState":"Updating","resourceGuid":"4533aea7-df81-4ff4-a6c6-3609ca9e8cc3","securityRules":[],"defaultSecurityRules":[{"name":"AllowVnetInBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowVnetInBound","etag":"W/\"b84009e3-96d2-4467-adca-f1bc8474aae2\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Updating","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"VirtualNetwork","destinationAddressPrefix":"VirtualNetwork","priority":65000,"description":"Allow + inbound traffic from all VMs in VNET","protocol":"*","access":"Allow","direction":"Inbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"AllowAzureLoadBalancerInBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowAzureLoadBalancerInBound","etag":"W/\"b84009e3-96d2-4467-adca-f1bc8474aae2\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Updating","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"AzureLoadBalancer","destinationAddressPrefix":"*","priority":65001,"description":"Allow + inbound traffic from azure load balancer","protocol":"*","access":"Allow","direction":"Inbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"DenyAllInBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/DenyAllInBound","etag":"W/\"b84009e3-96d2-4467-adca-f1bc8474aae2\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Updating","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"*","destinationAddressPrefix":"*","priority":65500,"description":"Deny + all inbound traffic","protocol":"*","access":"Deny","direction":"Inbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"AllowVnetOutBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowVnetOutBound","etag":"W/\"b84009e3-96d2-4467-adca-f1bc8474aae2\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Updating","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"VirtualNetwork","destinationAddressPrefix":"VirtualNetwork","priority":65000,"description":"Allow + outbound traffic from all VMs to all VMs in VNET","protocol":"*","access":"Allow","direction":"Outbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"AllowInternetOutBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowInternetOutBound","etag":"W/\"b84009e3-96d2-4467-adca-f1bc8474aae2\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Updating","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"*","destinationAddressPrefix":"Internet","priority":65001,"description":"Allow + outbound traffic from all VMs to Internet","protocol":"*","access":"Allow","direction":"Outbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"DenyAllOutBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/DenyAllOutBound","etag":"W/\"b84009e3-96d2-4467-adca-f1bc8474aae2\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Updating","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"*","destinationAddressPrefix":"*","priority":65500,"description":"Deny + all outbound traffic","protocol":"*","access":"Deny","direction":"Outbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}}]}}' + headers: + azure-asyncnotification: + - Enabled + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/974b0d06-15a2-48b6-b104-b288396ab469?api-version=2022-01-01&t=639293578138420315&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '5003' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:56:53 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - 758986a8-a3f5-418f-b664-590b88accc2f + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-ms-throttle-levels: + - operationRatePct=0.1, operationConcurrencyPct=0.3, etc + x-msedge-ref: + - 'Ref A: 78A13F5F60434F09A4B3B8CED9676D3D Ref B: SN4AA2022302033 Ref C: 2026-11-04T02:56:53Z' + status: + code: 201 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network nsg create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/974b0d06-15a2-48b6-b104-b288396ab469?api-version=2022-01-01&t=639293578138420315&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '{"status":"Succeeded"}' + headers: + cache-control: + - no-cache + content-length: + - '22' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:56:53 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - c29eba04-83cf-4862-835e-0e326751ac8d + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationConcurrencyPct=0.5, subscriptionReadRatePct=4.9, etc + x-msedge-ref: + - 'Ref A: AAE72834195A462F881B6880DE0870D2 Ref B: SN4AA2022301011 Ref C: 2026-11-04T02:56:54Z' + status: + code: 200 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network nsg create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005?api-version=2022-01-01 + response: + body: + string: '{"name":"clihcp-nsg000005","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005","etag":"W/\"fb58d9ec-a11e-4b69-abbe-71c683f01c4b\"","type":"Microsoft.Network/networkSecurityGroups","location":"uksouth","properties":{"provisioningState":"Succeeded","resourceGuid":"4533aea7-df81-4ff4-a6c6-3609ca9e8cc3","securityRules":[],"defaultSecurityRules":[{"name":"AllowVnetInBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowVnetInBound","etag":"W/\"fb58d9ec-a11e-4b69-abbe-71c683f01c4b\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Succeeded","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"VirtualNetwork","destinationAddressPrefix":"VirtualNetwork","priority":65000,"description":"Allow + inbound traffic from all VMs in VNET","protocol":"*","access":"Allow","direction":"Inbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"AllowAzureLoadBalancerInBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowAzureLoadBalancerInBound","etag":"W/\"fb58d9ec-a11e-4b69-abbe-71c683f01c4b\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Succeeded","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"AzureLoadBalancer","destinationAddressPrefix":"*","priority":65001,"description":"Allow + inbound traffic from azure load balancer","protocol":"*","access":"Allow","direction":"Inbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"DenyAllInBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/DenyAllInBound","etag":"W/\"fb58d9ec-a11e-4b69-abbe-71c683f01c4b\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Succeeded","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"*","destinationAddressPrefix":"*","priority":65500,"description":"Deny + all inbound traffic","protocol":"*","access":"Deny","direction":"Inbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"AllowVnetOutBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowVnetOutBound","etag":"W/\"fb58d9ec-a11e-4b69-abbe-71c683f01c4b\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Succeeded","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"VirtualNetwork","destinationAddressPrefix":"VirtualNetwork","priority":65000,"description":"Allow + outbound traffic from all VMs to all VMs in VNET","protocol":"*","access":"Allow","direction":"Outbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"AllowInternetOutBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/AllowInternetOutBound","etag":"W/\"fb58d9ec-a11e-4b69-abbe-71c683f01c4b\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Succeeded","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"*","destinationAddressPrefix":"Internet","priority":65001,"description":"Allow + outbound traffic from all VMs to Internet","protocol":"*","access":"Allow","direction":"Outbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}},{"name":"DenyAllOutBound","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/defaultSecurityRules/DenyAllOutBound","etag":"W/\"fb58d9ec-a11e-4b69-abbe-71c683f01c4b\"","type":"Microsoft.Network/networkSecurityGroups/defaultSecurityRules","properties":{"provisioningState":"Succeeded","sourcePortRange":"*","destinationPortRange":"*","sourceAddressPrefix":"*","destinationAddressPrefix":"*","priority":65500,"description":"Deny + all outbound traffic","protocol":"*","access":"Deny","direction":"Outbound","sourcePortRanges":[],"destinationPortRanges":[],"sourceAddressPrefixes":[],"destinationAddressPrefixes":[]}}]}}' + headers: + cache-control: + - no-cache + content-length: + - '5010' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:56:55 GMT + etag: + - W/"fb58d9ec-a11e-4b69-abbe-71c683f01c4b" + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - cb51bdbe-0452-477d-b953-06f3128d846e + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationRatePct=0.4, operationConcurrencyPct=0.5, subscriptionReadRatePct=5.0, + etc + x-msedge-ref: + - 'Ref A: 4152868994CB412E93AF2C987EA6F634 Ref B: SN4AA2022304031 Ref C: 2026-11-04T02:56:54Z' + status: + code: 200 + message: '' +- request: + body: '{"location": "uksouth", "properties": {"addressSpace": {"addressPrefixes": + ["10.0.0.0/16"]}, "enableDdosProtection": false, "enableVmProtection": false}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet create + Connection: + - keep-alive + Content-Length: + - '153' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location --address-prefixes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004?api-version=2025-07-01 + response: + body: + string: '{"name":"clihcp-vnet000004","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","etag":"W/\"84b128f1-d532-4bfb-af59-78d421706c08\"","type":"Microsoft.Network/virtualNetworks","location":"uksouth","properties":{"provisioningState":"Updating","resourceGuid":"3edef0b1-2ddc-4075-bc51-685050bb4722","addressSpace":{"addressPrefixes":["10.0.0.0/16"]},"privateEndpointVNetPolicies":"Disabled","subnets":[],"virtualNetworkPeerings":[],"enableDdosProtection":false}}' + headers: + azure-asyncnotification: + - Enabled + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/d21e52db-c819-4b6d-b5be-6a75fd914876?api-version=2025-07-01&t=639293578187510278&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '565' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:56:58 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - d3850307-e0db-41d7-bacf-c2f2cd01bb2c + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-ms-throttle-levels: + - operationRatePct=0.1, operationConcurrencyPct=0.3, subscriptionWriteRatePct=0.1, + etc + x-msedge-ref: + - 'Ref A: 223052A653D4448B9C43DD509A680518 Ref B: DM2AA1091211027 Ref C: 2026-11-04T02:56:56Z' + status: + code: 201 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --address-prefixes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/d21e52db-c819-4b6d-b5be-6a75fd914876?api-version=2025-07-01&t=639293578187510278&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '{"status":"InProgress"}' + headers: + cache-control: + - no-cache + content-length: + - '23' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:56:58 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - 51492fc0-ff03-4f59-afd4-ba19634dd550 + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationConcurrencyPct=0.5, subscriptionReadRatePct=5.1, etc + x-msedge-ref: + - 'Ref A: 21669E78C7AC43199A1C6469A99C7DCD Ref B: SN4AA2022303053 Ref C: 2026-11-04T02:56:58Z' + status: + code: 200 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --address-prefixes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/d21e52db-c819-4b6d-b5be-6a75fd914876?api-version=2025-07-01&t=639293578187510278&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '{"status":"Succeeded"}' + headers: + cache-control: + - no-cache + content-length: + - '22' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:09 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - e497f4f7-2c6b-4153-9471-c03f1a6c1a0e + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationConcurrencyPct=0.5, subscriptionReadRatePct=4.8, etc + x-msedge-ref: + - 'Ref A: AE254309688947F680CB89A3FB6DA964 Ref B: SN4AA2022303031 Ref C: 2026-11-04T02:57:09Z' + status: + code: 200 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --address-prefixes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004?api-version=2025-07-01 + response: + body: + string: '{"name":"clihcp-vnet000004","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","etag":"W/\"bd1159f8-4853-4baf-b3f8-cad07bae5ef3\"","type":"Microsoft.Network/virtualNetworks","location":"uksouth","properties":{"provisioningState":"Succeeded","resourceGuid":"3edef0b1-2ddc-4075-bc51-685050bb4722","addressSpace":{"addressPrefixes":["10.0.0.0/16"]},"privateEndpointVNetPolicies":"Disabled","subnets":[],"virtualNetworkPeerings":[],"enableDdosProtection":false}}' + headers: + cache-control: + - no-cache + content-length: + - '566' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:09 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - 256d7e24-f70f-422f-a213-df8ef363f925 + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationRatePct=1.0, operationConcurrencyPct=2.0, subscriptionReadRatePct=4.8, + etc + x-msedge-ref: + - 'Ref A: E50FC9DA2B424091BD8F0E62FB74F6AD Ref B: SN4AA2022302023 Ref C: 2026-11-04T02:57:09Z' + status: + code: 200 + message: '' +- request: + body: '{"name": "cluster-subnet", "properties": {"addressPrefix": "10.0.0.0/24", + "networkSecurityGroup": {"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005"}, + "privateEndpointNetworkPolicies": "Disabled", "privateLinkServiceNetworkPolicies": + "Enabled"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet subnet create + Connection: + - keep-alive + Content-Length: + - '360' + Content-Type: + - application/json + ParameterSetName: + - -g --vnet-name -n --address-prefixes --network-security-group --disable-private-endpoint-network-policies + --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet?api-version=2024-07-01 + response: + body: + string: '{"name":"cluster-subnet","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet","etag":"W/\"528da1fc-fe4d-44b9-9a8b-cdb21f618545\"","properties":{"provisioningState":"Updating","addressPrefix":"10.0.0.0/24","networkSecurityGroup":{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005"},"delegations":[],"privateEndpointNetworkPolicies":"Disabled","privateLinkServiceNetworkPolicies":"Enabled"},"type":"Microsoft.Network/virtualNetworks/subnets"}' + headers: + azure-asyncnotification: + - Enabled + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/13a71bfe-00f8-4d3f-86e0-f857d8862ecf?api-version=2024-07-01&t=639293578422205302&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '682' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:22 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - a989d784-b225-4c74-a023-a5e907c344f0 + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-ms-throttle-levels: + - operationRatePct=0.1, operationConcurrencyPct=0.3, subscriptionWriteRatePct=0.2, + etc + x-msedge-ref: + - 'Ref A: D4379167F3354549B9124B264CC0DF16 Ref B: DM2AA1091211029 Ref C: 2026-11-04T02:57:10Z' + status: + code: 201 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet subnet create + Connection: + - keep-alive + ParameterSetName: + - -g --vnet-name -n --address-prefixes --network-security-group --disable-private-endpoint-network-policies + --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/13a71bfe-00f8-4d3f-86e0-f857d8862ecf?api-version=2024-07-01&t=639293578422205302&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '{"status":"Succeeded"}' + headers: + cache-control: + - no-cache + content-length: + - '22' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:22 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - 50d396a7-ba92-44d9-9f7b-8a2bcbb7261a + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationRatePct=0.1, operationConcurrencyPct=0.5, subscriptionReadRatePct=5.0, + etc + x-msedge-ref: + - 'Ref A: B2337EE9CF0C41C8BA0F22EC9FB5448F Ref B: SN4AA2022303031 Ref C: 2026-11-04T02:57:22Z' + status: + code: 200 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet subnet create + Connection: + - keep-alive + ParameterSetName: + - -g --vnet-name -n --address-prefixes --network-security-group --disable-private-endpoint-network-policies + --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet?api-version=2024-07-01 + response: + body: + string: '{"name":"cluster-subnet","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet","etag":"W/\"168270af-c818-4159-a0d8-3bdadcebf3da\"","properties":{"provisioningState":"Succeeded","addressPrefix":"10.0.0.0/24","networkSecurityGroup":{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005"},"delegations":[],"privateEndpointNetworkPolicies":"Disabled","privateLinkServiceNetworkPolicies":"Enabled"},"type":"Microsoft.Network/virtualNetworks/subnets"}' + headers: + cache-control: + - no-cache + content-length: + - '683' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:22 GMT + etag: + - W/"168270af-c818-4159-a0d8-3bdadcebf3da" + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - a76604d0-8d38-411c-bc3d-7e7c278f6560 + x-ms-ratelimit-remaining-subscription-global-reads: + - '3748' + x-ms-throttle-levels: + - operationConcurrencyPct=0.5, subscriptionReadRatePct=5.0, etc + x-msedge-ref: + - 'Ref A: 8E3C3E965C5948BDA6068D9DC4205D07 Ref B: SN4AA2022304039 Ref C: 2026-11-04T02:57:23Z' + status: + code: 200 + message: OK +- request: + body: '{"name": "integration-subnet", "properties": {"addressPrefix": "10.0.1.0/24", + "delegations": [{"name": "0", "properties": {"serviceName": "Microsoft.RedHatOpenShift/hcpOpenShiftClusters"}}], + "privateEndpointNetworkPolicies": "Disabled", "privateLinkServiceNetworkPolicies": + "Enabled"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet subnet create + Connection: + - keep-alive + Content-Length: + - '285' + Content-Type: + - application/json + ParameterSetName: + - -g --vnet-name -n --address-prefixes --delegations --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet?api-version=2024-07-01 + response: + body: + string: '{"name":"integration-subnet","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet","etag":"W/\"d76ce1f7-c922-417c-88b9-3aeeaced1294\"","properties":{"provisioningState":"Updating","addressPrefix":"10.0.1.0/24","delegations":[{"name":"0","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet/delegations/0","etag":"W/\"d76ce1f7-c922-417c-88b9-3aeeaced1294\"","properties":{"provisioningState":"Succeeded","serviceName":"Microsoft.RedHatOpenShift/hcpOpenShiftClusters","actions":["Microsoft.Network/virtualNetworks/subnets/join/action"]},"type":"Microsoft.Network/virtualNetworks/subnets/delegations"}],"privateEndpointNetworkPolicies":"Disabled","privateLinkServiceNetworkPolicies":"Enabled"},"type":"Microsoft.Network/virtualNetworks/subnets"}' + headers: + azure-asyncnotification: + - Enabled + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/7872bcd8-0a5d-4e14-b483-1e8bfeb30eeb?api-version=2024-07-01&t=639293578438488582&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '1006' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:23 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - 2244d43e-120d-47e0-89ea-cda3ed8829d6 + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-ms-throttle-levels: + - operationRatePct=0.2, operationConcurrencyPct=0.3, subscriptionWriteRatePct=0.2, + etc + x-msedge-ref: + - 'Ref A: 8EE5288CC2F84326AFB2B180F6E78108 Ref B: SN4AA2022304025 Ref C: 2026-11-04T02:57:23Z' + status: + code: 201 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet subnet create + Connection: + - keep-alive + ParameterSetName: + - -g --vnet-name -n --address-prefixes --delegations --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Network/locations/uksouth/operations/7872bcd8-0a5d-4e14-b483-1e8bfeb30eeb?api-version=2024-07-01&t=639293578438488582&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '{"status":"Succeeded"}' + headers: + cache-control: + - no-cache + content-length: + - '22' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:24 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - f0412b94-2c83-4280-ae90-bffdbc599fe6 + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationConcurrencyPct=0.5, subscriptionReadRatePct=5.0, etc + x-msedge-ref: + - 'Ref A: B27E94C39D7F4BD68A80006CA99FC08B Ref B: DM2AA1091214047 Ref C: 2026-11-04T02:57:24Z' + status: + code: 200 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet subnet create + Connection: + - keep-alive + ParameterSetName: + - -g --vnet-name -n --address-prefixes --delegations --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet?api-version=2024-07-01 + response: + body: + string: '{"name":"integration-subnet","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet","etag":"W/\"03d9b719-d600-4640-a930-4a51fde524cf\"","properties":{"provisioningState":"Succeeded","addressPrefix":"10.0.1.0/24","delegations":[{"name":"0","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet/delegations/0","etag":"W/\"03d9b719-d600-4640-a930-4a51fde524cf\"","properties":{"provisioningState":"Succeeded","serviceName":"Microsoft.RedHatOpenShift/hcpOpenShiftClusters","actions":["Microsoft.Network/virtualNetworks/subnets/join/action"]},"type":"Microsoft.Network/virtualNetworks/subnets/delegations"}],"privateEndpointNetworkPolicies":"Disabled","privateLinkServiceNetworkPolicies":"Enabled"},"type":"Microsoft.Network/virtualNetworks/subnets"}' + headers: + cache-control: + - no-cache + content-length: + - '1007' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:26 GMT + etag: + - W/"03d9b719-d600-4640-a930-4a51fde524cf" + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - f90b51fe-1e42-4638-a759-e148fe10006a + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationConcurrencyPct=0.5, subscriptionReadRatePct=5.1, etc + x-msedge-ref: + - 'Ref A: 8960B267976D40008BBA1BAE77C7D769 Ref B: DM2AA1091213017 Ref C: 2026-11-04T02:57:24Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - network vnet show + Connection: + - keep-alive + ParameterSetName: + - -g -n --query -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004?api-version=2025-07-01 + response: + body: + string: '{"name":"clihcp-vnet000004","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","etag":"W/\"03d9b719-d600-4640-a930-4a51fde524cf\"","type":"Microsoft.Network/virtualNetworks","location":"uksouth","properties":{"provisioningState":"Succeeded","resourceGuid":"3edef0b1-2ddc-4075-bc51-685050bb4722","addressSpace":{"addressPrefixes":["10.0.0.0/16"]},"privateEndpointVNetPolicies":"Disabled","subnets":[{"name":"cluster-subnet","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet","etag":"W/\"03d9b719-d600-4640-a930-4a51fde524cf\"","properties":{"provisioningState":"Succeeded","addressPrefix":"10.0.0.0/24","networkSecurityGroup":{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005"},"delegations":[],"privateEndpointNetworkPolicies":"Disabled","privateLinkServiceNetworkPolicies":"Enabled"},"type":"Microsoft.Network/virtualNetworks/subnets"},{"name":"integration-subnet","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet","etag":"W/\"03d9b719-d600-4640-a930-4a51fde524cf\"","properties":{"provisioningState":"Succeeded","addressPrefix":"10.0.1.0/24","delegations":[{"name":"0","id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet/delegations/0","etag":"W/\"03d9b719-d600-4640-a930-4a51fde524cf\"","properties":{"provisioningState":"Succeeded","serviceName":"Microsoft.RedHatOpenShift/hcpOpenShiftClusters","actions":["Microsoft.Network/virtualNetworks/subnets/join/action"]},"type":"Microsoft.Network/virtualNetworks/subnets/delegations"}],"privateEndpointNetworkPolicies":"Disabled","privateLinkServiceNetworkPolicies":"Enabled"},"type":"Microsoft.Network/virtualNetworks/subnets"}],"virtualNetworkPeerings":[],"enableDdosProtection":false}}' + headers: + cache-control: + - no-cache + content-length: + - '2257' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:28 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-arm-service-request-id: + - 8bf52036-fb8d-4b89-83b8-c9f471cf9bd2 + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-ms-throttle-levels: + - operationRatePct=0.5, operationConcurrencyPct=2.0, subscriptionReadRatePct=5.1, + etc + x-msedge-ref: + - 'Ref A: ED17C7D0F4B74867A98464F61D437B06 Ref B: DM2AA1091212021 Ref C: 2026-11-04T02:57:28Z' + status: + code: 200 + message: '' +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --enable-rbac-authorization --public-network-access --query + -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007?api-version=2026-05-15 + response: + body: + string: '{"error":{"code":"ResourceNotFound","message":"The Resource ''Microsoft.KeyVault/vaults/clihcpkv000007'' + under resource group ''cli_test_aro_hcp000001'' was not found. For more details + please go to https://aka.ms/ARMResourceNotFoundFix"}}' + headers: + cache-control: + - no-cache + content-length: + - '234' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:28 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-failure-cause: + - gateway + x-msedge-ref: + - 'Ref A: 38E675C9C5C843E2B3436C9A3EB10BBB Ref B: SN4AA2022303017 Ref C: 2026-11-04T02:57:28Z' + status: + code: 404 + message: Not Found +- request: + body: '{"location": "uksouth", "properties": {"tenantId": "00000000-0000-0000-0000-000000000001", + "sku": {"name": "standard", "family": "A"}, "accessPolicies": [], "enableRbacAuthorization": + true, "enableSoftDelete": true, "softDeleteRetentionInDays": 90, "publicNetworkAccess": + "Enabled", "networkAcls": {"bypass": "AzureServices", "defaultAction": "Allow"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault create + Connection: + - keep-alive + Content-Length: + - '353' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location --enable-rbac-authorization --public-network-access --query + -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007?api-version=2026-05-15 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007","name":"clihcpkv000007","type":"Microsoft.KeyVault/vaults","location":"uksouth","tags":{},"systemData":{"createdBy":"recording-user@example.com","createdByType":"User","createdAt":"2026-11-04T02:57:29.593Z","lastModifiedBy":"recording-user@example.com","lastModifiedByType":"User","lastModifiedAt":"2026-11-04T02:57:29.593Z"},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"00000000-0000-0000-0000-000000000001","accessPolicies":[],"enabledForDeployment":false,"enabledForDiskEncryption":false,"enabledForTemplateDeployment":false,"enableSoftDelete":true,"softDeleteRetentionInDays":90,"enableRbacAuthorization":true,"vaultUri":"https://clihcpkv000007.vault.azure.net","provisioningState":"RegisteringDns","publicNetworkAccess":"Enabled"}}' + headers: + cache-control: + - no-cache + content-length: + - '905' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:31 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-keyvault-service-version: + - 2.2.1271.0 + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: C993D243087642189C383EAAAC4CCCE9 Ref B: SN4AA2022303011 Ref C: 2026-11-04T02:57:29Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --enable-rbac-authorization --public-network-access --query + -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007?api-version=2026-05-15 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007","name":"clihcpkv000007","type":"Microsoft.KeyVault/vaults","location":"uksouth","tags":{},"systemData":{"createdBy":"recording-user@example.com","createdByType":"User","createdAt":"2026-11-04T02:57:29.593Z","lastModifiedBy":"recording-user@example.com","lastModifiedByType":"User","lastModifiedAt":"2026-11-04T02:57:29.593Z"},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"00000000-0000-0000-0000-000000000001","accessPolicies":[],"enabledForDeployment":false,"enabledForDiskEncryption":false,"enabledForTemplateDeployment":false,"enableSoftDelete":true,"softDeleteRetentionInDays":90,"enableRbacAuthorization":true,"vaultUri":"https://clihcpkv000007.vault.azure.net/","provisioningState":"RegisteringDns","publicNetworkAccess":"Enabled"}}' + headers: + cache-control: + - no-cache + content-length: + - '906' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:57:31 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-keyvault-service-version: + - 2.2.1271.0 + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: E4B2948AEB904D4D8BECA7F4ECF4A671 Ref B: DM2AA1091212019 Ref C: 2026-11-04T02:57:31Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --enable-rbac-authorization --public-network-access --query + -o + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007?api-version=2026-05-15 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007","name":"clihcpkv000007","type":"Microsoft.KeyVault/vaults","location":"uksouth","tags":{},"systemData":{"createdBy":"recording-user@example.com","createdByType":"User","createdAt":"2026-11-04T02:57:29.593Z","lastModifiedBy":"recording-user@example.com","lastModifiedByType":"User","lastModifiedAt":"2026-11-04T02:57:29.593Z"},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"00000000-0000-0000-0000-000000000001","accessPolicies":[],"enabledForDeployment":false,"enabledForDiskEncryption":false,"enabledForTemplateDeployment":false,"enableSoftDelete":true,"softDeleteRetentionInDays":90,"enableRbacAuthorization":true,"vaultUri":"https://clihcpkv000007.vault.azure.net/","provisioningState":"Succeeded","publicNetworkAccess":"Enabled"}}' + headers: + cache-control: + - no-cache + content-length: + - '901' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:58:01 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-keyvault-service-version: + - 2.2.1271.0 + x-ms-ratelimit-remaining-subscription-global-reads: + - '3748' + x-msedge-ref: + - 'Ref A: 155017FC62584E60A70A21B2BA474AED Ref B: SN4AA2022301051 Ref C: 2026-11-04T02:58:02Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - ad signed-in-user show + Connection: + - keep-alive + User-Agent: + - python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) AZURECLI/2.92.0 + method: GET + uri: https://graph.microsoft.com/v1.0/me + response: + body: + string: '{"id": "00000000-0000-0000-0000-000000000002"}' + headers: + cache-control: + - no-cache + content-length: + - '46' + content-type: + - application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8 + date: + - Wed, 04 Nov 2026 02:58:03 GMT + odata-version: + - '4.0' + request-id: + - f18970fd-3cf4-4024-984a-9885eec63af3 + strict-transport-security: + - max-age=31536000 + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-ms-ags-diagnostic: + - '{"ServerInfo":{"DataCenter":"South Central US","Slice":"E","Ring":"5","ScaleUnit":"003","RoleInstance":"SN4PEPF00000509"}}' + x-ms-resource-unit: + - '1' + status: + code: 200 + message: OK +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "User", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/14b46e9e-c2b7-41b4-b07b-48a6ebf60603"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/14b46e9e-c2b7-41b4-b07b-48a6ebf60603","principalId":"00000000-0000-0000-0000-000000000002","principalType":"User","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T02:58:03.9279147Z","updatedOn":"2026-11-04T02:58:04.7419248Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"4fc48ae0-d6d9-44af-828f-f12a1de14ece"}' + headers: + cache-control: + - no-cache + content-length: + - '979' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:58:04 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 51477175D488457AB05F4B7F37A64127 Ref B: SN4AA2022303033 Ref C: 2026-11-04T02:58:03Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault key create + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + ParameterSetName: + - --vault-name -n --kty --size + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: POST + uri: https://clihcpkv000007.vault.azure.net/keys/etcd-data-kms-encryption-key/create?api-version=7.6-preview.2 + response: + body: + string: '{"error":{"code":"Unauthorized","message":"AKV10000: Request is missing + a Bearer, PoP, or MTLS_POP token."}}' + headers: + cache-control: + - no-cache + content-length: + - '108' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:06 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + www-authenticate: + - Bearer authorization="https://login.microsoftonline.com/00000000-0000-0000-0000-000000000001", + resource="https://vault.azure.net" + x-content-type-options: + - nosniff + x-ms-keyvault-region: + - uksouth + x-ms-keyvault-service-version: + - 1.9.3939.1 + status: + code: 401 + message: Unauthorized +- request: + body: '{"kty": "RSA", "key_size": 2048, "attributes": {"enabled": true}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault key create + Connection: + - keep-alive + Content-Length: + - '65' + Content-Type: + - application/json + ParameterSetName: + - --vault-name -n --kty --size + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: POST + uri: https://clihcpkv000007.vault.azure.net/keys/etcd-data-kms-encryption-key/create?api-version=7.6-preview.2 + response: + body: + string: '{"key":{"kid":"https://clihcpkv000007.vault.azure.net/keys/etcd-data-kms-encryption-key/2194f189e201460aa9465785bc2fc7a9","kty":"RSA","key_ops":["encrypt","decrypt","sign","verify","wrapKey","unwrapKey"],"n":"vzIlActqj_t39wkjVexzV30CwXwCcnvOM4FJitl1YYpwa0Lhppp9T7ZD4-aE9jvAnjRJmxZO2a0E8FEPKXzezxLv73CAKhPTQ4ZNR85mrXtBxxdyWwyqysRarv8-l279_pwwlQTwaSvU8_QNRGtactMfOy077oSevJdQJvC6TrciRRic5Ph56wc-TPKRG4-qK1yQXNwbV5S2ZUI31Nr6KXeiWwM16bGI6yPzBVqqMgK6VNrqDmnsFjtRdxApmt5Cnv1k_2mRRVXvEWzWJON1QTGq5mfyVgCgGABg5u7aHjqU1qjCJsPt5yPAY5EqlrvlGKcyA3y1bOiRnmL2UnkwHQ","e":"AQAB"},"attributes":{"enabled":true,"key_size":2048,"created":1793761147,"updated":1793761147,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90,"exportable":false,"hsmPlatform":"0"}}' + headers: + cache-control: + - no-cache + content-length: + - '751' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:06 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-content-type-options: + - nosniff + x-ms-keyvault-rbac-assignment-id: + - 4fc48ae0d6d944af828ff12a1de14ece + x-ms-keyvault-region: + - uksouth + x-ms-keyvault-service-version: + - 1.9.3939.1 + status: + code: 200 + message: OK +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008","name":"clihcp-service000008","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '531' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:10 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 640C9D25A0774A25983E4ED01C8EFF0C Ref B: DM2AA1091212049 Ref C: 2026-11-04T02:59:07Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009","name":"clihcp-capi000009","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '525' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:12 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: EFAB3B97E4ED4552AE3471D45AEFE98C Ref B: SN4AA2022302027 Ref C: 2026-11-04T02:59:10Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010","name":"clihcp-control000010","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '531' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:16 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 062DC6DB10C74835AB88C8714F2D1A19 Ref B: DM2AA1091212019 Ref C: 2026-11-04T02:59:14Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011","name":"clihcp-ccm000011","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '523' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:21 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: CB0755FB952D4C6FA15DE40228BF2E78 Ref B: SN4AA2022305033 Ref C: 2026-11-04T02:59:17Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012","name":"clihcp-ingress000012","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '531' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:25 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: D7707DD702A54C8C862B65B56B3FED43 Ref B: SN4AA2022304037 Ref C: 2026-11-04T02:59:22Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013","name":"clihcp-disk000013","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '525' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:29 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: B1F50B5AD6244526A7A7CB470AF849A0 Ref B: SN4AA2022301049 Ref C: 2026-11-04T02:59:25Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014","name":"clihcp-file000014","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '525' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:32 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 858DF71F07454A5DB2DA96F66C732AD0 Ref B: DM2AA1091214049 Ref C: 2026-11-04T02:59:29Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015","name":"clihcp-image000015","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '527' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:35 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: A75364493B64490BA3F050A78E82B1E0 Ref B: SN4AA2022305011 Ref C: 2026-11-04T02:59:33Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016","name":"clihcp-network000016","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '531' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:38 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: D02133D00A444356B67F0771F434CA09 Ref B: SN4AA2022303037 Ref C: 2026-11-04T02:59:36Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017","name":"clihcp-kms000017","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '523' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:42 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 3A8C5DA8EF25429B91591840656F6237 Ref B: DM2AA1091213051 Ref C: 2026-11-04T02:59:40Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018","name":"clihcp-dpdisk000018","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '529' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:46 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: C622328297A44CBAB8E4630F2DF1DB6C Ref B: SN4AA2022303053 Ref C: 2026-11-04T02:59:43Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019","name":"clihcp-dpfile000019","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '529' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:49 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 8A7D9688A1B646B6B13F948F0A2FBF4E Ref B: SN4AA2022302009 Ref C: 2026-11-04T02:59:46Z' + status: + code: 201 + message: Created +- request: + body: '{"location": "uksouth"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - identity create + Connection: + - keep-alive + Content-Length: + - '23' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020?api-version=2025-05-31-preview + response: + body: + string: '{"location":"uksouth","tags":{},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020","name":"clihcp-dpimage000020","type":"Microsoft.ManagedIdentity/userAssignedIdentities","properties":{"isolationScope":"None","assignmentRestrictions":{"providers":[]},"tenantId":"00000000-0000-0000-0000-000000000001","principalId":"00000000-0000-0000-0000-000000000002","clientId":"00000000-0000-0000-0000-000000000003"}}' + headers: + cache-control: + - no-cache + content-length: + - '531' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:53 GMT + expires: + - '-1' + location: + - /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 3A57BCC6E4F64FBF9FFB40A261B6454C Ref B: DM2AA1091213033 Ref C: 2026-11-04T02:59:50Z' + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/c0ff367d-66d8-445e-917c-583feb0ef0d4"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/c0ff367d-66d8-445e-917c-583feb0ef0d4","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T02:59:53.8963531Z","updatedOn":"2026-11-04T02:59:54.1613591Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"bc609dac-81a0-41b8-a1df-34850fd473f5"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:54 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 55F305BF0EEA4023BF67DB364FEA7237 Ref B: SN4AA2022303017 Ref C: 2026-11-04T02:59:53Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/c0ff367d-66d8-445e-917c-583feb0ef0d4"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/c0ff367d-66d8-445e-917c-583feb0ef0d4","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T02:59:55.5697927Z","updatedOn":"2026-11-04T02:59:56.3254670Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"5c53c565-1327-4522-946c-faf6507df477"}' + headers: + cache-control: + - no-cache + content-length: + - '1023' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:57 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 64D500F1B33C4876B8195742288B5BBD Ref B: DM2AA1091214025 Ref C: 2026-11-04T02:59:55Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/88366f10-ed47-4cc0-9fab-c8a06148393e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/88366f10-ed47-4cc0-9fab-c8a06148393e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T02:59:58.1006373Z","updatedOn":"2026-11-04T02:59:58.6786546Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"8ab9b66b-4b3e-4cf8-a162-0c98dead061a"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 02:59:59 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 071EFDF6EF7740CDA2F2D748365A7BB3 Ref B: SN4AA2022305039 Ref C: 2026-11-04T02:59:57Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/fc0c873f-45e9-4d0d-a7d1-585aab30c6ed"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/fc0c873f-45e9-4d0d-a7d1-585aab30c6ed","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T02:59:59.9871391Z","updatedOn":"2026-11-04T03:00:00.6897814Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"0dc2d8a8-a848-4281-a43a-681933499814"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:01 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: F2E509F6E4434BA7BD861761CEAA02C5 Ref B: SN4AA2022302049 Ref C: 2026-11-04T02:59:59Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/fc0c873f-45e9-4d0d-a7d1-585aab30c6ed"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/fc0c873f-45e9-4d0d-a7d1-585aab30c6ed","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:02.3691857Z","updatedOn":"2026-11-04T03:00:03.1699366Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"44f3b0e0-b933-4225-a540-0aa6fd71342c"}' + headers: + cache-control: + - no-cache + content-length: + - '1023' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:03 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: DA21F278EC4F401EAEE6EB1AD66E4B8A Ref B: SN4AA2022304029 Ref C: 2026-11-04T03:00:02Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:04.8696361Z","updatedOn":"2026-11-04T03:00:05.7691411Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"7bac7aaa-78e8-49fb-a49d-d26f8dc6c3ba"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:05 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 5193B8B377984FE19F4480B23CD85276 Ref B: SN4AA2022304019 Ref C: 2026-11-04T03:00:04Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:08.0180834Z","updatedOn":"2026-11-04T03:00:08.4842406Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"dbb6b570-97a8-4d3e-9ab7-b149a3b1a286"}' + headers: + cache-control: + - no-cache + content-length: + - '1023' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:09 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 0A271647D97445B18C2A62971668D066 Ref B: SN4AA2022302039 Ref C: 2026-11-04T03:00:07Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0336e1d3-7a87-462b-b6db-342b63f7802c"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0336e1d3-7a87-462b-b6db-342b63f7802c","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:10.4878357Z","updatedOn":"2026-11-04T03:00:11.1578422Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"4a24d8ad-425e-4cf3-a7ed-1ca09f45bdd4"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:12 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: E4E89FBEAB7F4A01B38F23AEFBF5D115 Ref B: SN4AA2022301047 Ref C: 2026-11-04T03:00:10Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:13.8656716Z","updatedOn":"2026-11-04T03:00:15.0582296Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"1c4bc133-c5fc-44f8-96d1-4bf0202722fe"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:15 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: F4D17E8580B146A7966B8312957C5716 Ref B: SN4AA2022305029 Ref C: 2026-11-04T03:00:13Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:16.5447637Z","updatedOn":"2026-11-04T03:00:17.1373718Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"0448caf6-3f1c-4996-abe2-fd3a95a2f765"}' + headers: + cache-control: + - no-cache + content-length: + - '1023' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:17 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 6EE51EBFD67144DE888C439AE04DBF46 Ref B: SN4AA2022301037 Ref C: 2026-11-04T03:00:16Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/8b32b316-c2f5-4ddf-b05b-83dacd2d08b5"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/8b32b316-c2f5-4ddf-b05b-83dacd2d08b5","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:18.6485069Z","updatedOn":"2026-11-04T03:00:19.3075252Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"a4cf64e3-17d0-45b0-bc6c-4ee2c4b97215"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:19 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: DDC54CD0626B4EAEA97E3F230BDEE5C6 Ref B: DM2AA1091211023 Ref C: 2026-11-04T03:00:18Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/be7a6435-15ae-4171-8f30-4a343eff9e8f"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/be7a6435-15ae-4171-8f30-4a343eff9e8f","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:20.7573820Z","updatedOn":"2026-11-04T03:00:21.3443872Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"f5d35920-6fa2-40f9-9b34-b73e8f5817a4"}' + headers: + cache-control: + - no-cache + content-length: + - '1059' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:21 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 43382F6D6B04416BB40A51DF34FEE4C0 Ref B: SN4AA2022305029 Ref C: 2026-11-04T03:00:20Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/be7a6435-15ae-4171-8f30-4a343eff9e8f"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/be7a6435-15ae-4171-8f30-4a343eff9e8f","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:23.0680821Z","updatedOn":"2026-11-04T03:00:23.3480893Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"45586fbc-9f4a-4c49-a2ac-34220cc675ff"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:24 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: D303821A3EE94CFEA03B4A648C9383FD Ref B: SN4AA2022305035 Ref C: 2026-11-04T03:00:22Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/12338af0-0e69-4776-bea7-57ae8d297424"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/12338af0-0e69-4776-bea7-57ae8d297424","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:25.1566062Z","updatedOn":"2026-11-04T03:00:25.4706121Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.KeyVault/vaults/clihcpkv000007/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"38d03342-a3fe-475d-a28f-8fbc95f0c8c3"}' + headers: + cache-control: + - no-cache + content-length: + - '991' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:27 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: DBB5D0098BD74DA39F16198FE429C7E5 Ref B: SN4AA2022301021 Ref C: 2026-11-04T03:00:24Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:28.0508550Z","updatedOn":"2026-11-04T03:00:28.9091033Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"4c210f2d-292f-4499-9b0e-c84a90066df8"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:30 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 16D3CFDEDF3D427FAF989B642B992E88 Ref B: SN4AA2022301049 Ref C: 2026-11-04T03:00:27Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:30.8277569Z","updatedOn":"2026-11-04T03:00:31.9524810Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"55981d48-3174-4491-9a6f-78cd8b3d1f5d"}' + headers: + cache-control: + - no-cache + content-length: + - '1059' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:34 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 6F1C8727061E436D968DC0287B2DF733 Ref B: SN4AA2022305051 Ref C: 2026-11-04T03:00:30Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:34.5771169Z","updatedOn":"2026-11-04T03:00:35.4331292Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"96d431fa-6f0b-409c-ac9c-c2a054a17d85"}' + headers: + cache-control: + - no-cache + content-length: + - '1023' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:36 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 98672AB2956A49AD8191E4077B02BD00 Ref B: SN4AA2022301033 Ref C: 2026-11-04T03:00:34Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/8b32b316-c2f5-4ddf-b05b-83dacd2d08b5"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/8b32b316-c2f5-4ddf-b05b-83dacd2d08b5","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:37.9173354Z","updatedOn":"2026-11-04T03:00:38.8083621Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"1708729a-ad44-41b4-9003-d95f300fb965"}' + headers: + cache-control: + - no-cache + content-length: + - '1013' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:39 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 2A21DC6CA1324EADAA15E6A69055D6C2 Ref B: SN4AA2022301031 Ref C: 2026-11-04T03:00:37Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:40.3302401Z","updatedOn":"2026-11-04T03:00:41.0032361Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"e86551e6-cdd1-424e-a77a-cd0f1d055f3a"}' + headers: + cache-control: + - no-cache + content-length: + - '1043' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:46 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: B56280ABF0D2448E92DABDD1145D45C7 Ref B: SN4AA2022305049 Ref C: 2026-11-04T03:00:39Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:47.0120409Z","updatedOn":"2026-11-04T03:00:47.2810463Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"6ab6001f-17f1-4083-8d85-68a34f8ab788"}' + headers: + cache-control: + - no-cache + content-length: + - '1049' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:48 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 7E62212694584F3DA0B586865413ADA9 Ref B: SN4AA2022301053 Ref C: 2026-11-04T03:00:46Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:48.7580082Z","updatedOn":"2026-11-04T03:00:49.5780220Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"a96b0596-119b-4fee-a384-fcada68d9365"}' + headers: + cache-control: + - no-cache + content-length: + - '1041' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:49 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: BB5D2EE2E473412BB9672F3B2CAD5B1F Ref B: DM2AA1091214045 Ref C: 2026-11-04T03:00:48Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:51.2032441Z","updatedOn":"2026-11-04T03:00:52.3342612Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"9c289ba8-fa11-443e-9700-ce5d4cbe1b79"}' + headers: + cache-control: + - no-cache + content-length: + - '1049' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:52 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 7FE924D60FD24F05A53AA0C8D9BC310C Ref B: DM2AA1091212045 Ref C: 2026-11-04T03:00:50Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:53.8232850Z","updatedOn":"2026-11-04T03:00:54.5862946Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"c4bfeb62-bd2a-4e3e-9404-5e2650dbfa54"}' + headers: + cache-control: + - no-cache + content-length: + - '1043' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:55 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: C7042196C587485090D950B5D8FDA8DB Ref B: SN4AA2022303053 Ref C: 2026-11-04T03:00:53Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:00:56.2245508Z","updatedOn":"2026-11-04T03:00:56.8641193Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"70b153f5-9150-4d4f-8209-b0ab2b926d94"}' + headers: + cache-control: + - no-cache + content-length: + - '1043' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:00:58 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 26986DE38FAE4D879FA015E2AC761642 Ref B: SN4AA2022303023 Ref C: 2026-11-04T03:00:55Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:01:00.2268873Z","updatedOn":"2026-11-04T03:01:00.8888908Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"6f42b0e8-709b-48ad-aada-bd985dbf9aa8"}' + headers: + cache-control: + - no-cache + content-length: + - '1045' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:01:03 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 2687C4F00B134458A97D47A5D0AC9738 Ref B: SN4AA2022302027 Ref C: 2026-11-04T03:00:59Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:01:03.5706771Z","updatedOn":"2026-11-04T03:01:04.4577148Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"a6d6e225-be62-41c8-88e9-5730d169d6fb"}' + headers: + cache-control: + - no-cache + content-length: + - '1049' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:01:05 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 3838976F71F248D0AE1F2C3EA1DE0CEF Ref B: DM2AA1091213021 Ref C: 2026-11-04T03:01:03Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:01:06.6532937Z","updatedOn":"2026-11-04T03:01:07.4713113Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"a5cbda66-d258-4e3d-b3f2-b2880bf81308"}' + headers: + cache-control: + - no-cache + content-length: + - '1041' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:01:08 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 221140404B0C4E058A4B1A68DE3938E4 Ref B: SN4AA2022303053 Ref C: 2026-11-04T03:01:06Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:01:09.1192680Z","updatedOn":"2026-11-04T03:01:09.8242853Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"98921a7f-2aa5-4e84-9307-42c6e2fc8db2"}' + headers: + cache-control: + - no-cache + content-length: + - '1047' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:01:10 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 31053FE76F594B49A2643B43F87F4A34 Ref B: SN4AA2022303009 Ref C: 2026-11-04T03:01:08Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:01:11.3058058Z","updatedOn":"2026-11-04T03:01:11.6618164Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"3e8648c1-80d0-4cdb-9cbe-86b422285387"}' + headers: + cache-control: + - no-cache + content-length: + - '1047' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:01:13 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: DB2E9EDF9B8B4DAEA82EDE913D49DFC2 Ref B: SN4AA2022301025 Ref C: 2026-11-04T03:01:11Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"properties": {"principalId": "00000000-0000-0000-0000-000000000002", + "principalType": "ServicePrincipal", "roleDefinitionId": "/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e"}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - role assignment create + Connection: + - keep-alive + Content-Length: + - '270' + Content-Type: + - application/json + ParameterSetName: + - --assignee-object-id --assignee-principal-type --role --scope + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004?api-version=2022-04-01 + response: + body: + string: '{"properties":{"roleDefinitionId":"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e","principalId":"00000000-0000-0000-0000-000000000002","principalType":"ServicePrincipal","scope":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020","condition":null,"conditionVersion":null,"createdOn":"2026-11-04T03:01:14.2957049Z","updatedOn":"2026-11-04T03:01:14.7577172Z","createdBy":null,"updatedBy":"recording-user@example.com","delegatedManagedIdentityResourceId":null,"description":null},"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000004","type":"Microsoft.Authorization/roleAssignments","name":"3f390bbc-3b45-4f3e-995e-9b40aca46283"}' + headers: + cache-control: + - no-cache + content-length: + - '1049' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:01:15 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 1FB96B3FE2CD4668B88943525BB1FB21 Ref B: SN4AA2022305049 Ref C: 2026-11-04T03:01:14Z' + x-powered-by: + - ASP.NET + status: + code: 201 + message: Created +- request: + body: '{"identity": {"userAssignedIdentities": {"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010": + {}}, "type": "UserAssigned"}, "location": "uksouth", "properties": {"api": {"visibility": + "Public"}, "clusterImageRegistry": {"state": "Enabled"}, "cryptoRestrictions": + "None", "etcd": {"dataEncryption": {"customerManaged": {"encryptionType": "KMS", + "kms": {"activeKey": {"name": "etcd-data-kms-encryption-key", "version": "2194f189e201460aa9465785bc2fc7a9"}, + "keyVaultType": "KeyVault", "vaultName": "clihcpkv000007", "visibility": "Public"}}, + "keyManagementMode": "CustomerManaged"}}, "ingress": {"type": "Public"}, "network": + {"hostPrefix": 23, "machineCidr": "10.0.0.0/16", "networkType": "OVNKubernetes", + "podCidr": "10.128.0.0/14", "serviceCidr": "172.30.0.0/16"}, "platform": {"managedResourceGroup": + "clihcp-managed000006", "networkSecurityGroupId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005", + "operatorsAuthentication": {"userAssignedIdentities": {"controlPlaneOperators": + {"cluster-api-azure": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009", + "control-plane": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010", + "cloud-controller-manager": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011", + "ingress": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012", + "disk-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013", + "file-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014", + "image-registry": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015", + "cloud-network-config": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016", + "kms": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017"}, + "dataPlaneOperators": {"disk-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018", + "file-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019", + "image-registry": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020"}, + "serviceManagedIdentity": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008"}}, + "outboundType": "LoadBalancer", "subnetId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet", + "vnetIntegrationSubnetId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet"}, + "version": {"id": "4.22"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + Content-Length: + - '5747' + Content-Type: + - application/json + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002\",\n + \ \"identity\": {\n \"type\": \"UserAssigned\",\n \"userAssignedIdentities\": + {\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\": + {},\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\": + {}\n }\n },\n \"location\": \"uksouth\",\n \"name\": \"clihcp000002\",\n + \ \"properties\": {\n \"api\": {\n \"visibility\": \"Public\"\n + \ },\n \"autoscaling\": {\n \"maxNodeProvisionTimeSeconds\": + 900,\n \"maxPodGracePeriodSeconds\": 600,\n \"podPriorityThreshold\": + -10\n },\n \"clusterImageRegistry\": {\n \"state\": + \"Enabled\"\n },\n \"cryptoRestrictions\": \"None\",\n \"dns\": + {\n \"baseDomainPrefix\": \"cluster\"\n },\n \"etcd\": + {\n \"dataEncryption\": {\n \"customerManaged\": + {\n \"encryptionType\": \"KMS\",\n \"kms\": + {\n \"activeKey\": {\n \"name\": + \"etcd-data-kms-encryption-key\",\n \"version\": + \"2194f189e201460aa9465785bc2fc7a9\"\n },\n \"keyVaultType\": + \"KeyVault\",\n \"vaultName\": \"clihcpkv000007\",\n + \ \"visibility\": \"Public\"\n }\n + \ },\n \"keyManagementMode\": \"CustomerManaged\"\n + \ }\n },\n \"ingress\": {\n \"type\": \"Public\"\n + \ },\n \"network\": {\n \"hostPrefix\": 23,\n \"machineCidr\": + \"10.0.0.0/16\",\n \"networkType\": \"OVNKubernetes\",\n \"podCidr\": + \"10.128.0.0/14\",\n \"serviceCidr\": \"172.30.0.0/16\"\n },\n + \ \"nodeDrainTimeoutMinutes\": 0,\n \"platform\": {\n \"managedResourceGroup\": + \"clihcp-managed000006\",\n \"networkSecurityGroupId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005\",\n + \ \"operatorsAuthentication\": {\n \"userAssignedIdentities\": + {\n \"controlPlaneOperators\": {\n \"cloud-controller-manager\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\",\n + \ \"cloud-network-config\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\",\n + \ \"cluster-api-azure\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\",\n + \ \"control-plane\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\",\n + \ \"disk-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\",\n + \ \"ingress\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\",\n + \ \"kms\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\"\n + \ },\n \"dataPlaneOperators\": {\n \"disk-csi-driver\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020\"\n + \ },\n \"serviceManagedIdentity\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\"\n + \ }\n },\n \"outboundType\": \"LoadBalancer\",\n + \ \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vnetIntegrationSubnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet\"\n + \ },\n \"provisioningState\": \"Accepted\",\n \"version\": + {\n \"channelGroup\": \"stable\",\n \"id\": \"4.22\"\n + \ }\n },\n \"systemData\": {\n \"createdAt\": \"2026-11-04T03:01:16.5762188Z\",\n + \ \"createdBy\": \"recording-user@example.com\",\n \"createdByType\": + \"User\",\n \"lastModifiedAt\": \"2026-11-04T03:01:16.5762188Z\",\n + \ \"lastModifiedBy\": \"recording-user@example.com\",\n \"lastModifiedByType\": + \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters\"\n}" + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '7923' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:01:15 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '20' + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 52C4E2D6265844CDB085F815B1337AFF Ref B: DM2AA1091214017 Ref C: 2026-11-04T03:01:16Z' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Accepted\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:01:17 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 3084CB46B3884ADEB5F23209B5AADFA5 Ref B: SN4AA2022303051 Ref C: 2026-11-04T03:01:17Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:01:47 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 81E91A9F3FB84452B70BD51747FEC058 Ref B: SN4AA2022303047 Ref C: 2026-11-04T03:01:47Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:02:18 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 2EE2CD69DB594C4084704EC43BF39612 Ref B: DM2AA1091212025 Ref C: 2026-11-04T03:02:18Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:02:49 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 3A82A935263340B4BCE681D0A8AB4C9A Ref B: DM2AA1091211027 Ref C: 2026-11-04T03:02:49Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:03:20 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: A30888D1865A48BCA10CCFED8BD09344 Ref B: DM2AA1091214047 Ref C: 2026-11-04T03:03:20Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:03:50 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: F1A539A5F7D1410388E7E7C289A0F61B Ref B: SN4AA2022304011 Ref C: 2026-11-04T03:03:51Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:04:21 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: B80C8A6B3F614FC29020E794CA6F8369 Ref B: SN4AA2022303053 Ref C: 2026-11-04T03:04:21Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:04:52 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 16C89393F0854D01A90EBF8BA131A68D Ref B: SN4AA2022301021 Ref C: 2026-11-04T03:04:52Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:05:23 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: BD86CC1FA4B44B57B49D8A91526607CE Ref B: SN4AA2022305053 Ref C: 2026-11-04T03:05:23Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:05:53 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 4F6AC3755D8D471A85299214F142209F Ref B: SN4AA2022302047 Ref C: 2026-11-04T03:05:53Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:06:24 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 53D210934CFF4D399F23BF166B5FC820 Ref B: SN4AA2022303019 Ref C: 2026-11-04T03:06:24Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:06:55 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 1F998FB79F4449789A30B172FF7B8778 Ref B: DM2AA1091213035 Ref C: 2026-11-04T03:06:55Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:07:26 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: CB1D0C968A7247488FFCD9BD33FD4E24 Ref B: DM2AA1091214021 Ref C: 2026-11-04T03:07:25Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:07:57 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 27623F0647D5447580522CD4A77F90D8 Ref B: SN4AA2022303023 Ref C: 2026-11-04T03:07:56Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:08:27 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 66FCFC10CE6B475CA467AFE81D88B12F Ref B: SN4AA2022304045 Ref C: 2026-11-04T03:08:27Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:08:58 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: FF5D99066D494443B7CEF718D68E8C23 Ref B: SN4AA2022305051 Ref C: 2026-11-04T03:08:58Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:09:28 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: D7F8C51797554FA39A598159FDEC91AF Ref B: DM2AA1091214037 Ref C: 2026-11-04T03:09:29Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:09:59 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 792465401DD64C20881AE693BA7957F0 Ref B: SN4AA2022304049 Ref C: 2026-11-04T03:09:59Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:10:29 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 4D3C244FF6BC4533B62132BA514A1B25 Ref B: DM2AA1091213053 Ref C: 2026-11-04T03:10:30Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:11:00 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: E265E2CE547E45AA86DF178DE9676BD6 Ref B: SN4AA2022304035 Ref C: 2026-11-04T03:11:00Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:11:32 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: ED5478E2106B424B92906DB22A15BAD5 Ref B: SN4AA2022301033 Ref C: 2026-11-04T03:11:31Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:12:02 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 11145050EE1E4C5F87F1B7EE825F9D95 Ref B: SN4AA2022305023 Ref C: 2026-11-04T03:12:02Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da?api-version=2026-10-01&t=639293580768418527&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/cedaf982-01af-439b-978d-9b298f5a55da\",\n + \ \"name\": \"cedaf982-01af-439b-978d-9b298f5a55da\",\n \"status\": \"Succeeded\",\n + \ \"startTime\": \"2026-11-04T03:01:16.785002035Z\",\n \"endTime\": \"2026-11-04T03:12:27.096320383Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '358' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:12:32 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 215F9138C6594371A21952F6FD06A8ED Ref B: SN4AA2022301035 Ref C: 2026-11-04T03:12:33Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster create + Connection: + - keep-alive + ParameterSetName: + - -g -n --location --version --subnet-id --vnet-integration-subnet-id --nsg + --managed-resource-group-name --key-management-mode --kms-vault-name --vault-visibility + --kms-active-key --assign-service-managed-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-control-plane-operator-identity --assign-control-plane-operator-identity + --assign-data-plane-operator-identity --assign-data-plane-operator-identity + --assign-data-plane-operator-identity + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002\",\n + \ \"identity\": {\n \"type\": \"UserAssigned\",\n \"userAssignedIdentities\": + {\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ }\n }\n },\n \"location\": \"uksouth\",\n \"name\": + \"clihcp000002\",\n \"properties\": {\n \"api\": {\n \"url\": + \"https://api.cluster.pg9q9.uksouth.aroapp-hcp.io:443\",\n \"visibility\": + \"Public\"\n },\n \"autoscaling\": {\n \"maxNodeProvisionTimeSeconds\": + 900,\n \"maxPodGracePeriodSeconds\": 600,\n \"podPriorityThreshold\": + -10\n },\n \"clusterImageRegistry\": {\n \"state\": + \"Enabled\"\n },\n \"console\": {\n \"url\": \"https://console-openshift-console.apps.aro.cluster.pg9q9.uksouth.aroapp-hcp.io\"\n + \ },\n \"cryptoRestrictions\": \"None\",\n \"dns\": {\n + \ \"baseDomain\": \"pg9q9.uksouth.aroapp-hcp.io\",\n \"baseDomainPrefix\": + \"cluster\"\n },\n \"etcd\": {\n \"dataEncryption\": + {\n \"customerManaged\": {\n \"encryptionType\": + \"KMS\",\n \"kms\": {\n \"activeKey\": + {\n \"name\": \"etcd-data-kms-encryption-key\",\n + \ \"version\": \"2194f189e201460aa9465785bc2fc7a9\"\n + \ },\n \"keyVaultType\": \"KeyVault\",\n + \ \"vaultName\": \"clihcpkv000007\",\n \"visibility\": + \"Public\"\n }\n },\n \"keyManagementMode\": + \"CustomerManaged\"\n }\n },\n \"ingress\": {\n \"type\": + \"Public\"\n },\n \"network\": {\n \"hostPrefix\": + 23,\n \"machineCidr\": \"10.0.0.0/16\",\n \"networkType\": + \"OVNKubernetes\",\n \"podCidr\": \"10.128.0.0/14\",\n \"serviceCidr\": + \"172.30.0.0/16\"\n },\n \"nodeDrainTimeoutMinutes\": 0,\n \"platform\": + {\n \"issuerUrl\": \"https://uksouth.oic.aro-hcp.azure.com/00000000-0000-0000-0000-000000000001/2ts540mr2595fe25uq5g15odjmjclg6n\",\n + \ \"managedResourceGroup\": \"clihcp-managed000006\",\n \"networkSecurityGroupId\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005\",\n + \ \"operatorsAuthentication\": {\n \"userAssignedIdentities\": + {\n \"controlPlaneOperators\": {\n \"cloud-controller-manager\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\",\n + \ \"cloud-network-config\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\",\n + \ \"cluster-api-azure\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\",\n + \ \"control-plane\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\",\n + \ \"disk-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\",\n + \ \"ingress\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\",\n + \ \"kms\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\"\n + \ },\n \"dataPlaneOperators\": {\n \"disk-csi-driver\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020\"\n + \ },\n \"serviceManagedIdentity\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\"\n + \ }\n },\n \"outboundType\": \"LoadBalancer\",\n + \ \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vnetIntegrationSubnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet\"\n + \ },\n \"provisioningState\": \"Succeeded\",\n \"status\": + {\n \"activeVersions\": [\n {\n \"version\": + \"4.22\"\n }\n ],\n \"conditions\": [\n + \ {\n \"lastTransitionTime\": \"2026-11-04T03:01:18Z\",\n + \ \"message\": \"\",\n \"reason\": \"Valid\",\n + \ \"status\": \"True\",\n \"type\": \"RequirementsValid\"\n + \ }\n ]\n },\n \"version\": {\n \"channelGroup\": + \"stable\",\n \"id\": \"4.22\"\n }\n },\n \"systemData\": + {\n \"createdAt\": \"2026-11-04T03:01:16.5762188Z\",\n \"createdBy\": + \"recording-user@example.com\",\n \"createdByType\": \"User\",\n \"lastModifiedAt\": + \"2026-11-04T03:01:16.5762188Z\",\n \"lastModifiedBy\": \"recording-user@example.com\",\n + \ \"lastModifiedByType\": \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '10289' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:12:34 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '14' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 4DC316B2E576457681EF241954CBFA64 Ref B: SN4AA2022301051 Ref C: 2026-11-04T03:12:33Z' + status: + code: 200 + message: OK +- request: + body: '{"certificateSigningRequest": "redacted-csr"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster request-credential + Connection: + - keep-alive + Content-Length: + - '45' + Content-Type: + - application/json + ParameterSetName: + - -g -n --admin -f + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: POST + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/requestAdminCredential?api-version=2026-10-01 + response: + body: + string: '' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/6933a9be-6f48-459b-aa4d-17736b913511?api-version=2026-10-01&t=639293587554386740&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '0' + date: + - Wed, 04 Nov 2026 03:12:34 GMT + expires: + - '-1' + location: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationResults/6933a9be-6f48-459b-aa4d-17736b913511?api-version=2026-10-01&t=639293587554542997&c=REDACTED&s=REDACTED&h=REDACTED + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '17' + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: B3A09D1920EB4E56A80939E987792A5D Ref B: DM2AA1091212033 Ref C: 2026-11-04T03:12:35Z' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster request-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n --admin -f + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/6933a9be-6f48-459b-aa4d-17736b913511?api-version=2026-10-01&t=639293587554386740&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/6933a9be-6f48-459b-aa4d-17736b913511\",\n + \ \"name\": \"6933a9be-6f48-459b-aa4d-17736b913511\",\n \"status\": \"Accepted\",\n + \ \"startTime\": \"2026-11-04T03:12:35.420206962Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:12:35 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: CA7D9B87118B49E2B4E614544DB0D0CA Ref B: SN4AA2022304017 Ref C: 2026-11-04T03:12:35Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster request-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n --admin -f + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/6933a9be-6f48-459b-aa4d-17736b913511?api-version=2026-10-01&t=639293587554386740&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/6933a9be-6f48-459b-aa4d-17736b913511\",\n + \ \"name\": \"6933a9be-6f48-459b-aa4d-17736b913511\",\n \"status\": \"Succeeded\",\n + \ \"startTime\": \"2026-11-04T03:12:35.420206962Z\",\n \"endTime\": \"2026-11-04T03:12:47.069053172Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '358' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:13:06 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 060F83866C3D4B63A792260260246AD8 Ref B: SN4AA2022303037 Ref C: 2026-11-04T03:13:06Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster request-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n --admin -f + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationResults/6933a9be-6f48-459b-aa4d-17736b913511?api-version=2026-10-01&t=639293587554542997&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '{"expirationTimestamp": "2026-11-05T03:12:35Z", "kubeconfig": "apiVersion: + v1\nclusters:\n- cluster:\n certificate-authority-data: UkVEQUNURUQ=\n server: + https://api.cluster.pg9q9.uksouth.aroapp-hcp.io:443\n name: cluster\ncontexts:\n- + context:\n cluster: cluster\n user: admin\n name: admin\ncurrent-context: + admin\nkind: Config\nusers:\n- name: admin\n user:\n client-certificate-data: + UkVEQUNURUQ=\n"}' + headers: + cache-control: + - no-cache + content-length: + - '422' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:13:07 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '19' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 9B5F77509D6D455D8E3B8268EAEA3E88 Ref B: SN4AA2022302019 Ref C: 2026-11-04T03:13:07Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster show + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002\",\n + \ \"identity\": {\n \"type\": \"UserAssigned\",\n \"userAssignedIdentities\": + {\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ }\n }\n },\n \"location\": \"uksouth\",\n \"name\": + \"clihcp000002\",\n \"properties\": {\n \"api\": {\n \"url\": + \"https://api.cluster.pg9q9.uksouth.aroapp-hcp.io:443\",\n \"visibility\": + \"Public\"\n },\n \"autoscaling\": {\n \"maxNodeProvisionTimeSeconds\": + 900,\n \"maxPodGracePeriodSeconds\": 600,\n \"podPriorityThreshold\": + -10\n },\n \"clusterImageRegistry\": {\n \"state\": + \"Enabled\"\n },\n \"console\": {\n \"url\": \"https://console-openshift-console.apps.aro.cluster.pg9q9.uksouth.aroapp-hcp.io\"\n + \ },\n \"cryptoRestrictions\": \"None\",\n \"dns\": {\n + \ \"baseDomain\": \"pg9q9.uksouth.aroapp-hcp.io\",\n \"baseDomainPrefix\": + \"cluster\"\n },\n \"etcd\": {\n \"dataEncryption\": + {\n \"customerManaged\": {\n \"encryptionType\": + \"KMS\",\n \"kms\": {\n \"activeKey\": + {\n \"name\": \"etcd-data-kms-encryption-key\",\n + \ \"version\": \"2194f189e201460aa9465785bc2fc7a9\"\n + \ },\n \"keyVaultType\": \"KeyVault\",\n + \ \"vaultName\": \"clihcpkv000007\",\n \"visibility\": + \"Public\"\n }\n },\n \"keyManagementMode\": + \"CustomerManaged\"\n }\n },\n \"ingress\": {\n \"type\": + \"Public\"\n },\n \"network\": {\n \"hostPrefix\": + 23,\n \"machineCidr\": \"10.0.0.0/16\",\n \"networkType\": + \"OVNKubernetes\",\n \"podCidr\": \"10.128.0.0/14\",\n \"serviceCidr\": + \"172.30.0.0/16\"\n },\n \"nodeDrainTimeoutMinutes\": 0,\n \"platform\": + {\n \"issuerUrl\": \"https://uksouth.oic.aro-hcp.azure.com/00000000-0000-0000-0000-000000000001/2ts540mr2595fe25uq5g15odjmjclg6n\",\n + \ \"managedResourceGroup\": \"clihcp-managed000006\",\n \"networkSecurityGroupId\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005\",\n + \ \"operatorsAuthentication\": {\n \"userAssignedIdentities\": + {\n \"controlPlaneOperators\": {\n \"cloud-controller-manager\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\",\n + \ \"cloud-network-config\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\",\n + \ \"cluster-api-azure\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\",\n + \ \"control-plane\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\",\n + \ \"disk-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\",\n + \ \"ingress\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\",\n + \ \"kms\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\"\n + \ },\n \"dataPlaneOperators\": {\n \"disk-csi-driver\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020\"\n + \ },\n \"serviceManagedIdentity\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\"\n + \ }\n },\n \"outboundType\": \"LoadBalancer\",\n + \ \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vnetIntegrationSubnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet\"\n + \ },\n \"provisioningState\": \"Succeeded\",\n \"status\": + {\n \"activeVersions\": [\n {\n \"version\": + \"4.22\"\n }\n ],\n \"conditions\": [\n + \ {\n \"lastTransitionTime\": \"2026-11-04T03:01:18Z\",\n + \ \"message\": \"\",\n \"reason\": \"Valid\",\n + \ \"status\": \"True\",\n \"type\": \"RequirementsValid\"\n + \ }\n ]\n },\n \"version\": {\n \"channelGroup\": + \"stable\",\n \"id\": \"4.22\"\n }\n },\n \"systemData\": + {\n \"createdAt\": \"2026-11-04T03:01:16.5762188Z\",\n \"createdBy\": + \"recording-user@example.com\",\n \"createdByType\": \"User\",\n \"lastModifiedAt\": + \"2026-11-04T03:01:16.5762188Z\",\n \"lastModifiedBy\": \"recording-user@example.com\",\n + \ \"lastModifiedByType\": \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '10289' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:13:07 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 74E1294FC2F24272996DA3704E7E759E Ref B: DM2AA1091211011 Ref C: 2026-11-04T03:13:08Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster update + Connection: + - keep-alive + ParameterSetName: + - -g -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002\",\n + \ \"identity\": {\n \"type\": \"UserAssigned\",\n \"userAssignedIdentities\": + {\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ }\n }\n },\n \"location\": \"uksouth\",\n \"name\": + \"clihcp000002\",\n \"properties\": {\n \"api\": {\n \"url\": + \"https://api.cluster.pg9q9.uksouth.aroapp-hcp.io:443\",\n \"visibility\": + \"Public\"\n },\n \"autoscaling\": {\n \"maxNodeProvisionTimeSeconds\": + 900,\n \"maxPodGracePeriodSeconds\": 600,\n \"podPriorityThreshold\": + -10\n },\n \"clusterImageRegistry\": {\n \"state\": + \"Enabled\"\n },\n \"console\": {\n \"url\": \"https://console-openshift-console.apps.aro.cluster.pg9q9.uksouth.aroapp-hcp.io\"\n + \ },\n \"cryptoRestrictions\": \"None\",\n \"dns\": {\n + \ \"baseDomain\": \"pg9q9.uksouth.aroapp-hcp.io\",\n \"baseDomainPrefix\": + \"cluster\"\n },\n \"etcd\": {\n \"dataEncryption\": + {\n \"customerManaged\": {\n \"encryptionType\": + \"KMS\",\n \"kms\": {\n \"activeKey\": + {\n \"name\": \"etcd-data-kms-encryption-key\",\n + \ \"version\": \"2194f189e201460aa9465785bc2fc7a9\"\n + \ },\n \"keyVaultType\": \"KeyVault\",\n + \ \"vaultName\": \"clihcpkv000007\",\n \"visibility\": + \"Public\"\n }\n },\n \"keyManagementMode\": + \"CustomerManaged\"\n }\n },\n \"ingress\": {\n \"type\": + \"Public\"\n },\n \"network\": {\n \"hostPrefix\": + 23,\n \"machineCidr\": \"10.0.0.0/16\",\n \"networkType\": + \"OVNKubernetes\",\n \"podCidr\": \"10.128.0.0/14\",\n \"serviceCidr\": + \"172.30.0.0/16\"\n },\n \"nodeDrainTimeoutMinutes\": 0,\n \"platform\": + {\n \"issuerUrl\": \"https://uksouth.oic.aro-hcp.azure.com/00000000-0000-0000-0000-000000000001/2ts540mr2595fe25uq5g15odjmjclg6n\",\n + \ \"managedResourceGroup\": \"clihcp-managed000006\",\n \"networkSecurityGroupId\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005\",\n + \ \"operatorsAuthentication\": {\n \"userAssignedIdentities\": + {\n \"controlPlaneOperators\": {\n \"cloud-controller-manager\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\",\n + \ \"cloud-network-config\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\",\n + \ \"cluster-api-azure\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\",\n + \ \"control-plane\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\",\n + \ \"disk-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\",\n + \ \"ingress\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\",\n + \ \"kms\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\"\n + \ },\n \"dataPlaneOperators\": {\n \"disk-csi-driver\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020\"\n + \ },\n \"serviceManagedIdentity\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\"\n + \ }\n },\n \"outboundType\": \"LoadBalancer\",\n + \ \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vnetIntegrationSubnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet\"\n + \ },\n \"provisioningState\": \"Succeeded\",\n \"status\": + {\n \"activeVersions\": [\n {\n \"version\": + \"4.22\"\n }\n ],\n \"conditions\": [\n + \ {\n \"lastTransitionTime\": \"2026-11-04T03:01:18Z\",\n + \ \"message\": \"\",\n \"reason\": \"Valid\",\n + \ \"status\": \"True\",\n \"type\": \"RequirementsValid\"\n + \ }\n ]\n },\n \"version\": {\n \"channelGroup\": + \"stable\",\n \"id\": \"4.22\"\n }\n },\n \"systemData\": + {\n \"createdAt\": \"2026-11-04T03:01:16.5762188Z\",\n \"createdBy\": + \"recording-user@example.com\",\n \"createdByType\": \"User\",\n \"lastModifiedAt\": + \"2026-11-04T03:01:16.5762188Z\",\n \"lastModifiedBy\": \"recording-user@example.com\",\n + \ \"lastModifiedByType\": \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '10289' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:13:08 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3747' + x-msedge-ref: + - 'Ref A: B8CD19D24BE5484792C7EB20FD16F496 Ref B: DM2AA1091214029 Ref C: 2026-11-04T03:13:08Z' + status: + code: 200 + message: OK +- request: + body: '{"identity": {"type": "UserAssigned", "userAssignedIdentities": {"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016": + {}, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008": + {}}}, "location": "uksouth", "properties": {"api": {"visibility": "Public"}, + "autoscaling": {"maxNodeProvisionTimeSeconds": 900, "maxPodGracePeriodSeconds": + 600, "podPriorityThreshold": -10}, "clusterImageRegistry": {"state": "Enabled"}, + "cryptoRestrictions": "None", "dns": {"baseDomainPrefix": "cluster"}, "etcd": + {"dataEncryption": {"customerManaged": {"encryptionType": "KMS", "kms": {"activeKey": + {"name": "etcd-data-kms-encryption-key", "version": "2194f189e201460aa9465785bc2fc7a9"}, + "keyVaultType": "KeyVault", "vaultName": "clihcpkv000007", "visibility": "Public"}}, + "keyManagementMode": "CustomerManaged"}}, "ingress": {"type": "Public"}, "network": + {"hostPrefix": 23, "machineCidr": "10.0.0.0/16", "networkType": "OVNKubernetes", + "podCidr": "10.128.0.0/14", "serviceCidr": "172.30.0.0/16"}, "nodeDrainTimeoutMinutes": + 30, "platform": {"managedResourceGroup": "clihcp-managed000006", "networkSecurityGroupId": + "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005", + "operatorsAuthentication": {"userAssignedIdentities": {"controlPlaneOperators": + {"cloud-controller-manager": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011", + "cloud-network-config": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016", + "cluster-api-azure": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009", + "control-plane": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010", + "disk-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013", + "file-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014", + "image-registry": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015", + "ingress": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012", + "kms": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017"}, + "dataPlaneOperators": {"disk-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018", + "file-csi-driver": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019", + "image-registry": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020"}, + "serviceManagedIdentity": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008"}}, + "outboundType": "LoadBalancer", "subnetId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet", + "vnetIntegrationSubnetId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet"}, + "version": {"channelGroup": "stable", "id": "4.22"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster update + Connection: + - keep-alive + Content-Length: + - '5959' + Content-Type: + - application/json + ParameterSetName: + - -g -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002\",\n + \ \"identity\": {\n \"type\": \"UserAssigned\",\n \"userAssignedIdentities\": + {\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ }\n }\n },\n \"location\": \"uksouth\",\n \"name\": + \"clihcp000002\",\n \"properties\": {\n \"api\": {\n \"url\": + \"https://api.cluster.pg9q9.uksouth.aroapp-hcp.io:443\",\n \"visibility\": + \"Public\"\n },\n \"autoscaling\": {\n \"maxNodeProvisionTimeSeconds\": + 900,\n \"maxPodGracePeriodSeconds\": 600,\n \"podPriorityThreshold\": + -10\n },\n \"clusterImageRegistry\": {\n \"state\": + \"Enabled\"\n },\n \"console\": {\n \"url\": \"https://console-openshift-console.apps.aro.cluster.pg9q9.uksouth.aroapp-hcp.io\"\n + \ },\n \"cryptoRestrictions\": \"None\",\n \"dns\": {\n + \ \"baseDomain\": \"pg9q9.uksouth.aroapp-hcp.io\",\n \"baseDomainPrefix\": + \"cluster\"\n },\n \"etcd\": {\n \"dataEncryption\": + {\n \"customerManaged\": {\n \"encryptionType\": + \"KMS\",\n \"kms\": {\n \"activeKey\": + {\n \"name\": \"etcd-data-kms-encryption-key\",\n + \ \"version\": \"2194f189e201460aa9465785bc2fc7a9\"\n + \ },\n \"keyVaultType\": \"KeyVault\",\n + \ \"vaultName\": \"clihcpkv000007\",\n \"visibility\": + \"Public\"\n }\n },\n \"keyManagementMode\": + \"CustomerManaged\"\n }\n },\n \"ingress\": {\n \"type\": + \"Public\"\n },\n \"network\": {\n \"hostPrefix\": + 23,\n \"machineCidr\": \"10.0.0.0/16\",\n \"networkType\": + \"OVNKubernetes\",\n \"podCidr\": \"10.128.0.0/14\",\n \"serviceCidr\": + \"172.30.0.0/16\"\n },\n \"nodeDrainTimeoutMinutes\": 30,\n + \ \"platform\": {\n \"issuerUrl\": \"https://uksouth.oic.aro-hcp.azure.com/00000000-0000-0000-0000-000000000001/2ts540mr2595fe25uq5g15odjmjclg6n\",\n + \ \"managedResourceGroup\": \"clihcp-managed000006\",\n \"networkSecurityGroupId\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005\",\n + \ \"operatorsAuthentication\": {\n \"userAssignedIdentities\": + {\n \"controlPlaneOperators\": {\n \"cloud-controller-manager\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\",\n + \ \"cloud-network-config\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\",\n + \ \"cluster-api-azure\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\",\n + \ \"control-plane\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\",\n + \ \"disk-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\",\n + \ \"ingress\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\",\n + \ \"kms\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\"\n + \ },\n \"dataPlaneOperators\": {\n \"disk-csi-driver\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020\"\n + \ },\n \"serviceManagedIdentity\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\"\n + \ }\n },\n \"outboundType\": \"LoadBalancer\",\n + \ \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vnetIntegrationSubnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet\"\n + \ },\n \"provisioningState\": \"Accepted\",\n \"status\": + {\n \"activeVersions\": [\n {\n \"version\": + \"4.22\"\n }\n ],\n \"conditions\": [\n + \ {\n \"lastTransitionTime\": \"2026-11-04T03:01:18Z\",\n + \ \"message\": \"\",\n \"reason\": \"Valid\",\n + \ \"status\": \"True\",\n \"type\": \"RequirementsValid\"\n + \ }\n ]\n },\n \"version\": {\n \"channelGroup\": + \"stable\",\n \"id\": \"4.22\"\n }\n },\n \"systemData\": + {\n \"createdAt\": \"2026-11-04T03:01:16.5762188Z\",\n \"createdBy\": + \"recording-user@example.com\",\n \"createdByType\": \"User\",\n \"lastModifiedAt\": + \"2026-11-04T03:13:09.0135705Z\",\n \"lastModifiedBy\": \"recording-user@example.com\",\n + \ \"lastModifiedByType\": \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters\"\n}" + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/07a0fdd7-2353-47c7-98fd-4acf5c2d08f4?api-version=2026-10-01&t=639293587892791952&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '10289' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:13:08 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '25' + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 378AF255DA0144E6AF9A21DB29B392D1 Ref B: SN4AA2022304037 Ref C: 2026-11-04T03:13:08Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster update + Connection: + - keep-alive + ParameterSetName: + - -g -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/07a0fdd7-2353-47c7-98fd-4acf5c2d08f4?api-version=2026-10-01&t=639293587892791952&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/07a0fdd7-2353-47c7-98fd-4acf5c2d08f4\",\n + \ \"name\": \"07a0fdd7-2353-47c7-98fd-4acf5c2d08f4\",\n \"status\": \"Accepted\",\n + \ \"startTime\": \"2026-11-04T03:13:09.21932335Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '307' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:13:09 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 0CA9E2F8752E4350AAD03BBC1E22026C Ref B: DM2AA1091212009 Ref C: 2026-11-04T03:13:09Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster update + Connection: + - keep-alive + ParameterSetName: + - -g -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/07a0fdd7-2353-47c7-98fd-4acf5c2d08f4?api-version=2026-10-01&t=639293587892791952&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/07a0fdd7-2353-47c7-98fd-4acf5c2d08f4\",\n + \ \"name\": \"07a0fdd7-2353-47c7-98fd-4acf5c2d08f4\",\n \"status\": \"Updating\",\n + \ \"startTime\": \"2026-11-04T03:13:09.21932335Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '307' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:13:40 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 60F1C81F9CF647B8BFAD0EE2CD8F95E5 Ref B: DM2AA1091211031 Ref C: 2026-11-04T03:13:40Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster update + Connection: + - keep-alive + ParameterSetName: + - -g -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/07a0fdd7-2353-47c7-98fd-4acf5c2d08f4?api-version=2026-10-01&t=639293587892791952&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/07a0fdd7-2353-47c7-98fd-4acf5c2d08f4\",\n + \ \"name\": \"07a0fdd7-2353-47c7-98fd-4acf5c2d08f4\",\n \"status\": \"Succeeded\",\n + \ \"startTime\": \"2026-11-04T03:13:09.21932335Z\",\n \"endTime\": \"2026-11-04T03:13:57.264706821Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '357' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:14:11 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 4356EC05206B458ABAECD8796CBC1782 Ref B: SN4AA2022302019 Ref C: 2026-11-04T03:14:11Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster update + Connection: + - keep-alive + ParameterSetName: + - -g -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002\",\n + \ \"identity\": {\n \"type\": \"UserAssigned\",\n \"userAssignedIdentities\": + {\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ }\n }\n },\n \"location\": \"uksouth\",\n \"name\": + \"clihcp000002\",\n \"properties\": {\n \"api\": {\n \"url\": + \"https://api.cluster.pg9q9.uksouth.aroapp-hcp.io:443\",\n \"visibility\": + \"Public\"\n },\n \"autoscaling\": {\n \"maxNodeProvisionTimeSeconds\": + 900,\n \"maxPodGracePeriodSeconds\": 600,\n \"podPriorityThreshold\": + -10\n },\n \"clusterImageRegistry\": {\n \"state\": + \"Enabled\"\n },\n \"console\": {\n \"url\": \"https://console-openshift-console.apps.aro.cluster.pg9q9.uksouth.aroapp-hcp.io\"\n + \ },\n \"cryptoRestrictions\": \"None\",\n \"dns\": {\n + \ \"baseDomain\": \"pg9q9.uksouth.aroapp-hcp.io\",\n \"baseDomainPrefix\": + \"cluster\"\n },\n \"etcd\": {\n \"dataEncryption\": + {\n \"customerManaged\": {\n \"encryptionType\": + \"KMS\",\n \"kms\": {\n \"activeKey\": + {\n \"name\": \"etcd-data-kms-encryption-key\",\n + \ \"version\": \"2194f189e201460aa9465785bc2fc7a9\"\n + \ },\n \"keyVaultType\": \"KeyVault\",\n + \ \"vaultName\": \"clihcpkv000007\",\n \"visibility\": + \"Public\"\n }\n },\n \"keyManagementMode\": + \"CustomerManaged\"\n }\n },\n \"ingress\": {\n \"type\": + \"Public\"\n },\n \"network\": {\n \"hostPrefix\": + 23,\n \"machineCidr\": \"10.0.0.0/16\",\n \"networkType\": + \"OVNKubernetes\",\n \"podCidr\": \"10.128.0.0/14\",\n \"serviceCidr\": + \"172.30.0.0/16\"\n },\n \"nodeDrainTimeoutMinutes\": 30,\n + \ \"platform\": {\n \"issuerUrl\": \"https://uksouth.oic.aro-hcp.azure.com/00000000-0000-0000-0000-000000000001/2ts540mr2595fe25uq5g15odjmjclg6n\",\n + \ \"managedResourceGroup\": \"clihcp-managed000006\",\n \"networkSecurityGroupId\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005\",\n + \ \"operatorsAuthentication\": {\n \"userAssignedIdentities\": + {\n \"controlPlaneOperators\": {\n \"cloud-controller-manager\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\",\n + \ \"cloud-network-config\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\",\n + \ \"cluster-api-azure\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\",\n + \ \"control-plane\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\",\n + \ \"disk-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\",\n + \ \"ingress\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\",\n + \ \"kms\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\"\n + \ },\n \"dataPlaneOperators\": {\n \"disk-csi-driver\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020\"\n + \ },\n \"serviceManagedIdentity\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\"\n + \ }\n },\n \"outboundType\": \"LoadBalancer\",\n + \ \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vnetIntegrationSubnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet\"\n + \ },\n \"provisioningState\": \"Succeeded\",\n \"status\": + {\n \"activeVersions\": [\n {\n \"version\": + \"4.22\"\n }\n ],\n \"conditions\": [\n + \ {\n \"lastTransitionTime\": \"2026-11-04T03:01:18Z\",\n + \ \"message\": \"\",\n \"reason\": \"Valid\",\n + \ \"status\": \"True\",\n \"type\": \"RequirementsValid\"\n + \ }\n ]\n },\n \"version\": {\n \"channelGroup\": + \"stable\",\n \"id\": \"4.22\"\n }\n },\n \"systemData\": + {\n \"createdAt\": \"2026-11-04T03:01:16.5762188Z\",\n \"createdBy\": + \"recording-user@example.com\",\n \"createdByType\": \"User\",\n \"lastModifiedAt\": + \"2026-11-04T03:13:09.0135705Z\",\n \"lastModifiedBy\": \"recording-user@example.com\",\n + \ \"lastModifiedByType\": \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '10290' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:14:11 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 36DFEB57FB4E46C489E96C3C99C5CF64 Ref B: SN4AA2022302029 Ref C: 2026-11-04T03:14:11Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_aro_hcp000001?api-version=2024-11-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001","name":"cli_test_aro_hcp000001","type":"Microsoft.Resources/resourceGroups","location":"uksouth","tags":{"product":"azurecli","cause":"automation","test":"test_aro_hcp_cluster_lifecycle","date":"2026-11-04T02:56:50Z","module":"aro","createdAt":"2026-11-04T02:56:51.5644970Z"},"properties":{"provisioningState":"Succeeded"}}' + headers: + cache-control: + - no-cache + content-length: + - '421' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 04 Nov 2026 03:14:12 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: CD3F9ABB3AFB4826AB4384717F11492C Ref B: SN4AA2022303029 Ref C: 2026-11-04T03:14:12Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002\",\n + \ \"identity\": {\n \"type\": \"UserAssigned\",\n \"userAssignedIdentities\": + {\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ },\n \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\": + {\n \"clientId\": \"00000000-0000-0000-0000-000000000003\",\n + \ \"principalId\": \"00000000-0000-0000-0000-000000000002\"\n + \ }\n }\n },\n \"location\": \"uksouth\",\n \"name\": + \"clihcp000002\",\n \"properties\": {\n \"api\": {\n \"url\": + \"https://api.cluster.pg9q9.uksouth.aroapp-hcp.io:443\",\n \"visibility\": + \"Public\"\n },\n \"autoscaling\": {\n \"maxNodeProvisionTimeSeconds\": + 900,\n \"maxPodGracePeriodSeconds\": 600,\n \"podPriorityThreshold\": + -10\n },\n \"clusterImageRegistry\": {\n \"state\": + \"Enabled\"\n },\n \"console\": {\n \"url\": \"https://console-openshift-console.apps.aro.cluster.pg9q9.uksouth.aroapp-hcp.io\"\n + \ },\n \"cryptoRestrictions\": \"None\",\n \"dns\": {\n + \ \"baseDomain\": \"pg9q9.uksouth.aroapp-hcp.io\",\n \"baseDomainPrefix\": + \"cluster\"\n },\n \"etcd\": {\n \"dataEncryption\": + {\n \"customerManaged\": {\n \"encryptionType\": + \"KMS\",\n \"kms\": {\n \"activeKey\": + {\n \"name\": \"etcd-data-kms-encryption-key\",\n + \ \"version\": \"2194f189e201460aa9465785bc2fc7a9\"\n + \ },\n \"keyVaultType\": \"KeyVault\",\n + \ \"vaultName\": \"clihcpkv000007\",\n \"visibility\": + \"Public\"\n }\n },\n \"keyManagementMode\": + \"CustomerManaged\"\n }\n },\n \"ingress\": {\n \"type\": + \"Public\"\n },\n \"network\": {\n \"hostPrefix\": + 23,\n \"machineCidr\": \"10.0.0.0/16\",\n \"networkType\": + \"OVNKubernetes\",\n \"podCidr\": \"10.128.0.0/14\",\n \"serviceCidr\": + \"172.30.0.0/16\"\n },\n \"nodeDrainTimeoutMinutes\": 30,\n + \ \"platform\": {\n \"issuerUrl\": \"https://uksouth.oic.aro-hcp.azure.com/00000000-0000-0000-0000-000000000001/2ts540mr2595fe25uq5g15odjmjclg6n\",\n + \ \"managedResourceGroup\": \"clihcp-managed000006\",\n \"networkSecurityGroupId\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/networkSecurityGroups/clihcp-nsg000005\",\n + \ \"operatorsAuthentication\": {\n \"userAssignedIdentities\": + {\n \"controlPlaneOperators\": {\n \"cloud-controller-manager\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ccm000011\",\n + \ \"cloud-network-config\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-network000016\",\n + \ \"cluster-api-azure\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-capi000009\",\n + \ \"control-plane\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-control000010\",\n + \ \"disk-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-disk000013\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-file000014\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-image000015\",\n + \ \"ingress\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-ingress000012\",\n + \ \"kms\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-kms000017\"\n + \ },\n \"dataPlaneOperators\": {\n \"disk-csi-driver\": + \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpdisk000018\",\n + \ \"file-csi-driver\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpfile000019\",\n + \ \"image-registry\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-dpimage000020\"\n + \ },\n \"serviceManagedIdentity\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.ManagedIdentity/userAssignedIdentities/clihcp-service000008\"\n + \ }\n },\n \"outboundType\": \"LoadBalancer\",\n + \ \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vnetIntegrationSubnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/integration-subnet\"\n + \ },\n \"provisioningState\": \"Succeeded\",\n \"status\": + {\n \"activeVersions\": [\n {\n \"version\": + \"4.22\"\n }\n ],\n \"conditions\": [\n + \ {\n \"lastTransitionTime\": \"2026-11-04T03:01:18Z\",\n + \ \"message\": \"\",\n \"reason\": \"Valid\",\n + \ \"status\": \"True\",\n \"type\": \"RequirementsValid\"\n + \ }\n ]\n },\n \"version\": {\n \"channelGroup\": + \"stable\",\n \"id\": \"4.22\"\n }\n },\n \"systemData\": + {\n \"createdAt\": \"2026-11-04T03:01:16.5762188Z\",\n \"createdBy\": + \"recording-user@example.com\",\n \"createdByType\": \"User\",\n \"lastModifiedAt\": + \"2026-11-04T03:13:09.0135705Z\",\n \"lastModifiedBy\": \"recording-user@example.com\",\n + \ \"lastModifiedByType\": \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '10290' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:14:12 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 829FF170AB73471DAE36EF40A4431DF0 Ref B: SN4AA2022305023 Ref C: 2026-11-04T03:14:12Z' + status: + code: 200 + message: OK +- request: + body: '{"location": "uksouth", "properties": {"autoRepair": true, "platform": + {"enableEncryptionAtHost": false, "osDisk": {"diskStorageAccountType": "Premium_LRS", + "diskType": "Managed", "sizeGiB": 64}, "vmSize": "Standard_D8s_v3"}, "replicas": + 1, "version": {"channelGroup": "stable", "id": "4.22.11"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + Content-Length: + - '297' + Content-Type: + - application/json + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003\",\n + \ \"location\": \"uksouth\",\n \"name\": \"clihcpnp000003\",\n \"properties\": + {\n \"autoRepair\": true,\n \"platform\": {\n \"enableEncryptionAtHost\": + false,\n \"osDisk\": {\n \"diskStorageAccountType\": + \"Premium_LRS\",\n \"diskType\": \"Managed\",\n \"sizeGiB\": + 64\n },\n \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vmSize\": \"Standard_D8s_v3\"\n },\n \"provisioningState\": + \"Accepted\",\n \"replicas\": 1,\n \"version\": {\n \"channelGroup\": + \"stable\",\n \"id\": \"4.22.11\"\n }\n },\n \"systemData\": + {\n \"createdAt\": \"2026-11-04T03:14:13.4248909Z\",\n \"createdBy\": + \"recording-user@example.com\",\n \"createdByType\": \"User\",\n \"lastModifiedAt\": + \"2026-11-04T03:14:13.4248909Z\",\n \"lastModifiedBy\": \"recording-user@example.com\",\n + \ \"lastModifiedByType\": \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters/nodePools\"\n}" + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '1345' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:14:13 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '25' + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: B4AA2CCF882143398B862A937E3E7836 Ref B: SN4AA2022303053 Ref C: 2026-11-04T03:14:13Z' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Accepted\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:14:14 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: F77489D82A9C4E6DB2548B39646A1D48 Ref B: SN4AA2022303045 Ref C: 2026-11-04T03:14:13Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:14:44 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 8DE2CCF370144BB19609C03411A77692 Ref B: DM2AA1091212051 Ref C: 2026-11-04T03:14:44Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:15:15 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 03F57879508049928B184F7CAF2B56C7 Ref B: DM2AA1091211039 Ref C: 2026-11-04T03:15:15Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:15:45 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: E2F0A137ED9E4FF7860E41F55C9BE7DF Ref B: SN4AA2022305027 Ref C: 2026-11-04T03:15:45Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:16:16 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 9E70672B33EE46E3BE4C3F9C1C162270 Ref B: SN4AA2022304025 Ref C: 2026-11-04T03:16:16Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:16:47 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 31DE3014A5F64A098F48796DE3BFB151 Ref B: SN4AA2022302023 Ref C: 2026-11-04T03:16:47Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:17:18 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 5A25445D334B4CFFBC6E63E7F3C8B457 Ref B: DM2AA1091214037 Ref C: 2026-11-04T03:17:18Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:17:48 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 99B2FF9918254C2BA16E190524B670D5 Ref B: SN4AA2022303037 Ref C: 2026-11-04T03:17:48Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:18:19 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 1EE5FF0B50A84F45B8B4A3C1992D01A3 Ref B: SN4AA2022302025 Ref C: 2026-11-04T03:18:19Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:18:50 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 3AE12575DC514539A8C30C41CC4D59B0 Ref B: SN4AA2022304029 Ref C: 2026-11-04T03:18:50Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:19:20 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 72D8BA035B7B458DAA86ABD0A0F2DF60 Ref B: DM2AA1091211023 Ref C: 2026-11-04T03:19:20Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:19:51 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 6246619F200B45D0BD484FFDD4946247 Ref B: DM2AA1091211009 Ref C: 2026-11-04T03:19:51Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:20:22 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: B7124CBD4AB744D795D0A21BA345DFC0 Ref B: SN4AA2022304047 Ref C: 2026-11-04T03:20:22Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:20:53 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 6803A8A3EA32473E9AD86C2163E293AE Ref B: SN4AA2022301039 Ref C: 2026-11-04T03:20:53Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:21:23 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: EAC15661BF58489A954FF4B57E43FB50 Ref B: SN4AA2022305033 Ref C: 2026-11-04T03:21:23Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:21:54 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: C9895D165A354DFA8FD2BBDB9965E00F Ref B: SN4AA2022301023 Ref C: 2026-11-04T03:21:54Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:22:26 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 9341052485804124ABA2BCA83F8C4748 Ref B: DM2AA1091213049 Ref C: 2026-11-04T03:22:25Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:22:56 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 6865BBFC6C394DE8A853930BEA1FCE71 Ref B: SN4AA2022305019 Ref C: 2026-11-04T03:22:56Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Provisioning\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '312' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:23:27 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: E1203326B95E48DE80499209A9380FB1 Ref B: DM2AA1091211033 Ref C: 2026-11-04T03:23:27Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7?api-version=2026-10-01&t=639293588535342645&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n + \ \"name\": \"50823ceb-487a-4c82-b1f2-a092e57d78b7\",\n \"status\": \"Succeeded\",\n + \ \"startTime\": \"2026-11-04T03:14:13.480050455Z\",\n \"endTime\": \"2026-11-04T03:23:47.121877248Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '358' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:23:58 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: BDD510F144CC4E2D84272943014ED497 Ref B: SN4AA2022301037 Ref C: 2026-11-04T03:23:58Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool create + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --replicas --vm-size --version --channel-group + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003\",\n + \ \"location\": \"uksouth\",\n \"name\": \"clihcpnp000003\",\n \"properties\": + {\n \"autoRepair\": true,\n \"platform\": {\n \"enableEncryptionAtHost\": + false,\n \"osDisk\": {\n \"diskStorageAccountType\": + \"Premium_LRS\",\n \"diskType\": \"Managed\",\n \"sizeGiB\": + 64\n },\n \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vmSize\": \"Standard_D8s_v3\"\n },\n \"provisioningState\": + \"Succeeded\",\n \"replicas\": 1,\n \"status\": {\n \"activeVersions\": + [\n {\n \"version\": \"4.22.11\"\n }\n + \ ],\n \"conditions\": [\n {\n \"lastTransitionTime\": + \"2026-11-04T03:14:14Z\",\n \"message\": \"\",\n \"reason\": + \"Valid\",\n \"status\": \"True\",\n \"type\": + \"RequirementsValid\"\n }\n ]\n },\n \"version\": + {\n \"channelGroup\": \"stable\",\n \"id\": \"4.22.11\"\n + \ }\n },\n \"systemData\": {\n \"createdAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"createdBy\": \"recording-user@example.com\",\n \"createdByType\": + \"User\",\n \"lastModifiedAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"lastModifiedBy\": \"recording-user@example.com\",\n \"lastModifiedByType\": + \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters/nodePools\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '1805' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:23:58 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 5392B6E7D5E94AAF9988E7C8BA807221 Ref B: SN4AA2022303029 Ref C: 2026-11-04T03:23:58Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool show + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003\",\n + \ \"location\": \"uksouth\",\n \"name\": \"clihcpnp000003\",\n \"properties\": + {\n \"autoRepair\": true,\n \"platform\": {\n \"enableEncryptionAtHost\": + false,\n \"osDisk\": {\n \"diskStorageAccountType\": + \"Premium_LRS\",\n \"diskType\": \"Managed\",\n \"sizeGiB\": + 64\n },\n \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vmSize\": \"Standard_D8s_v3\"\n },\n \"provisioningState\": + \"Succeeded\",\n \"replicas\": 1,\n \"status\": {\n \"activeVersions\": + [\n {\n \"version\": \"4.22.11\"\n }\n + \ ],\n \"conditions\": [\n {\n \"lastTransitionTime\": + \"2026-11-04T03:14:14Z\",\n \"message\": \"\",\n \"reason\": + \"Valid\",\n \"status\": \"True\",\n \"type\": + \"RequirementsValid\"\n }\n ]\n },\n \"version\": + {\n \"channelGroup\": \"stable\",\n \"id\": \"4.22.11\"\n + \ }\n },\n \"systemData\": {\n \"createdAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"createdBy\": \"recording-user@example.com\",\n \"createdByType\": + \"User\",\n \"lastModifiedAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"lastModifiedBy\": \"recording-user@example.com\",\n \"lastModifiedByType\": + \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters/nodePools\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '1805' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:23:58 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3748' + x-msedge-ref: + - 'Ref A: E78E8C48372C42AC9BFEB94D1CCC19EC Ref B: DM2AA1091212021 Ref C: 2026-11-04T03:23:59Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool update + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003\",\n + \ \"location\": \"uksouth\",\n \"name\": \"clihcpnp000003\",\n \"properties\": + {\n \"autoRepair\": true,\n \"platform\": {\n \"enableEncryptionAtHost\": + false,\n \"osDisk\": {\n \"diskStorageAccountType\": + \"Premium_LRS\",\n \"diskType\": \"Managed\",\n \"sizeGiB\": + 64\n },\n \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vmSize\": \"Standard_D8s_v3\"\n },\n \"provisioningState\": + \"Succeeded\",\n \"replicas\": 1,\n \"status\": {\n \"activeVersions\": + [\n {\n \"version\": \"4.22.11\"\n }\n + \ ],\n \"conditions\": [\n {\n \"lastTransitionTime\": + \"2026-11-04T03:14:14Z\",\n \"message\": \"\",\n \"reason\": + \"Valid\",\n \"status\": \"True\",\n \"type\": + \"RequirementsValid\"\n }\n ]\n },\n \"version\": + {\n \"channelGroup\": \"stable\",\n \"id\": \"4.22.11\"\n + \ }\n },\n \"systemData\": {\n \"createdAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"createdBy\": \"recording-user@example.com\",\n \"createdByType\": + \"User\",\n \"lastModifiedAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"lastModifiedBy\": \"recording-user@example.com\",\n \"lastModifiedByType\": + \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters/nodePools\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '1805' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:23:59 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 66773C8FF93044BD8FCBA7B657F466C6 Ref B: SN4AA2022304033 Ref C: 2026-11-04T03:23:59Z' + status: + code: 200 + message: OK +- request: + body: '{"location": "uksouth", "properties": {"autoRepair": true, "nodeDrainTimeoutMinutes": + 15, "platform": {"enableEncryptionAtHost": false, "osDisk": {"diskStorageAccountType": + "Premium_LRS", "diskType": "Managed", "sizeGiB": 64}, "subnetId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet", + "vmSize": "Standard_D8s_v3"}, "replicas": 1, "version": {"channelGroup": "stable", + "id": "4.22.11"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool update + Connection: + - keep-alive + Content-Length: + - '518' + Content-Type: + - application/json + ParameterSetName: + - -g --cluster-name -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003\",\n + \ \"location\": \"uksouth\",\n \"name\": \"clihcpnp000003\",\n \"properties\": + {\n \"autoRepair\": true,\n \"nodeDrainTimeoutMinutes\": 15,\n + \ \"platform\": {\n \"enableEncryptionAtHost\": false,\n + \ \"osDisk\": {\n \"diskStorageAccountType\": \"Premium_LRS\",\n + \ \"diskType\": \"Managed\",\n \"sizeGiB\": 64\n + \ },\n \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vmSize\": \"Standard_D8s_v3\"\n },\n \"provisioningState\": + \"Accepted\",\n \"replicas\": 1,\n \"status\": {\n \"activeVersions\": + [\n {\n \"version\": \"4.22.11\"\n }\n + \ ],\n \"conditions\": [\n {\n \"lastTransitionTime\": + \"2026-11-04T03:14:14Z\",\n \"message\": \"\",\n \"reason\": + \"Valid\",\n \"status\": \"True\",\n \"type\": + \"RequirementsValid\"\n }\n ]\n },\n \"version\": + {\n \"channelGroup\": \"stable\",\n \"id\": \"4.22.11\"\n + \ }\n },\n \"systemData\": {\n \"createdAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"createdBy\": \"recording-user@example.com\",\n \"createdByType\": + \"User\",\n \"lastModifiedAt\": \"2026-11-04T03:24:00.2636247Z\",\n + \ \"lastModifiedBy\": \"recording-user@example.com\",\n \"lastModifiedByType\": + \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters/nodePools\"\n}" + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d?api-version=2026-10-01&t=639293594403105021&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '1843' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:23:59 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '29' + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 4BAC877F403E45C28CB1A4159D800D51 Ref B: DM2AA1091212051 Ref C: 2026-11-04T03:24:00Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool update + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d?api-version=2026-10-01&t=639293594403105021&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d\",\n + \ \"name\": \"34fa73be-ad74-4c2f-b731-1e390990735d\",\n \"status\": \"Accepted\",\n + \ \"startTime\": \"2026-11-04T03:24:00.287225988Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:24:01 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 570673B86FEF47C78D06355E6B7EE2FE Ref B: SN4AA2022303033 Ref C: 2026-11-04T03:24:00Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool update + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d?api-version=2026-10-01&t=639293594403105021&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d\",\n + \ \"name\": \"34fa73be-ad74-4c2f-b731-1e390990735d\",\n \"status\": \"Updating\",\n + \ \"startTime\": \"2026-11-04T03:24:00.287225988Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:24:31 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: E07DE8C48FA94006890B033C65597CD8 Ref B: DM2AA1091214017 Ref C: 2026-11-04T03:24:31Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool update + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d?api-version=2026-10-01&t=639293594403105021&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d\",\n + \ \"name\": \"34fa73be-ad74-4c2f-b731-1e390990735d\",\n \"status\": \"Updating\",\n + \ \"startTime\": \"2026-11-04T03:24:00.287225988Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:25:02 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 111C7310E9794C3CBDE9F63E469C540B Ref B: SN4AA2022304025 Ref C: 2026-11-04T03:25:02Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool update + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d?api-version=2026-10-01&t=639293594403105021&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/34fa73be-ad74-4c2f-b731-1e390990735d\",\n + \ \"name\": \"34fa73be-ad74-4c2f-b731-1e390990735d\",\n \"status\": \"Succeeded\",\n + \ \"startTime\": \"2026-11-04T03:24:00.287225988Z\",\n \"endTime\": \"2026-11-04T03:25:29.877231472Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '358' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:25:33 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: D70F0A454917436A80E55F2C00240F0B Ref B: SN4AA2022302021 Ref C: 2026-11-04T03:25:32Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster nodepool update + Connection: + - keep-alive + ParameterSetName: + - -g --cluster-name -n --node-drain-timeout + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003?api-version=2026-10-01 + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/nodePools/clihcpnp000003\",\n + \ \"location\": \"uksouth\",\n \"name\": \"clihcpnp000003\",\n \"properties\": + {\n \"autoRepair\": true,\n \"nodeDrainTimeoutMinutes\": 15,\n + \ \"platform\": {\n \"enableEncryptionAtHost\": false,\n + \ \"osDisk\": {\n \"diskStorageAccountType\": \"Premium_LRS\",\n + \ \"diskType\": \"Managed\",\n \"sizeGiB\": 64\n + \ },\n \"subnetId\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.Network/virtualNetworks/clihcp-vnet000004/subnets/cluster-subnet\",\n + \ \"vmSize\": \"Standard_D8s_v3\"\n },\n \"provisioningState\": + \"Succeeded\",\n \"replicas\": 1,\n \"status\": {\n \"activeVersions\": + [\n {\n \"version\": \"4.22.11\"\n }\n + \ ],\n \"conditions\": [\n {\n \"lastTransitionTime\": + \"2026-11-04T03:14:14Z\",\n \"message\": \"\",\n \"reason\": + \"Valid\",\n \"status\": \"True\",\n \"type\": + \"RequirementsValid\"\n }\n ]\n },\n \"version\": + {\n \"channelGroup\": \"stable\",\n \"id\": \"4.22.11\"\n + \ }\n },\n \"systemData\": {\n \"createdAt\": \"2026-11-04T03:14:13.4248909Z\",\n + \ \"createdBy\": \"recording-user@example.com\",\n \"createdByType\": + \"User\",\n \"lastModifiedAt\": \"2026-11-04T03:24:00.2636247Z\",\n + \ \"lastModifiedBy\": \"recording-user@example.com\",\n \"lastModifiedByType\": + \"User\"\n },\n \"type\": \"Microsoft.RedHatOpenShift/hcpOpenShiftClusters/nodePools\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '1844' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:25:33 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3746' + x-msedge-ref: + - 'Ref A: 79D6A58FC38045F89C67F8BF8AA01A60 Ref B: SN4AA2022302051 Ref C: 2026-11-04T03:25:33Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + Content-Length: + - '0' + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: POST + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002/revokeCredentials?api-version=2026-10-01 + response: + body: + string: '' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '0' + date: + - Wed, 04 Nov 2026 03:25:33 GMT + expires: + - '-1' + location: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationResults/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '23' + x-ms-ratelimit-remaining-subscription-global-writes: + - '2999' + x-ms-ratelimit-remaining-subscription-writes: + - '199' + x-msedge-ref: + - 'Ref A: 3605158F05F847519717C4E1C7F7195F Ref B: SN4AA2022303031 Ref C: 2026-11-04T03:25:34Z' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n + \ \"name\": \"099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n \"status\": \"Accepted\",\n + \ \"startTime\": \"2026-11-04T03:25:34.579478101Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:25:34 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 0D677B678DF349DB81AA34D207F9EEEE Ref B: SN4AA2022302049 Ref C: 2026-11-04T03:25:34Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n + \ \"name\": \"099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:25:34.579478101Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:26:05 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: C97F5CB2E6EF41E097BE0C3B9C167216 Ref B: DM2AA1091214009 Ref C: 2026-11-04T03:26:05Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n + \ \"name\": \"099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:25:34.579478101Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:26:36 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 1CFDB395333B49C1B2DC3ECB3F1598D6 Ref B: DM2AA1091211035 Ref C: 2026-11-04T03:26:36Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n + \ \"name\": \"099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:25:34.579478101Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:27:06 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: EA21B1B426C140939CB980330AB79C1D Ref B: DM2AA1091213039 Ref C: 2026-11-04T03:27:07Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n + \ \"name\": \"099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:25:34.579478101Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:27:37 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '12' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: C9B994EAA84C4806A3FF5897125E1A89 Ref B: SN4AA2022303031 Ref C: 2026-11-04T03:27:37Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n + \ \"name\": \"099af1ff-9b84-40d1-af7e-fedcbca2c524\",\n \"status\": \"Succeeded\",\n + \ \"startTime\": \"2026-11-04T03:25:34.579478101Z\",\n \"endTime\": \"2026-11-04T03:27:39.862161572Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '358' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:28:08 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 9AF53F1D990F49518B7CDDB14B3A55C0 Ref B: SN4AA2022304045 Ref C: 2026-11-04T03:28:08Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster revoke-credential + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationResults/099af1ff-9b84-40d1-af7e-fedcbca2c524?api-version=2026-10-01&t=639293595346143542&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '' + headers: + cache-control: + - no-cache + date: + - Wed, 04 Nov 2026 03:28:09 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 6C0932FF9F56483CB80F4E1BE2036404 Ref B: DM2AA1091213045 Ref C: 2026-11-04T03:28:09Z' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + Content-Length: + - '0' + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: DELETE + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro_hcp000001/providers/Microsoft.RedHatOpenShift/hcpOpenShiftClusters/clihcp000002?api-version=2026-10-01 + response: + body: + string: '' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + cache-control: + - no-cache + content-length: + - '0' + date: + - Wed, 04 Nov 2026 03:28:10 GMT + expires: + - '-1' + location: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationResults/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '37' + x-ms-ratelimit-remaining-subscription-deletes: + - '199' + x-ms-ratelimit-remaining-subscription-global-deletes: + - '2999' + x-msedge-ref: + - 'Ref A: 99C1A3861BF64CA8BEF8F303842B1EF8 Ref B: SN4AA2022305025 Ref C: 2026-11-04T03:28:10Z' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:28:10 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 5CAB2C7A5E6847CE87830D593ECB6583 Ref B: SN4AA2022303051 Ref C: 2026-11-04T03:28:11Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:28:41 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 4173090FA67149A4A050CB4A98E956FB Ref B: SN4AA2022302021 Ref C: 2026-11-04T03:28:41Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:29:11 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '11' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: CFD0D861061245DABD1D3487D3CFDD7B Ref B: SN4AA2022304039 Ref C: 2026-11-04T03:29:12Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:29:43 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: F1C3717B59CA4882AF6A05966101C2D7 Ref B: DM2AA1091213011 Ref C: 2026-11-04T03:29:43Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:30:13 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 3BF3CFD7F40946BE8D883760A25669FC Ref B: SN4AA2022301039 Ref C: 2026-11-04T03:30:14Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:30:45 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: AF1905BFCB0046C0AB7343ABB2C13D3D Ref B: DM2AA1091214039 Ref C: 2026-11-04T03:30:44Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:31:15 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: B3246D4E448A49799CE3699E19B51246 Ref B: SN4AA2022303051 Ref C: 2026-11-04T03:31:15Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:31:46 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: EECF3E16D6AB44EC80107DC3E802ECAE Ref B: DM2AA1091212023 Ref C: 2026-11-04T03:31:46Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:32:17 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '9' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: C5329DF5857F43538C79DE9E60951D86 Ref B: DM2AA1091213023 Ref C: 2026-11-04T03:32:17Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Deleting\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '308' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:32:48 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: A968D206155B41D9A7828A2059A15594 Ref B: SN4AA2022301011 Ref C: 2026-11-04T03:32:48Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: "{\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationStatuses/8f135e51-bc88-4434-b779-77669f4f9741\",\n + \ \"name\": \"8f135e51-bc88-4434-b779-77669f4f9741\",\n \"status\": \"Succeeded\",\n + \ \"startTime\": \"2026-11-04T03:28:10.769389914Z\",\n \"endTime\": \"2026-11-04T03:32:59.871710602Z\"\n}" + headers: + cache-control: + - no-cache + content-length: + - '358' + content-type: + - application/json + date: + - Wed, 04 Nov 2026 03:33:19 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '10' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 004EBCA42F274CD88B59663EFEA578D6 Ref B: SN4AA2022304045 Ref C: 2026-11-04T03:33:18Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp cluster delete + Connection: + - keep-alive + ParameterSetName: + - -g -n --yes + User-Agent: + - AZURECLI/2.92.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOperationResults/8f135e51-bc88-4434-b779-77669f4f9741?api-version=2026-10-01&t=639293596908126433&c=REDACTED&s=REDACTED&h=REDACTED + response: + body: + string: '' + headers: + cache-control: + - no-cache + date: + - Wed, 04 Nov 2026 03:33:19 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '8' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + x-msedge-ref: + - 'Ref A: 16A7DB3D7EA54D0A9270927E92ED1CF7 Ref B: DM2AA1091211051 Ref C: 2026-11-04T03:33:19Z' + status: + code: 204 + message: No Content +version: 1 diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/recordings/test_aro_hcp_get_versions.yaml b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/recordings/test_aro_hcp_get_versions.yaml new file mode 100644 index 00000000000..c413f480ef6 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/recordings/test_aro_hcp_get_versions.yaml @@ -0,0 +1,608 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - aro hcp get-versions + Connection: + - keep-alive + ParameterSetName: + - --location + User-Agent: + - AZURECLI/2.91.0 azsdk-python-core/1.39.0 Python/3.11.12 (macOS-26.7.1-arm64-arm-64bit) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions?api-version=2026-10-01 + response: + body: + string: "{\n \"value\": [\n {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.0\",\n + \ \"name\": \"4.19.0\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.1\",\n + \ \"name\": \"4.19.1\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.10\",\n + \ \"name\": \"4.19.10\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.11\",\n + \ \"name\": \"4.19.11\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.12\",\n + \ \"name\": \"4.19.12\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.13\",\n + \ \"name\": \"4.19.13\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.14\",\n + \ \"name\": \"4.19.14\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.15\",\n + \ \"name\": \"4.19.15\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.16\",\n + \ \"name\": \"4.19.16\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.17\",\n + \ \"name\": \"4.19.17\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.18\",\n + \ \"name\": \"4.19.18\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.19\",\n + \ \"name\": \"4.19.19\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.2\",\n + \ \"name\": \"4.19.2\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.20\",\n + \ \"name\": \"4.19.20\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.21\",\n + \ \"name\": \"4.19.21\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.22\",\n + \ \"name\": \"4.19.22\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.23\",\n + \ \"name\": \"4.19.23\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.24\",\n + \ \"name\": \"4.19.24\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.25\",\n + \ \"name\": \"4.19.25\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.26\",\n + \ \"name\": \"4.19.26\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.27\",\n + \ \"name\": \"4.19.27\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.28\",\n + \ \"name\": \"4.19.28\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.29\",\n + \ \"name\": \"4.19.29\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.3\",\n + \ \"name\": \"4.19.3\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.30\",\n + \ \"name\": \"4.19.30\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.31\",\n + \ \"name\": \"4.19.31\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.32\",\n + \ \"name\": \"4.19.32\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.33\",\n + \ \"name\": \"4.19.33\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.34\",\n + \ \"name\": \"4.19.34\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.35\",\n + \ \"name\": \"4.19.35\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.36\",\n + \ \"name\": \"4.19.36\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.37\",\n + \ \"name\": \"4.19.37\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.38\",\n + \ \"name\": \"4.19.38\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.39\",\n + \ \"name\": \"4.19.39\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.4\",\n + \ \"name\": \"4.19.4\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.40\",\n + \ \"name\": \"4.19.40\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.41\",\n + \ \"name\": \"4.19.41\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.42\",\n + \ \"name\": \"4.19.42\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.5\",\n + \ \"name\": \"4.19.5\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.6\",\n + \ \"name\": \"4.19.6\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.7\",\n + \ \"name\": \"4.19.7\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.19.9\",\n + \ \"name\": \"4.19.9\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": false\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.0\",\n + \ \"name\": \"4.20.0\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.1\",\n + \ \"name\": \"4.20.1\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.10\",\n + \ \"name\": \"4.20.10\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.11\",\n + \ \"name\": \"4.20.11\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.12\",\n + \ \"name\": \"4.20.12\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.13\",\n + \ \"name\": \"4.20.13\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.14\",\n + \ \"name\": \"4.20.14\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.15\",\n + \ \"name\": \"4.20.15\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.16\",\n + \ \"name\": \"4.20.16\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.17\",\n + \ \"name\": \"4.20.17\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.18\",\n + \ \"name\": \"4.20.18\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.19\",\n + \ \"name\": \"4.20.19\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.2\",\n + \ \"name\": \"4.20.2\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.20\",\n + \ \"name\": \"4.20.20\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.21\",\n + \ \"name\": \"4.20.21\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.22\",\n + \ \"name\": \"4.20.22\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.23\",\n + \ \"name\": \"4.20.23\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.24\",\n + \ \"name\": \"4.20.24\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.25\",\n + \ \"name\": \"4.20.25\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.26\",\n + \ \"name\": \"4.20.26\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.27\",\n + \ \"name\": \"4.20.27\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.28\",\n + \ \"name\": \"4.20.28\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.29\",\n + \ \"name\": \"4.20.29\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.3\",\n + \ \"name\": \"4.20.3\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.30\",\n + \ \"name\": \"4.20.30\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.31\",\n + \ \"name\": \"4.20.31\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.32\",\n + \ \"name\": \"4.20.32\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.33\",\n + \ \"name\": \"4.20.33\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.34\",\n + \ \"name\": \"4.20.34\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.35\",\n + \ \"name\": \"4.20.35\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.36\",\n + \ \"name\": \"4.20.36\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.37\",\n + \ \"name\": \"4.20.37\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.38\",\n + \ \"name\": \"4.20.38\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.39\",\n + \ \"name\": \"4.20.39\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.4\",\n + \ \"name\": \"4.20.4\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.40\",\n + \ \"name\": \"4.20.40\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.41\",\n + \ \"name\": \"4.20.41\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.42\",\n + \ \"name\": \"4.20.42\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.5\",\n + \ \"name\": \"4.20.5\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.6\",\n + \ \"name\": \"4.20.6\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.20.8\",\n + \ \"name\": \"4.20.8\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.0\",\n + \ \"name\": \"4.21.0\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.1\",\n + \ \"name\": \"4.21.1\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.10\",\n + \ \"name\": \"4.21.10\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.11\",\n + \ \"name\": \"4.21.11\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.12\",\n + \ \"name\": \"4.21.12\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.13\",\n + \ \"name\": \"4.21.13\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.14\",\n + \ \"name\": \"4.21.14\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.15\",\n + \ \"name\": \"4.21.15\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.16\",\n + \ \"name\": \"4.21.16\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.17\",\n + \ \"name\": \"4.21.17\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.18\",\n + \ \"name\": \"4.21.18\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.19\",\n + \ \"name\": \"4.21.19\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.2\",\n + \ \"name\": \"4.21.2\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.20\",\n + \ \"name\": \"4.21.20\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.21\",\n + \ \"name\": \"4.21.21\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.22\",\n + \ \"name\": \"4.21.22\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.23\",\n + \ \"name\": \"4.21.23\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.24\",\n + \ \"name\": \"4.21.24\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.25\",\n + \ \"name\": \"4.21.25\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.26\",\n + \ \"name\": \"4.21.26\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.27\",\n + \ \"name\": \"4.21.27\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.28\",\n + \ \"name\": \"4.21.28\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.29\",\n + \ \"name\": \"4.21.29\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.3\",\n + \ \"name\": \"4.21.3\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.30\",\n + \ \"name\": \"4.21.30\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.31\",\n + \ \"name\": \"4.21.31\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.32\",\n + \ \"name\": \"4.21.32\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.33\",\n + \ \"name\": \"4.21.33\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.34\",\n + \ \"name\": \"4.21.34\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.35\",\n + \ \"name\": \"4.21.35\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.36\",\n + \ \"name\": \"4.21.36\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.37\",\n + \ \"name\": \"4.21.37\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.4\",\n + \ \"name\": \"4.21.4\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.5\",\n + \ \"name\": \"4.21.5\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.6\",\n + \ \"name\": \"4.21.6\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.7\",\n + \ \"name\": \"4.21.7\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.8\",\n + \ \"name\": \"4.21.8\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.21.9\",\n + \ \"name\": \"4.21.9\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.0\",\n + \ \"name\": \"4.22.0\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.1\",\n + \ \"name\": \"4.22.1\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.10\",\n + \ \"name\": \"4.22.10\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.11\",\n + \ \"name\": \"4.22.11\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.12\",\n + \ \"name\": \"4.22.12\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.13\",\n + \ \"name\": \"4.22.13\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.14\",\n + \ \"name\": \"4.22.14\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.15\",\n + \ \"name\": \"4.22.15\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.16\",\n + \ \"name\": \"4.22.16\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.17\",\n + \ \"name\": \"4.22.17\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.18\",\n + \ \"name\": \"4.22.18\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.2\",\n + \ \"name\": \"4.22.2\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.3\",\n + \ \"name\": \"4.22.3\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.4\",\n + \ \"name\": \"4.22.4\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.5\",\n + \ \"name\": \"4.22.5\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.6\",\n + \ \"name\": \"4.22.6\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.7\",\n + \ \"name\": \"4.22.7\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.8\",\n + \ \"name\": \"4.22.8\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n },\n + \ {\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.RedHatOpenShift/locations/uksouth/hcpOpenShiftVersions/4.22.9\",\n + \ \"name\": \"4.22.9\",\n \"properties\": {\n \"channelGroup\": + \"stable\",\n \"enabled\": true\n },\n \"type\": + \"Microsoft.RedHatOpenShift/locations/hcpOpenShiftVersions\"\n }\n + \ ]\n}" + headers: + cache-control: + - no-cache + content-length: + - '56551' + content-type: + - application/json + date: + - Thu, 22 Oct 2026 17:03:01 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - istio-envoy + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-envoy-upstream-service-time: + - '70' + x-ms-ratelimit-remaining-subscription-global-reads: + - '3749' + status: + code: 200 + message: OK +version: 1 diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/test_aro_hcp_scenario.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/test_aro_hcp_scenario.py new file mode 100644 index 00000000000..2063294a6a9 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/test_aro_hcp_scenario.py @@ -0,0 +1,409 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +import base64 +import json +import os +import re +import time + +import yaml +from azure.cli.testsdk import ResourceGroupPreparer, ScenarioTest +from azure.cli.testsdk.scenario_tests import RecordingProcessor + + +class AroHcpRecordingProcessor(RecordingProcessor): + + MOCK_TENANT_ID = '00000000-0000-0000-0000-000000000001' + MOCK_PRINCIPAL_ID = '00000000-0000-0000-0000-000000000002' + MOCK_CLIENT_ID = '00000000-0000-0000-0000-000000000003' + MOCK_ROLE_ASSIGNMENT_ID = '00000000-0000-0000-0000-000000000004' + MOCK_USER_EMAIL = 'recording-user@example.com' + REDACTED_DATA = base64.b64encode(b'REDACTED').decode('ascii') + + HEADERS_TO_REDACT = [ + 'x-ms-keyvault-network-info', + 'x-ms-operation-identifier', + ] + + @classmethod + def _scrub_text(cls, value): + if not value: + return value + + replacements = ( + (r'("tenantId"\s*:\s*")[^"]+', rf'\g<1>{cls.MOCK_TENANT_ID}'), + (r'("principalId"\s*:\s*")[^"]+', rf'\g<1>{cls.MOCK_PRINCIPAL_ID}'), + (r'("clientId"\s*:\s*")[^"]+', rf'\g<1>{cls.MOCK_CLIENT_ID}'), + ( + r'("(?:createdBy|lastModifiedBy|updatedBy)"\s*:\s*")[^"]+', + rf'\g<1>{cls.MOCK_USER_EMAIL}', + ), + ( + r'(login\.microsoftonline\.com/)[0-9a-f-]{36}', + rf'\g<1>{cls.MOCK_TENANT_ID}', + ), + ( + r'(\.oic\.aro-hcp\.azure\.com/)[0-9a-f-]{36}', + rf'\g<1>{cls.MOCK_TENANT_ID}', + ), + ( + r'(/roleAssignments/)[0-9a-f-]{36}', + rf'\g<1>{cls.MOCK_ROLE_ASSIGNMENT_ID}', + ), + (r'([?&](?:c|s|h)=)[^&"\s\\]+', r'\g<1>REDACTED'), + ) + for pattern, replacement in replacements: + value = re.sub(pattern, replacement, value, flags=re.IGNORECASE) + return value + + def process_request(self, request): + request.uri = self._scrub_text(request.uri) + if not request.body: + return request + + body_is_bytes = isinstance(request.body, bytes) + body = request.body.decode('utf-8') if body_is_bytes else request.body + body = self._scrub_text(body) + if 'requestAdminCredential' in request.uri: + content = json.loads(body) + content['certificateSigningRequest'] = 'redacted-csr' + body = json.dumps(content) + request.body = body.encode('utf-8') if body_is_bytes else body + return request + + def process_response(self, response): + headers = response.get('headers', {}) + for header in list(headers): + if header.lower() in self.HEADERS_TO_REDACT: + del headers[header] + continue + values = headers[header] + if isinstance(values, list): + headers[header] = [ + self._scrub_text(value) if isinstance(value, str) else value + for value in values + ] + elif isinstance(values, str): + headers[header] = self._scrub_text(values) + + body = (response.get('body') or {}).get('string') + if not body: + return response + + body_is_bytes = isinstance(body, bytes) + body = body.decode('utf-8') if body_is_bytes else body + body = self._scrub_text(body) + try: + content = json.loads(body) + except (TypeError, ValueError): + response['body']['string'] = body.encode('utf-8') if body_is_bytes else body + return response + if content.get('userPrincipalName') and content.get('id'): + body = json.dumps({'id': self.MOCK_PRINCIPAL_ID}) + response['body']['string'] = body.encode('utf-8') if body_is_bytes else body + return response + if not content.get('kubeconfig'): + response['body']['string'] = body.encode('utf-8') if body_is_bytes else body + return response + + kubeconfig = yaml.safe_load(content['kubeconfig']) + for cluster in kubeconfig.get('clusters', []): + cluster.get('cluster', {})['certificate-authority-data'] = self.REDACTED_DATA + for user in kubeconfig.get('users', []): + user_data = user.get('user', {}) + user_data['client-certificate-data'] = self.REDACTED_DATA + if 'client-key-data' in user_data: + user_data['client-key-data'] = self.REDACTED_DATA + content['kubeconfig'] = yaml.safe_dump(kubeconfig, default_flow_style=False) + body = json.dumps(content) + response['body']['string'] = body.encode('utf-8') if body_is_bytes else body + return response + + +class AroHcpScenario(ScenarioTest): + + def _get_test_identity(self): + identity_resource_id = os.getenv('IDENTITY_RESOURCE_ID') + if identity_resource_id: + identity = self.cmd( + 'identity show --ids {}'.format(identity_resource_id) + ).get_output_in_json() + return identity['principalId'], 'ServicePrincipal' + + identity = self.cmd('ad signed-in-user show').get_output_in_json() + return identity['id'], 'User' + + def _create_identity(self, key): + identity = self.cmd( + 'identity create -g {{rg}} -n {{{}}} --location uksouth'.format(key) + ).get_output_in_json() + self.kwargs[key + '_id'] = identity['id'] + self.kwargs[key + '_principal_id'] = identity['principalId'] + + def _assign_role(self, assignee_key, role, scope_key): + self.cmd( + 'role assignment create --assignee-object-id {{{}_principal_id}} ' + '--assignee-principal-type ServicePrincipal --role {} --scope {{{}}}'.format( + assignee_key, role, scope_key) + ) + + def __init__(self, method_name): + super().__init__( + method_name, + recording_processors=[AroHcpRecordingProcessor()], + replay_processors=[AroHcpRecordingProcessor()], + ) + + def test_aro_hcp_get_versions(self): + versions = self.cmd( + 'aro hcp get-versions --location uksouth', + checks=[ + self.check('type(@)', 'array'), + self.greater_than('length(@)', 0), + self.exists('[0].ChannelGroup'), + ], + ).get_output_in_json() + + for version in versions: + self.assertRegex(version['Name'], r'^\d+\.\d+\.\d+$') + + @ResourceGroupPreparer(name_prefix='cli_test_aro_hcp', location='uksouth') + def test_aro_hcp_cluster_lifecycle(self, resource_group): + self.kwargs.update({ + 'rg': resource_group, + 'cluster': self.create_random_name('clihcp', 20), + 'nodepool': self.create_random_name('clihcpnp', 15), + 'vnet': self.create_random_name('clihcp-vnet', 24), + 'subnet': 'cluster-subnet', + 'integration_subnet': 'integration-subnet', + 'nsg': self.create_random_name('clihcp-nsg', 24), + 'managed_rg': self.create_random_name('clihcp-managed', 24), + 'keyvault': self.create_random_name('clihcpkv', 24), + 'kms_key': 'etcd-data-kms-encryption-key', + 'service_identity': self.create_random_name('clihcp-service', 24), + 'capi_identity': self.create_random_name('clihcp-capi', 24), + 'control_plane_identity': self.create_random_name('clihcp-control', 24), + 'ccm_identity': self.create_random_name('clihcp-ccm', 24), + 'ingress_identity': self.create_random_name('clihcp-ingress', 24), + 'disk_csi_identity': self.create_random_name('clihcp-disk', 24), + 'file_csi_identity': self.create_random_name('clihcp-file', 24), + 'image_registry_identity': self.create_random_name('clihcp-image', 24), + 'cloud_network_identity': self.create_random_name('clihcp-network', 24), + 'kms_identity': self.create_random_name('clihcp-kms', 24), + 'dp_disk_csi_identity': self.create_random_name('clihcp-dpdisk', 24), + 'dp_file_csi_identity': self.create_random_name('clihcp-dpfile', 24), + 'dp_image_registry_identity': self.create_random_name('clihcp-dpimage', 24), + }) + + self.kwargs['nsg_id'] = self.cmd( + 'network nsg create -g {rg} -n {nsg} --location uksouth --query NewNSG.id -o tsv' + ).output.strip() + self.cmd( + 'network vnet create -g {rg} -n {vnet} --location uksouth ' + '--address-prefixes 10.0.0.0/16' + ) + self.kwargs['subnet_id'] = self.cmd( + 'network vnet subnet create -g {rg} --vnet-name {vnet} -n {subnet} ' + '--address-prefixes 10.0.0.0/24 --network-security-group {nsg_id} ' + '--disable-private-endpoint-network-policies true --query id -o tsv' + ).output.strip() + self.kwargs['integration_subnet_id'] = self.cmd( + 'network vnet subnet create -g {rg} --vnet-name {vnet} ' + '-n {integration_subnet} --address-prefixes 10.0.1.0/24 ' + '--delegations Microsoft.RedHatOpenShift/hcpOpenShiftClusters --query id -o tsv' + ).output.strip() + self.kwargs['vnet_id'] = self.cmd( + 'network vnet show -g {rg} -n {vnet} --query id -o tsv' + ).output.strip() + + self.kwargs['keyvault_id'] = self.cmd( + 'keyvault create -g {rg} -n {keyvault} --location uksouth ' + '--enable-rbac-authorization true --public-network-access Enabled ' + '--query id -o tsv' + ).output.strip() + test_identity_id, test_identity_type = self._get_test_identity() + self.kwargs.update({ + 'test_identity_id': test_identity_id, + 'test_identity_type': test_identity_type, + }) + self.cmd( + 'role assignment create --assignee-object-id {test_identity_id} ' + '--assignee-principal-type {test_identity_type} ' + '--role 14b46e9e-c2b7-41b4-b07b-48a6ebf60603 --scope {keyvault_id}' + ) + if self.in_recording: + time.sleep(60) + + key = self.cmd( + 'keyvault key create --vault-name {keyvault} -n {kms_key} ' + '--kty RSA --size 2048' + ).get_output_in_json() + self.kwargs['kms_key_version'] = key['key']['kid'].rsplit('/', 1)[-1] + + for key in ( + 'service_identity', + 'capi_identity', + 'control_plane_identity', + 'ccm_identity', + 'ingress_identity', + 'disk_csi_identity', + 'file_csi_identity', + 'image_registry_identity', + 'cloud_network_identity', + 'kms_identity', + 'dp_disk_csi_identity', + 'dp_file_csi_identity', + 'dp_image_registry_identity'): + self._create_identity(key) + + role_assignments = ( + ('service_identity', 'c0ff367d-66d8-445e-917c-583feb0ef0d4', 'vnet_id'), + ('service_identity', 'c0ff367d-66d8-445e-917c-583feb0ef0d4', 'nsg_id'), + ('capi_identity', '88366f10-ed47-4cc0-9fab-c8a06148393e', 'vnet_id'), + ('control_plane_identity', 'fc0c873f-45e9-4d0d-a7d1-585aab30c6ed', 'vnet_id'), + ('control_plane_identity', 'fc0c873f-45e9-4d0d-a7d1-585aab30c6ed', 'nsg_id'), + ('ccm_identity', 'a1f96423-95ce-4224-ab27-4e3dc72facd4', 'vnet_id'), + ('ccm_identity', 'a1f96423-95ce-4224-ab27-4e3dc72facd4', 'nsg_id'), + ('ingress_identity', '0336e1d3-7a87-462b-b6db-342b63f7802c', 'vnet_id'), + ('file_csi_identity', '0d7aedc0-15fd-4a67-a412-efad370c947e', 'vnet_id'), + ('file_csi_identity', '0d7aedc0-15fd-4a67-a412-efad370c947e', 'nsg_id'), + ('image_registry_identity', '8b32b316-c2f5-4ddf-b05b-83dacd2d08b5', 'vnet_id'), + ('cloud_network_identity', 'be7a6435-15ae-4171-8f30-4a343eff9e8f', 'subnet_id'), + ('cloud_network_identity', 'be7a6435-15ae-4171-8f30-4a343eff9e8f', 'vnet_id'), + ('kms_identity', '12338af0-0e69-4776-bea7-57ae8d297424', 'keyvault_id'), + ('dp_file_csi_identity', '0d7aedc0-15fd-4a67-a412-efad370c947e', 'vnet_id'), + ('dp_file_csi_identity', '0d7aedc0-15fd-4a67-a412-efad370c947e', 'subnet_id'), + ('dp_file_csi_identity', '0d7aedc0-15fd-4a67-a412-efad370c947e', 'nsg_id'), + ('dp_image_registry_identity', '8b32b316-c2f5-4ddf-b05b-83dacd2d08b5', 'vnet_id'), + ) + for assignee_key, role, scope_key in role_assignments: + self._assign_role(assignee_key, role, scope_key) + + for identity_key in ( + 'capi_identity', + 'control_plane_identity', + 'ccm_identity', + 'ingress_identity', + 'disk_csi_identity', + 'file_csi_identity', + 'image_registry_identity', + 'cloud_network_identity', + 'kms_identity'): + self._assign_role( + 'service_identity', + 'acdd72a7-3385-48ef-bd42-f606fba81ae7', + identity_key + '_id') + + for identity_key in ( + 'dp_disk_csi_identity', + 'dp_file_csi_identity', + 'dp_image_registry_identity'): + self._assign_role( + 'service_identity', + 'ef318e2a-8334-4a05-9e4a-295a196c6a6e', + identity_key + '_id') + + cluster_created = False + try: + cluster = self.cmd( + "aro hcp cluster create -g {rg} -n {cluster} --location uksouth " + "--version 4.22 --subnet-id {subnet_id} " + "--vnet-integration-subnet-id {integration_subnet_id} --nsg {nsg_id} " + "--managed-resource-group-name {managed_rg} " + "--key-management-mode CustomerManaged " + "--kms-vault-name {keyvault} --vault-visibility Public " + "--kms-active-key '{{name:{kms_key},version:{kms_key_version}}}' " + "--assign-service-managed-identity {service_identity_id} " + "--assign-control-plane-operator-identity cluster-api-azure {capi_identity_id} " + "--assign-control-plane-operator-identity control-plane {control_plane_identity_id} " + "--assign-control-plane-operator-identity cloud-controller-manager {ccm_identity_id} " + "--assign-control-plane-operator-identity ingress {ingress_identity_id} " + "--assign-control-plane-operator-identity disk-csi-driver {disk_csi_identity_id} " + "--assign-control-plane-operator-identity file-csi-driver {file_csi_identity_id} " + "--assign-control-plane-operator-identity image-registry {image_registry_identity_id} " + "--assign-control-plane-operator-identity cloud-network-config {cloud_network_identity_id} " + "--assign-control-plane-operator-identity kms {kms_identity_id} " + "--assign-data-plane-operator-identity disk-csi-driver {dp_disk_csi_identity_id} " + "--assign-data-plane-operator-identity file-csi-driver {dp_file_csi_identity_id} " + "--assign-data-plane-operator-identity image-registry {dp_image_registry_identity_id}" + ).get_output_in_json() + cluster_created = True + self.assertEqual(self.kwargs['cluster'], cluster['name']) + self.assertEqual('uksouth', cluster['location']) + self.assertEqual('Public', cluster['properties']['api']['visibility']) + self.assertEqual('Succeeded', cluster['properties']['provisioningState']) + + kubeconfig = os.path.join(os.getcwd(), '{}-kubeconfig'.format(self.kwargs['cluster'])) + self.kwargs['kubeconfig'] = kubeconfig + try: + self.cmd( + 'aro hcp cluster request-credential -g {rg} -n {cluster} ' + '--admin -f {kubeconfig}' + ) + self.assertTrue(os.path.isfile(kubeconfig)) + self.assertGreater(os.path.getsize(kubeconfig), 0) + finally: + if os.path.exists(kubeconfig): + os.remove(kubeconfig) + + self.cmd( + 'aro hcp cluster show -g {rg} -n {cluster}', + checks=[ + self.check('name', '{cluster}'), + self.check('properties.provisioningState', 'Succeeded'), + ], + ) + + self.cmd( + 'aro hcp cluster update -g {rg} -n {cluster} --node-drain-timeout 30', + checks=[ + self.check('name', '{cluster}'), + self.check('properties.nodeDrainTimeoutMinutes', 30), + self.check('properties.provisioningState', 'Succeeded'), + ], + ) + + self.cmd( + 'aro hcp cluster nodepool create -g {rg} --cluster-name {cluster} ' + '-n {nodepool} --replicas 1 ' + '--vm-size Standard_D8s_v3 --version 4.22.11 ' + '--channel-group stable', + checks=[ + self.check('name', '{nodepool}'), + self.check('properties.replicas', 1), + self.check('properties.provisioningState', 'Succeeded'), + ], + ) + + self.cmd( + 'aro hcp cluster nodepool show -g {rg} --cluster-name {cluster} ' + '-n {nodepool}', + checks=[ + self.check('name', '{nodepool}'), + self.check('properties.replicas', 1), + self.check('properties.provisioningState', 'Succeeded'), + ], + ) + + self.cmd( + 'aro hcp cluster nodepool update -g {rg} --cluster-name {cluster} ' + '-n {nodepool} --node-drain-timeout 15', + checks=[ + self.check('name', '{nodepool}'), + self.check('properties.nodeDrainTimeoutMinutes', 15), + self.check('properties.provisioningState', 'Succeeded'), + ], + ) + + self.cmd('aro hcp cluster revoke-credential -g {rg} -n {cluster}') + + self.cmd('aro hcp cluster delete -g {rg} -n {cluster} --yes') + cluster_created = False + finally: + if cluster_created: + self.cmd('aro hcp cluster delete -g {rg} -n {cluster} --yes') diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/test_recording_processors.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/test_recording_processors.py new file mode 100644 index 00000000000..8f2104755f1 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/integration/test_recording_processors.py @@ -0,0 +1,190 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import json +import types +import unittest + +import yaml + +from azure.cli.command_modules.aro.tests.latest.hcp.integration.test_aro_hcp_scenario import AroHcpRecordingProcessor + + +class AroHcpRecordingProcessorTest(unittest.TestCase): + + def setUp(self): + self.processor = AroHcpRecordingProcessor() + + @staticmethod + def _request(uri, body=None): + return types.SimpleNamespace(uri=uri, body=body) + + @staticmethod + def _response(body, headers=None): + return { + 'body': {'string': body}, + 'headers': headers or {}, + } + + def test_identity_values_are_consistent_between_response_and_request(self): + response = self._response(json.dumps({ + 'tenantId': '11111111-1111-1111-1111-111111111111', + 'principalId': '22222222-2222-2222-2222-222222222222', + 'clientId': '33333333-3333-3333-3333-333333333333', + })) + + processed_response = self.processor.process_response(response) + identity = json.loads(processed_response['body']['string']) + request = self._request( + 'https://management.azure.com/roleAssignments/example', + json.dumps({'principalId': '22222222-2222-2222-2222-222222222222'}).encode(), + ) + processed_request = self.processor.process_request(request) + assignment = json.loads(processed_request.body) + + self.assertEqual(identity['tenantId'], self.processor.MOCK_TENANT_ID) + self.assertEqual(identity['principalId'], self.processor.MOCK_PRINCIPAL_ID) + self.assertEqual(identity['clientId'], self.processor.MOCK_CLIENT_ID) + self.assertEqual(assignment['principalId'], identity['principalId']) + + def test_preserves_bytes_response_body(self): + response = self._response(json.dumps({ + 'tenantId': '11111111-1111-1111-1111-111111111111', + 'name': 'example-resource', + }).encode('utf-8')) + + processed = self.processor.process_response(response) + + self.assertIsInstance(processed['body']['string'], bytes) + self.assertEqual( + json.loads(processed['body']['string'])['tenantId'], + self.processor.MOCK_TENANT_ID, + ) + + def test_normalizes_generated_role_assignment_ids(self): + recorded_id = '11111111-1111-4111-8111-111111111111' + replay_id = '22222222-2222-4222-8222-222222222222' + recorded = self._response(json.dumps({ + 'id': '/subscriptions/example/providers/Microsoft.Authorization/' + 'roleAssignments/{}'.format(recorded_id), + })) + replay = self._request( + 'https://management.azure.com/subscriptions/example/providers/' + 'Microsoft.Authorization/roleAssignments/{}'.format(replay_id) + ) + + processed_recorded = self.processor.process_response(recorded) + processed_replay = self.processor.process_request(replay) + + self.assertIn( + '/roleAssignments/{}'.format(self.processor.MOCK_ROLE_ASSIGNMENT_ID), + json.loads(processed_recorded['body']['string'])['id'], + ) + self.assertIn( + '/roleAssignments/{}'.format(self.processor.MOCK_ROLE_ASSIGNMENT_ID), + processed_replay.uri, + ) + + def test_redacts_personal_data_and_lro_context(self): + tenant_id = '11111111-1111-1111-1111-111111111111' + response = self._response( + json.dumps({ + 'systemData': { + 'createdBy': 'person@example.com', + 'lastModifiedBy': 'person@example.com', + }, + 'issuer': 'https://uksouth.oic.aro-hcp.azure.com/{}/cluster'.format(tenant_id), + }), + { + 'Azure-AsyncOperation': [ + 'https://management.azure.com/operations/id?' + 't=1&c=signed-context&s=signed-request&h=signed-hash' + ], + 'WWW-Authenticate': [ + 'Bearer authorization="https://login.microsoftonline.com/{}"'.format(tenant_id) + ], + 'x-ms-keyvault-network-info': ['addr=192.0.2.1'], + 'x-ms-operation-identifier': ['operation-id'], + }, + ) + + processed = self.processor.process_response(response) + body = json.loads(processed['body']['string']) + + self.assertEqual(body['systemData']['createdBy'], self.processor.MOCK_USER_EMAIL) + self.assertEqual(body['systemData']['lastModifiedBy'], self.processor.MOCK_USER_EMAIL) + self.assertIn(self.processor.MOCK_TENANT_ID, body['issuer']) + operation_url = processed['headers']['Azure-AsyncOperation'][0] + self.assertIn('c=REDACTED', operation_url) + self.assertIn('s=REDACTED', operation_url) + self.assertIn('h=REDACTED', operation_url) + self.assertIn(self.processor.MOCK_TENANT_ID, processed['headers']['WWW-Authenticate'][0]) + self.assertNotIn('x-ms-keyvault-network-info', processed['headers']) + self.assertNotIn('x-ms-operation-identifier', processed['headers']) + + def test_redacts_graph_profile_and_credential_payload(self): + profile = self._response(json.dumps({ + 'id': '22222222-2222-2222-2222-222222222222', + 'displayName': 'Example Person', + 'mail': 'person@example.com', + 'userPrincipalName': 'person@example.com', + })) + processed_profile = self.processor.process_response(profile) + + credential_request = self._request( + 'https://management.azure.com/requestAdminCredential?' + 'c=signed-context&s=signed-request&h=signed-hash', + json.dumps({'certificateSigningRequest': 'real-csr'}), + ) + processed_request = self.processor.process_request(credential_request) + + self.assertEqual( + json.loads(processed_profile['body']['string']), + {'id': self.processor.MOCK_PRINCIPAL_ID}, + ) + self.assertEqual( + json.loads(processed_request.body)['certificateSigningRequest'], + 'redacted-csr', + ) + self.assertIn('c=REDACTED', processed_request.uri) + self.assertIn('s=REDACTED', processed_request.uri) + self.assertIn('h=REDACTED', processed_request.uri) + + def test_redacts_kubeconfig_credentials(self): + kubeconfig = yaml.safe_dump({ + 'clusters': [{ + 'name': 'cluster', + 'cluster': {'certificate-authority-data': 'real-ca'}, + }], + 'users': [{ + 'name': 'admin', + 'user': { + 'client-certificate-data': 'real-certificate', + 'client-key-data': 'real-private-key', + }, + }], + }) + + processed = self.processor.process_response( + self._response(json.dumps({'kubeconfig': kubeconfig})) + ) + redacted = yaml.safe_load(json.loads(processed['body']['string'])['kubeconfig']) + + self.assertEqual( + redacted['clusters'][0]['cluster']['certificate-authority-data'], + self.processor.REDACTED_DATA, + ) + self.assertEqual( + redacted['users'][0]['user']['client-certificate-data'], + self.processor.REDACTED_DATA, + ) + self.assertEqual( + redacted['users'][0]['user']['client-key-data'], + self.processor.REDACTED_DATA, + ) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_commands.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_commands.py new file mode 100644 index 00000000000..1beb4921207 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_commands.py @@ -0,0 +1,82 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import contextlib +import unittest +from unittest import mock + +from azure.cli.command_modules.aro.azext_aro_hcp.commands import load_command_table + + +class _Loader: + def __init__(self): + self.command_table = {} + self.command_groups = [] + + def command_group(self, name): + self.command_groups.append(name) + return contextlib.nullcontext() + + +class CommandTableTest(unittest.TestCase): + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.NodepoolCreate", autospec=True) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.GetVersions", autospec=True) + @mock.patch("azure.cli.command_modules.aro.aaz.latest.aro.hcp.cluster.nodepool._show.Show", autospec=True) + @mock.patch("azure.cli.command_modules.aro.aaz.latest.aro.hcp.cluster.nodepool._list.List", autospec=True) + @mock.patch("azure.cli.command_modules.aro.aaz.latest.aro.hcp.cluster._show.Show", autospec=True) + @mock.patch("azure.cli.command_modules.aro.aaz.latest.aro.hcp.cluster._list.List", autospec=True) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.RequestCredential", autospec=True) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.ClusterUpdate", autospec=True) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.ClusterCreate", autospec=True) + def test_load_command_table_registers_custom_commands_and_transformers( + self, cluster_create, cluster_update, request_credential, cluster_list, cluster_show, + nodepool_list, nodepool_show, get_versions, nodepool_create): + loader = _Loader() + + load_command_table(loader, None) + + self.assertEqual( + ["aro hcp cluster", "aro hcp cluster nodepool", "aro hcp"], + loader.command_groups, + ) + self.assertEqual( + { + "aro hcp cluster create", + "aro hcp cluster update", + "aro hcp cluster request-credential", + "aro hcp cluster list", + "aro hcp cluster show", + "aro hcp cluster nodepool create", + "aro hcp cluster nodepool list", + "aro hcp cluster nodepool show", + "aro hcp get-versions", + }, + set(loader.command_table), + ) + cluster_create.assert_called_once_with(loader=loader) + cluster_update.assert_called_once_with(loader=loader) + request_credential.assert_called_once_with(loader=loader) + cluster_list.assert_called_once() + cluster_show.assert_called_once() + nodepool_create.assert_called_once_with(loader=loader) + nodepool_list.assert_called_once() + nodepool_show.assert_called_once() + get_versions.assert_called_once_with(loader=loader) + + from azure.cli.command_modules.aro.azext_aro_hcp._format import ( + cluster_list_table_format, + cluster_show_table_format, + nodepool_list_table_format, + nodepool_show_table_format, + ) + self.assertIs(cluster_list.call_args.kwargs["table_transformer"], cluster_list_table_format) + self.assertIs(cluster_show.call_args.kwargs["table_transformer"], cluster_show_table_format) + self.assertIs(nodepool_list.call_args.kwargs["table_transformer"], nodepool_list_table_format) + self.assertIs(nodepool_show.call_args.kwargs["table_transformer"], nodepool_show_table_format) + + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_custom_commands.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_custom_commands.py new file mode 100644 index 00000000000..712bf9933c0 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_custom_commands.py @@ -0,0 +1,739 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import argparse +import types +import unittest +from unittest import mock + +from azure.cli.core.aaz import AAZUndefined +from azure.cli.core.aaz._field_value import AAZObject +from azure.cli.core.azclierror import FileOperationError, InvalidArgumentValueError, MutuallyExclusiveArgumentError + +from azure.cli.command_modules.aro.azext_aro_hcp.custom import ClusterCreate, ClusterUpdate, GetVersions, NodepoolCreate, RequestCredential + + +SUBNET_ID = ("/subscriptions/000/resourceGroups/network-rg/providers/Microsoft.Network/" + "virtualNetworks/vnet/subnets/cluster-subnet") + + +def _identity_id(name): + return ("/subscriptions/000/resourceGroups/network-rg/providers/" + "Microsoft.ManagedIdentity/userAssignedIdentities/{}".format(name)) + + +class _Arg: + def __init__(self, value): + self.value = value + + def __iter__(self): + return iter(self.value) + + def to_serialized_data(self): + return self.value + + +class _OperatorIdentity: + def __init__(self, name, resource_id): + self.name = _Arg(name) + self.resource_id = _Arg(resource_id) + + +class ClusterCreateTest(unittest.TestCase): + + def test_required_create_arguments_are_marked_required_in_help(self): + schema = ClusterCreate._build_arguments_schema() + + for name in ( + "name", + "resource_group", + "version", + "key_management_mode", + "subnet_id", + "vnet_integration_subnet_id", + "nsg", + "assign_control_plane_operator_identity", + "assign_data_plane_operator_identity", + "assign_service_managed_identity", + ): + with self.subTest(argument=name): + command_arg = getattr(schema, name).to_cmd_arg(name) + self.assertTrue(command_arg.type.settings["required"]) + + def test_help_examples_use_custom_identity_arguments(self): + example_text = " ".join(example["text"] for example in ClusterCreate.AZ_HELP["examples"]) + + self.assertIn("--assign-control-plane-operator-identity", example_text) + self.assertIn("--assign-data-plane-operator-identity", example_text) + self.assertIn("--assign-service-managed-identity", example_text) + self.assertNotIn("--etcd-encryption-type", example_text) + self.assertIn("--key-management-mode CustomerManaged", example_text) + self.assertNotIn("--control-plane-operators", example_text) + self.assertNotIn("--data-plane-operators", example_text) + self.assertEqual(9, example_text.count("--assign-control-plane-operator-identity")) + self.assertEqual(3, example_text.count("--assign-data-plane-operator-identity")) + + def test_key_management_mode_is_required_without_default(self): + schema = ClusterCreate._build_arguments_schema() + + self.assertTrue(schema.key_management_mode._required) + self.assertIs(schema.key_management_mode._default, AAZUndefined) + + command_arg = schema.key_management_mode.to_cmd_arg("key_management_mode") + settings = command_arg.type.settings + self.assertTrue(settings["required"]) + self.assertIs(settings["default"], AAZUndefined) + + parser = argparse.ArgumentParser() + parser.add_argument( + *command_arg.options_list, + required=settings["required"], + default=settings["default"], + action=settings["action"], + choices=settings["choices"], + ) + with mock.patch("sys.stderr") as stderr, self.assertRaises(SystemExit) as error: + parser.parse_args([]) + self.assertEqual(error.exception.code, 2) + self.assertIn("--key-management-mode", "".join(call.args[0] for call in stderr.write.call_args_list)) + + args = parser.parse_args(["--key-management-mode", "CustomerManaged"]) + self.assertIsNotNone(args.key_management_mode) + + + @staticmethod + def _identity_parser(): + schema = ClusterCreate._build_arguments_schema() + command_arg = schema.assign_control_plane_operator_identity.to_cmd_arg( + "assign_control_plane_operator_identity" + ) + settings = command_arg.type.settings + parser = argparse.ArgumentParser() + parser.add_argument( + *command_arg.options_list, + dest="identities", + nargs=settings["nargs"], + action=settings["action"], + ) + return parser, schema + + def _command(self, control_plane, data_plane, service, container_registry=None): + command = object.__new__(ClusterCreate) + command.ctx = types.SimpleNamespace(args=types.SimpleNamespace( + subnet_id=_Arg(SUBNET_ID), + assign_control_plane_operator_identity=control_plane, + assign_data_plane_operator_identity=data_plane, + assign_service_managed_identity=_Arg(service), + assign_container_registry_managed_identity=_Arg(container_registry), + container_registry_managed_identity=_Arg(None), + )) + return command + + @mock.patch( + "azure.cli.command_modules.aro.azext_aro_hcp.custom.has_value", + side_effect=lambda arg: arg.to_serialized_data() is not None, + ) + def test_pre_operations_maps_operator_identities(self, _): + service = "/subscriptions/000/resourceGroups/rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/service" + control_plane_id = "/subscriptions/000/resourceGroups/rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/control" + data_plane_id = "/subscriptions/000/resourceGroups/rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/data" + command = self._command( + [_OperatorIdentity("control-plane", control_plane_id)], + [_OperatorIdentity("disk-csi-driver", data_plane_id)], + service, + ) + + command.pre_operations() + + args = command.ctx.args + self.assertEqual( + {control_plane_id: {}, service: {}}, + args.user_assigned_identities, + ) + self.assertEqual({ + "user_assigned_identities": { + "control_plane_operators": {"control-plane": control_plane_id}, + "data_plane_operators": {"disk-csi-driver": data_plane_id}, + "service_managed_identity": service, + } + }, args.operators_authentication) + + @mock.patch( + "azure.cli.command_modules.aro.azext_aro_hcp.custom.has_value", + side_effect=lambda arg: arg.to_serialized_data() is not None, + ) + def test_pre_operations_resolves_all_identity_names_from_subnet(self, _): + command = self._command( + [_OperatorIdentity("control-plane", "control")], + [_OperatorIdentity("disk-csi-driver", "data")], + "service", + "registry", + ) + + command.pre_operations() + + args = command.ctx.args + self.assertEqual({ + _identity_id("control"): {}, + _identity_id("service"): {}, + }, args.user_assigned_identities) + self.assertEqual({ + "user_assigned_identities": { + "control_plane_operators": {"control-plane": _identity_id("control")}, + "data_plane_operators": {"disk-csi-driver": _identity_id("data")}, + "service_managed_identity": _identity_id("service"), + } + }, args.operators_authentication) + self.assertEqual( + _identity_id("registry"), + args.container_registry_managed_identity, + ) + + def test_container_registry_identity_replaces_generated_argument(self): + schema = ClusterCreate._build_arguments_schema() + command_arg = schema.assign_container_registry_managed_identity.to_cmd_arg( + "assign_container_registry_managed_identity" + ) + + self.assertFalse(schema.container_registry_managed_identity._registered) + self.assertEqual( + [ + "--registry-identity", + "--assign-container-registry-managed-identity", + ], + command_arg.options_list, + ) + + def test_pre_operations_rejects_duplicate_name(self): + command = self._command( + [ + _OperatorIdentity("control-plane", "identity-one"), + _OperatorIdentity("control-plane", "identity-two"), + ], + [_OperatorIdentity("disk-csi-driver", "identity-three")], + "service-identity", + ) + + with self.assertRaisesRegex(InvalidArgumentValueError, "Duplicate name 'control-plane'"): + command.pre_operations() + + def test_identity_argument_accepts_repeated_positional_pairs(self): + parser, schema = self._identity_parser() + namespace = parser.parse_args([ + "--control-plane-identity", "control-plane", "identity-one", + "--control-plane-identity", "ingress", "identity-two", + ]) + values = schema() + namespace.identities.apply(values, "assign_control_plane_operator_identity") + + self.assertEqual([ + {"name": "control-plane", "resource_id": "identity-one"}, + {"name": "ingress", "resource_id": "identity-two"}, + ], values.assign_control_plane_operator_identity.to_serialized_data()) + + def test_identity_argument_help_omits_structured_input_formats(self): + schema = ClusterCreate._build_arguments_schema() + command_arg = schema.assign_control_plane_operator_identity.to_cmd_arg( + "assign_control_plane_operator_identity" + ) + help_text = command_arg.type.settings["help"] + + self.assertIn( + "Usage: --assign-control-plane-operator-identity OPERATOR_NAME IDENTITY", + help_text, + ) + self.assertNotIn("shorthand-syntax", help_text) + self.assertNotIn("json-file", help_text) + self.assertNotIn('Try "??"', help_text) + + def test_identity_argument_requires_exactly_two_values(self): + parser, _ = self._identity_parser() + + with self.assertRaisesRegex(InvalidArgumentValueError, "expects OPERATOR_NAME IDENTITY"): + parser.parse_args([ + "--assign-control-plane-operator-identity", "control-plane", + ]) + + def test_content_adds_identity(self): + operation_type = ClusterCreate.HcpOpenShiftClustersCreateOrUpdate + base_type = operation_type.__mro__[1] + operation = object.__new__(operation_type) + + with mock.patch.object( + base_type, "content", new_callable=mock.PropertyMock, + return_value={"properties": {}}): + self.assertEqual( + {"properties": {}, "identity": {"type": "UserAssigned"}}, + operation.content, + ) + + def test_content_replaces_identity_type(self): + operation_type = ClusterCreate.HcpOpenShiftClustersCreateOrUpdate + base_type = operation_type.__mro__[1] + operation = object.__new__(operation_type) + content = {"identity": {"type": "SystemAssigned", "userAssignedIdentities": {}}} + + with mock.patch.object( + base_type, "content", new_callable=mock.PropertyMock, + return_value=content): + self.assertEqual("UserAssigned", operation.content["identity"]["type"]) + self.assertEqual({}, operation.content["identity"]["userAssignedIdentities"]) + + +class NodepoolCreateTest(unittest.TestCase): + + def test_vm_size_and_version_are_required_in_help(self): + schema = NodepoolCreate._build_arguments_schema() + + for name in ("vm_size", "version"): + with self.subTest(argument=name): + command_arg = getattr(schema, name).to_cmd_arg(name) + self.assertTrue(command_arg.type.settings["required"]) + + def test_location_is_not_registered_or_required(self): + schema = NodepoolCreate._build_arguments_schema() + + self.assertFalse(schema.location._registered) + self.assertFalse(schema.location._required) + + def test_help_examples_omit_location(self): + for example in NodepoolCreate.AZ_HELP["examples"]: + self.assertNotIn("--location", example["text"]) + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom._ClusterShow") + def test_content_uses_parent_cluster_location(self, cluster_show): + for location in ("eastus", "westus"): + with self.subTest(location=location): + cluster_show.reset_mock() + cluster_show.return_value.return_value = {"location": location} + args = NodepoolCreate._build_arguments_schema()() + args.resource_group = "cluster-rg" + args.cluster_name = "parent-cluster" + args.vm_size = "Standard_D8s_v3" + args.version = "4.19.0" + args.location = "centralus" + command = object.__new__(NodepoolCreate) + command.cli_ctx = mock.Mock() + command.ctx = types.SimpleNamespace(args=args) + + command.pre_operations() + + cluster_show.assert_called_once_with(cli_ctx=command.cli_ctx) + cluster_show.return_value.assert_called_once_with(command_args={ + "resource_group": "cluster-rg", + "name": "parent-cluster", + }) + operation = object.__new__(NodepoolCreate.NodePoolsCreateOrUpdate) + operation.ctx = command.ctx + content = operation.content + + self.assertEqual(location, content["location"]) + self.assertEqual("Standard_D8s_v3", content["properties"]["platform"]["vmSize"]) + self.assertEqual("4.19.0", content["properties"]["version"]["id"]) + + +class ClusterUpdateTest(unittest.TestCase): + + def test_help_examples_use_custom_identity_arguments(self): + example_text = " ".join(example["text"] for example in ClusterUpdate.AZ_HELP["examples"]) + + self.assertIn("--assign-control-plane-operator-identity", example_text) + self.assertIn("--assign-data-plane-operator-identity", example_text) + self.assertIn("--assign-service-managed-identity", example_text) + + @staticmethod + def _command(control_plane=None, data_plane=None, service=None, container_registry=None): + command = object.__new__(ClusterUpdate) + args = ClusterUpdate._build_arguments_schema()() + for name, value in ( + ("assign_control_plane_operator_identity", control_plane), + ("assign_data_plane_operator_identity", data_plane), + ("assign_service_managed_identity", service), + ("assign_container_registry_managed_identity", container_registry), + ): + if value is not None: + args[name] = value + command.ctx = types.SimpleNamespace(args=args, get_http_client=mock.Mock()) + return command + + @staticmethod + def _instance(): + schema = ClusterUpdate.HcpOpenShiftClustersGet._build_schema_on_200() + data = { + "location": "eastus", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + _identity_id("control"): {}, + _identity_id("data"): {}, + _identity_id("service"): {}, + }, + }, + "properties": { + "version": {"id": "4.19", "channelGroup": "stable"}, + "platform": { + "subnetId": SUBNET_ID, + "vnetIntegrationSubnetId": SUBNET_ID, + "networkSecurityGroupId": ( + "/subscriptions/000/resourceGroups/network-rg/providers/" + "Microsoft.Network/networkSecurityGroups/cluster-nsg" + ), + "containerRegistry": {"managedIdentity": _identity_id("registry")}, + "operatorsAuthentication": { + "userAssignedIdentities": { + "controlPlaneOperators": {"existing-control": _identity_id("control")}, + "dataPlaneOperators": {"existing-data": _identity_id("data")}, + "serviceManagedIdentity": _identity_id("service"), + }, + }, + }, + }, + } + return AAZObject(schema, data=schema.process_data(data)) + + def test_pre_instance_update_merges_supplied_category_and_rebuilds_top_level_identities(self): + instance = self._instance() + command = self._command( + control_plane=[{"name": "new-control", "resource_id": "new-control-identity"}], + ) + + command.pre_instance_update(instance) + + operator_identities = instance.properties.platform.operators_authentication.user_assigned_identities + self.assertEqual({ + "existing-control": _identity_id("control"), + "new-control": _identity_id("new-control-identity"), + }, operator_identities.control_plane_operators) + self.assertEqual({"existing-data": _identity_id("data")}, operator_identities.data_plane_operators) + self.assertEqual(_identity_id("service"), operator_identities.service_managed_identity) + self.assertEqual({ + _identity_id("control"): {}, + _identity_id("new-control-identity"): {}, + _identity_id("service"): {}, + }, instance.identity.user_assigned_identities.to_serialized_data()) + + def test_pre_instance_update_removes_replaced_identity_from_put_content(self): + instance = self._instance() + operator_identities = instance.properties.platform.operators_authentication.user_assigned_identities + operator_identities.control_plane_operators = { + "cluster-api-azure": _identity_id("control"), + "other-operator": _identity_id("other-control"), + } + command = self._command(control_plane=[ + {"name": "cluster-api-azure", "resource_id": "replacement-control"}, + ]) + command.ctx.vars = types.SimpleNamespace(instance=instance) + + command.pre_instance_update(instance) + command.InstanceUpdateByJson(ctx=command.ctx)() + content = command.HcpOpenShiftClustersCreateOrUpdate(ctx=command.ctx).content + + operators = content["properties"]["platform"]["operatorsAuthentication"]["userAssignedIdentities"] + self.assertEqual({ + "cluster-api-azure": _identity_id("replacement-control"), + "other-operator": _identity_id("other-control"), + }, operators["controlPlaneOperators"]) + self.assertNotIn(_identity_id("control"), operators["controlPlaneOperators"].values()) + self.assertEqual({ + _identity_id("replacement-control"): {}, + _identity_id("other-control"): {}, + _identity_id("service"): {}, + }, content["identity"]["userAssignedIdentities"]) + self.assertNotIn(_identity_id("control"), content["identity"]["userAssignedIdentities"]) + + def test_pre_instance_update_resolves_all_identity_names_from_subnet(self): + instance = self._instance() + command = self._command( + control_plane=[ + {"name": "existing-control", "resource_id": "control-two"}, + {"name": "new-control", "resource_id": "control-three"}, + ], + data_plane=[ + {"name": "existing-data", "resource_id": "data-two"}, + {"name": "new-data", "resource_id": "data-three"}, + ], + service="service-two", + ) + + command.pre_instance_update(instance) + + operator_identities = instance.properties.platform.operators_authentication.user_assigned_identities + self.assertEqual({ + "existing-control": _identity_id("control-two"), + "new-control": _identity_id("control-three"), + }, operator_identities.control_plane_operators) + self.assertEqual({ + "existing-data": _identity_id("data-two"), + "new-data": _identity_id("data-three"), + }, operator_identities.data_plane_operators) + self.assertEqual(_identity_id("service-two"), operator_identities.service_managed_identity) + self.assertEqual({ + _identity_id("control-two"): {}, + _identity_id("control-three"): {}, + _identity_id("service-two"): {}, + }, instance.identity.user_assigned_identities.to_serialized_data()) + + def test_pre_instance_update_preserves_container_registry_identity_resource_id(self): + registry_id = _identity_id("registry") + command = self._command(container_registry=registry_id) + + command.pre_instance_update(self._instance()) + + self.assertEqual( + registry_id, + command.ctx.args.container_registry_managed_identity, + ) + + def test_container_registry_identity_replaces_generated_argument(self): + schema = ClusterUpdate._build_arguments_schema() + command_arg = schema.assign_container_registry_managed_identity.to_cmd_arg( + "assign_container_registry_managed_identity" + ) + + self.assertFalse(schema.container_registry_managed_identity._registered) + self.assertEqual( + [ + "--registry-identity", + "--assign-container-registry-managed-identity", + ], + command_arg.options_list, + ) + + def test_pre_instance_update_preserves_identities_when_arguments_are_omitted(self): + instance = self._instance() + command = self._command() + + command.pre_instance_update(instance) + + self.assertEqual( + { + _identity_id("control"): {}, + _identity_id("data"): {}, + _identity_id("service"): {}, + }, + instance.identity.user_assigned_identities.to_serialized_data(), + ) + operator_identities = instance.properties.platform.operators_authentication.user_assigned_identities + self.assertEqual({"existing-control": _identity_id("control")}, + operator_identities.control_plane_operators) + self.assertEqual({"existing-data": _identity_id("data")}, operator_identities.data_plane_operators) + self.assertEqual(_identity_id("service"), operator_identities.service_managed_identity) + + def test_pre_instance_update_identity_flags_produce_put_content(self): + for flag, field in ( + ("control_plane", "controlPlaneOperators"), + ("data_plane", "dataPlaneOperators"), + ("service", "serviceManagedIdentity"), + ("container_registry", None), + ): + for use_resource_id in (False, True): + with self.subTest(flag=flag, use_resource_id=use_resource_id): + instance = self._instance() + expected = instance.to_serialized_data() + identity = _identity_id("replacement") if use_resource_id else "replacement" + value = [{"name": "replacement", "resource_id": identity}] if flag in ( + "control_plane", "data_plane", + ) else identity + command = self._command(**{flag: value}) + command.ctx.vars = types.SimpleNamespace(instance=instance) + platform = expected["properties"]["platform"] + operators = platform["operatorsAuthentication"]["userAssignedIdentities"] + if field is None: + platform["containerRegistry"]["managedIdentity"] = _identity_id("replacement") + else: + if flag in ("control_plane", "data_plane"): + operators[field]["replacement"] = _identity_id("replacement") + else: + operators[field] = _identity_id("replacement") + assigned_ids = set(operators["controlPlaneOperators"].values()) + assigned_ids.add(operators["serviceManagedIdentity"]) + expected["identity"]["userAssignedIdentities"] = { + identity_id: {} for identity_id in assigned_ids + } + + command.pre_instance_update(instance) + command.InstanceUpdateByJson(ctx=command.ctx)() + operation = command.HcpOpenShiftClustersCreateOrUpdate(ctx=command.ctx) + + self.assertEqual("PUT", operation.method) + self.assertEqual(expected, operation.content) + + def test_pre_instance_update_rejects_duplicate_name(self): + command = self._command(control_plane=[ + {"name": "control-plane", "resource_id": "identity-one"}, + {"name": "control-plane", "resource_id": "identity-two"}, + ]) + + with self.assertRaisesRegex(InvalidArgumentValueError, "Duplicate name 'control-plane'"): + command.pre_instance_update(self._instance()) + + +class GetVersionsTest(unittest.TestCase): + + def _command(self, control_plane=False, node_pools=False): + command = object.__new__(GetVersions) + command.ctx = types.SimpleNamespace(args=types.SimpleNamespace( + control_plane=_Arg(control_plane), + node_pools=_Arg(node_pools), + )) + return command + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.has_value", return_value=True) + @mock.patch.object(GetVersions.__mro__[1], "_output") + def test_default_output_filters_and_sorts_full_versions(self, base_output, _): + base_output.return_value = ([ + {"name": "4.20.1", "properties": {"enabled": True, "channelGroup": "candidate"}}, + {"name": "4.19.3", "properties": {"enabled": False}}, + {"name": "4.19.2", "properties": {"channelGroup": "stable"}}, + ], "next") + + result, next_link = self._command()._output() + + self.assertEqual(["4.19.2", "4.20.1"], [row["Name"] for row in result]) + self.assertEqual("next", next_link) + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.has_value", return_value=True) + @mock.patch.object(GetVersions.__mro__[1], "_output") + def test_control_plane_output_deduplicates_major_minor_per_channel(self, base_output, _): + base_output.return_value = ([ + {"name": "4.20.2", "properties": {"channelGroup": "stable"}}, + {"name": "4.19.3", "properties": {"channelGroup": "stable"}}, + {"name": "4.20.1", "properties": {"channelGroup": "candidate"}}, + {"name": "4.20.3", "properties": {"channelGroup": "stable"}}, + {"name": "4.20.4", "properties": {"channelGroup": "candidate"}}, + {"name": "4.20.5", "properties": {"channelGroup": "fast", "enabled": False}}, + {"name": "invalid", "properties": {}}, + ], None) + + result, _ = self._command(control_plane=True)._output() + + self.assertEqual(["4.19", "4.20", "4.20"], [row["Name"] for row in result]) + self.assertEqual(["stable", "candidate", "stable"], [row["ChannelGroup"] for row in result]) + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.has_value", return_value=True) + @mock.patch.object(GetVersions.__mro__[1], "_output", return_value=([], None)) + def test_flags_are_mutually_exclusive(self, _, __): + with self.assertRaises(MutuallyExclusiveArgumentError): + self._command(control_plane=True, node_pools=True)._output() + + +class RequestCredentialTest(unittest.TestCase): + + def test_no_wait_is_disabled(self): + schema = RequestCredential._build_arguments_schema() + + self.assertFalse(RequestCredential.AZ_SUPPORT_NO_WAIT) + self.assertFalse(schema.no_wait._registered) + self.assertIs(schema.no_wait._default, False) + + def test_handler_without_admin_raises_invalid_argument_value_error(self): + command = object.__new__(RequestCredential) + with self.assertRaisesRegex( + InvalidArgumentValueError, + "Requesting a non-admin credential is not supported yet"): + command._handler({"admin": False}) + + @mock.patch( + "azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig._generate_admin_credential_request", + return_value=(b"private-key", "csr"), + ) + @mock.patch.object(RequestCredential.__mro__[1], "_handler", return_value="poller") + def test_handler_populates_internal_csr(self, base_handler, _): + command = object.__new__(RequestCredential) + command_args = {"admin": True} + + self.assertEqual("poller", command._handler(command_args)) + + self.assertEqual("csr", command_args["certificate_signing_request"]) + self.assertEqual(b"private-key", command._private_key_pem) + base_handler.assert_called_once_with(command_args) + + @mock.patch( + "azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig._generate_admin_credential_request", + return_value=(b"private-key", "csr"), + ) + @mock.patch.object(RequestCredential.__mro__[1], "_handler", side_effect=RuntimeError("failed")) + def test_handler_clears_key_when_poller_creation_fails(self, _, __): + command = object.__new__(RequestCredential) + with self.assertRaisesRegex(RuntimeError, "failed"): + command._handler({"admin": True}) + self.assertFalse(hasattr(command, "_private_key_pem")) + + @mock.patch( + "azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig._generate_admin_credential_request", + return_value=(b"private-key", "csr"), + ) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig.print_or_merge_credentials") + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig._embed_private_key", return_value="embedded") + @mock.patch.object(RequestCredential, "deserialize_output", return_value={"kubeconfig": "config"}) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.has_value", return_value=False) + def test_handler_preserves_merge_error_after_output_clears_key(self, _, __, ___, print_or_merge, ____): + command = object.__new__(RequestCredential) + command.ctx = types.SimpleNamespace( + vars=types.SimpleNamespace(instance=object()), + args=types.SimpleNamespace( + file=_Arg("/tmp/config"), + context_name=_Arg(None), + name=_Arg("cluster-one"), + resource_group=_Arg("group-one"), + overwrite_existing=_Arg(False), + ), + ) + merge_error = FileOperationError("Failed to merge credentials") + print_or_merge.side_effect = merge_error + + with mock.patch.object( + RequestCredential.__mro__[1], "_handler", side_effect=lambda command_args: command._output()): + with self.assertRaises(FileOperationError) as raised: + command._handler({"admin": True}) + + self.assertIs(merge_error, raised.exception) + self.assertFalse(hasattr(command, "_private_key_pem")) + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig.print_or_merge_credentials") + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig._embed_private_key", return_value="embedded") + @mock.patch.object(RequestCredential, "deserialize_output", return_value={"kubeconfig": "config\\n"}) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp.custom.has_value", return_value=False) + def test_output_embeds_key_and_uses_default_context( + self, _, __, embed_private_key, print_or_merge): + command = object.__new__(RequestCredential) + command._private_key_pem = b"private-key" + command.ctx = types.SimpleNamespace( + vars=types.SimpleNamespace(instance=object()), + args=types.SimpleNamespace( + file=_Arg("/tmp/config"), + context_name=_Arg(None), + name=_Arg("cluster-one"), + resource_group=_Arg("group-one"), + overwrite_existing=_Arg(False), + ), + ) + + self.assertIsNone(command._output()) + + self.assertFalse(hasattr(command, "_private_key_pem")) + embed_private_key.assert_called_once_with("config\n", b"private-key", "group-one-cluster-one-admin") + print_or_merge.assert_called_once_with( + "/tmp/config", "embedded", False, "cluster-one-admin" + ) + + def test_hidden_csr_is_added_to_request_content(self): + operation_type = RequestCredential.HcpOpenShiftClustersRequestAdminCredential + base_type = operation_type.__mro__[1] + operation = object.__new__(operation_type) + operation.ctx = types.SimpleNamespace( + args=types.SimpleNamespace(certificate_signing_request=_Arg("pem-csr")) + ) + + with mock.patch.object( + base_type, "content", new_callable=mock.PropertyMock, return_value={}): + self.assertEqual( + {"certificateSigningRequest": "pem-csr"}, + operation.content, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_format.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_format.py new file mode 100644 index 00000000000..7ba6dc9afbc --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_format.py @@ -0,0 +1,92 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import unittest + +from azure.cli.command_modules.aro.azext_aro_hcp._format import ( + _major_minor, + _parse_semver, + cluster_list_table_format, + cluster_show_table_format, + nodepool_list_table_format, + nodepool_show_table_format, +) + + +class FormatTest(unittest.TestCase): + + def test_parse_semver(self): + self.assertEqual((4, 19, 2), _parse_semver("4.19.2")) + self.assertEqual((4, 19, 2), _parse_semver("4.19.2-preview")) + self.assertEqual((0, 0, 0), _parse_semver("4.19")) + self.assertEqual((0, 0, 0), _parse_semver(None)) + + def test_major_minor(self): + self.assertEqual("4.19", _major_minor("4.19.2")) + self.assertEqual("4.19", _major_minor("4.19")) + self.assertEqual("", _major_minor("invalid")) + self.assertEqual("", _major_minor(None)) + + + def test_cluster_table_formats(self): + cluster = { + "name": "cluster-one", + "location": "eastus", + "resourceGroup": "group-one", + "properties": { + "version": {"id": "4.19"}, + "provisioningState": "Succeeded", + "api": {"url": "https://api.example.invalid"}, + }, + } + expected = [{ + "Name": "cluster-one", + "Location": "eastus", + "ResourceGroup": "group-one", + "Version": "4.19", + "ProvisioningState": "Succeeded", + "ApiServerUrl": "https://api.example.invalid", + }] + + self.assertEqual(expected, cluster_show_table_format(cluster)) + self.assertEqual(expected, cluster_list_table_format([cluster])) + self.assertEqual( + [{ + "Name": "", + "Location": "", + "ResourceGroup": "", + "Version": "", + "ProvisioningState": "", + "ApiServerUrl": "", + }], + cluster_show_table_format({}), + ) + + def test_nodepool_table_formats(self): + nodepool = { + "name": "workers", + "properties": { + "version": {"id": "4.19.2"}, + "platform": {"vmSize": "Standard_D4s_v5"}, + "provisioningState": "Succeeded", + }, + } + expected = [{ + "Name": "workers", + "Version": "4.19.2", + "VmSize": "Standard_D4s_v5", + "ProvisioningState": "Succeeded", + }] + + self.assertEqual(expected, nodepool_show_table_format(nodepool)) + self.assertEqual(expected, nodepool_list_table_format([nodepool])) + self.assertEqual( + [{"Name": "", "Version": "", "VmSize": "", "ProvisioningState": ""}], + nodepool_show_table_format({}), + ) + + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_kubeconfig.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_kubeconfig.py new file mode 100644 index 00000000000..821d0ec6736 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/hcp/unit/test_kubeconfig.py @@ -0,0 +1,238 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import contextlib +import base64 +import errno +import io +import os +import stat +import tempfile +import unittest +from unittest import mock + +import yaml +from azure.cli.core.azclierror import FileOperationError +from cryptography import x509 +from cryptography.hazmat.primitives import serialization +from knack.util import CLIError + +from azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig import ( + _embed_private_key, + _generate_admin_credential_request, + _handle_merge, + load_kubernetes_configuration, + merge_kubernetes_configurations, + print_or_merge_credentials, +) + + +def _config(name="admin", server="https://api.example.invalid"): + return { + "apiVersion": "v1", + "clusters": [{"name": name, "cluster": {"server": server}}], + "contexts": [{"name": name, "context": {"cluster": name, "user": "admin"}}], + "current-context": name, + "kind": "Config", + "users": [{"name": "admin", "user": {"client-certificate-data": "certificate"}}], + } + + +class CredentialHelperTest(unittest.TestCase): + + def test_generate_admin_credential_request(self): + private_key_pem, csr_pem = _generate_admin_credential_request() + + private_key = serialization.load_pem_private_key(private_key_pem, password=None) + csr = x509.load_pem_x509_csr(csr_pem.encode("ascii")) + + self.assertEqual(4096, private_key.key_size) + self.assertEqual( + [ + (x509.NameOID.COMMON_NAME, "system:customer-break-glass:system-admin"), + (x509.NameOID.ORGANIZATION_NAME, "system:masters"), + ], + [(attribute.oid, attribute.value) for attribute in csr.subject], + ) + self.assertTrue(csr.is_signature_valid) + self.assertEqual(csr.public_key().public_numbers(), private_key.public_key().public_numbers()) + + def test_embed_private_key_in_admin_user(self): + private_key_pem, _ = _generate_admin_credential_request() + kubeconfig = yaml.safe_dump({ + "apiVersion": "v1", + "current-context": "other-context", + "contexts": [ + {"name": "other-context", "context": {"cluster": "other", "user": "other"}}, + {"name": "admin-context", "context": {"cluster": "cluster", "user": "admin"}}, + ], + "clusters": [{"name": "cluster", "cluster": {"server": "https://example.invalid"}}], + "users": [ + {"name": "other", "user": {"client-key-data": "unchanged"}}, + {"name": "admin", "user": {"client-certificate-data": "certificate", "client-key": "admin.key"}}, + ], + }) + + config = yaml.safe_load(_embed_private_key(kubeconfig, private_key_pem, "cluster-admin")) + + self.assertEqual("unchanged", config["users"][0]["user"]["client-key-data"]) + self.assertEqual("other", config["users"][0]["name"]) + self.assertEqual("other", config["contexts"][0]["context"]["user"]) + self.assertEqual("cluster-admin", config["users"][1]["name"]) + self.assertEqual("cluster-admin", config["contexts"][1]["context"]["user"]) + admin_credentials = config["users"][1]["user"] + self.assertNotIn("client-key", admin_credentials) + self.assertEqual(private_key_pem, base64.b64decode(admin_credentials["client-key-data"])) + + +class LoadKubernetesConfigurationTest(unittest.TestCase): + + def test_loads_yaml(self): + with tempfile.TemporaryDirectory() as directory: + path = os.path.join(directory, "config") + with open(path, "w", encoding="utf-8") as stream: + yaml.safe_dump(_config(), stream) + self.assertEqual(_config(), load_kubernetes_configuration(path)) + + def test_missing_file_raises_cli_error(self): + with self.assertRaisesRegex(CLIError, "does not exist"): + load_kubernetes_configuration("/path/that/does/not/exist") + + @mock.patch( + "azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig.open", + side_effect=PermissionError(errno.EACCES, "Permission denied"), + ) + def test_permission_error_is_actionable(self, _): + with self.assertRaisesRegex(FileOperationError, "Permission denied"): + load_kubernetes_configuration("config") + + +class HandleMergeTest(unittest.TestCase): + + def test_adds_new_entry(self): + existing = {"clusters": [{"name": "one"}]} + _handle_merge(existing, {"clusters": [{"name": "two"}]}, "clusters", replace=False) + self.assertEqual([{"name": "one"}, {"name": "two"}], existing["clusters"]) + + def test_replaces_duplicate_when_requested(self): + existing = {"clusters": [{"name": "one", "value": "old"}]} + addition = {"clusters": [{"name": "one", "value": "new"}]} + _handle_merge(existing, addition, "clusters", replace=True) + self.assertEqual(addition["clusters"], existing["clusters"]) + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig.prompt_y_n", return_value=False) + def test_rejects_conflicting_entry(self, _): + existing = {"users": [{"name": "admin", "user": {"token": "old"}}]} + addition = {"users": [{"name": "admin", "user": {"token": "new"}}]} + with self.assertRaisesRegex(CLIError, "already exists"): + _handle_merge(existing, addition, "users", replace=False) + + def test_missing_existing_section_raises_file_error(self): + with self.assertRaisesRegex(FileOperationError, "No such key 'clusters'"): + _handle_merge({}, {"clusters": [{"name": "one"}]}, "clusters", replace=False) + + +class MergeKubernetesConfigurationsTest(unittest.TestCase): + + def test_merges_and_renames_context_atomically(self): + with tempfile.TemporaryDirectory() as directory: + existing_path = os.path.join(directory, "config") + addition_path = os.path.join(directory, "addition") + with open(existing_path, "w", encoding="utf-8") as stream: + yaml.safe_dump(_config("existing"), stream) + with open(addition_path, "w", encoding="utf-8") as stream: + yaml.safe_dump(_config("new"), stream) + os.chmod(existing_path, 0o600) + + merge_kubernetes_configurations( + existing_path, addition_path, replace=True, context_name="renamed" + ) + + merged = load_kubernetes_configuration(existing_path) + self.assertEqual("renamed", merged["current-context"]) + self.assertIn("renamed", [item["name"] for item in merged["clusters"]]) + self.assertIn("renamed", [item["name"] for item in merged["contexts"]]) + if os.name != "nt": + self.assertEqual(0o600, stat.S_IMODE(os.stat(existing_path).st_mode)) + + @unittest.skipIf(os.name == "nt", "Symlink test not applicable on Windows") + def test_refuses_to_replace_symlink(self): + with tempfile.TemporaryDirectory() as directory: + target_path = os.path.join(directory, "target") + link_path = os.path.join(directory, "config") + addition_path = os.path.join(directory, "addition") + for path in (target_path, addition_path): + with open(path, "w", encoding="utf-8") as stream: + yaml.safe_dump(_config(), stream) + os.symlink(target_path, link_path) + + with self.assertRaisesRegex(CLIError, "symbolic link"): + merge_kubernetes_configurations(link_path, addition_path, replace=True) + + +class PrintOrMergeCredentialsTest(unittest.TestCase): + + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig.os.remove", wraps=os.remove) + @mock.patch("azure.cli.command_modules.aro.azext_aro_hcp._kubeconfig.merge_kubernetes_configurations") + def test_merge_yaml_error_is_raised_and_temporary_credentials_are_removed(self, merge, remove): + merge_error = yaml.YAMLError("invalid YAML") + merge.side_effect = merge_error + with tempfile.TemporaryDirectory() as directory: + path = os.path.join(directory, "config") + with self.assertRaisesRegex(CLIError, "Failed to merge credentials") as raised: + print_or_merge_credentials(path, yaml.safe_dump(_config()), False, None) + + self.assertIs(merge_error, raised.exception.__cause__) + remove.assert_called_once_with(merge.call_args.args[1]) + self.assertFalse(os.path.exists(merge.call_args.args[1])) + + def test_merges_credentials_for_two_clusters_without_user_collision(self): + with tempfile.TemporaryDirectory() as directory: + path = os.path.join(directory, "config") + for resource_group in ("group-one", "group-two"): + user_name = resource_group + "-cluster-admin" + kubeconfig = _embed_private_key( + yaml.safe_dump(_config("cluster")), resource_group.encode("ascii"), user_name + ) + print_or_merge_credentials(path, kubeconfig, False, resource_group + "-context") + + merged = load_kubernetes_configuration(path) + self.assertEqual( + ["group-one-cluster-admin", "group-two-cluster-admin"], + [user["name"] for user in merged["users"]], + ) + self.assertEqual( + ["group-one-cluster-admin", "group-two-cluster-admin"], + [context["context"]["user"] for context in merged["contexts"]], + ) + self.assertEqual( + [b"group-one", b"group-two"], + [base64.b64decode(user["user"]["client-key-data"]) for user in merged["users"]], + ) + + def test_dash_prints_kubeconfig(self): + kubeconfig = _embed_private_key( + yaml.safe_dump(_config()), b"private-key", "cluster-one-admin" + ) + output = io.StringIO() + with contextlib.redirect_stdout(output): + print_or_merge_credentials("-", kubeconfig, False, None) + self.assertEqual(kubeconfig + "\n", output.getvalue()) + config = yaml.safe_load(output.getvalue()) + self.assertEqual("cluster-one-admin", config["users"][0]["name"]) + self.assertEqual("cluster-one-admin", config["contexts"][0]["context"]["user"]) + + def test_creates_parent_and_secure_config(self): + with tempfile.TemporaryDirectory() as directory: + path = os.path.join(directory, ".kube", "config") + print_or_merge_credentials(path, yaml.safe_dump(_config()), False, None) + + self.assertEqual(_config(), load_kubernetes_configuration(path)) + if os.name != "nt": + self.assertEqual(0o600, stat.S_IMODE(os.stat(path).st_mode)) + + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/__init__.py new file mode 100644 index 00000000000..34913fb394d --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/__init__.py @@ -0,0 +1,4 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/custom_preparers.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/custom_preparers.py similarity index 100% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/custom_preparers.py rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/custom_preparers.py diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/__init__.py new file mode 100644 index 00000000000..34913fb394d --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/__init__.py @@ -0,0 +1,4 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/recordings/test_aro_get_versions.yaml b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/recordings/test_aro_get_versions.yaml similarity index 100% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/recordings/test_aro_get_versions.yaml rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/recordings/test_aro_get_versions.yaml diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/recordings/test_aro_public_cluster.yaml b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/recordings/test_aro_public_cluster.yaml similarity index 99% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/recordings/test_aro_public_cluster.yaml rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/recordings/test_aro_public_cluster.yaml index a92586f0cc2..a249a75d230 100644 --- a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/recordings/test_aro_public_cluster.yaml +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/recordings/test_aro_public_cluster.yaml @@ -7113,7 +7113,7 @@ interactions: uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_aro000001/providers/Microsoft.RedHatOpenShift/openShiftClusters/aro000005/listAdminCredentials?api-version=2025-07-25 response: body: - string: "{\n \"kubeconfig\": \"Y2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9hcGkuaGVwdGc2NWsuZWFzdHVzLmFyb2FwcC5pbzo2NDQzCiAgbmFtZTogaGVwdGc2NWsKY29udGV4dHM6Ci0gY29udGV4dDoKICAgIGNsdXN0ZXI6IGhlcHRnNjVrCiAgICB1c2VyOiBzeXN0ZW06YWRtaW4KICBuYW1lOiBzeXN0ZW06YWRtaW4KY3VycmVudC1jb250ZXh0OiBzeXN0ZW06YWRtaW4KcHJlZmVyZW5jZXM6IHt9CnVzZXJzOgotIG5hbWU6IHN5c3RlbTphZG1pbgogIHVzZXI6CiAgICBjbGllbnQtY2VydGlmaWNhdGUtZGF0YTogTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUktWRU5EUVdjeVowRjNTVUpCWjBsSlRraHJZVGx6ZHpFd05sVjNSRkZaU2t0dldrbG9kbU5PUVZGRlRFSlJRWGRPYWtWVFRVSkJSMEV4VlVVS1EzaE5TbUl6UW14aWJrNXZZVmRhTUUxVFFYZElaMWxFVmxGUlJFVjRaR2hhUnpGd1lta3hjbVJYU214Wk1qbDFXbTFzYmt4WVRuQmFNalZzWTJwQlpRcEdkekI1VG1wQk5FMVVUWGhOYWtsNFRrUkNZVVozTUhsT2VrRTBUVlJOZUUxcVRUTk5SRnBoVFVKamVFWlVRVlJDWjA1V1FrRk5WRVJJVGpWak0xSnNDbUpVY0doYVJ6RndZbXBEUTBGVFNYZEVVVmxLUzI5YVNXaDJZMDVCVVVWQ1FsRkJSR2RuUlZCQlJFTkRRVkZ2UTJkblJVSkJUR2hQVlVzNGQxVmFSaXNLVkhKMlZXbHhOWGM1UTNoaWF6SmlUaXQzY2tOMFpYVmhaMjRyYzFodWFVZGFURFIyVld0bWQweFNhQ3RGTlhNcmFWRnJOVEZpVjB4TVprTjNaWGhUVVFwRmNFOW9jVUUzU2xKdVRUUkxWbloxWkVSTlRVUnFkM2xGZHpKdldEUjFaVzk0YzNWQk9XWktXbWhxY2l0U2ExTjRVaTlCTUhKWWNuWktOMDFMZEhkNUNrMVVTV1F6YUdObVptdG9Obk5KYmpVM1UyaERjWEZXU0RSVFFYaHZhblIwY0ZKQkwyeFlSMDFwWkhoMlRrUnNTR3hKT0VwMlNYZFNNRVJCTUUwNE1qSUtPREIxZGpkM2Ewb3plR2xEZFhaNlRuWkJabEZWYVZZMFJ6TjVUbTlNZGtGblRsQm9iRUpPZVZvcmIwRkdUM3B4VGtkQloycFhaa0pTVFRkQ1pFcDNXUXBSUzJwQk5IUjVhM0I1V1d3MVVrSkpVa2RuWnpkUEswcHFNV1JqUlVKTFluVlZWVnBhT0dGR2JVWjFRVGxYV0RSNFN6ZHRXVkZUTjJ4NWVuWnJVR05oQ2pWeE1FeGhNbTFuZDBRNFEwRjNSVUZCWVU1WFRVWlJkMFJuV1VSV1VqQlFRVkZJTDBKQlVVUkJaMWRuVFVKTlIwRXhWV1JLVVZGTlRVRnZSME5EYzBjS1FWRlZSa0ozVFVOTlFYZEhRVEZWWkVWM1JVSXZkMUZEVFVGQmQwaDNXVVJXVWpCcVFrSm5kMFp2UVZWVk1EZElWa294UVZWME5scFJkbU5sS3pZelVncDNaemd6WTNGamQwUlJXVXBMYjFwSmFIWmpUa0ZSUlV4Q1VVRkVaMmRGUWtGSloxTXpNV2R6WjBFMlNqRk5kbEJNVGtablJYWklRM1ZUWkcxQk5qaHpDbVZ6YUZSV2R5dEdMMDlaVDB4SE5YaFBha2xzZW1sVlRtbDRWelZGZG5BclFXaGhjbEJKU0hSdUwxaGpibXgyUzFSRlptdEhiRU1yWlZjNGNEa3pja2NLVlN0cFREQmxhVmhwT0d0M1NVbHJVVVpRVVZWV2EzUnpiemxzYzBac04yaFlNRVJyZWpFNFNqVkJRa0o0WW1ONkx6ZExlVkptWTBzNVlrUktNR3hCT0FwaU5VTTFkR1Z1YlRkU1JsaEJhbk41VVZWS1dGQnZjVkExZFZwSFVrWllVV3BKVXpOa1ZUVXZPVEYwUTNSNmRHWnZRVFJvY1ZwellWQlFTMVJHUldGdUNqRnRWSFpEVkVWdFNsRkVVRU5oVmtOMFlTdHdLMUZJVDFONmNrMTVTVGR5YTFaRVRHMVlUWFZoTDNCclUxQnJXWEZwWlUxNVp6ZHZaSFpLUVdNeFZrSUtRV0ZIU1haaWRISXZiMHRzTmsxYWNsSlVaMnhTZUc0dlNYSTBaMVJzT1d3d1JYQnRjSFI2ZEdobE9XdHVhV04yUnpJcmRrOVpWVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89CiAgICBjbGllbnQta2V5LWRhdGE6IExTMHRMUzFDUlVkSlRpQlNVMEVnVUZKSlZrRlVSU0JMUlZrdExTMHRMUXBOU1VsRmIzZEpRa0ZCUzBOQlVVVkJkVVUxVVhKNlFsSnJXRFZQZFRsVFMzSnVSREJNUm5WVVduTXpOME56U3pFMk5YRkRaalo0WldWSldtdDJhVGxUQ2xJdlFYUkhTRFJVYlhvMlNrTlVibFowV1hOME9FeENOMFpLUVZOck5rZHZSSE5zUjJONlozQlhLelV3VFhkM1QxQkVTVlJFWVdobWFUVTJha2Q1TkVRS01UaHNiVWRQZGpWSFVreEdTRGhFVTNSbGRUaHVjM2R4TTBSSmVFMW9NMlZHZURrclUwaHhkMmxtYm5STFJVdHhjRlZtYUVsRVIybFBNakpzUlVRclZncGpXWGxLTTBjNE1FOVZaVlZxZDIwNGFrSklVVTFFVVhwNlltSjZVell2ZGtOUmJtWkhTVXMyTDAweU9FSTVRbE5LV0dkaVpra3laM1U0UTBFd0swZFZDa1V6U200MlowRlZOMDl2TUZsRFEwNWFPRVpGZW5OR01HNUNhRUZ4VFVScE0wdFRia3BwV0d4RlJXaEZZVU5FY3pjMGJWQldNWGRSUlhCMU5WSlNiRzRLZUc5WFdWYzBSREZhWm1wRmNuVmFhRUpNZFZoTVR5dFJPWGh5YlhKUmRISmhZVVJCVUhkSlJFRlJRVUpCYjBsQ1FVSnZWWEYzU1M5bGFYUXlhbXB0ZVFwT0wxYzNZMnBKWTNVeE1HVTFUbXdySzBST1p6VXZjV1JNTjJ0eFpUTk5WMU42VWpJemEzSkxMMGxrU21ORFltOUZhaTluWkVJelRrOHpNa3hpWWxkTENtVk1aWFUzT1UwMlRGWkJaa1JFTlRGQ1JXRnpXakZ1Vm1FM0wyTk5VVk5XYmtkSFlURkhTRTlqY1N0RWIyNVdPVEprVGpScGJtRkhUMk5LZWt3NVkwSUtkSFl6WVhKUmIyZHZiamRFTmxSV04xTmFObVEzTVU5Wk9HNVpjVXhwVm5GRFVIRjNjREVyTVdseWNsQTFORkkwYVd3MlFYTjNiRk5aVDNwNU1tSjVNUXBCYzFaeVNtdzFSM1JyZWtwME5scDBZazlxZDFWRlZIUjNSRWxLVTBWTlozTjVLMFpWVW5FeVRUTTRkV0l6WW1OTFpuQlZlRVJGT1ZWRFNrUlBRalJxQ2poeFQxZENkV0ZvZDI5U1ZXMXpabUpGSzJkRU5rTkdNazlaUVZaQ1RUTnhWV0kwVG5vMVVVSnNjVE0yVERWamVrWnVTVzFGVUhaRmRrTkNaVGs1TjBzS01tMUpUWGcyUlVObldVVkJlR1Z1ZDNGRldEVTJkVlpYYTJGUE9EVmhUa3BpWjJGeVRXa3ZiRGxqVEdVMFpHeDNaemRJY3pKcWFHMXhWMnhQYWxaV2VRcHZNV3REYkZVd2QybDVNaTlqYjJkSGFrRnZUVE5tVVM5U1NHRk1Xa0YwVWtsb2QwdFFZbFYwWWpCWlpVaE5URWMyTlhwNU1FOU5hVk53Y0hNM05FZDNDbGRVVW1SMVJqa3JUMUU1TmtGcVpXVkpNbU40YUV4TE1YRmFPVVpPUnpCaFJucDRTamRFTWs1U1N6ZENXbVV6UTNsdk5GSkphR05EWjFsRlFUZHRXREVLVlVKV1NGaDBkazFWTUhWdU5GSm5MMVZWUTNoU1dFcG9kVlpqZWl0SlJXbElhMGxIY1cxbE5UVkpjRWQ2V1dKSE4xbEdTbVpYTWtoQmRWb3lVVk5ITUFwcGRUTldaVGxPZFRCNFRDOWFXR1pGWVU1d1lVcDZjMkZoYVdoWFptazFiMWhGY21sTU5VZ3ZjSFZGTUc5TVFYTnJWR1I2UzJsRlMzZE1UV1UzYUM5cUNqRjZZekJXTmtGdFVYQkhSRWRyZEZWcVZHRlNOM1ZoWkVkUVlUUjVVazlTUWpKcVQyUkNhME5uV1VFM0wxZHZNa0l5WmpKdVIyUXJTVGg1U2t0MFMwTUtTMFZHVTB0Q1UycFNkSE0yVTBObFJITTNXR2RsTkVsaGVtUklRMjh5YW5CUVNIazRPWEpZUmt0cGRrTnpjSEZTWW1sYWVWUkxkVEIxT1RSTGFVTmxhUXB0UXpnclpubEdlbVpwVWpSblZUSTRZekJzYVhGaldtMUxTMHh0WjJ0QlN5dG5WME5qYldWWVRXbHlRV0V3TVdreU9Dc3hjMnh1UVZCWlprUnRWMG93Q2sxd1JWSnhOa3RpWkVGRmNGQlZWbnBGYkdJNVNuZExRbWRHVDAxbFFWTjNPRWR3VjB4aE1tcG1hSEIwU0ZGUGF6UklkWFZOYjBZMlFtdFROVkJRVUU0S2RpOW9TV3RsVml0alNVaHVSV2xDTm1oMk4yMVBPRXhSWTJaRmVHeHplRFYyWVNzdk1HSTRNMnRVY0VkV2VHUkpUSGRDUVhadGEydzJaVzlsTmxsUmRRb3lhMXBDY2trNFdISm9TVU55UW5aWmFYZDJaM1ZLZDBGTGJqZGFkbXRtVjIxUmJEaHVkWGRHWjNsVVlqaGhNM0o1WjJ0dU1sUmhLMmRPVVRObU1GSlNDbVp6YkVKQmIwZENRVXhJWlRGbGNIbFpjQ3RxWTBZeVQwNXhaMjFyYkhkeFJqSm5aa3BqZVhaRU1FZG5VbGRwTjBkSVFtSm5kMGhQSzNGYVVsSlpXRWNLVm1WRVdHZExUa2d6V25rMVQzVlROakpLS3k5MGMzaDBZVlV3Ykc5SlZtWktSR2czYUhvck9EaGxkMDVNVjNVeVkyWnFWRXRyVVZwRVlURnlWRTFPV1FvelJXNUJXRll3V1RkMmIySktZVkZIWmtnMFoyWTJjekY0VEVwSk5uQnBNall3VWxONlNuSXlSemMwVVhacllsYzVkMHRDQ2kwdExTMHRSVTVFSUZKVFFTQlFVa2xXUVZSRklFdEZXUzB0TFMwdENnPT0K\"\n}\n" + string: "{\n \"kubeconfig\": \"Y2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9hcGkuaGVwdGc2NWsuZWFzdHVzLmFyb2FwcC5pbzo2NDQzCiAgbmFtZTogaGVwdGc2NWsKY29udGV4dHM6Ci0gY29udGV4dDoKICAgIGNsdXN0ZXI6IGhlcHRnNjVrCiAgICB1c2VyOiBzeXN0ZW06YWRtaW4KICBuYW1lOiBzeXN0ZW06YWRtaW4KY3VycmVudC1jb250ZXh0OiBzeXN0ZW06YWRtaW4KcHJlZmVyZW5jZXM6IHt9CnVzZXJzOgotIG5hbWU6IHN5c3RlbTphZG1pbgogIHVzZXI6CiAgICBjbGllbnQtY2VydGlmaWNhdGUtZGF0YTogTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUktWRU5EUVdjeVowRjNTVUpCWjBsSlRraHJZVGx6ZHpFd05sVjNSRkZaU2t0dldrbG9kbU5PUVZGRlRFSlJRWGRPYWtWVFRVSkJSMEV4VlVVS1EzaE5TbUl6UW14aWJrNXZZVmRhTUUxVFFYZElaMWxFVmxGUlJFVjRaR2hhUnpGd1lta3hjbVJYU214Wk1qbDFXbTFzYmt4WVRuQmFNalZzWTJwQlpRcEdkekI1VG1wQk5FMVVUWGhOYWtsNFRrUkNZVVozTUhsT2VrRTBUVlJOZUUxcVRUTk5SRnBoVFVKamVFWlVRVlJDWjA1V1FrRk5WRVJJVGpWak0xSnNDbUpVY0doYVJ6RndZbXBEUTBGVFNYZEVVVmxLUzI5YVNXaDJZMDVCVVVWQ1FsRkJSR2RuUlZCQlJFTkRRVkZ2UTJkblJVSkJUR2hQVlVzNGQxVmFSaXNLVkhKMlZXbHhOWGM1UTNoaWF6SmlUaXQzY2tOMFpYVmhaMjRyYzFodWFVZGFURFIyVld0bWQweFNhQ3RGTlhNcmFWRnJOVEZpVjB4TVprTjNaWGhUVVFwRmNFOW9jVUUzU2xKdVRUUkxWbloxWkVSTlRVUnFkM2xGZHpKdldEUjFaVzk0YzNWQk9XWktXbWhxY2l0U2ExTjRVaTlCTUhKWWNuWktOMDFMZEhkNUNrMVVTV1F6YUdObVptdG9Obk5KYmpVM1UyaERjWEZXU0RSVFFYaHZhblIwY0ZKQkwyeFlSMDFwWkhoMlRrUnNTR3hKT0VwMlNYZFNNRVJCTUUwNE1qSUtPREIxZGpkM2Ewb3plR2xEZFhaNlRuWkJabEZWYVZZMFJ6TjVUbTlNZGtGblRsQm9iRUpPZVZvcmIwRkdUM3B4VGtkQloycFhaa0pTVFRkQ1pFcDNXUXBSUzJwQk5IUjVhM0I1V1d3MVVrSkpVa2RuWnpkUEswcHFNV1JqUlVKTFluVlZWVnBhT0dGR2JVWjFRVGxYV0RSNFN6ZHRXVkZUTjJ4NWVuWnJVR05oQ2pWeE1FeGhNbTFuZDBRNFEwRjNSVUZCWVU1WFRVWlJkMFJuV1VSV1VqQlFRVkZJTDBKQlVVUkJaMWRuVFVKTlIwRXhWV1JLVVZGTlRVRnZSME5EYzBjS1FWRlZSa0ozVFVOTlFYZEhRVEZWWkVWM1JVSXZkMUZEVFVGQmQwaDNXVVJXVWpCcVFrSm5kMFp2UVZWVk1EZElWa294UVZWME5scFJkbU5sS3pZelVncDNaemd6WTNGamQwUlJXVXBMYjFwSmFIWmpUa0ZSUlV4Q1VVRkVaMmRGUWtGSloxTXpNV2R6WjBFMlNqRk5kbEJNVGtablJYWklRM1ZUWkcxQk5qaHpDbVZ6YUZSV2R5dEdMMDlaVDB4SE5YaFBha2xzZW1sVlRtbDRWelZGZG5BclFXaGhjbEJKU0hSdUwxaGpibXgyUzFSRlptdEhiRU1yWlZjNGNEa3pja2NLVlN0cFREQmxhVmhwT0d0M1NVbHJVVVpRVVZWV2EzUnpiemxzYzBac04yaFlNRVJyZWpFNFNqVkJRa0o0WW1ONkx6ZExlVkptWTBzNVlrUktNR3hCT0FwaU5VTTFkR1Z1YlRkU1JsaEJhbk41VVZWS1dGQnZjVkExZFZwSFVrWllVV3BKVXpOa1ZUVXZPVEYwUTNSNmRHWnZRVFJvY1ZwellWQlFTMVJHUldGdUNqRnRWSFpEVkVWdFNsRkVVRU5oVmtOMFlTdHdLMUZJVDFONmNrMTVTVGR5YTFaRVRHMVlUWFZoTDNCclUxQnJXWEZwWlUxNVp6ZHZaSFpLUVdNeFZrSUtRV0ZIU1haaWRISXZiMHRzTmsxYWNsSlVaMnhTZUc0dlNYSTBaMVJzT1d3d1JYQnRjSFI2ZEdobE9XdHVhV04yUnpJcmRrOVpWVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89CiAgICBjbGllbnQta2V5LWRhdGE6IExTMHRMUzFDUlVkSlRpQlNVMEVnVUZKSlZrRlVSU0JMUlZrdExTMHRMUXBOU1VsRmIzZEpRa0ZCUzBOQlVVVkJkVVUxVVhKNlFsSnJXRFZQZFRsVFMzSnVSREJNUm5WVVduTXpOME56U3pFMk5YRkRaalo0WldWSldtdDJhVGxUQ2pORmJrRllWakJaTjNadllrcGhVVWRtU0RSblpqWnpNWGhNU2trMmNHa3lOakJTVTNwS2NqSkhOelJSZG10aVZ6bDNTMElLTFMwdExTMUZUa1FnVWxOQklGQlNTVlpCVkVVZ1MwVlpMUzB0TFMwSwo=\"\n}\n" headers: cache-control: - no-cache diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/recordings/test_aro_public_cluster_with_managed_identities.yaml b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/recordings/test_aro_public_cluster_with_managed_identities.yaml similarity index 100% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/recordings/test_aro_public_cluster_with_managed_identities.yaml rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/recordings/test_aro_public_cluster_with_managed_identities.yaml diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/test_aro_scenario.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/test_aro_scenario.py similarity index 98% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/test_aro_scenario.py rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/test_aro_scenario.py index 4f3ff1f14a6..735a091b2b0 100644 --- a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/integration/test_aro_scenario.py +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/integration/test_aro_scenario.py @@ -10,7 +10,7 @@ from knack.log import get_logger -from azure.cli.command_modules.aro.tests.latest.custom_preparers import AROClusterServicePrincipalPreparer +from azure.cli.command_modules.aro.tests.latest.standard.custom_preparers import AROClusterServicePrincipalPreparer from azure.cli.testsdk import ScenarioTest, ResourceGroupPreparer from azure.cli.testsdk.checkers import StringContainCheck from azure.cli.testsdk.scenario_tests import AllowLargeResponse diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/__init__.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/__init__.py new file mode 100644 index 00000000000..34913fb394d --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/__init__.py @@ -0,0 +1,4 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/test_aro_helpers.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/test_aro_helpers.py similarity index 100% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/test_aro_helpers.py rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/test_aro_helpers.py diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/test_dynamic_validators.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/test_dynamic_validators.py similarity index 100% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/test_dynamic_validators.py rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/test_dynamic_validators.py diff --git a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/test_validators.py b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/test_validators.py similarity index 99% rename from src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/test_validators.py rename to src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/test_validators.py index 97b4db11b5d..2fafadf4901 100644 --- a/src/azure-cli/azure/cli/command_modules/aro/tests/latest/unit/test_validators.py +++ b/src/azure-cli/azure/cli/command_modules/aro/tests/latest/standard/unit/test_validators.py @@ -815,7 +815,7 @@ def test_validate_worker_vm_disk_size_gb(test_description, namespace, expected_e ), ( "should raise RequiredArgumentMissingError Exception because namespace.client_secret is not None", - Mock(client_secret="secret_123"), + Mock(client_secret=Mock()), RequiredArgumentMissingError ), (