Skip to content

Azure IPAM v4.0.0 Release #377

Open
DCMattyG wants to merge 121 commits intomainfrom
ipam-3.7.0
Open

Azure IPAM v4.0.0 Release #377
DCMattyG wants to merge 121 commits intomainfrom
ipam-3.7.0

Conversation

@DCMattyG
Copy link
Contributor

@DCMattyG DCMattyG commented Mar 11, 2026

Azure IPAM v4.0.0

This is a major release that delivers significant framework upgrades, a data grid migration, authentication modernization, comprehensive documentation overhaul, revamped examples, and numerous bug fixes.


Major Framework & Dependency Upgrades

  • React 18 → 19: Full migration including removal of forwardRef wrappers (ref-as-prop), removal of PropTypes, explicit null for useRef() calls, and migration of LoadingButton to Button
  • MSAL v4 → v5 (@azure/msal-browser 4.x → 5.x, @azure/msal-react 3.x → 5.x): Removed obsolete config, consolidated event types, fixed silent token timeout recovery (timed_out error code), and prevented iframe fallback timeout loops
  • Inovua React Data Grid → AG Grid (ag-grid-community / ag-grid-react 35.x): Complete migration to AG Grid including centralized DataGrid component, custom styling, column state persistence, unified data loading overlays, and custom cell renderers (drill-down, info, progress)
  • Vite 7 → 8 (vite 7.x → 8.x, @vitejs/plugin-react 5.x → 6.x): Migrated to Vite 8 which replaces Rollup with Rolldown and esbuild with Oxc for bundling, transforms, and minification. Removed vite-plugin-eslint2 (redundant with editor-based linting and incompatible with Vite 8)
  • ESLint 10: Upgraded from ESLint 9 to 10 with modern React linting plugins (@eslint-react/eslint-plugin, eslint-plugin-react-compiler), replacing eslint-plugin-react and eslint-plugin-react-hooks. Added dist/ ignore, fixed no-useless-assignment violations, and removed unused eslint-plugin-jest
  • Updated NPM packages across the board (Vite 7.3.x, React Router 7.13.x, MUI 7.3.x, etc.)

