AzLocal.UpdateManagement

0.8.5

PowerShell module to manage Azure Local (formerly Azure Stack HCI) cluster updates using Azure Update Manager APIs. Provides functions to start updates, check update status, list available updates, and monitor update runs. Renamed from AzStackHci.ManageUpdates in v0.7.3 to align with the Azure Local product name.

Minimum PowerShell version

5.1

Installation Options

Copy and Paste the following command to install this package using PowerShellGet More Info

Install-Module -Name AzLocal.UpdateManagement -RequiredVersion 0.8.5

Copy and Paste the following command to install this package using Microsoft.PowerShell.PSResourceGet More Info

Install-PSResource -Name AzLocal.UpdateManagement -Version 0.8.5

You can deploy this package directly to Azure Automation. Note that deploying packages with dependencies will deploy all the dependencies to Azure Automation. Learn More

Manually download the .nupkg file to your system's default download location. Note that the file won't be unpacked, and won't include any dependencies. Learn More

Owners

Copyright

(c) Microsoft. All rights reserved.

Package Details

Author(s)

  • Neil Bird Microsoft

Tags

Azure AzureLocal AzureStackHCI Updates UpdateManager HCI Automation CICD Pipeline ServiceNow ITSM Incident

Functions

Connect-AzLocalServicePrincipal Start-AzLocalClusterUpdate Get-AzLocalClusterUpdateReadiness Get-AzLocalClusterInventory Get-AzLocalClusterInfo Get-AzLocalUpdateSummary Get-AzLocalAvailableUpdates Get-AzLocalUpdateRuns Set-AzLocalClusterUpdateRingTag Invoke-AzLocalFleetOperation Get-AzLocalFleetProgress Test-AzLocalFleetHealthGate Export-AzLocalFleetState Resume-AzLocalFleetUpdate Stop-AzLocalFleetUpdate Test-AzLocalClusterHealth Get-AzLocalFleetStatusData New-AzLocalFleetStatusHtmlReport Test-AzLocalUpdateScheduleAllowed Reset-AzLocalSideloadedTag Get-AzLocalItsmConfig Test-AzLocalItsmConnection New-AzLocalIncident Copy-AzLocalPipelineExample Update-AzLocalPipelineExample Copy-AzLocalItsmSample Get-AzLocalFleetHealthFailures Test-AzLocalApplyUpdatesScheduleCoverage Get-AzLocalUpdateRunFailures Get-AzLocalApplyUpdatesScheduleConfig Resolve-AzLocalCurrentUpdateRing Get-AzLocalApplyUpdatesScheduleNextFirings New-AzLocalApplyUpdatesScheduleConfig Update-AzLocalApplyUpdatesScheduleConfig Get-AzLocalApplyUpdatesScheduleCycleCalendar Get-AzLocalFleetHealthOverview Get-AzLocalLatestSolutionVersion Get-AzLocalFleetConnectivityStatus New-AzLocalFleetConnectivityStatusSummary Add-AzLocalPipelineVersionBanner Export-AzLocalAuthValidationReport Invoke-AzLocalClusterInventory Set-AzLocalClusterUpdateRingTagFromCsv Export-AzLocalUpdateRunMonitorReport Export-AzLocalFleetUpdateStatusReport Export-AzLocalClusterUpdateReadinessReport Export-AzLocalFleetConnectivityStatusReport Export-AzLocalApplyUpdatesScheduleAudit Export-AzLocalFleetHealthStatusReport Resolve-AzLocalPipelineUpdateRing Export-AzLocalClusterReadinessGateReport Invoke-AzLocalReadinessGatedClusterUpdate Add-AzLocalApplyUpdatesStepSummary Add-AzLocalNoReadyClustersStepSummary Invoke-AzLocalItsmTicketingFromArtifact

PSEditions

Desktop Core

Dependencies

This module has no dependencies.

Release Notes

## Version 0.8.5 - New Public cmdlet `Get-AzLocalApplyUpdatesScheduleCycleCalendar` + Step.6 manual schedule-file inputs + Step.3 cycle-calendar regression fix + per-ring cluster-count column

Step.3 cycle-calendar refactor + regression fix release. One new Public cmdlet, two new Step.6 manual-run inputs. No other public API removed; no parameter changes on existing cmdlets. The v0.8.4 cycle-calendar silent-drop bug in `Test-AzLocalApplyUpdatesScheduleCoverage -View Recommend` is fixed at the architectural level (decoupled from the advisor's findings gate).

- **NEW Step.6 manual schedule-file inputs.** GH `workflow_dispatch.inputs` gains `use_schedule_file` (choice false/true) + `resolve_for_date_utc` (string, YYYY-MM-DD); ADO `parameters` gains symmetric `useScheduleFile` (boolean) + `resolveForDateUtc` (string). When `use_schedule_file=true` on a manual run, the resolver reads `apply-updates-schedule.yml` and runs `Resolve-AzLocalCurrentUpdateRing -Schedule $cfg -Now $resolveAt` (today UTC, or the operator-supplied date) - exactly as a scheduled run would. Use this to test a schedule change before the next tick, re-run a missed scheduled day, or preview a future cycleWeek/dayOfWeek. `update_ring` is no longer `required: true` - either supply it OR set `use_schedule_file=true`. The resolver throws a helpful error if BOTH are empty. Back-compat: manual runs with `use_schedule_file=false` use the manual ring verbatim (v0.8.4 behaviour). Scheduled firings are unchanged.

- **NEW Public cmdlet `Get-AzLocalApplyUpdatesScheduleCycleCalendar`.** Projects an `apply-updates-schedule.yml` configuration forward across the calendar - one row per UTC day - and emits either a structured object pipeline (default) or a fully-rendered markdown block (`-AsMarkdown`). Parameters: `-Schedule <PSCustomObject>` (mandatory), `-StartDate <datetime>` (default UTC today), `-Days <int>` (default = `CycleWeeks * 7`; ValidateRange 1-3650), `-AsMarkdown`, `-IncludePerRingSummary`, `-ClusterRingCounts <hashtable>`. Object output per day: `DateUtc, DayOfWeekName, CycleWeek, CycleWeeksTotal, CycleWeekLabel, IsCycleWrap, Rings, UpdateRingValue, AllowedUpdateVersions, AllowedUpdateVersionsSource, MatchedRowCount, IsDeadDay, Reason`. Re-uses `Resolve-AzLocalCurrentUpdateRing` per-day so cycle-week math, UNION semantics, and AllowedUpdateVersions precedence stay identical to runtime. Variable cycle length safe (4 / 8 / 52 weeks tested) and year-boundary safe (W52 -> W1 wrap, W53 years).
- **REGRESSION FIX: v0.8.4 cycle calendar silently dropped on healthy fleets.** In v0.8.4 the Enhancement B cycle-calendar block lived inside the Recommend snippet builder, AFTER the "any findings?" gate; on a fleet with zero findings the snippet was empty and Step.3 yml `if ($hasIssues -and $reco)` / `if (-not $hasIssues -and $reco)` branches both fire only when `$reco` is non-empty - so the calendar quietly disappeared. The new cmdlet is invoked unconditionally whenever `$scheduleCfg` is parsed, so the calendar always renders. NO Step.3 yml structural change beyond the version bump.
- **NEW: `Clusters in ring(s)` calendar column + `Cluster count` per-ring projection column** (via new `-ClusterRingCounts` hashtable). When supplied, the per-day table gains a 6th column (`3+12 (total: 15)` for UNION rows, `5` for single-ring days, blank for dead days), and the optional `### Per-ring projection` section gains a `Cluster count` column. Lookups are `OrdinalIgnoreCase`. Step.3 builds the map from the live tagged `$clusters` already in scope; the cmdlet itself stays pure (no CSV / Azure I/O).
- **NEW: optional `### Per-ring projection` section (`-IncludePerRingSummary`).** Row per ring with next eligible UTC date + all eligible dates inside the horizon (with cluster count column when `-ClusterRingCounts` is supplied). Step.3 yml passes `-IncludePerRingSummary` so the section always appears.
- **`Test-AzLocalApplyUpdatesScheduleCoverage -View Recommend` Enhancement B now delegates to the new cmdlet.** The v0.8.4 inline cycle-calendar block (~37 lines) is replaced by a single `Get-AzLocalApplyUpdatesScheduleCycleCalendar -Schedule $scheduleCfg -AsMarkdown -IncludePerRingSummary -ClusterRingCounts $ringCountMap` call, wrapped in `try/catch` with a `_Cycle calendar unavailable: ..._` fallback line.
- **Pester suite updates**: drift-sync test bumped to `'0.8.5'`; new drift assertion asserts `Get-AzLocalApplyUpdatesScheduleCycleCalendar` is exported; ~28 new It blocks across two new Describe blocks cover object-pipeline shape, default Days math, day-0 resolution, IsDeadDay, UNION rendering, IsCycleWrap on rollover, 52-week / 8-week / 1-week cycles, multi-cycle horizon, defensive `CycleWeeks=0` throw, markdown heading + 5-column / 6-column header variants, the v0.8.4 silent-drop regression guard, ClusterRingCounts UNION + dead-day rendering, case-insensitive ring lookup, cycle-wrap annotation, year-boundary safety. Expected baseline: 882/0/1 -> ~910/0/1.
- **All 20 bundled `Step.{0..9}.yml` templates** bump `GENERATED_AGAINST_MODULE_VERSION` from `'0.8.4'` to `'0.8.5'`.

## Version 0.8.3 - Test-AzLocalApplyUpdatesScheduleCoverage Step.3 advisor accuracy + readability fixes: Recommend now diff-prunes against `-PipelineYamlPath`, Step.3 yml `pipeline_path` REQUIRED, Allow-list heading reframed, closing-fence typo fixed

## Version 0.8.2 - Test-AzLocalApplyUpdatesScheduleCoverage operator-UX release: -View Recommend snippet embeds `# All cron times below are UTC` comment + `Indent tip` blockquote; -View Audit `NoWindowTag` row now names affected clusters grouped by `UpdateRing` + sorts AFTER Covered; Step.3 GH/ADO Allow-list section trimmed; five new internal pipeline-host helpers (Get/Set/Add/Write-AzLocalPipeline*) laid down as foundations for the upcoming executable-YAML refactor

## Version 0.8.1 - Test-AzLocalApplyUpdatesScheduleCoverage -View Recommend GH snippet emits ONLY the `schedule:` block (no `on:` / `workflow_dispatch:` lines) so it can be pasted straight into Step.6_apply-updates.yml without producing a duplicate-key YAML error

## Version 0.8.0 - Step.7 form-default regressions fixed (criticalElapsedDays 7->3, updateRing Wave1->empty) + Pii-Guard.Tests.ps1 (repo-hygiene guard) + Publish-Module.ps1 excludes maintainer-only RELEASE-PROCESS.md

## Version 0.7.99 - Property/Summary renames (AvailableUpdates -> AllAvailableUpdates, AvailableUpdatesCount -> ActionableUpdatesCount, Ready/NotReady Summary -> ReadyForUpdate/UpToDate/NotReadyForUpdate) + Step.7 CRITICAL elapsed-days 7->3 + artifact zip names prefixed with step.X-

For full v0.7.x and v0.8.x release notes see:
https://github.com/NeilBird/Azure-Local/blob/main/AzLocal.UpdateManagement/CHANGELOG.md

FileList

Version History

Version Downloads Last updated
0.8.6 19 6/10/2026
0.8.5 (current version) 15 6/10/2026
0.8.4 27 6/9/2026
0.8.3 10 6/9/2026
0.8.2 6 6/9/2026