Skip to content

v0.3.0 Release - #32

Merged
tpcarman merged 29 commits into
masterfrom
dev
Jul 13, 2026
Merged

v0.3.0 Release#32
tpcarman merged 29 commits into
masterfrom
dev

Conversation

@tpcarman

@tpcarman tpcarman commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Description

Release v0.3.0 of the Microsoft Azure As Built Report module.

Added

  • InfoLevel 2 detail view for ASR protected items, showing per-VM sections with replication provider, health, state, active/target locations, test failover status, and A2A-specific RPO, last heartbeat, recovery VM size, and availability zone properties
  • Support for ASR Replication Policies (AsrPolicy), Recovery Plans (AsrRecoveryPlan), and Network Mappings (AsrNetworkMapping)
  • StorageRedundancy, CrossRegionRestore, SoftDeleteState, SoftDeleteRetentionDays, ImmutabilityState, and PublicNetworkAccess properties and health checks to Recovery Services Vault
  • Support for Azure NetApp Files, with per-volume detail, AD/encryption configuration, mount targets, export policy rules, and 5 health checks
  • Support for Management Groups, including full hierarchy display and an optional hierarchy diagram (Options.EnableDiagrams)
  • Options.DiagramDpi setting for diagram raster resolution
  • Support for Private DNS Zones, Virtual Network Gateways, DDoS Protection Plans, Application Gateways, Data Collection Rules, Public IP Addresses, Network Watchers, VM Scale Sets, Maintenance Configurations, and DNS Forwarding Rulesets
  • Resource Locks reporting across Virtual Networks, Key Vaults, Recovery Services Vaults, Storage Accounts, Firewalls, Private DNS Zones, Route Tables, Virtual Network Gateways, Log Analytics Workspaces, and DDoS Protection Plans
  • Support for User Assigned Managed Identities, Automation Accounts, and Diagnostic Settings
  • Support for Network Virtual Appliances (Get-AbrAzNetworkVirtualAppliance) — identifies third-party NVAs via Marketplace publisher or resource tag, with InfoLevel 3 UDR route table cross-referencing against all NIC private IPs and Load Balancer frontend IPs for HA pairs

Changed

  • Minimum Az module version requirement raised from 15.3.0 to 16.0.0

Fixed

  • ASR protected items provider filtering, health check direction, and a localization typo
  • Empty per-subscription sections appearing when no resources match in a subscription
  • Storage Account Share/Container/Queue/Table 403 errors when shared key access is disabled
  • Unhandled stream error from unguarded Azure API calls post-authentication
  • Blank ConnectionStatus for ExpressRoute VNet Gateway connections
  • Blank Load Balancer architecture diagram caused by a mismatched localization key

See CHANGELOG.md for full details.

Related Issue

N/A — aggregate release PR for v0.3.0 covering multiple previously discussed features and fixes.

Motivation and Context

Bundles the v0.3.0 feature set (new resource types, health checks, and diagram support) and accumulated bug fixes into a single release, bringing the module's coverage of Azure resource types up to date.

How Has This Been Tested?

  • Pester test suite updated with coverage for all new v0.3.0 report sections
  • All modified language files validated via Import-LocalizedData
  • Manual report generation smoke test against a live Azure tenant pending

Screenshots (if appropriate):

N/A

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have read the contributing documentation.

🤖 Generated with Claude Code

cse-gh and others added 28 commits April 23, 2026 17:38
Add a new Get-AbrAzNetAppFiles private function that documents Azure
NetApp Files (ANF) across the account, capacity pool, and volume
hierarchy, plus snapshot and backup policies. Modelled on the AVD
implementation: one consolidated function in Src/Private/ covering
every ANF resource type with InfoLevel-gated rendering and
health-check styling.

Resources covered:
- NetApp Accounts (with Active Directory join and encryption config)
- Capacity Pools (service level, QoS, size, allocation %, throughput)
- Volumes (protocol, quota, mount targets, export policy rules,
  snapshot/backup policy references, cool access tiering, SMB/NFS
  attributes, provisioning state)
- Snapshot Policies (hourly/daily/weekly/monthly schedules)
- Backup Policies (daily/weekly/monthly retention)
- Per-volume snapshots and quota rules at InfoLevel 4

Health checks (all gated by Healthcheck.NetAppFiles.<flag>):
- PoolCapacity: warning when sum of volume quotas > 85% of pool size
- AdHealth: warning when Active Directory join status != InUse
- SnapshotPolicy: info when a volume has no snapshot policy attached
- BackupProtection: info when a volume has no backup policy attached
- CustomerManagedKey: info when account uses platform-managed keys

Internationalization: GetAbrAzNetAppFiles string block added to all
five supported cultures (en-US, en-GB, es-ES, fr-FR, de-DE). Non-en-US
cultures currently mirror the English strings pending native
translations.

