Skip to content

Add Environment Validator TSG: AzStackHci_Subscription_State#329

Open
1008covingtonlane wants to merge 4 commits into
Azure:mainfrom
1008covingtonlane:tsg-subscription-state
Open

Add Environment Validator TSG: AzStackHci_Subscription_State#329
1008covingtonlane wants to merge 4 commits into
Azure:mainfrom
1008covingtonlane:tsg-subscription-state

Conversation

@1008covingtonlane

Copy link
Copy Markdown
Collaborator

What

Adds a public Environment Validator remediation TSG for AzStackHci_Subscription_State (ADO 38356879), which confirms the cluster's Azure Stack HCI subscription is Active during Deployment, Update, and Upgrade readiness. No TSG existed for this validator, so front-line support had nothing to point a customer at.

How it was grounded (source + telemetry, not guessed)

  • Product source: the check is Test-AzureStackHCISubscriptionState (ASZ-EnvironmentValidator, AzStackHci.ArcIntegration.Helpers.psm1). It runs Get-AzureStackHCISubscriptionStatus per node, selects the Azure Stack HCI subscription, and reports FAILURE when the cmdlet errors, no subscription is found, or SubscriptionStatus != 'Active'; SUCCESS only when Active.
  • Live telemetry: harvested the real failure Detail signatures from EnvironmentValidatorResult and grouped them into the three sub-modes the guide branches on. Also confirmed the check currently PASSES fleet-wide (~4,069 clusters), so the guide is honest that a genuinely-disabled subscription is the rarer case.

Structure

Standard sibling house style (at-a-glance table, Overview, Requirements, Troubleshooting Steps 1-6, Glossary):

  • Detection: HealthCheckResult JSON, the EventID 17205 event-log query, the portal Updates tab, and the authoritative on-box Get-AzureStackHCISubscriptionStatus.
  • Three failure sub-modes, each with its own owner and fix: subscription not Active (Azure subscription/billing), cannot read the subscription (connectivity/registration, with the firewall-requirements reference), and no subscription found (re-registration).
  • Per-node identification, consequences, per-sub-mode remediation with risk labels, and verification via Invoke-SolutionUpdatePrecheck -SystemHealth.
  • Cross-links the related MSI-access, external-connectivity, and DNS guides. Indexed in the EnvironmentValidator README.

Validation

Graded with the tsg-forge harness: static structure/safety lint Grade A and a 13-persona usability panel at 5/5. This is a cloud/subscription check whose genuinely-disabled failure is not safely injectable on a shared lab (and it only runs on a real Arc-registered cluster), so it is documented and statically graded rather than driven through a live inject loop.

Adds a public remediation guide for the AzStackHci_Subscription_State Environment
Validator check (ADO 38356879), which confirms the cluster's Azure Stack HCI
subscription is Active during Deployment, Update, and Upgrade readiness.

The guide is grounded in the product source (Test-AzureStackHCISubscriptionState,
which runs Get-AzureStackHCISubscriptionStatus per node) and in live failure
signatures observed in fleet telemetry. It branches the three real failure
sub-modes, each with its own owner and fix:

- Subscription not Active ("... is inactive on computer <NODE>"): an Azure
  subscription / billing action.
