Skip to content

Commit f69c4d5

Browse files
authored
Merge pull request #68 from NeilBird/users/nebird/development
v0.7.99: AvailableUpdates rename, 3-bucket Readiness Summary (+UpToDate), Step.7 CRITICAL 7->3, artifact zip step.X- prefix
2 parents 5723a06 + f03d34e commit f69c4d5

32 files changed

Lines changed: 530 additions & 207 deletions

AzLocal.UpdateManagement/Automation-Pipeline-Examples/README.md

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,20 @@ The pipelines are **fully opt-in additive layers** over the module. The PowerShe
7676

7777
The ten YAMLs ship with a `Step.N_` filename prefix **and** a matching `Step.N - <description>` value in each workflow's `name:` field (GitHub Actions) / header title (Azure DevOps):
7878

79-
Each row's name links to the matching `Step N -` section in [`docs/appendix-pipelines.md`](docs/appendix-pipelines.md), which documents what every pipeline does, the cmdlets it calls, its inputs / outputs / dependencies, the RBAC and exit conditions, and the emitted artefacts.
80-
81-
| Step | File / Workflow name |
82-
|---:|---|
83-
| 0 | [Step.0 - Authentication Validation and Subscription Scope Report](docs/appendix-pipelines.md#step-0---authentication-validation-and-subscription-scope-report) |
84-
| 1 | [Step.1 - Inventory Azure Local Clusters](docs/appendix-pipelines.md#step-1---inventory-clusters) |
85-
| 2 | [Step.2 - Manage UpdateRing Tags](docs/appendix-pipelines.md#step-2---manage-updatering-tags) |
86-
| 3 | [Step.3 - Apply-Updates Schedule Coverage Audit](docs/appendix-pipelines.md#step-3---apply-updates-schedule-coverage-audit) |
87-
| 4 | [Step.4 - Fleet Connectivity Status](docs/appendix-pipelines.md#step-4---fleet-connectivity-status) |
88-
| 5 | [Step.5 - Assess Update Readiness](docs/appendix-pipelines.md#step-5---assess-update-readiness) |
89-
| 6 | [Step.6 - Apply Updates](docs/appendix-pipelines.md#step-6---apply-updates) |
90-
| 7 | [Step.7 - Monitor In-Flight Updates](docs/appendix-pipelines.md#step-7---monitor-in-flight-updates) |
91-
| 8 | [Step.8 - Fleet Update Status](docs/appendix-pipelines.md#step-8---fleet-update-status) |
92-
| 9 | [Step.9 - Fleet Health Status](docs/appendix-pipelines.md#step-9---fleet-health-status) |
79+
Each row's name links to the matching `Step N -` section in [`docs/appendix-pipelines.md`](docs/appendix-pipelines.md), which documents what every pipeline does, the cmdlets it calls, its inputs / outputs / dependencies, the RBAC and exit conditions, and the emitted artefacts. The **GH Actions** and **Azure DevOps** columns link directly to the source YAML for each platform.
80+
81+
| Step | File / Workflow name | GH Actions | Azure DevOps |
82+
|---:|---|---|---|
83+
| 0 | [Step.0 - Authentication Validation and Subscription Scope Report](docs/appendix-pipelines.md#step-0---authentication-validation-and-subscription-scope-report) | [`Step.0_authentication-test.yml`](github-actions/Step.0_authentication-test.yml) | [`Step.0_authentication-test.yml`](azure-devops/Step.0_authentication-test.yml) |
84+
| 1 | [Step.1 - Inventory Azure Local Clusters](docs/appendix-pipelines.md#step-1---inventory-clusters) | [`Step.1_inventory-clusters.yml`](github-actions/Step.1_inventory-clusters.yml) | [`Step.1_inventory-clusters.yml`](azure-devops/Step.1_inventory-clusters.yml) |
85+
| 2 | [Step.2 - Manage UpdateRing Tags](docs/appendix-pipelines.md#step-2---manage-updatering-tags) | [`Step.2_manage-updatering-tags.yml`](github-actions/Step.2_manage-updatering-tags.yml) | [`Step.2_manage-updatering-tags.yml`](azure-devops/Step.2_manage-updatering-tags.yml) |
86+
| 3 | [Step.3 - Apply-Updates Schedule Coverage Audit](docs/appendix-pipelines.md#step-3---apply-updates-schedule-coverage-audit) | [`Step.3_apply-updates-schedule-audit.yml`](github-actions/Step.3_apply-updates-schedule-audit.yml) | [`Step.3_apply-updates-schedule-audit.yml`](azure-devops/Step.3_apply-updates-schedule-audit.yml) |
87+
| 4 | [Step.4 - Fleet Connectivity Status](docs/appendix-pipelines.md#step-4---fleet-connectivity-status) | [`Step.4_fleet-connectivity-status.yml`](github-actions/Step.4_fleet-connectivity-status.yml) | [`Step.4_fleet-connectivity-status.yml`](azure-devops/Step.4_fleet-connectivity-status.yml) |
88+
| 5 | [Step.5 - Assess Update Readiness](docs/appendix-pipelines.md#step-5---assess-update-readiness) | [`Step.5_assess-update-readiness.yml`](github-actions/Step.5_assess-update-readiness.yml) | [`Step.5_assess-update-readiness.yml`](azure-devops/Step.5_assess-update-readiness.yml) |
89+
| 6 | [Step.6 - Apply Updates](docs/appendix-pipelines.md#step-6---apply-updates) | [`Step.6_apply-updates.yml`](github-actions/Step.6_apply-updates.yml) | [`Step.6_apply-updates.yml`](azure-devops/Step.6_apply-updates.yml) |
90+
| 7 | [Step.7 - Monitor In-Flight Updates](docs/appendix-pipelines.md#step-7---monitor-in-flight-updates) | [`Step.7_monitor-updates.yml`](github-actions/Step.7_monitor-updates.yml) | [`Step.7_monitor-updates.yml`](azure-devops/Step.7_monitor-updates.yml) |
91+
| 8 | [Step.8 - Fleet Update Status](docs/appendix-pipelines.md#step-8---fleet-update-status) | [`Step.8_fleet-update-status.yml`](github-actions/Step.8_fleet-update-status.yml) | [`Step.8_fleet-update-status.yml`](azure-devops/Step.8_fleet-update-status.yml) |
92+
| 9 | [Step.9 - Fleet Health Status](docs/appendix-pipelines.md#step-9---fleet-health-status) | [`Step.9_fleet-health-status.yml`](github-actions/Step.9_fleet-health-status.yml) | [`Step.9_fleet-health-status.yml`](azure-devops/Step.9_fleet-health-status.yml) |
9393

9494
- **GitHub Actions**: the Actions sidebar sorts workflows alphabetically by the `name:` field inside the YAML. Because every `name:` starts with `Step.N - `, the sidebar lists the ten workflows in execution order (Step.0 first, Step.9 last) instead of the cosmetically confusing alphabetical scatter (`Apply Updates`, `Apply-Updates Schedule Coverage Audit`, `Assess Update Readiness`, ...).
9595
- **Azure DevOps**: the Pipelines list sorts by the pipeline **definition name** chosen at *import time* (not by the YAML filename and not by any top-level `name:` field - the `name:` field in an ADO YAML controls the per-run *build number*, not the pipeline display name). When you import each YAML, the import wizard prefills the suggested pipeline name from the YAML's leading title comment; the YAMLs in this repo open with `# Step.N - <description>`, so the suggested name is already correct. **Accept the suggested name** (or paste `Step.N - <description>` yourself), and the Pipelines list will sort in execution order. You can rename a pipeline later via *Pipeline -> Edit -> Settings -> Name*.
@@ -1885,35 +1885,21 @@ After migration the file is a strict superset of v1 - every cluster still resolv
18851885
18861886
## 9. Tuning throughput (`-ThrottleLimit`)
18871887
1888-
**v0.7.68 removed `-ThrottleLimit` from every fleet-scale read cmdlet.** Those cmdlets are now single-batch Azure Resource Graph queries - one ARG call per cmdlet invocation, regardless of fleet size - so the flag had no effect on read throughput and its presence misled operators into thinking they could tune it. The removed-from list:
1889-
1890-
| Function | `-ThrottleLimit` in v0.7.68 | Replacement back-end | Used by pipeline |
1891-
|---|---|---|---|
1892-
| `Get-AzLocalUpdateSummary` | **Removed** | Single ARG batch read | Fleet Update Status. |
1893-
| `Get-AzLocalAvailableUpdates` | **Removed** | Single ARG batch read | Apply Updates (pre-check), Assess Update Readiness. |
1894-
| `Get-AzLocalClusterUpdateReadiness` | **Removed** | Single ARG batch read | Apply Updates (pre-check), Fleet Update Status, Assess Update Readiness. |
1895-
| `Test-AzLocalClusterHealth` | **Removed** | Single ARG batch read (HCI health checks) | Assess Update Readiness, Fleet Health Status. |
1896-
| `Get-AzLocalFleetProgress` | **Removed** | Single ARG batch read | Step.6 Fleet Update Status (JUnit emitter). |
1897-
| `Get-AzLocalFleetStatusData` | **Removed** | Single ARG batch read | Step.6 Fleet Update Status, `New-AzLocalFleetStatusHtmlReport`. |
1898-
| `New-AzLocalFleetStatusHtmlReport` | **Removed** | Single ARG batch read | Standalone report. |
1899-
| `Get-AzLocalUpdateRuns` | **Removed** | Single ARG batch read against `microsoft.azurestackhci/clusters/updates/updateruns` | Step.6 Fleet Update Status. |
1900-
| `Get-AzLocalUpdateRunFailures` (new in v0.7.68) | n/a (ARG-only) | Single ARG batch read with 9-deep `mv-expand` | Step.5 Apply Updates post-mortem, ad-hoc triage. |
1901-
1902-
All shipped pipeline YAMLs were updated to stop passing `-ThrottleLimit` to these cmdlets. **If you had passed `throttle_limit` on the workflow input or as a `-ThrottleLimit` argument to any of the above, you can remove it** - the value was already a silent no-op against ARG, and v0.7.68 surfaces the change loudly by failing parameter binding for any caller still passing it.
1888+
**As of v0.7.68, no fleet-scale read cmdlet exposes `-ThrottleLimit`.** Every read-side cmdlet (`Get-AzLocalUpdateSummary`, `Get-AzLocalAvailableUpdates`, `Get-AzLocalClusterUpdateReadiness`, `Test-AzLocalClusterHealth`, `Get-AzLocalFleetProgress`, `Get-AzLocalFleetStatusData`, `New-AzLocalFleetStatusHtmlReport`, `Get-AzLocalUpdateRuns`, `Get-AzLocalUpdateRunFailures`) is a single-batch Azure Resource Graph query - one ARG call per cmdlet invocation, regardless of fleet size - so the flag had no effect on read throughput. Pipelines no longer pass it. Any `throttle_limit` input you may have on an older fork of these YAMLs can be removed safely.
19031889
19041890
### Where `-ThrottleLimit` still applies
19051891
1906-
Only the **apply-side fan-out** still uses any form of parallelism control, because applying updates legitimately is a per-cluster ARM PUT and benefits from controlled parallelism:
1892+
Only the **apply-side fan-out** still uses parallelism control, because applying updates is a per-cluster ARM PUT and benefits from bounded concurrency:
19071893
19081894
| Function | `-ThrottleLimit` exposed | Used by pipeline |
19091895
|---|---|---|
1910-
| `Start-AzLocalClusterUpdate` (apply-side fleet ops) | Internal via `Invoke-FleetJobsInParallel`; no user-facing `-ThrottleLimit` parameter. | Step.5 Apply Updates. |
1896+
| `Start-AzLocalClusterUpdate` (apply-side fleet ops) | Internal via `Invoke-FleetJobsInParallel`; no user-facing `-ThrottleLimit` parameter. | Step.6 Apply Updates. |
19111897
1912-
For Step.5 Apply Updates, the apply-side parallelism is bounded internally by the module's own job-pool helper; there is no operator-facing throttle knob to tune.
1898+
The apply-side parallelism is bounded internally by the module's own job-pool helper; there is no operator-facing throttle knob to tune.
19131899
19141900
### Throttling on the read side (ARG 429 / `Retry-After`)
19151901
1916-
Even though the cmdlets are now single-batch reads, Azure Resource Graph has per-tenant rate limits. `Invoke-AzResourceGraphQuery` (the helper behind every ARG-first cmdlet) now retries on HTTP 429 - it inspects the `Retry-After` response header when present and otherwise applies bounded exponential backoff capped at the documented ARG throttling envelope. Large fleet sweeps no longer fall over at the throttling boundary.
1902+
Azure Resource Graph has per-tenant rate limits. `Invoke-AzResourceGraphQuery` (the helper behind every ARG-first cmdlet) retries on HTTP 429 - it inspects the `Retry-After` response header when present and otherwise applies bounded exponential backoff capped at the documented ARG throttling envelope. Large fleet sweeps no longer fall over at the throttling boundary.
19171903
19181904
If you see ARG-side `429 TooManyRequests` in the verbose logs from `Invoke-AzResourceGraphQuery`, the most common causes are: (a) running every pipeline on the same cron tick (stagger schedules at least 2-3 minutes apart), and (b) running multiple read pipelines from the same identity in a tight loop during development (add `Start-Sleep -Seconds 30` between iterations of an interactive harness).
19191905

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.0_authentication-test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ variables:
5959
# log if the YAML appears stale - prompting you to refresh via
6060
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
6161
- name: GENERATED_AGAINST_MODULE_VERSION
62-
value: '0.7.98'
62+
value: '0.7.99'
6363
# Resolution order for the module version pin (leave all unset to install the latest,
6464
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
6565
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).
@@ -306,6 +306,6 @@ stages:
306306
condition: always()
307307
inputs:
308308
targetPath: '$(Build.ArtifactStagingDirectory)/auth-report'
309-
artifact: 'azlocal-auth-report_$(stamp.artifactStamp)'
309+
artifact: 'azlocal-step.0-auth-report_$(stamp.artifactStamp)'
310310
publishLocation: 'pipeline'
311311

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.1_inventory-clusters.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ variables:
4242
# log if the YAML appears stale - prompting you to refresh via
4343
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
4444
- name: GENERATED_AGAINST_MODULE_VERSION
45-
value: '0.7.98'
45+
value: '0.7.99'
4646
# Resolution order for the module version pin (leave all unset to install the latest,
4747
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
4848
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).
@@ -278,7 +278,7 @@ stages:
278278
displayName: 'Publish Inventory Artifact'
279279
inputs:
280280
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
281-
ArtifactName: 'azlocal-cluster-inventory_$(stamp.artifactStamp)'
281+
ArtifactName: 'azlocal-step.1-cluster-inventory_$(stamp.artifactStamp)'
282282
publishLocation: 'Container'
283283

284284
- task: PowerShell@2

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.2_manage-updatering-tags.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ variables:
4545
# log if the YAML appears stale - prompting you to refresh via
4646
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
4747
- name: GENERATED_AGAINST_MODULE_VERSION
48-
value: '0.7.98'
48+
value: '0.7.99'
4949
# Resolution order for the module version pin (leave all unset to install the latest,
5050
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
5151
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).
@@ -263,7 +263,7 @@ stages:
263263
displayName: 'Publish Log Artifacts'
264264
inputs:
265265
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
266-
ArtifactName: 'azlocal-updatering-tag-logs_$(stamp.artifactStamp)'
266+
ArtifactName: 'azlocal-step.2-updatering-tag-logs_$(stamp.artifactStamp)'
267267
publishLocation: 'Container'
268268

269269
- task: PowerShell@2

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.3_apply-updates-schedule-audit.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ parameters:
8181
default: false
8282

8383
variables:
84-
GENERATED_AGAINST_MODULE_VERSION: '0.7.98'
84+
GENERATED_AGAINST_MODULE_VERSION: '0.7.99'
8585
REQUIRED_MODULE_VERSION: '${{ parameters.moduleVersion }}'
8686
reportsPath: '$(Build.ArtifactStagingDirectory)/reports'
8787

@@ -345,7 +345,7 @@ stages:
345345
condition: always()
346346
inputs:
347347
PathtoPublish: '$(reportsPath)'
348-
ArtifactName: 'azlocal-apply-updates-schedule-audit-report_$(stamp.artifactStamp)'
348+
ArtifactName: 'azlocal-step.3-apply-updates-schedule-audit-report_$(stamp.artifactStamp)'
349349
publishLocation: 'Container'
350350

351351
- pwsh: |

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.4_fleet-connectivity-status.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ variables:
102102
# the version actually installed and to the latest on PSGallery, and emits a warning
103103
# log if the YAML appears stale - prompting you to refresh via
104104
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
105-
GENERATED_AGAINST_MODULE_VERSION: '0.7.98'
105+
GENERATED_AGAINST_MODULE_VERSION: '0.7.99'
106106
# Resolution order for the module version pin (leave all unset to install the latest,
107107
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
108108
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).
@@ -423,7 +423,7 @@ stages:
423423
condition: always()
424424
inputs:
425425
PathtoPublish: '$(reportsPath)'
426-
ArtifactName: 'azlocal-fleet-connectivity-status-report_$(stamp.artifactStamp)'
426+
ArtifactName: 'azlocal-step.4-fleet-connectivity-status-report_$(stamp.artifactStamp)'
427427
publishLocation: 'Container'
428428

429429
# Create the markdown summary FIRST (before PublishTestResults below) so the
@@ -565,7 +565,7 @@ stages:
565565
continueOnError: true
566566
inputs:
567567
PathtoPublish: '$(reportsPath)'
568-
ArtifactName: 'azlocal-fleet-connectivity-status-itsm-results_$(stamp.artifactStamp)'
568+
ArtifactName: 'azlocal-step.4-fleet-connectivity-status-itsm-results_$(stamp.artifactStamp)'
569569
publishLocation: 'Container'
570570

571571
- task: PublishTestResults@2

0 commit comments

Comments
 (0)