Skip to content

Add Az.RedHatOpenShiftHcp (Azure Red Hat OpenShift Hosted Control Planes) module - #30326

Open
Nikhil Thomas (nikhil-thomas) wants to merge 26 commits into
Azure:mainfrom
nikhil-thomas:Az.RedHatOpenShiftHcp-generation
Open

Nikhil Thomas (nikhil-thomas) wants to merge 26 commits into
Azure:mainfrom
nikhil-thomas:Az.RedHatOpenShiftHcp-generation

Conversation

@nikhil-thomas

@nikhil-thomas Nikhil Thomas (nikhil-thomas) commented Oct 22, 2026 •

Copy link
Copy Markdown

🤖 PR Validation — ⚠️ Review suggested

Tests
⚠️ 20/20
️✔️Az.Accounts
️✔️Build
️✔️PowerShell Core - Windows
️✔️Windows PowerShell - Windows
⚠️Az.RedHatOpenShiftHcp
️✔️Build
️✔️PowerShell Core - Windows
️✔️Windows PowerShell - Windows
️✔️Breaking Change Check
️✔️PowerShell Core - Windows
️✔️Windows PowerShell - Windows
⚠️Signature Check
⚠️PowerShell Core - Windows
Type Cmdlet Description Remediation
⚠️ Get-AzRedHatOpenShiftHcpCluster Get-AzRedHatOpenShiftHcpCluster Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpCluster Get-AzRedHatOpenShiftHcpCluster changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
⚠️ Get-AzRedHatOpenShiftHcpExternalAuth Get-AzRedHatOpenShiftHcpExternalAuth Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpExternalAuth Get-AzRedHatOpenShiftHcpExternalAuth changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
⚠️ Get-AzRedHatOpenShiftHcpNodePool Get-AzRedHatOpenShiftHcpNodePool Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpNodePool Get-AzRedHatOpenShiftHcpNodePool changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
⚠️ Get-AzRedHatOpenShiftHcpVersion Get-AzRedHatOpenShiftHcpVersion Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpVersion Get-AzRedHatOpenShiftHcpVersion changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
⚠️Windows PowerShell - Windows
Type Cmdlet Description Remediation
⚠️ Get-AzRedHatOpenShiftHcpCluster Get-AzRedHatOpenShiftHcpCluster Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpCluster Get-AzRedHatOpenShiftHcpCluster changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
⚠️ Get-AzRedHatOpenShiftHcpExternalAuth Get-AzRedHatOpenShiftHcpExternalAuth Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpExternalAuth Get-AzRedHatOpenShiftHcpExternalAuth changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
⚠️ Get-AzRedHatOpenShiftHcpNodePool Get-AzRedHatOpenShiftHcpNodePool Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpNodePool Get-AzRedHatOpenShiftHcpNodePool changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
⚠️ Get-AzRedHatOpenShiftHcpVersion Get-AzRedHatOpenShiftHcpVersion Changes the ConfirmImpact but does not set the SupportsShouldProcess property to true in the cmdlet attribute. Determine if the cmdlet should implement ShouldProcess and if so determine if it should implement Force / ShouldContinue
⚠️ Get-AzRedHatOpenShiftHcpVersion Get-AzRedHatOpenShiftHcpVersion changes the confirm impact. Please ensure that the change in ConfirmImpact is justified Verify that ConfirmImpact is changed appropriately by the cmdlet. It is very rare for a cmdlet to change the ConfirmImpact.
️✔️Help Example Check
️✔️PowerShell Core - Windows
️✔️Windows PowerShell - Windows
️✔️Help File Existence Check
️✔️PowerShell Core - Windows
️✔️Windows PowerShell - Windows
⚠️File Change Check
⚠️PowerShell Core - Windows
Type Cmdlet Description Remediation
⚠️ AssemblyInfo.cs will be updated automatically. Please do not update it manually. Revert AssemblyInfo.cs to its last version.
⚠️Windows PowerShell - Windows
Type Cmdlet Description Remediation
⚠️ AssemblyInfo.cs will be updated automatically. Please do not update it manually. Revert AssemblyInfo.cs to its last version.
️✔️UX Metadata Check
️✔️PowerShell Core - Windows
️✔️Windows PowerShell - Windows
️✔️Test
️✔️PowerShell Core - Linux
️✔️PowerShell Core - MacOS
️✔️PowerShell Core - Windows
️✔️Windows PowerShell - Windows