- Cannot read the subscription ("Unable to connect to service" / "Operation timed
  out" / "not registered" / "not part of a cluster"): a connectivity, registration,
  or pre-deployment condition, with the firewall-requirements reference.
- No Azure Stack HCI subscription found: re-registration.

Includes the standard sections (at-a-glance, Overview, Requirements, Troubleshooting
Steps 1-6, Glossary): detection via the HealthCheckResult JSON, the EventID 17205
event-log query, the portal Updates tab, and the authoritative on-box
Get-AzureStackHCISubscriptionStatus; per-node identification; consequences;
per-sub-mode remediation with risk labels; and verification. Cross-links the related
MSI-access, external-connectivity, and DNS guides. Also indexed in the
EnvironmentValidator README.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings July 11, 2026 19:51

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.

Pull request overview

Adds an Environment Validator troubleshooting guide for AzStackHci_Subscription_State.

Changes:

  • Documents detection, failure modes, remediation, and verification.
  • Adds the guide to the Environment Validator index.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
Troubleshooting-AzStackHci_Subscription_State.md Adds the subscription-state TSG.
README.md Links the new guide.

try {
$sub = Get-AzureStackHCISubscriptionStatus -ErrorAction Stop |
Where-Object SubscriptionName -like 'Azure Stack HCI*'
[pscustomobject]@{ Status = if ($sub) { $sub.Status } else { 'NotFound' }; Error = $null }

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Thanks for the careful read, but .Status is correct here and I am keeping it. Get-AzureStackHCISubscriptionStatus returns AzureStackHCISubscription objects whose properties are Id, Status, and ExpirationTime, plus SubscriptionName used for the filter; the status value is exposed as .Status. The Environment Validator check that emits this result reads the same property: after Where-Object SubscriptionName -like 'Azure Stack HCI*' it evaluates $azureStackHCISubscription.Status (source: AzStackHci.EnvironmentChecker, AzStackHci.ArcIntegration.Helpers.psm1, Test-AzureStackHCISubscriptionState).

SubscriptionStatus is the name of the enum type (and of an internal registration-state field), not the cmdlet's output property. Projecting .SubscriptionStatus would return an empty column, which would be the real defect. Since this validator passes on thousands of clusters in the field today, .Status is confirmed as the live property. No change.


```powershell
Invoke-Command -ComputerName (Get-ClusterNode).Name -ScriptBlock {
(Get-AzureStackHCISubscriptionStatus | Where-Object SubscriptionName -like 'Azure Stack HCI*').Status

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Thanks for the careful read, but .Status is correct here and I am keeping it. Get-AzureStackHCISubscriptionStatus returns AzureStackHCISubscription objects whose properties are Id, Status, and ExpirationTime, plus SubscriptionName used for the filter; the status value is exposed as .Status. The Environment Validator check that emits this result reads the same property: after Where-Object SubscriptionName -like 'Azure Stack HCI*' it evaluates $azureStackHCISubscription.Status (source: AzStackHci.EnvironmentChecker, AzStackHci.ArcIntegration.Helpers.psm1, Test-AzureStackHCISubscriptionState).

SubscriptionStatus is the name of the enum type (and of an internal registration-state field), not the cmdlet's output property. Projecting .SubscriptionStatus would return an empty column, which would be the real defect. Since this validator passes on thousands of clusters in the field today, .Status is confirmed as the live property. No change.

**Sub-mode: not registered** (`Azure Stack HCI is not registered with Azure`, or no subscription found).

1. Confirm the cluster's Azure registration. A cluster that lost its registration must be re-registered with Azure before this check can pass.
2. Follow the current Azure Local registration guidance at [https://aka.ms/UpgradeRequirements](https://aka.ms/UpgradeRequirements) and the Azure Local registration documentation to re-register the cluster to the correct subscription and resource group.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Good call. Fixed in 571c98a: the not-registered remediation now links Register-AzStackHCI (Az.StackHCI), which documents both registration and the -RepairRegistration repair path, and it names the repair command inline. I kept the aka.ms/UpgradeRequirements pointer as the general Azure Local requirements reference alongside it.

Comment on lines +103 to +104
Get-AzureStackHCISubscriptionStatus | Where-Object SubscriptionName -like 'Azure Stack HCI*' |
Select-Object SubscriptionName, Status

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Thanks for the careful read, but .Status is correct here and I am keeping it. Get-AzureStackHCISubscriptionStatus returns AzureStackHCISubscription objects whose properties are Id, Status, and ExpirationTime, plus SubscriptionName used for the filter; the status value is exposed as .Status. The Environment Validator check that emits this result reads the same property: after Where-Object SubscriptionName -like 'Azure Stack HCI*' it evaluates $azureStackHCISubscription.Status (source: AzStackHci.EnvironmentChecker, AzStackHci.ArcIntegration.Helpers.psm1, Test-AzureStackHCISubscriptionState).

SubscriptionStatus is the name of the enum type (and of an internal registration-state field), not the cmdlet's output property. Projecting .SubscriptionStatus would return an empty column, which would be the real defect. Since this validator passes on thousands of clusters in the field today, .Status is confirmed as the live property. No change.

…) for the not-registered fix

Addresses a PR-review comment: the re-registration step linked the general
UpgradeRequirements overview rather than actionable registration guidance. Now
links Register-AzStackHCI (Az.StackHCI), which documents both registration and the
-RepairRegistration repair path, and names the repair command inline.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1008covingtonlane and others added 2 commits July 12, 2026 14:26
Add a 'Where this does NOT appear' note that marks the four cluster-tooling
surfaces (cluster logs, Failover Cluster Manager, Windows Admin Center standalone,
Windows Admin Center in the Azure portal) as not-evident for this check, since a
subscription-state result is an Azure registration/billing signal, not a Windows
failover-cluster state. This tells the admin where NOT to look and completes the
multi-surface discoverability coverage (node PowerShell, Azure portal, and event
log 17205 were already shown).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 1d7f2348-e3be-4fe4-8598-6bf5dcb4050f
…ckHci log/report

Add a note (and a read snippet) in the 'where it appears' step pointing to the
Environment Checker's own on-disk log/report on the node that ran the check:
%USERPROFILE%\.AzStackHci\AzStackHciEnvironmentChecker.log and
AzStackHciEnvironmentReport.json/.xml. This is a distinct discoverability surface
from the Windows event channel (17205) and the cluster HealthCheckResult share,
and it carries the same AzStackHci_Subscription_State FAILURE result + Detail.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 1d7f2348-e3be-4fe4-8598-6bf5dcb4050f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants