Add Environment Validator TSG: AzStackHci_Subscription_State#329
Add Environment Validator TSG: AzStackHci_Subscription_State#3291008covingtonlane wants to merge 4 commits into
Conversation
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>
There was a problem hiding this comment.
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 } |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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.
| Get-AzureStackHCISubscriptionStatus | Where-Object SubscriptionName -like 'Azure Stack HCI*' | | ||
| Select-Object SubscriptionName, Status |
There was a problem hiding this comment.
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>
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
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)
Test-AzureStackHCISubscriptionState(ASZ-EnvironmentValidator,AzStackHci.ArcIntegration.Helpers.psm1). It runsGet-AzureStackHCISubscriptionStatusper node, selects theAzure Stack HCIsubscription, and reports FAILURE when the cmdlet errors, no subscription is found, orSubscriptionStatus != 'Active'; SUCCESS only whenActive.Detailsignatures fromEnvironmentValidatorResultand 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):
Get-AzureStackHCISubscriptionStatus.Invoke-SolutionUpdatePrecheck -SystemHealth.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.