Description

This PR introduces Az.RedHatOpenShiftHcp, a new generated Azure PowerShell module for Azure Red Hat OpenShift Hosted Control Planes (ARO-HCP). The module was generated with AutoRest from the stable 2026-10-01 API (azure-rest-api-specs PR #47069, merge 322d99de).

The module ships 15 cmdlets spanning the ARO-HCP surface:

  • Version — Get-AzRedHatOpenShiftHcpVersion
  • Cluster — New-/Get-/Update-/Remove-AzRedHatOpenShiftHcpCluster
  • Node pool — New-/Get-/Update-/Remove-AzRedHatOpenShiftHcpNodePool
  • External auth — New-/Get-/Update-/Remove-AzRedHatOpenShiftHcpExternalAuth
  • Credentials — New-AzRedHatOpenShiftHcpClusterAdminCredential, Remove-AzRedHatOpenShiftHcpClusterAdminCredential (revoke)

Customizations

Six customizations layer usability and correctness on top of the generated surface:

  • One-shot admin credential: New-...ClusterAdminCredential performs the full CSR + kubeconfig exchange in a single call, returning a ready-to-use kubeconfig.
  • New-Cluster identity/KMS auto-wiring: New-...Cluster auto-wires the managed/user-assigned identity and KMS encryption settings so callers don't hand-assemble the identity payload.
  • Update-Cluster identity GET-merge: Update-...Cluster performs a GET-merge of the existing identity block before PATCH, preventing accidental clobbering of identities on update.
  • Get-Version views: Get-...Version exposes distinct control-plane and node-pool version views.
  • Default table views: Formatting (.format.ps1xml) gives each resource type a readable default table view.
  • revokeCredentials 204 directive: a swagger directive injects a 204 response on revokeCredentials to work around a spec gap (see below).

Spec gap (C6)

The revokeCredentials operation in the 2026-10-01 spec does not declare its 204 No Content response, which breaks generated deserialization. The workaround is self-contained and can be removed once the spec is corrected.

Testing & quality

  • 36 recorded playback tests, 0 skipped, covering the full lifecycle of cluster, node pool, external auth, version reads, and admin-credential create/revoke.
  • ChangeLog.md updated under ## Upcoming Release.
  • Markdown help regenerated for all 15 cmdlets.

Design review

Cmdlet design review is waived for generated/AutoRest modules (confirmed with the PowerShell module PM); the gate to merge for this module is technical readiness only.

Note: Repository https://github.com/Azure/azure-powershell-cmdlet-review-pr was in archived state in the first week of October 2026.

Mandatory Checklist

  • SHOULD update ChangeLog.md file(s) appropriately
    • Update src/{{SERVICE}}/{{SERVICE}}/ChangeLog.md.
      • A snippet outlining the change(s) made in the PR should be written under the ## Upcoming Release header in the past tense.
    • Should not change ChangeLog.md if no new release is required, such as fixing test case only.
  • SHOULD regenerate markdown help files if there is cmdlet API change. Instruction
  • SHOULD have proper test coverage for changes in pull request.
  • SHOULD NOT adjust version of module manually in pull request

…Hcp module

- Add the AutoRest literate README.md for the new ARO-HCP module
- Pin the azure-rest-api-specs swagger via commit + input-file (stable 2026-10-01)
- Set module metadata (module-version 0.1.0, title/service-name RedHatOpenShiftHcp)
- Set subject-prefix to '' and document the rationale inline
  - this RP's subjects already contain Hcp/OpenShift tokens, so the inherited $(service-name) prefix
  would produce doubled nouns (e.g. Get-AzRedHatOpenShiftHcpHcpOpenShiftCluster)
  - Nouns will be branded explicitly via subject-rename directives in a follow-up.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…16 cmdlets)

- Add the generated Az.RedHatOpenShiftHcp module for the Microsoft.RedHatOpenShift
  hcpOpenShiftClusters (ARO-HCP) RP, from azure-rest-api-specs stable API 2026-10-01
  (pinned commit dfe87dc0).
- Surface (16 cmdlets): Get/New/Update/Remove for Cluster, NodePool, ExternalAuth;
  Get for Version and OperatorIdentityRoleSet; Request/Revoke cluster credentials.
- Generation directives (authored in README.md):
  - subject-prefix: '' with explicit subject renames to brand nouns as
    RedHatOpenShiftHcp* (avoids the Hcp/OpenShift token doubling).
  - Remove Set-* cmdlets (autogen convention: New-*/Update-* instead).
  - Remove the generic CreateViaIdentity variants on New-*.
  - Rename the ExternalAuth -Client parameter to -ClientProfile (resolves a
    CS0102 collision with the generated SDK client accessor).
  - Keep the whole-body-object (-Parameter) Create/Update variants.
- Remove the OperatorIdentityRoleSet cmdlet via a `remove` directive (product decision); surface now 15 cmdlets.
- Tests and examples are generated stubs, to be implemented and recorded in a
  follow-up.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Regenerate Az.RedHatOpenShiftHcp against the preview spec
  (hcpopenshiftclusters/preview/2026-09-01-preview) instead of
  stable/2026-10-01, so cmdlets send api-version=2026-09-01-preview —
  the version actually merged and deployed to the dev/preview RP.

- README: pin input-file to the preview openapi and bump the spec commit
- UX manifests: apiVersion 2026-10-01 -> 2026-09-01-preview
- regenerate cmdlet docs/help; drop params absent from the preview API
    (e.g. ContainerRegistryManagedIdentity, KmKeyVaultType)
- refresh generate-info.json, Az.RedHatOpenShiftHcp.psd1, and the solution

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…t- cmdlet

- Replace the generated Request-AzRedHatOpenShiftHcpClusterAdminCredential with a custom
  cmdlet that performs the whole admin-credential flow in one call
  - generate an RSA-4096 key + CSR locally
  - send only the CSR
  - splice the signed key into the returned kubeconfig
  - merge it into the user's kubeconfig AKS-style.
- README: hide directive routes the generated cmdlet to internal/ so the custom one
    replaces it (matched on the pre-rename subject, before the brand renames)
- Directory.Build.props: YamlDotNet.Signed 5.2.1 scoped to the Autorest project so the
    reference survives autorest regeneration (which rewrites the csproj)
- regenerated docs/help/psd1 for the cmdlet

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
….Version