Engine & Backend

  • Azure Function Blueprints: Implemented Blueprint-based function naming for improved clarity
  • Python dependency cleanup: Removed msal, azure-common, azure-keyvault-secrets, and six; added azure-mgmt-resource-subscriptions to address Azure SDK module separation
  • Reservation logic hardening: Fixed CIDR overlap detection during auto-fulfillment, added validation for all in-block vNet prefix overlap checks, and made auto-fulfillment idempotent by deduping existing block vNet associations
  • Endpoint fix: Standalone NICs are now included in the Endpoint list (fixes Standalone NICs not listed in Endpoint node #371)
  • Network associations fix: Resolved improper handling of missing vNETs and vHUBs (fixes Error fetching available IP Block networks #350)

UI & UX Improvements

  • Drill-down navigation in Discover (fixes Navigation Improvements #183): Added hierarchical drill-down with multi-filter pass-through and hidden column auto-reveal when filters are active
  • Centralized authentication handling: New AuthHandler for MSAL error handling, centralized token acquisition via tokenService
  • Custom DraggablePaper component: Replaced react-draggable package with a purpose-built component
  • Associations UX: Shifted API work to Redux thunks, optimized data refresh, fixed infinite update loops by separating initial grid selection from user selection state
  • Planner data loading: Addressed issue where Planner would not load when data was incomplete (fixes Planner will not load #366)
  • Reservation UX: Fixed view reversion after cancelling a Reservation, fixed column sorting, and streamlined the interface
  • Unified grid experience: Centralized DataGrid and ConfigureGrid components with shared filter utilities, consistent loading overlays, and AG Grid custom styling (brightness filter for row hover)
  • Search bar: Fixed messaging when no resources are found in Azure IPAM scope

Deployment, Build & Infrastructure

  • RHEL images updated to UBI9
  • Dockerfiles optimized: Improved layering, removed unneeded steps across all container images
  • KeyVault Soft Delete added to deployment and migration Bicep templates (fixes Enable soft delete for Key Vault #373)
  • Build flexibility: Added support for building with either current or latest NPM/Python packages
  • CI/CD path exclusions: Added exclusions to avoid unnecessary test/build runs for documentation-only changes
  • Azure PowerShell SDK v14 compatibility: Fixed Get-AzAccessToken breaking changes (fixes Breaking changes to Get-AzAccessToken #343); updated deploy & migrate scripts

Documentation Overhaul

  • Massively revamped How-To docs: authentication, exclusions, Discover, Reservations, External Networks, and Virtual Network Associations sections
  • New documentation: Comprehensive automation docs, API docs for vNet Associations, initial External Networks docs, detailed Reservations feature docs
  • 50+ screenshots added or replaced to reflect the current UI
  • Fixed all markdown warnings/errors and added .markdownlint.json configuration
  • Doc cleanup: Fixed stale links, grammar, spelling issues, deprecated folder descriptions, and undocumented switches across all sections

Examples

  • Terraform example revamped: Migrated from Shell scripts to the official Azure IPAM Terraform provider
  • Azure ESLZ example modernized: Updated resource API references, modern coding standards, and improved parameterization
  • Script examples reorganized: PowerShell and Shell scripts moved into a dedicated examples/scripts/ folder with new helper scripts and README
  • Token helper function: Standardized access token generation; removed legacy Microsoft Graph SDK v1 support

Testing

  • Added tests for Virtual Network Association permutations
  • Expanded overall testing coverage with numerous additional Pester tests
  • Updated test expectations to align with additionally created resources

Bug Fixes

[major]

…that were not being accounted for properly
…ue to improper handling of missing vNETs and vHUBs
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR is a major Azure IPAM v4.0.0 release spanning UI modernization (React/MSAL/AG Grid), backend/auth hardening, deployment updates, examples, and extensive documentation refresh.

Changes:

  • UI: React 19 + MSAL v5 migration, centralized token acquisition (tokenService) + new AuthHandler, AG Grid migration with shared grid wrappers/utilities.
  • Engine/infra: Added standalone NIC discovery, hardened reservation/network association logic, enabled Key Vault soft delete in templates, updated Dockerfiles/base images.
  • Docs/examples: Large documentation overhaul plus new/updated Bash/PowerShell/Terraform/Bicep examples.

Reviewed changes

Copilot reviewed 128 out of 188 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
ui/src/features/analysis/visualize/visualize.jsx Ref handling changes in search component
ui/src/features/analysis/peering/peering.jsx Ref handling changes in search component
ui/src/features/ipam/ipamSlice.jsx Added replaceBlockNetworksAsync thunk and reducers
deploy/deploy.ps1 Added Get-AccessToken helper and updated token usage
deploy/update.ps1 Added Get-AccessToken helper and updated token usage
migrate/migrate.ps1 Added Get-AccessToken helper and updated token usage
ui/src/features/DiscoverTable/Utils/ProgressCellRenderer.jsx New AG Grid progress cell renderer
Comments suppressed due to low confidence (2)

ui/src/features/analysis/visualize/visualize.jsx:567

  • Search is no longer wrapped in React.forwardRef, but it still relies on useImperativeHandle(ref, ...) and is used as <Search ref={searchRef} ... />. In React, ref is not passed as a normal prop to function components, so this will leave ref undefined and break searchRef.current.* calls (e.g., getValue(), hasValue()). Restore React.forwardRef((props, ref) => ...) (or rename the prop to something like searchRef and pass it explicitly) so the imperative handle is wired correctly.
    ui/src/features/analysis/peering/peering.jsx:664
  • Search is no longer wrapped in React.forwardRef, but it still uses useImperativeHandle(ref, ...) and is rendered as <Search ref={searchRef} ... />. Since ref is not delivered as a normal prop to function components, the imperative methods (clearSearch(), hasValue(), etc.) won’t be exposed and searchRef.current usage will break. Convert Search back to React.forwardRef((props, ref) => ...) (or pass an explicitly named ref prop) to make the imperative handle work.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 128 out of 188 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

ui/src/features/analysis/visualize/visualize.jsx:567

  • Search is no longer wrapped in React.forwardRef, but it still calls useImperativeHandle(ref, ...) and the parent uses <Search ref={searchRef} />. In React, ref is not passed as a normal prop, so ref here will be undefined and searchRef.current will stay null (breaking getValue()/hasValue() calls and potentially crashing effects that dereference it). Convert Search back to React.forwardRef((props, ref) => ...) (or rename to an explicit prop like innerRef and update callers) so the imperative API works.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 129 out of 189 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

ui/src/features/analysis/visualize/visualize.jsx:553

  • Search is no longer wrapped in React.forwardRef, but it still tries to receive ref via props and uses useImperativeHandle(ref, ...). In React, ref is not passed as a normal prop to function components, so searchRef will never be wired up and the imperative API (getValue, hasValue, etc.) will be broken (and can also cause warnings like “Function components cannot be given refs”). Convert Search back to React.forwardRef (accepting ref as the 2nd arg) and remove ref from the props destructuring.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 129 out of 189 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (2)

ui/src/features/analysis/visualize/visualize.jsx:553

  • Search is no longer wrapped in React.forwardRef, but it still relies on a ref argument (useImperativeHandle(ref, ...)). In React, ref={searchRef} is not passed as a normal prop, so ref will be undefined here and searchRef.current will never get the imperative API (breaking calls like searchRef.current.hasValue() / getValue()). Convert Search back to React.forwardRef((props, ref) => ...) (or rename to an explicit prop like innerRef and pass it manually).
    ui/src/features/analysis/peering/peering.jsx:654
  • Search is defined as a normal component that destructures { ref, ... }, but it's used as <Search ref={searchRef} /> and calls useImperativeHandle(ref, ...). React does not pass ref through props unless the component uses React.forwardRef, so searchRef.current.setValue/clearSearch/... will break at runtime. Restore React.forwardRef for Search (or pass a differently named prop like innerRef).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants