Azure IPAM v4.0.0 Release #377
Open
DCMattyG wants to merge 169 commits into
Open
Conversation
…tion for Azure IPAM
…that were not being accounted for properly
…ue to improper handling of missing vNETs and vHUBs
…DataGrid component
Update-AzADApplication/Get-AzADApplication were called with -ApplicationId (AppId), forcing an AppId->ObjectId lookup in Microsoft Graph that can fail right after app creation due to replication delay, surfacing as "Cannot bind argument to parameter 'Id' because it is an empty string." Switch to -ObjectId ($app.Id), the native replication-safe key, fixing CI deploy failures on newer Az/Microsoft.Graph module versions.
Add `if: always()` to the Upload Logs step so failure logs are captured alongside successful runs. Fall back to a "FAILED" suffix when ipamSuffix is empty and skip upload gracefully when no log files exist, so a failed deploy surfaces its real error instead of a secondary log-upload error.
The Engine App references the newly created UI App's AppId as a Known Client Application. Microsoft Graph intermittently rejects this with "Property api.knownClientApplications is invalid." when the UI App has not yet replicated. Poll Get-AzADApplication until the UI App is discoverable (up to 60s) before creating the Engine App.
Newly created app registrations are not immediately discoverable in
Microsoft Graph due to replication delay, causing intermittent failures:
- Engine App creation rejecting the UI App as a Known Client Application
("Property api.knownClientApplications is invalid.")
- Updating the Engine API endpoint failing with "Resource '<id>' does
not exist or one of its queried reference-property objects are not
present."
Poll Get-AzADApplication for both the UI App and Engine App (up to 60s
each) until they are discoverable before referencing/updating them.
…to a retry helper Replace the propagation-wait polling loops and per-operation retry blocks with a single silent Invoke-WithGraphRetry helper. Retry the actual Graph operations (engine app create, API endpoint update, UI/engine SP creation) rather than polling a proxy read, closing the time-of-check/time-of-use gap. Keep the idempotent SP existence checks; surface only the net result.
Route the UI resource access update, post-create app/SP reads, engine secret creation, and admin-consent SP fetches through Invoke-WithGraphRetry to absorb replication delay at every point a freshly-created AD object is referenced.
Construct the shared aiohttp TCPConnector/ClientSession lazily in the SHARED_TRANSPORT property instead of at import time. Newer aiohttp requires a running event loop when these are created; building them during module import (before uvicorn starts the loop) raised "no running event loop" and crash-looped the engine on startup.
Get-AzADServicePrincipal returns $null without throwing when a freshly created service principal has not yet replicated, so Invoke-WithGraphRetry never retried and admin consent failed with "Invalid clientId:" (empty). Throw on an empty result so the retry loop engages until the SP is visible.
Build the shared CosmosClient and its ManagedIdentityCredential lazily via get_cosmos_client(), and create the shared aiohttp transport lazily in globals.SHARED_TRANSPORT. Constructing these at import (in helper.py's module scope, before uvicorn started the event loop) created an aiohttp ClientSession/TCPConnector with no running loop, crash-looping the engine under newer aiohttp. All Azure async clients are now instantiated on first use within a running loop; main.py and the routers already did so.
…rincipals New-MgOauth2PermissionGrant runs against the Microsoft Graph endpoint, which may not yet have a freshly created service principal that Az (ARM) already returned, causing "Specified resourceId was not found". Wrap the grant calls in Invoke-WithGraphRetry so admin consent tolerates cross-service replication lag.
Replace the fixed 5s delay in Invoke-WithGraphRetry with capped exponential backoff plus jitter (BaseDelaySeconds * 2^(attempt-1), capped at MaxDelaySeconds, scaled by a random factor). This tolerates both fast and slow Azure AD replication and avoids synchronized retries from concurrent callers stampeding a throttled endpoint. Retry-on-any-error behavior is unchanged; errors are deliberately not classified by message text.
Piping Get-AzADApplication output into Remove-AzADApplication bound the object's directory ObjectId onto -ApplicationId under Az.Resources 9.1.0, so Graph looked the ObjectId up as a client AppId and failed with "Resource 'Application_<id>' does not exist" despite the app existing. Remove by explicit -ObjectId to avoid the parameter-binding ambiguity.
Drop the LoadingButton import from @mui/lab and update the commented-out WIP usages in DialogActions to use Button instead, since @mui/material's Button now supports the `loading` prop natively.
…skipping explicit Service Principal removal.
Ran `npx @mui/codemod@latest deprecations/dialog-props src`. manageEndpoints.jsx is the only real migration; Table.jsx and newReservation.jsx are cosmetic recast reformatting.
…I v9)
Ran `npx @mui/codemod@latest deprecations/menu-props src` to convert
MenuListProps -> slotProps.list (generator.jsx, DataGrid.jsx).
The codemod doesn't handle Menu's PaperProps even though v9 removed it,
so migrated the 5 remaining sites manually to slotProps.paper:
- drawer.jsx (2x)
- manageEndpoints.jsx
- space.jsx
- block.jsx
Verified no PaperProps={ usages remain in src/ and no lint errors.
Ran `npx @mui/codemod@latest deprecations/tooltip-props src`. Touched InfoCellRenderer.jsx and admin.jsx — both purely mechanical PopperProps -> slotProps.popper conversions.
Ran `npx @mui/codemod@latest deprecations/autocomplete-props src`,
touching 11 files. Verified against the v9 Autocomplete API:
- componentsProps -> slotProps
- ListboxProps -> slotProps.listbox
- PopperComponent -> slots.popper
- renderInput's <TextField InputProps={...params.InputProps}>
-> <TextField slotProps={{...params.slotProps, input: {...}}}>
Ran `npx @mui/codemod@latest deprecations/text-field-props src`. Affected 10 files: - TextField inputProps -> slotProps.htmlInput - TextField InputProps -> slotProps.input The 2 remaining inputProps usages on OutlinedInput are intentionally left alone — OutlinedInput still accepts inputProps in v9.
settings.jsx imported `Unstable_Grid2 as Grid` from @mui/material,
which v9 removed (the new Grid IS the former Grid2). The v7.0.0/grid-props
codemod looks for named imports of `Grid`, not aliased `Unstable_Grid2`,
so this had to be done manually.
- Import: Unstable_Grid2 as Grid -> Grid
- <Grid xs={N}> -> <Grid size={{ xs: N }}>
Ran `npx @mui/codemod@latest v9.0.0/system-props src`, touching 23 files. For Box/Stack/Typography/Link/Grid/DialogContentText components, props like display, alignItems, justifyContent, position, top/left/right/bottom, mt/mb/ml/mr, etc. have been moved from component-level props into the sx prop. Typography palette tokens (e.g. color="textSecondary") were correctly preserved per the v9 API.
…I v9) The menu-props codemod doesn't recurse into Select's nested MenuProps, so this had to be done manually per the v9 migration guide.
- Consolidated `styled`, `createTheme`, `ThemeProvider` into one import from `@mui/material/styles` (replaces direct `@mui/system` dep). - Rewrote v4-era `overrides:` block as v9 `components.MuiCircularProgress.styleOverrides`, restoring the original rounded/thicker progress-circle styling that has been silently disabled since v5. - Dropped the dead `MuiLinearProgress` overrides — no `<LinearProgress>` is rendered inside this ThemeProvider's subtree.
v9 removed 23 legacy icon exports that ended with `Outline` (no 'd'). Renamed all in-use ones to their `Outlined` counterparts: - DeleteOutline -> DeleteOutlined (4 files) - ErrorOutline -> ErrorOutlined (reservations.jsx) - PieChartOutline -> PieChartOutlined (block.jsx) For aliased imports (e.g. `DeleteOutline as DeleteOutlineIcon`), only the imported name was changed; usage sites kept their local alias.
Upgrades all workflow actions to address the Node.js 20 deprecation warning and align with the latest available versions: - actions/checkout v4 -> v6 - actions/setup-node v4 -> v6 - actions/setup-python v5 -> v6 - actions/github-script v7 -> v9 - actions/create-github-app-token v2 -> v3 - azure/login v2 -> v3 - hadolint/hadolint-action v3.1.0 -> v3.3.0
…plugin-react-hooks@7 React Compiler 1.0 consolidated its lint rules into eslint-plugin-react-hooks@^7; the standalone eslint-plugin-react-compiler package is deprecated and pulled in the deprecated @babel/plugin-proposal-private-methods as a transitive dependency. * Swap eslint-plugin-react-compiler@19.1.0-rc.2 for eslint-plugin-react-hooks@7.1.x * Adopt reactHooks.configs.flat['recommended-latest'] preset * Disable react-hooks/set-state-in-effect (preserves prior incremental-cleanup stance) * Move ref-during-render assignments in refresh.jsx into useEffect (react-hooks/refs) * Suppress per-line known intentional patterns in DataGrid, manageEndpoints, peering
Hadolint v3.3.0 bundles a newer hadolint binary that newly enforces DL3041 (pin dnf install package versions). This mirrors the existing DL3008 suppression for apt — OS package version pinning makes base-image rebuilds brittle since distro repos don't retain old patch versions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
forwardRefwrappers (ref-as-prop), removal ofPropTypes, explicitnullforuseRef()calls, and migration ofLoadingButtontoButton@azure/msal-browser4.x → 5.x,@azure/msal-react3.x → 5.x): Removed obsolete config, consolidated event types, fixed silent token timeout recovery (timed_outerror code), and prevented iframe fallback timeout loopsag-grid-community/ag-grid-react35.x): Complete migration to AG Grid including centralizedDataGridcomponent, custom styling, column state persistence, unified data loading overlays, and custom cell renderers (drill-down, info, progress)vite7.x → 8.x,@vitejs/plugin-react5.x → 6.x): Migrated to Vite 8 which replaces Rollup with Rolldown and esbuild with Oxc for bundling, transforms, and minification. Removedvite-plugin-eslint2(redundant with editor-based linting and incompatible with Vite 8)@eslint-react/eslint-pluginv5,eslint-plugin-react-hooksv7 — which now consolidates the React Compiler lint rules per the React Compiler 1.0 release), replacingeslint-plugin-react. Addeddist/ignore, fixedno-useless-assignmentviolations, and removed unusedeslint-plugin-jest. Resolved all remaining lint warnings as part of the React 19 modernization —useContext→use,<Context.Provider>→<Context>, ref naming conventions, stable list keys, hoisted static styled components, migration ofSnackbarUtilsto notistack's standaloneenqueueSnackbar, and moved "ref assigned during render" patterns intouseEffect@mui/material7.3.x → 9.0.x,@mui/icons-material7.3.x → 9.0.x): Major two-version jump. Migrated deprecated component props to the unifiedslots/slotPropsAPI (largely via@mui/codemod), moved deprecated system props intosx, replaced the removedUnstable_Grid2with the new defaultGrid(usingsize={{ xs: N }}), renamed removedOutline(no "d") icon exports to theirOutlinedcounterparts, and removed@mui/lab(no longer needed —LoadingButton'sloadingprop is now native toButton)Engine & Backend
msal,azure-common,azure-keyvault-secrets, andsix; addedazure-mgmt-resource-subscriptionsto address Azure SDK module separationpyproject.tomlwith Ruff linter configuration (pycodestyle, pyflakes, isort). Resolved all lint violations across 18 engine files — bare except clauses, wildcard imports replaced with explicit names, unused imports/variables, invalid escape sequences, import sorting and groupingUI & UX Improvements
AuthHandlerfor MSAL error handling, centralized token acquisition viatokenServiceDraggablePapercomponent: Replacedreact-draggablepackage with a purpose-built componentDataGridandConfigureGridcomponents with shared filter utilities, consistent loading overlays, and AG Grid custom styling (brightnessfilter for row hover)Deployment, Build & Infrastructure
ADD→COPY, JSON notation forCMD/ENTRYPOINT,pipefailfor pipedRUNcommands). Added centralized.hadolint.yamlfor rule suppressionscheckout@v6,setup-node@v6,setup-python@v6,github-script@v9,create-github-app-token@v3,azure/login@v3,hadolint-action@v3.3.0) to address the Node.js 20 runner deprecationGet-AzAccessTokenbreaking changes (fixes Breaking changes to Get-AzAccessToken #343); updated deploy & migrate scriptsDocumentation Overhaul
.markdownlint.jsonconfigurationExamples
examples/scripts/folder with new helper scripts and READMETesting
Bug Fixes
Get-AzAccessTokenbreaking changes not accounted for[major]