Orchestrator: register NetAppFiles in $DefaultSectionOrder and
$SectionFunctionMap. Default config adds NetAppFiles entries to
SectionOrder, InfoLevel (1), and HealthCheck with the five flags
enabled.

Documentation: README gains "NetApp Files" in the supported-resources
list, an entry in the InfoLevel table (default 1, max 4), and a
dedicated Healthcheck subsection. CHANGELOG records the addition
under [Unreleased].

Cmdlets consumed from Az.NetAppFiles: Get-AzNetAppFilesAccount,
Get-AzNetAppFilesPool, Get-AzNetAppFilesVolume,
Get-AzNetAppFilesSnapshot, Get-AzNetAppFilesSnapshotPolicy,
Get-AzNetAppFilesBackupPolicy, Get-AzNetAppFilesVolumeQuotaRule.

Validated with PSScriptAnalyzer (0 findings in new file) and the
existing Pester test suite (203/203 passing, including the
LocalizationData consistency checks across all five cultures).
Address PR #31 review feedback (tpcarman): use descriptive names instead
of single-letter / abbreviated loop variables.

  $Acct -> $NetAppAccount
  $P    -> $CapacityPool
  $V    -> $Volume
  $Mt   -> $MountTarget
  $S    -> $Snapshot
  $Qr   -> $QuotaRule
  $Pol  -> $Policy
  $Pols -> $Policies

Pure rename: 147 insertions / 147 deletions, no logic change.
PSScriptAnalyzer: 0 findings.
…en-GB spellings

Address PR #31 review feedback (tpcarman): the appended NetApp Files
localization block was previously placeholder English in non-en-US
cultures. Now properly translated.

- de-DE: 116 strings translated to German with umlauts/sharp-s
  (UTF-8 without BOM, matching the existing file's convention).
- es-ES: 116 strings translated to Spanish with full diacritics
  (UTF-8 without BOM, matching the existing file).
- fr-FR: 116 strings translated to French in pure ASCII, matching
  the existing file's accent-stripped convention (e.g. "resume",
  "cle", "strategie").
- en-GB: 7 spellings adjusted (summarizes -> summarises x5,
  Utilized -> Utilised, Organizational -> Organisational) to match
  the rest of the file's en-GB style.

Per project convention preserved across all non-en-US files,
"Yes"/"No" are kept untranslated. Azure-specific technical terms
(SMB, NFSv3, AES, LDAP, FQDN, Active Directory, Cool Access,
Kerberos, RBAC, etc.) are also kept in English.

Validation:
- All 5 Tests/LocalizationData.Tests.ps1 Pester tests pass
  (key consistency across en-US/en-GB/de-DE/es-ES/fr-FR).
- Import-LocalizedData round-trips cleanly for each culture
  with all 116 keys present.
Add support for Azure NetApp Files reporting
…scription sections

- Add Get-AbrAzManagementGroup to report full MG hierarchy with parent/child relationships and subscription counts
- Add Get-AbrDiagAzManagementGroup for optional hierarchy diagram (EnableDiagrams option) using AsBuiltReport.Diagram, sized for portrait page
- Add Test-AbrAzInfoLevelEnabled helper to gate per-subscription section rendering
- Fix empty subscription sections by checking resource existence per subscription before creating Heading3 section
- Add ManagementGroup InfoLevel and EnableDiagrams/DiagramTheme options to JSON config
- Add localization strings for Management Groups across all supported languages
- Add Management Group icons (management-groups.png, subscriptions.png, blank.png)
- Update README and CHANGELOG

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Resource Locks (CanNotDelete/ReadOnly) to Virtual Networks, Key Vaults,
  Recovery Services Vaults, Storage Accounts, Firewalls, Private DNS Zones,
  Route Tables, Virtual Network Gateways, Log Analytics Workspaces, and DDoS
  Protection Plans; displayed at InfoLevel 2 and above across all 5 languages
- Add reporting for Application Gateways, Data Collection Rules, DDoS Protection
  Plans, DNS Forwarding Rulesets, Maintenance Configurations, Network Watchers,
  Private DNS Zones, Public IP Addresses, Virtual Network Gateways, and VM Scale Sets
- Update minimum Az module dependency to 16.0.0
- Update CHANGELOG and README for v0.3.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Relocate all 55 private report functions into a Report/ subfolder to
separate report-generation functions from the Diagram/ subfolder. The
.psm1 already uses -Recurse so no module-load changes are required.
Update three Get-ChildItem calls in the Pester test suite that lacked
-Recurse and would have returned empty results after the move.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…d Identity support; fix storage account management-plane property mappings and empty subscription sections

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Location field to Get-AbrAzPrivateDnsZone InObj and summary table
- Add Location localization key to all language files (en-US, en-GB, de-DE, es-ES, fr-FR)
- Remove tests for ExternalModuleDependencies (AsBuiltReport.Core), IconUri, and diagram functions that do not apply to this module

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…t health check logic

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace single Get-AzRecoveryServicesAsrNetworkMapping -Fabric call with
a two-level loop: first enumerate ASR networks per fabric via
Get-AzRecoveryServicesAsrNetwork, then call
Get-AzRecoveryServicesAsrNetworkMapping with both -Fabric and -Network
parameters. The original single-parameter call silently returns nothing
on real Azure vaults as both parameters are required.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AsBuiltReport.Diagram is listed as a RequiredModule in the manifest but
was not installed on CI runners, causing the manifest to fail to parse.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pushes a tag prefixed with v* to create a draft release pre-populated
with the current version's CHANGELOG section, requiring manual publish
before PSGallery and social media jobs fire.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace exit 1 with a step output so the job completes green with
subsequent steps skipped rather than failing on non-main/master tags.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tication

Wrap Get-AzTenant, Get-AzLocation, and Get-AzSubscription calls in
try/catch so that transient HTTP stream failures (e.g. Error while
copying content to a stream) are caught and reported as warnings
rather than propagating as an unhandled exception that aborts the run.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ConnectionStatus is a server-computed IPsec tunnel health value that
Azure never populates for ExpressRoute connections (no IPsec tunnel
exists). Fall back to N/A instead of blank, and exclude N/A rows from
the connection status health check so ExpressRoute connections aren't
falsely flagged as unhealthy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Microsoft.Maintenance/maintenanceConfigurations does not expose a
provisioningState property in its ARM schema at any API version, so
the field could never be populated and always rendered blank. Removes
the dead Get-AzResource lookup workaround, the ProvisioningState
column/health check, and the corresponding config schema and
documentation entries.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Correct edge/Blankline calls to match actual PScribo cmdlet casing
(Edge, BlankLine) and remove stale hashtable alignment padding.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…pliance)

Identifies third-party NVAs (Palo Alto, Fortinet, Cisco, Check Point, F5,
Barracuda, SonicWall, Juniper, Riverbed) via Azure Marketplace image
publisher, with optional resource-tag fallback (Options.NvaTag) and a
configurable publisher list (Options.NvaPublishers). Summary table at
InfoLevel 1, per-NVA detail at InfoLevel 2, and associated UDR route
table cross-reference at InfoLevel 3. Deallocated NVAs are flagged by
the Status health check.

Localizes all report strings across en-US, en-GB, fr-FR, de-DE, and
es-ES, and documents the new InfoLevel, HealthCheck, and Options
(NvaPublishers, NvaTag) schema entries in README.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Several report sections added over past releases (NetworkVirtualAppliance,
MaintenanceConfiguration, DnsForwardingRuleset, VirtualNetworkGateway,
ApplicationGateway, DdosProtectionPlan, PublicIpAddress, NetworkWatcher,
VmScaleSet, DataCollectionRule, PrivateDnsZone, DesktopVirtualization,
NetAppFiles, and the Asr* trio) had never been added to the hardcoded
per-feature checks in the Private Functions and JSON Configuration
contexts, so a regression removing one of their InfoLevel/HealthCheck/
SectionOrder entries or private function file would have gone undetected.

Add existence checks for the missing private functions, InfoLevel keys,
and HealthCheck keys, and consolidate SectionOrder validation into a
single comprehensive list instead of checking 5 of 38 entries.

Remove the redundant "Verify new vX.X.X functions have localization"
block - those 13 checks duplicated the dynamic 'All Get-AbrAz* functions
should have localization sections' test one section above, which already
covers every Get-AbrAz* function (including future ones) without
per-release maintenance.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
GetAbrAzLoadBalancer's localization sections defined the alt-text key as
LoadBalancerImage instead of Image, the key the code actually references
via $LocalizedData.Image. Since PScribo's Image cmdlet requires -Text as
a mandatory parameter for the Base64Percent parameter set, binding it to
$null threw a parameter validation exception on every report run, caught
by the surrounding try/catch and surfaced as "Unable to display Load
Balancer image" instead of rendering the diagram.

Renamed the key to Image across all 5 language files to match the
convention used by every other section with an embedded diagram
(e.g. GetAbrAzBastion, GetAbrAzNetworkSecurityGroup).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 4.54545% with 105 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...rc/Public/Invoke-AsBuiltReport.Microsoft.Azure.ps1 0.00% 105 Missing ⚠️

📢 Thoughts on this report? Let us know!

…ends

Previously only matched the primary NIC's private IP, missing UDRs that
route to secondary NICs or to an Internal Load Balancer frontend IP
fronting an NVA HA pair.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@tpcarman
tpcarman merged commit feca495 into master Jul 13, 2026
10 checks passed
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.

3 participants