AzLocal.UpdateManagement.psd1
|
@{ # Script module or binary module file associated with this manifest. RootModule = 'AzLocal.UpdateManagement.psm1' # Version number of this module. ModuleVersion = '0.8.94' # Supported PSEditions CompatiblePSEditions = @('Desktop', 'Core') # ID used to uniquely identify this module GUID = 'a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d' # Author of this module Author = 'Neil Bird, Microsoft' # Company or vendor of this module CompanyName = 'Microsoft' # Copyright statement for this module Copyright = '(c) Microsoft. All rights reserved.' # Description of the functionality provided by this module Description = '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.' # Minimum version of the PowerShell engine required by this module PowerShellVersion = '5.1' # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. NestedModules = @( # Private helpers (loaded first) 'Private/Convert-AzLocalUpdateWindowToCron.ps1', 'Private/ConvertFrom-AzLocalCronExpression.ps1', 'Private/ConvertFrom-AzLocalUpdateExclusion.ps1', 'Private/ConvertFrom-AzLocalScheduleYaml.ps1', 'Private/ConvertFrom-AzLocalUpdateExcluded.ps1', 'Private/ConvertFrom-AzLocalUpdateSideloaded.ps1', 'Private/ConvertFrom-AzLocalUpdateLastAttemptTagValue.ps1', 'Private/ConvertFrom-AzLocalUpdateWindow.ps1', 'Private/Convert-AzLocalScheduleSchemaVersion.ps1', 'Private/ConvertTo-AzLocalAdditionalProperties.ps1', 'Private/ConvertTo-SafeCsvCollection.ps1', 'Private/ConvertTo-SafeCsvField.ps1', 'Private/ConvertTo-ScrubbedCliOutput.ps1', 'Private/ConvertTo-AzLocalUpdateRingKqlFilter.ps1', 'Private/Export-ResultsToJUnitXml.ps1', 'Private/Format-AzLocalDurationHuman.ps1', 'Private/Format-AzLocalIncidentBody.ps1', 'Private/Format-AzLocalUpdateRun.ps1', 'Private/Format-AzLocalUpdateLastAttemptTagValue.ps1', 'Private/Get-AzLocalClusterReadinessStatus.ps1', 'Private/Get-AzLocalClusterUpdateRuns.ps1', 'Private/Get-AzLocalItsmDedupeKey.ps1', 'Private/Get-AzLocalItsmTriggerDecision.ps1', 'Private/Get-AzLocalModuleRootManifestPath.ps1', 'Private/Get-AzLocalPipelineCustomiseMarkers.ps1', 'Private/Get-AzLocalPipelineId.ps1', 'Private/Get-AzLocalPipelineManifest.ps1', 'Private/Get-AzLocalRunEndTime.ps1', 'Private/Get-AzLocalUpdateRunHealthEvidence.ps1', 'Private/Get-AzLocalUpdateRunStepStats.ps1', 'Private/Get-CurrentStepPath.ps1', 'Private/Get-DeepestActiveStep.ps1', 'Private/Get-DeepestErrorMessage.ps1', 'Private/Get-ExportFormat.ps1', 'Private/Get-HealthCheckFailureSummary.ps1', 'Private/Get-LastUpdateRunErrorSummary.ps1', 'Private/Get-LatestUpdateByYYMM.ps1', 'Private/Get-TagValue.ps1', 'Private/Import-AzLocalFleetState.ps1', 'Private/Install-AzGraphExtension.ps1', 'Private/Invoke-AzCliJson.ps1', 'Private/Invoke-AzLocalSideloadedAutoReset.ps1', 'Private/Invoke-AzLocalSideloadedAutoResetForCluster.ps1', 'Private/Invoke-AzLocalItsmHttp.ps1', 'Private/Invoke-AzLocalServiceNowAdapter.ps1', 'Private/Invoke-AzResourceGraphQuery.ps1', 'Private/Invoke-AzRestJson.ps1', 'Private/Invoke-AzLocalUpdateApply.ps1', 'Private/Invoke-FleetJobsInParallel.ps1', 'Private/Invoke-FleetOpClusterAction.ps1', 'Private/Read-AzLocalApplyUpdatesYamlCrons.ps1', 'Private/Resolve-AzLocalItsmSecret.ps1', 'Private/Resolve-AzLocalUpdateRunDeepestError.ps1', 'Private/Resolve-SafeOutputPath.ps1', 'Private/Resolve-WildcardDate.ps1', 'Private/Resolve-WildcardDateRange.ps1', 'Private/Set-AzLocalClusterTagsMerge.ps1', 'Private/Test-AzLocalUpdateRunsInFlight.ps1', 'Private/Write-AzLocalUpdateLastAttemptTag.ps1', # On-prem solution-update sideloading automation (v0.8.7) 'Private/Get-AzLocalSideloadAuthMap.ps1', 'Private/Get-AzLocalSideloadCatalog.ps1', 'Private/Convert-AzLocalSideloadCatalogSchemaVersion.ps1', 'Private/Select-AzLocalNextUpdateForCluster.ps1', 'Private/Resolve-AzLocalSideloadCredential.ps1', 'Private/Get-AzLocalSolutionUpdateDownload.ps1', 'Private/Get-AzLocalSideloadState.ps1', 'Private/Resolve-AzLocalSideloadTargetPath.ps1', 'Private/Register-AzLocalSideloadCopyTask.ps1', 'Private/New-AzLocalPSRemotingSession.ps1', 'Private/Test-AzLocalRemoteFileHash.ps1', 'Private/Invoke-AzLocalRemoteSolutionImport.ps1', 'Private/Test-AzCliAvailable.ps1', 'Private/Test-AzLocalAllowedUpdateVersionsString.ps1', 'Private/Test-AzLocalUpdateAssessmentStale.ps1', 'Private/Test-AzLocalUpdateExclusion.ps1', 'Private/Test-AzLocalUpdateExcludedAllowed.ps1', 'Private/Test-AzLocalUpdateSideloadedAllowed.ps1', 'Private/Test-AzLocalUpdateVersionInProgressMatch.ps1', 'Private/Test-AzLocalUpdateWindow.ps1', 'Private/Test-ExportPathWritable.ps1', 'Private/Write-Log.ps1', 'Private/Write-UpdateCsvLog.ps1', 'Private/Write-Utf8NoBomFile.ps1', # Pipeline host abstraction (v0.8.2) - foundations for the upcoming executable-YAML refactor 'Private/Get-AzLocalPipelineHost.ps1', 'Private/Set-AzLocalPipelineOutput.ps1', 'Private/Add-AzLocalPipelineStepSummary.ps1', 'Private/Write-AzLocalPipelineNotice.ps1', 'Private/Write-AzLocalPipelineWarning.ps1', # Generic JUnit XML emitter shared by every Public Step.* cmdlet (v0.8.5) 'Private/New-AzLocalPipelineJUnitXml.ps1', # Shared step-summary helpers (v0.8.81) - host-aware status icons, cluster portal deep-links, Ctrl-click tip 'Private/Get-AzLocalStatusIconMap.ps1', 'Private/Get-AzLocalClusterPortalLink.ps1', 'Private/Get-AzLocalCtrlClickTip.ps1', # Public exported functions 'Public/Connect-AzLocalServicePrincipal.ps1', 'Public/Copy-AzLocalItsmSample.ps1', 'Public/Copy-AzLocalPipelineExample.ps1', 'Public/Export-AzLocalFleetState.ps1', 'Public/Get-AzLocalApplyUpdatesScheduleConfig.ps1', 'Public/Get-AzLocalApplyUpdatesScheduleCycleCalendar.ps1', 'Public/Get-AzLocalApplyUpdatesScheduleNextFirings.ps1', 'Public/Get-AzLocalAvailableUpdates.ps1', 'Public/Get-AzLocalClusterInfo.ps1', 'Public/Get-AzLocalClusterInventory.ps1', 'Public/Get-AzLocalClusterUpdateReadiness.ps1', 'Public/Get-AzLocalFleetProgress.ps1', 'Public/Get-AzLocalFleetStatusData.ps1', 'Public/Get-AzLocalFleetHealthFailures.ps1', 'Public/Get-AzLocalFleetHealthOverview.ps1', 'Public/Get-AzLocalItsmConfig.ps1', 'Public/Get-AzLocalLatestSolutionVersion.ps1', 'Public/Get-AzLocalUpdateRunFailures.ps1', 'Public/Get-AzLocalUpdateRuns.ps1', 'Public/Get-AzLocalUpdateSummary.ps1', 'Public/Invoke-AzLocalFleetOperation.ps1', 'Public/New-AzLocalApplyUpdatesScheduleConfig.ps1', 'Public/New-AzLocalFleetStatusHtmlReport.ps1', 'Public/New-AzLocalIncident.ps1', 'Public/Reset-AzLocalSideloadedTag.ps1', 'Public/Resolve-AzLocalCurrentUpdateRing.ps1', 'Public/Resume-AzLocalFleetUpdate.ps1', 'Public/Set-AzLocalClusterUpdateRingTag.ps1', 'Public/Start-AzLocalClusterUpdate.ps1', 'Public/Stop-AzLocalFleetUpdate.ps1', 'Public/Sync-AzLocalClusterUpdateSummary.ps1', 'Public/Test-AzLocalApplyUpdatesScheduleCoverage.ps1', 'Public/Test-AzLocalClusterHealth.ps1', 'Public/Test-AzLocalFleetHealthGate.ps1', 'Public/Test-AzLocalItsmConnection.ps1', 'Public/Test-AzLocalUpdateScheduleAllowed.ps1', 'Public/Update-AzLocalApplyUpdatesScheduleConfig.ps1', 'Public/Update-AzLocalPipelineExample.ps1', 'Public/Get-AzLocalFleetConnectivityStatus.ps1', 'Public/New-AzLocalFleetConnectivityStatusSummary.ps1', # On-prem solution-update sideloading automation (v0.8.7) - catalog maintenance 'Public/Update-AzLocalSideloadCatalog.ps1', # On-prem solution-update sideloading automation (v0.8.7) - planner, orchestrator, reporting 'Public/Resolve-AzLocalSideloadPlan.ps1', 'Public/Invoke-AzLocalSideloadUpdate.ps1', 'Public/Export-AzLocalSideloadStatusReport.ps1', # Thin-YAML pipeline foundation (v0.8.5) 'Public/Add-AzLocalPipelineVersionBanner.ps1', # Thin-YAML Step.0 (v0.8.5) - Authentication validation + subscription scope + cluster reachability 'Public/Export-AzLocalAuthValidationReport.ps1', # Thin-YAML Step.1 (v0.8.5) - Cluster inventory + canonical CSV + operator README + step summary 'Public/Invoke-AzLocalClusterInventory.ps1', # Thin-YAML Step.2 (v0.8.5) - UpdateRing tag management workload (CSV validation + apply + JSON sidecar + step summary) 'Public/Set-AzLocalClusterUpdateRingTagFromCsv.ps1', # Thin-YAML Step.7 (v0.8.5) - In-flight update-run monitor (severity scoring + CSV + JUnit + step summary + 6 step outputs) 'Public/Export-AzLocalUpdateRunMonitorReport.ps1', # Thin-YAML Step.8 (v0.8.5) - Fleet update status (inventory + readiness + version distribution + 3-suite JUnit XML + step summary + 22 step outputs) 'Public/Export-AzLocalFleetUpdateStatusReport.ps1', # Thin-YAML Step.5 (v0.8.5) - Pre-flight Update Readiness Assessment (readiness + blocking-health JUnit + combined JUnit + 8-section markdown summary + 2 step outputs) 'Public/Export-AzLocalClusterUpdateReadinessReport.ps1', # Thin-YAML Step.4 (v0.8.5) - Fleet Connectivity Status (Cluster/Arc/NIC/ARB severity classification + JUnit XML via shared helper + markdown summary + 12 step outputs) 'Public/Export-AzLocalFleetConnectivityStatusReport.ps1', # Thin-YAML Step.3 (v0.8.5) - Apply-Updates Schedule Coverage Audit (Audit + Matrix + Recommend views + 2-suite JUnit XML + 12-row summary table + allow-list section + always-on cycle calendar + 12 step outputs) 'Public/Export-AzLocalApplyUpdatesScheduleAudit.ps1', # Thin-YAML Step.9 (v0.8.5) - Fleet Health Status (Detail + in-process Summary + Overview + 2-suite JUnit XML + 4-section markdown + 8 step outputs; condenses ~600-line inline run: | block in Step.9_fleet-health-status.yml on both platforms) 'Public/Export-AzLocalFleetHealthStatusReport.ps1', # Thin-YAML Step.6 (v0.8.5) - Apply-Updates pipeline (resolve UpdateRing from schedule + readiness gate report + readiness-gated apply + per-host apply-updates step summary + no-clusters-ready step summary + ITSM ticketing from JUnit artifact; condenses ~6 inline run: | blocks across both Step.6_apply-updates.yml pipelines into 6 testable Public cmdlets) 'Public/Resolve-AzLocalPipelineUpdateRing.ps1', 'Public/Export-AzLocalClusterReadinessGateReport.ps1', 'Public/Invoke-AzLocalReadinessGatedClusterUpdate.ps1', 'Public/Add-AzLocalApplyUpdatesStepSummary.ps1', 'Public/Add-AzLocalNoReadyClustersStepSummary.ps1', 'Public/Invoke-AzLocalItsmTicketingFromArtifact.ps1' ) FunctionsToExport = @( 'Connect-AzLocalServicePrincipal', 'Start-AzLocalClusterUpdate', 'Get-AzLocalClusterUpdateReadiness', 'Get-AzLocalClusterInventory', 'Get-AzLocalClusterInfo', 'Get-AzLocalUpdateSummary', 'Get-AzLocalAvailableUpdates', 'Get-AzLocalUpdateRuns', 'Set-AzLocalClusterUpdateRingTag', # Fleet-Scale Operations (v0.5.6) 'Invoke-AzLocalFleetOperation', 'Get-AzLocalFleetProgress', 'Test-AzLocalFleetHealthGate', 'Export-AzLocalFleetState', 'Resume-AzLocalFleetUpdate', 'Stop-AzLocalFleetUpdate', # Pre-Update Health Validation (v0.6.1) 'Test-AzLocalClusterHealth', # Fleet Status Data Collection & Reporting (v0.6.4) 'Get-AzLocalFleetStatusData', 'New-AzLocalFleetStatusHtmlReport', # Update Schedule Tag Helpers (v0.6.4) 'Test-AzLocalUpdateScheduleAllowed', # Sideloaded Payload Workflow (v0.7.1) 'Reset-AzLocalSideloadedTag', # ITSM Connector Phase 1 (v0.7.4) 'Get-AzLocalItsmConfig', 'Test-AzLocalItsmConnection', 'New-AzLocalIncident', # Pipeline-Examples Convenience (v0.7.4 / Update added v0.7.68) 'Copy-AzLocalPipelineExample', 'Update-AzLocalPipelineExample', # ITSM Sample Convenience (v0.7.50) 'Copy-AzLocalItsmSample', # Fleet Health Failures (v0.7.65) - 24-hour system health-check failures across the fleet 'Get-AzLocalFleetHealthFailures', # Apply-Updates Schedule Coverage Advisor (v0.7.65) - compares apply-updates YAML cron(s) to UpdateStartWindow tags 'Test-AzLocalApplyUpdatesScheduleCoverage', # Update Run Failures (v0.7.68) - ARG-only deep-error extraction (9 levels deep) for fleet-scale verbose error information 'Get-AzLocalUpdateRunFailures', # Ring-Aware Apply-Updates Schedule (v0.7.69) - human-readable schedule file + cycle-based resolver 'Get-AzLocalApplyUpdatesScheduleConfig', 'Resolve-AzLocalCurrentUpdateRing', 'Get-AzLocalApplyUpdatesScheduleNextFirings', 'New-AzLocalApplyUpdatesScheduleConfig', 'Update-AzLocalApplyUpdatesScheduleConfig', # Cycle Calendar (v0.8.5) - human-readable per-day projection of the resolver for one full cycle (or any -Days horizon), variable cycle length safe, year-boundary safe, per-ring 'next eligible date' summary 'Get-AzLocalApplyUpdatesScheduleCycleCalendar', # Fleet Health Overview (v0.7.70) - one row per cluster, ARG-first projection of cluster + updateSummaries (fleet-scale) 'Get-AzLocalFleetHealthOverview', # Latest Released Solution Version (v0.7.70) - public manifest probe (aka.ms/AzureEdgeUpdates) that anchors the rolling YYMM support window 'Get-AzLocalLatestSolutionVersion', # Check for Updates (v0.8.88) - triggers the updateSummaries/default/checkUpdates ARM action to refresh a cluster's (potentially stale) update assessment; opt-in -Wait polls the refreshed summary 'Sync-AzLocalClusterUpdateSummary', # Fleet Connectivity Status (v0.7.79) - 4-scope connectivity audit: cluster, Arc agent, physical NIC, ARB 'Get-AzLocalFleetConnectivityStatus', # Fleet Connectivity Status Summary Renderer (v0.7.87) - markdown step-summary builder used by Step.4 GH+ADO pipelines 'New-AzLocalFleetConnectivityStatusSummary', # Thin-YAML pipeline foundation (v0.8.5) - install-step version banner + drift annotations + step outputs (condenses ~50-line inline block in every Step.*.yml) 'Add-AzLocalPipelineVersionBanner', # Thin-YAML Step.0 (v0.8.5) - Authentication validation + subscription scope + cluster reachability (condenses ~200-line inline run: | block in Step.0_authentication-test.yml on both platforms) 'Export-AzLocalAuthValidationReport', # Thin-YAML Step.1 (v0.8.5) - Cluster inventory workload (condenses the inline run: | block in Step.1_inventory-clusters.yml on both platforms; writes timestamped + canonical CSV, JSON, README, and step summary) 'Invoke-AzLocalClusterInventory', # Thin-YAML Step.2 (v0.8.5) - UpdateRing tag management workload (validates CSV, applies tags via Set-AzLocalClusterUpdateRingTag, writes JSON sidecar + step summary) 'Set-AzLocalClusterUpdateRingTagFromCsv', # Thin-YAML Step.7 (v0.8.5) - In-flight update-run monitor (calls Get-AzLocalUpdateRuns -Latest -PassThru, classifies by per-step + overall elapsed + progress-status, writes CSV + JUnit XML + markdown step summary + 6 step outputs) 'Export-AzLocalUpdateRunMonitorReport', # Thin-YAML Step.8 (v0.8.5) - Fleet-wide Azure Local update status snapshot (inventory + readiness + Microsoft-manifest-anchored version distribution + 3-suite JUnit XML + supplementary CSVs + markdown step summary + 22 step outputs; replaces the ~830-line inline 'Collect Fleet Update Status' + 'Create Status Summary' blocks in Step.8_fleet-update-status.yml on both platforms) 'Export-AzLocalFleetUpdateStatusReport', # Thin-YAML Step.5 (v0.8.5) - Pre-flight Update Readiness Assessment (calls Get-AzLocalClusterUpdateReadiness + Test-AzLocalClusterHealth -BlockingOnly, writes per-check CSV + JUnit XML, merges into combined assess-readiness.xml, emits 8-section markdown step summary + 2 step outputs; replaces the ~280-line inline 'Run readiness + blocking health checks' block in Step.5_assess-update-readiness.yml on both platforms) 'Export-AzLocalClusterUpdateReadinessReport', # Thin-YAML Step.4 (v0.8.5) - Fleet Connectivity Status (calls Get-AzLocalFleetConnectivityStatus, classifies severity across Cluster/Arc/NIC/ARB scopes, emits JUnit XML via shared New-AzLocalPipelineJUnitXml helper, renders markdown via shared New-AzLocalFleetConnectivityStatusSummary, emits 12 lowercase step outputs; replaces the ~255-line inline 'Collect Fleet Connectivity Data' block in Step.4_fleet-connectivity-status.yml on both platforms) 'Export-AzLocalFleetConnectivityStatusReport', # Thin-YAML Step.3 (v0.8.5) - Apply-Updates Schedule Coverage Audit (calls Test-AzLocalApplyUpdatesScheduleCoverage Audit + Matrix + Recommend, builds 2-suite JUnit XML via shared New-AzLocalPipelineJUnitXml helper, renders summary table + Schedule/Cron detail tables + allow-list coverage + always-on Cycle calendar via Get-AzLocalApplyUpdatesScheduleCycleCalendar; emits 12 lowercase step outputs; replaces the ~220-line inline 'Run Schedule Coverage Audit' + ~210-line inline 'Create Schedule Coverage Summary' blocks in Step.3_apply-updates-schedule-audit.yml on both platforms; ALWAYS renders the Cycle calendar when -SchedulePath is supplied, fixing the v0.8.4 hasIssues-gate regression that silently dropped the calendar on clean-fleet runs) 'Export-AzLocalApplyUpdatesScheduleAudit', # Thin-YAML Step.9 (v0.8.5) - Fleet Health Status (calls Get-AzLocalFleetHealthFailures Detail + Get-AzLocalFleetHealthOverview, computes Summary view in-process, builds 2-suite JUnit XML via shared New-AzLocalPipelineJUnitXml helper, renders KPI / Overview / By-Reason / per-cluster collapsible markdown; emits 8 lowercase step outputs; replaces the ~600-line inline 'Collect Fleet Health Status' + 'Create Fleet Health Summary' blocks in Step.9_fleet-health-status.yml on both platforms) 'Export-AzLocalFleetHealthStatusReport', # Thin-YAML Step.6 (v0.8.5) - Apply-Updates pipeline (6 cmdlets that condense ~430 lines of inline run: | blocks across both Step.6_apply-updates.yml pipelines into testable, host-aware Public cmdlets; preserves byte-for-byte parity of all markdown summaries, per-host icon literals, and ADO task.logissue warning/error lines) 'Resolve-AzLocalPipelineUpdateRing', 'Export-AzLocalClusterReadinessGateReport', 'Invoke-AzLocalReadinessGatedClusterUpdate', 'Add-AzLocalApplyUpdatesStepSummary', 'Add-AzLocalNoReadyClustersStepSummary', 'Invoke-AzLocalItsmTicketingFromArtifact', # On-prem solution-update sideloading automation (v0.8.7) 'Update-AzLocalSideloadCatalog', 'Resolve-AzLocalSideloadPlan', 'Invoke-AzLocalSideloadUpdate', 'Export-AzLocalSideloadStatusReport', 'Add-AzLocalSideloadStepSummary' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. CmdletsToExport = @() # Variables to export from this module VariablesToExport = @() # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. AliasesToExport = @() # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. PrivateData = @{ PSData = @{ # Tags applied to this module. These help with module discovery in online galleries. Tags = @('Azure', 'AzureLocal', 'AzureStackHCI', 'Updates', 'UpdateManager', 'HCI', 'Automation', 'CICD', 'Pipeline', 'ServiceNow', 'ITSM', 'Incident') # A URL to the license for this module. LicenseUri = 'https://github.com/NeilBird/Azure-Local/blob/main/LICENSE' # A URL to the main website for this project. ProjectUri = 'https://github.com/NeilBird/Azure-Local' # A URL to an icon representing this module. IconUri = '' # ReleaseNotes of this module ReleaseNotes = @' ## Version 0.8.94 - Expands `BEGIN/END-AZLOCAL-CUSTOMIZE` marker coverage across every bundled CI/CD pipeline YAML (both GitHub Actions and Azure DevOps) so operator-owned INFRASTRUCTURE values survive `Update-AzLocalPipelineExample` - including with `-Force`, which otherwise reverts edits made outside marker regions. Three new uniquely-named region families wrap: the Azure DevOps WIF service connection name on each `AzureCLI@2`/`AzurePowerShell@5` task (`service-connection-<job>`); the hosted agent pool / GitHub `runs-on:` label that selects where a job runs (`runner-target-<job>`); and the sideload self-hosted pool/runner that the on-prem Advance job must use (`sideload-runner-<job>`). 45 marker pairs added across 20 files; region names are derived from the nearest stage/job and are unique per file. The merge engine (`Update-AzLocalPipelineExample`) and marker parser were already generic, so no function code changed - this is purely a template + docs + test release. Per-run INPUT defaults (updateRing, config paths, throttle) are deliberately NOT wrapped: they are already overridable per run and via variable groups, and wrapping them would freeze the module author's ability to improve defaults each release. No public API or export-count change (still 61). `GENERATED_AGAINST_MODULE_VERSION` bumped to `'0.8.94'`. ## Version 0.8.93 - Fixes a Bad Request in the `Update: 1 - Assess Update Readiness` pipeline. `Sync-AzLocalClusterUpdateSummary` (and the `Export-AzLocalClusterUpdateReadinessReport` stale-assessment auto-scan that calls it) POSTed the `Microsoft.AzureStackHCI/clusters/updateSummaries/default/checkUpdates` ARM action with NO request body; the `2026-03-01-preview` API spec now requires a body to be present, so the bodyless POST was rejected with `HttpRequestPayloadAPISpecValidationFailed` / `MissingRequiredParameter "Value is required but was not provided. Paths in payload: '.body'"`. The cmdlet now sends an empty JSON object `{}` (no properties are mandatory for a plain re-scan), validated end-to-end against a live cluster. Also refreshes the now-stale RBAC comment/warning in the cmdlet so it reflects that the v0.8.92 `updateSummaries/*` wildcard already authorizes checkUpdates (a 403 now means the custom role simply is not assigned, not that the action is ungranted). Bug-fix only - no API, parameter or export-count change (still 61). `GENERATED_AGAINST_MODULE_VERSION` bumped to `'0.8.93'`. ## Version 0.8.92 - Grants the preview "Check for updates" (`checkUpdates`) action to the least-privilege `Azure Stack HCI Update Operator (custom)` role via the `Microsoft.AzureStackHCI/clusters/updateSummaries/*` wildcard. `az role definition create`/`update` rejects the explicit `.../updateSummaries/checkUpdates/action` leaf because it is not yet in the `Microsoft.AzureStackHCI` provider operations catalog (checked 2026-06-18), but it accepts a wildcard whose prefix (`updateSummaries/`) resolves to the registered `updateSummaries/read`; Azure then matches the enforced `checkUpdates/action` against the wildcard at authorization time. So `Sync-AzLocalClusterUpdateSummary` and the `Export-AzLocalClusterUpdateReadinessReport` stale-assessment auto-scan now work under the custom role without falling back to Azure Stack HCI Administrator / Contributor or `-SkipStaleAssessmentScan`. The wildcard replaces the explicit `updateSummaries/read` line (which it subsumes) in the bundled `azlocal-update-management-custom-role.json`, docs/rbac.md, both READMEs and the `Connect-AzLocalServicePrincipal` help; it also covers any future control-plane sub-operation under `clusters/updateSummaries/`. Doc/RBAC-only change - no behavioural, API or export-count change (still 61). `GENERATED_AGAINST_MODULE_VERSION` bumped to `'0.8.92'`. ## Version 0.8.91 - Operator-facing cleanup of stale `Step.N` references left from the v0.8.7 pipeline de-numbering. The Config: 3 schedule-coverage audit (`Export-AzLocalApplyUpdatesScheduleAudit` / `Test-AzLocalApplyUpdatesScheduleCoverage`) no longer tells operators to edit a non-existent `Step.7_apply-updates.yml`: the "How to fix" headings, throw message, comment-based help and cron-coverage prose now name the shipped `apply-updates.yml` (with `.github/workflows/` and `azure-devops/` paths) and reference sibling pipelines by purpose (e.g. "the Manage UpdateRing Tags pipeline") instead of dead step numbers; the internal `$step6FileLabel` is renamed `$applyFileLabel`. Emitted markdown step-summary headers drop their dead step-number prefix (`## Step.0 - Authentication Validation...` -> `## Authentication Validation...`, `## Step.1 - Cluster Inventory` -> `## Cluster Inventory`, `## Step.2 - UpdateRing Tag Management Summary` -> `## UpdateRing Tag Management Summary`) and the `Get-AzLocalFleetConnectivityStatus` progress log drops its `Step.4` prefix. Output/help text only - no behavioural, API or export-count change (still 61); intentional backward-compat `Step.N_*.yml` migration aliases in `Get-AzLocalPipelineManifest` are unchanged. `GENERATED_AGAINST_MODULE_VERSION` bumped to `'0.8.91'`. ## Version 0.8.90 - Adds opt-in event-driven in-flight update monitoring so Update: 4 (Monitor In-Flight Updates) runs right after Update: 3 (Apply Updates) starts an update, yet stays cheap the rest of the time. New `-SkipWhenIdle` switch on `Export-AzLocalUpdateRunMonitorReport` performs one low-cost fleet-wide Azure Resource Graph probe ("any updateRuns InProgress?", new private helper `Test-AzLocalUpdateRunsInFlight`) and short-circuits to an IDLE result - writing the empty CSV/JUnit artefacts and all-zero step outputs - skipping the per-cluster sweep when nothing is in flight; fail-safe, so a probe error runs the full sweep rather than skipping. The bundled `monitor-updates.yml` default cron drops from 5x/day to every 6h (`0 */6 * * *`) and passes `-SkipWhenIdle` by default. `apply-updates.yml` now fires the monitor after starting >=1 update - `gh workflow run monitor-updates.yml` on GitHub Actions (needs `actions: write`) / the Pipelines REST queue API on Azure DevOps - tagged `triggered_by=apply-updates`; the monitor honours an optional `MONITOR_TRIGGER_DELAY_MINUTES` startup delay (unset/0 = off, otherwise clamped 15-240) so it lands AFTER updates move into InProgress. The monitor allows concurrent runs so a sleeping event-driven run never blocks the next. Both `apply-updates-schedule-audit.yml` (Config: 3) templates expose the monitor-recommendation tuning knobs (`MonitorPollIntervalMinutes`, `MonitorTrailingDays`, `MonitorInFlightHours`) as workflow inputs/parameters and plumb them into the cmdlet. Export count unchanged (still 61 - the new helper is private). `GENERATED_AGAINST_MODULE_VERSION` bumped to `'0.8.90'`. ## Version 0.8.89 - Sharpens the Config: 3 (Export-AzLocalApplyUpdatesScheduleAudit) "Recommended in-flight monitor schedule (Update: 4)" so the recommended monitor-updates.yml cron only polls when an update can actually be in flight, instead of 24x7. Replaces -MonitorFiresPerHour with -MonitorPollIntervalMinutes (15/20/30/60/120/180/240 min - now supports multi-hour cadence for slow multi-node runs that can take up to ~48h) and adds -MonitorInFlightHours (0-48, default 6), a buffer past the maintenance window for runs still finishing. Monitor DAYS now derive from apply-updates-schedule.yml ring eligibility (the cycle calendar) when -SchedulePath is supplied, otherwise from the apply-updates.yml cron weekday(s); monitor HOURS are bounded to the UpdateStartWindow span plus the in-flight buffer, falling back to all-hours when a run can cross midnight (an overnight window, -MonitorTrailingDays > 0, or the buffer pushing past 24h). Adds an Automation-Pipeline-Examples README section "How to control which updates are installed, and when" documenting the three-layer day/cadence/time model (apply-updates-schedule.yml -> apply cron -> UpdateStartWindow) and the tag -> schedule -> Config: 3 cron -> Update: 3/4 paste workflow. No public-API export-count change (still 61). GENERATED_AGAINST_MODULE_VERSION bumped to '0.8.89'. For full release notes see: https://github.com/NeilBird/Azure-Local/blob/main/AzLocal.UpdateManagement/CHANGELOG.md '@ # Prerelease string of this module # Prerelease = '' # Flag to indicate whether the module requires explicit user acceptance for install/update/save # RequireLicenseAcceptance = $false # External dependent modules of this module # ExternalModuleDependencies = @() } } # HelpInfo URI of this module # HelpInfoURI = '' # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. # DefaultCommandPrefix = '' } |