- Replace the generated Get-AzRedHatOpenShiftHcpVersion with a custom wrapper that curates
  the version list
  - filter to `enabled` versions and sort ascending by semver
  - `-ControlPlane` returning distinct MAJOR.MINOR (for a cluster's -VersionId)
  - `-NodePool` returning full X.Y.Z (for a node pool's -VersionId)
  - The two switches are mutually exclusive.

- For CLI parity the default list output is also enabled-only + sorted (disabled versions
  hidden; default == -NodePool); a single lookup by -Name is returned as-is. The enabled
  filter uses `-ne $false` so a missing 'enabled' is treated as enabled (matches the CLI's
  get('enabled', True)).

- README: hide directive routes the generated cmdlet to internal/ so the custom one
    replaces it (pre-rename subject, alongside the C1 hide)
- custom/Get-AzRedHatOpenShiftHcpVersion.ps1: wrapper over
    Az.RedHatOpenShiftHcp.internal\Get-AzRedHatOpenShiftHcpVersion

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…ersion/external-auth

- Add format-table directives so Get-* cmdlets show useful columns by default instead of the
  generated empty SystemData* columns

  - Cluster:      Name, Location, Resource Group, Version, ProvisioningState, API Server
  - Node pool:    Name, Version, VM Size, Replica, ProvisioningState
  - Version:      Name, Channel, Enabled, End Of Life
  - External auth: Name, Issuer, ProvisioningState

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…luster

- Replace the generated New-AzRedHatOpenShiftHcpCluster with a custom wrapper that assembles
  the derivable parts of the create body, so callers pass only the operator-identity maps + KMS vault/key:
  - derives -UserAssignedIdentity = control-plane `operators ∪ service MI` (hidden)
  - hardcodes etcd -CustomerManagedEncryptionType = KMS (hidden)
  - resolves bare UAMI names to full resource IDs via the subscription/RG parsed from
  - keeps the operator hashtable params and -KmVaultName/-ActiveKeyName/-ActiveKeyVersion/

  - README: hide directive routes the generated cmdlet to internal/ (anchored ^HcpOpenShiftCluster$ + verb New)
  - custom/New-AzRedHatOpenShiftHcpCluster.ps1: the wrapper (CreateExpanded surface minus the two auto-filled params)

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…uster

- Replace the generated Update-AzRedHatOpenShiftHcpCluster with a custom wrapper that lets you
  rotate/set operator identities without rebuilding the identity map
  - When any identity param is bound it does GET -> merge -> forward:
  - fetches the current cluster (via Az.RedHatOpenShiftHcp.internal\Get-...; reads operator maps +
    subnet from .ToJsonString())
  - merges the supplied -UserAssignedIdentity*Operator maps over the current ones, so rotating a
    single operator preserves the rest
- resolves bare identity names to resource IDs via the cluster's subnet (shared IdentityResolver)
- recomputes -UserAssignedIdentity = control-plane operators + service MI (data-plane excluded,
    consistent with create
- If no identity param is supplied (e.g. a -Tag-only patch) the request is forwarded unchanged (no
  GET). -UserAssignedIdentity is not exposed

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Prepare the Pester harness for incremental, per-cmdlet test coverage.
  - Add test/env.json with the coordinates the recorded tests will read
    (Location/ResourceGroupName/ClusterName/NodePoolName/ExternalAuthName).
    Subscription and tenant IDs are masked (all-zero GUIDs) so no real
    identifiers are committed; record passes will sanitize recordings to
    match these placeholders.
  - Delete the Get-AzRedHatOpenShiftHcpOperatorIdentityRoleSet test stub:
    that cmdlet was removed from the module via the README `subject:
    HcpOperatorIdentityRoleSet / remove: true` directive, so the stub
    tested a cmdlet that no longer exists.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
… (C4)

- Replace the generated -skip stub with real coverage of the custom Get-AzRedHatOpenShiftHcpVersion wrapper:

  - default list is enabled-only and semver-sorted (CLI parity)
  - `-ControlPlane` returns distinct MAJOR.MINOR
  - `-NodePool` returns full X.Y.Z
  - `-ControlPlane/-NodePool` are mutually exclusive
  - single `-Name` lookup is returned as-is

- Add the recorded ARM responses, sanitized to masked subscription/tenant
  GUIDs so playback matches env.json (via Get-SubscriptionIdTestSafe) and
  no real identifiers are committed.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Add offline Pester unit tests for the custom C# helpers (no Azure, no
  recording), calling the compiled static methods directly:
  - IdentityResolver.Resolve: full resource ID passthrough, bare-name
    expansion from the subnet's subscription/RG, idempotency, empty-input
    passthrough, and both error paths (no subnet, unparseable subnet).
  - KubeConfigHelper: PrepareKubeconfig embeds the key as client-key-data
    and renames cluster/user/context + current-context; MergeKubeConfig
    preserves existing entries and lets additions win on name collision.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Replace the generated -skip stubs for Get-AzRedHatOpenShiftHcpCluster, -NodePool, and -ExternalAuth with List + Get coverage asserting
  Name/Location/ProvisioningState against the live cluster.
- Add the recorded ARM responses, sanitized to masked subscription/tenant GUIDs.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Record a full node-pool lifecycle against the live cluster on a fixed
  throwaway pool (nptest-ps, 1 replica): CreateExpanded (version, VM size,
  subnet, AutoRepair), UpdateExpanded (NodeDrainTimeoutMinute PATCH), and
  Delete.

- The create's subnet id is built from the runtime subscription so
  no real subscription is committed; recordings are sanitized to masked
  subscription/tenant GUIDs.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…move)

- Record the external-auth lifecycle on a throwaway resource: CreateExpanded
  with a Confidential console client (provisions to AwaitingSecret), a
  negative test asserting the one-external-auth-per-cluster RP rule,
  UpdateExpanded (UsernameClaim PATCH), and Delete.
- Issuer is built from the
  runtime tenant and the audience is synthetic, so no real tenant/app id is
  committed; recordings are sanitized to masked subscription/tenant GUIDs.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…y merge (C3)

- Update-AzRedHatOpenShiftHcpCluster GET-merges operator identities with the
  current cluster before updating. Two defects in that nested read:

  1. It invoked `Az.RedHatOpenShiftHcp.internal\Get-AzRedHatOpenShiftHcpCluster`,
     but Get-Cluster is not hidden, it lives in exports/, not the internal
     module — so the call threw CommandNotFoundException whenever an operator
     identity parameter was supplied. Call the exported cmdlet by plain name.

  2. The nested child-cmdlet call did not inherit HTTP pipeline steps, so
     caller-injected steps (and the record/playback test mock attached via
     -HttpPipelinePrepend) were dropped and the Get made an unintended direct
     call. Forward -HttpPipelinePrepend/-HttpPipelineAppend into the nested Get.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Record the cluster lifecycle on a throwaway cluster (cltest-ps, fixed
  literal name for deterministic URI matching):

  - New CreateExpanded: full create with the operator-identity maps,
    KMS vault/key, and network config
  - Update UpdateExpanded: asserts the operator identity maps to
    exercise the GET-merge path, plus a tag change.
  - Remove Delete: deletes the throwaway cluster.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
-  revokeCredentials is a long-running POST whose terminal response is HTTP
  204, but the 2026-09-01-preview spec declares only 202 + default, so the
  generated cmdlet dispatched the successful 204 to onDefault and threw
  "The server responded with an unrecognized response, Status: NoContent".
  Add a swagger-document directive injecting a 204 response (the DELETE
  operations already declare 202 + 204 + default and work), so AutoRest
  emits an onNoContent success handler. generated/ is reproduced from this
  directive at build time.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Replace the generated -skip stubs with real coverage:

  - Request-AzRedHatOpenShiftHcpClusterAdminCredential: generates the
    key+CSR, calls the hidden cmdlet, decodes the SecureString kubeconfig,
    and writes it to -OutFile; asserts the file exists, contains a
    current-context, and is written 0600.
  - Revoke-AzRedHatOpenShiftHcpClusterCredentials: asserts the revoke
    returns cleanly on its 204 terminal (no "unrecognized response").

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Add examples illustrative commands: generic resource names, valid parameter values,
  masked GUIDs, output blocks dropped for Remove-/Revoke
- Regenerate the Autorest
  docs/ and the wrapper help/ markdown so the embedded EXAMPLES, SYNOPSIS,
  and PARAMETERS stay in sync with the module.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
- Switch the module from the preview 2026-09-01-preview API to the stable
  GA 2026-10-01 spec (azure-rest-api-specs PR #47069, merge commit
  322d99de): README commit/input-file pin, regenerate, and reconcile.
- The surface is unchanged (15 cmdlets); all customizations still
  apply. Additive-only schema deltas (keyVaultType,
  containerRegistry, api.authorizedCidrs, typed *ResourceStatus).

- Reconcile recordings to api-version=2026-10-01 (shapes unchanged, no
  re-record) and genericize test fixtures.
- Regenerate docs/help against stable.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
…ceptions

- Add the first-release note to ChangeLog.md under Upcoming Release

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
Copilot AI balanced review requested due to automatic review settings October 22, 2026 01:19
@azure-pipelines

Copy link
Copy Markdown
Contributor
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@microsoft-github-policy-service

Copy link
Copy Markdown
Contributor

Thank you for your contribution Nikhil Thomas (@nikhil-thomas)! We will review the pull request and get back to you soon.

@nikhil-thomas Nikhil Thomas (nikhil-thomas) changed the title feat(RedHatOpenShiftHcp): add Az.RedHatOpenShiftHcp module (ARO-HCP, stable 2026-10-01) Add Az.RedHatOpenShiftHcp (Azure Red Hat OpenShift Hosted Control Planes) module Oct 22, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

One or more issues must be addressed before approval.

7 open issues
What changed in this PR

Introduces the preview Az.RedHatOpenShiftHcp module for managing Azure Red Hat OpenShift Hosted Control Planes using the stable 2026-10-01 API.

Changes:

  • Adds module packaging, command mappings, and static-analysis exceptions.
  • Adds version discovery and shared identity-resolution and kubeconfig helpers.
  • Adds reference documentation, examples, and playback/live test scenarios.
File Description
tools/​StaticAnalysis/​Exceptions/​Az.RedHatOpenShiftHcp/​SignatureIssues.csv Updated as part of this pull request.
tools/​CreateMappings_rules.json Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.csproj Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​Properties/​AssemblyInfo.cs Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Revoke-AzRedHatOpenShiftHcpClusterCredentials.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Remove-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Remove-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Remove-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Get-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Get-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Get-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​help/​Az.RedHatOpenShiftHcp.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​ChangeLog.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp/​Az.RedHatOpenShiftHcp.psd1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​UX/​Microsoft.RedHatOpenShift/​hcpOpenShiftClusters.json Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​UX/​Microsoft.RedHatOpenShift/​hcpOpenShiftClusters-nodePools.json Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​UX/​Microsoft.RedHatOpenShift/​hcpOpenShiftClusters-externalAuths.json Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​utils/​Unprotect-SecureString.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​utils/​Get-SubscriptionIdTestSafe.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​utils.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Update-AzRedHatOpenShiftHcpNodePool.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Update-AzRedHatOpenShiftHcpExternalAuth.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Update-AzRedHatOpenShiftHcpCluster.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Revoke-AzRedHatOpenShiftHcpClusterCredentials.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Request-AzRedHatOpenShiftHcpClusterAdminCredential.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Remove-AzRedHatOpenShiftHcpNodePool.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Remove-AzRedHatOpenShiftHcpExternalAuth.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Remove-AzRedHatOpenShiftHcpCluster.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​README.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​New-AzRedHatOpenShiftHcpNodePool.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​New-AzRedHatOpenShiftHcpExternalAuth.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​New-AzRedHatOpenShiftHcpCluster.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​loadEnv.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​KubeConfigHelper.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​IdentityResolver.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Get-AzRedHatOpenShiftHcpVersion.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Get-AzRedHatOpenShiftHcpNodePool.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Get-AzRedHatOpenShiftHcpExternalAuth.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​Get-AzRedHatOpenShiftHcpCluster.Tests.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​test/​env.json Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​resources/​README.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​Properties/​AssemblyInfo.cs Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​how-to.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​generate-info.json Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Update-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Update-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Update-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Revoke-AzRedHatOpenShiftHcpClusterCredentials.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Request-AzRedHatOpenShiftHcpClusterAdminCredential.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Remove-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Remove-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Remove-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​New-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​New-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​New-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Get-AzRedHatOpenShiftHcpVersion.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Get-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Get-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​examples/​Get-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Revoke-AzRedHatOpenShiftHcpClusterCredentials.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Remove-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Remove-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Remove-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​README.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Get-AzRedHatOpenShiftHcpVersion.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Get-AzRedHatOpenShiftHcpNodePool.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Get-AzRedHatOpenShiftHcpExternalAuth.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Get-AzRedHatOpenShiftHcpCluster.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​docs/​Az.RedHatOpenShiftHcp.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​custom/​README.md Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​custom/​KubeConfigHelper.cs Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​custom/​IdentityResolver.cs Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​custom/​Get-AzRedHatOpenShiftHcpVersion.ps1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​custom/​Az.RedHatOpenShiftHcp.custom.psm1 Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​.gitignore Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​RedHatOpenShiftHcp.Autorest/​.gitattributes Updated as part of this pull request.
src/​RedHatOpenShiftHcp/​Directory.Build.props Updated as part of this pull request.

Review effort: Balanced

Comment thread src/RedHatOpenShiftHcp/Directory.Build.props Outdated
Comment thread src/RedHatOpenShiftHcp/RedHatOpenShiftHcp.Autorest/test/utils.ps1
@a0x1ab

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
Contributor
Azure Pipelines:
Successfully started running 3 pipeline(s).

@a0x1ab

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
Contributor
Azure Pipelines:
Successfully started running 3 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

- Credential cmdlet PowerShell 5.1 compatibility
  - Request-...ClusterAdminCredential used PS 7+/.NET Core-only APIs while the manifest
    declares CompatiblePSEditions 'Desktop' + PowerShellVersion 5.1. Replace
    ConvertFrom-SecureString -AsPlainText with [Net.NetworkCredential], and branch
    RSA private-key export

- Recorded-test fixture lifecycle
  - setupEnv now merges+preserves the committed env.json fixture instead of overwriting it
    with only SubscriptionId/Tenant during record
  - Order each resource's lifecycle so the delete runs after the update: the real Remove
    tests become ZRemove-* (Az.StorageMover ZUnregister convention) so they sort last; the
    Remove-* skip stubs are regenerated by the build.
  - Move the external-auth create/update/delete lifecycle off the persistent read-fixture
    cluster (which owns the single allowed 'entra' auth) onto the throwaway cltest-ps, so it
    no longer mutates the read fixture or collides with the one-auth-per-cluster rule
- Get-Version output contract
  - Get-...Version declared only IHcpOpenShiftVersion but -ControlPlane emits a summarized
    PSCustomObject (Name=MAJOR.MINOR, ChannelGroup). Declare both output types and document
    the per-view shapes; the projection stays a PSCustomObject because a MAJOR.MINOR value
    is not a real version resource.

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>
Copilot AI balanced review requested due to automatic review settings October 22, 2026 05:46

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The changes require final human review because they are too complex or risky for automated approval.

No open issues 🎉

2 resolved since last review

Review effort: Balanced

@NoriZC

NoriZC commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

Copy link
Copy Markdown
Contributor
Azure Pipelines:
Successfully started running 3 pipeline(s).

@NoriZC NoriZC self-assigned this Oct 22, 2026
Copilot AI balanced review requested due to automatic review settings October 23, 2026 04:18
@a0x1ab

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
Contributor
Azure Pipelines:
Successfully started running 3 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The missing exact Upcoming Release heading causes release versioning to throw before the module-name filter is applied.

1 open issue

Review effort: Balanced

* Overview of change #1
- Additional information about change #1
-->
## Version 0.1.0
Reformatted SignatureIssues.csv to ensure proper structure and consistency.
Copilot AI balanced review requested due to automatic review settings October 23, 2026 04:32
@NoriZC

NoriZC commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

Copy link
Copy Markdown
Contributor
Azure Pipelines:
Successfully started running 3 pipeline(s).

@a0x1ab

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
Contributor
Azure Pipelines:
Successfully started running 3 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

One or more issues must be addressed before approval.

1 open issue

Review effort: Balanced

Copilot AI balanced review requested due to automatic review settings October 23, 2026 04:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

One or more issues must be addressed before approval.

1 open issue

Review effort: Balanced

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants