Repository navigation
[Edge Action] Upgrade to stable 2026-10-01 API and preserve update compatibility - #10499
Jean Kim (kestry) wants to merge 6 commits into
Conversation
Preserve generic execution-filter updates while exposing version and header fields. Keep swap-default polling compatibility outside generated code. Add offline contract validation, expanded scenarios, and sanitized stable API recordings. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
/azp run |
There was a problem hiding this comment.
🟡 Changes recommended
Removing the released get-version-code --output-directory/-d option breaks existing download commands without a replacement customization.
1 open issue
What changed in this PR
Upgrades the Edge Action extension to stable API 2026-10-01, preserving generic updates and moving compatibility customizations outside generated code.
Changes:
- Updates generated API contracts, responses, and help examples.
- Adds execution-filter update arguments and swap-default polling compatibility.
- Expands offline tests, recording audits, sanitization, and maintenance documentation.
| File | Description |
|---|---|
| src/edge-action/README.md | Documents updates, generation ownership, and validation. |
| src/edge-action/azext_edge_action/tests/requirements.txt | Adds schema-validation dependency. |
| src/edge-action/azext_edge_action/tests/latest/test_edge_action.py | Expands lifecycle and update scenarios. |
| src/edge-action/azext_edge_action/tests/latest/test_edge_action_spec.py | Tests pinned contracts and recordings. |
| src/edge-action/azext_edge_action/tests/latest/test_edge_action_recording_processors.py | Tests sanitization and replay matching. |
| src/edge-action/azext_edge_action/tests/latest/test_edge_action_custom.py | Tests deployment and polling customizations. |
| src/edge-action/azext_edge_action/tests/latest/test_edge_action_contract.py | Adds offline command compatibility tests. |
| src/edge-action/azext_edge_action/tests/latest/spec_validation.py | Implements offline contract audits. |
| src/edge-action/azext_edge_action/tests/latest/spec_snapshot.json | Pins stable API schemas. |
| src/edge-action/azext_edge_action/tests/latest/recordings/test_edge_action_version_operations.yaml | Refreshes sanitized version lifecycle recording. |
| src/edge-action/azext_edge_action/tests/latest/recording_processors.py | Sanitizes recording headers, bodies, and URLs. |
| src/edge-action/azext_edge_action/custom.py | Adds update and polling customizations. |
| src/edge-action/azext_edge_action/commands.py | Registers customized commands. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_wait.py | Uses stable API for version waits. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_update.py | Updates API and tag-update example. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_swap_default.py | Aligns action with stable response contract. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_show.py | Uses stable version retrieval API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_list.py | Uses stable version listing API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_get_version_code.py | Updates retrieval contract; removes file-output handling. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_deploy_version_code.py | Deserializes full version deployment results. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_delete.py | Aligns stable deletion responses. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/version/_create.py | Uses stable version creation API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/execution_filter/_wait.py | Uses stable filter wait API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/execution_filter/_update.py | Updates API while retaining GET/PUT. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/execution_filter/_show.py | Uses stable filter retrieval API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/execution_filter/_list.py | Uses stable filter listing API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/execution_filter/_delete.py | Aligns stable filter deletion responses. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/execution_filter/_create.py | Uses stable filter creation API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/_wait.py | Uses stable resource wait API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/_update.py | Updates API and corrects help example. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/_show.py | Uses stable resource retrieval API. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/_list.py | Updates API and documents resource-group scope. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/_delete.py | Aligns stable resource deletion responses. |
| src/edge-action/azext_edge_action/aaz/latest/edge_action/_create.py | Uses stable resource creation API. |
Review effort: Balanced
|
Azure Pipelines: Successfully started running 2 pipeline(s). |
|
Azure Pipelines: There may be pipelines that require an authorized user to comment /azp run to run. |
|
/azp run |
|
Azure Pipelines: Successfully started running 2 pipeline(s). |
Restore get-version-code output-directory aliases through a regeneration-safe customization, add regression coverage, and prepare 1.0.0b5 release notes. Install per-extension test requirements before CI discovery while preserving existing behavior for extensions without a test manifest. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Updated in bf7cb17: HISTORY.rst now documents the customer-visible changes and setup.py advances to 1.0.0b5, retaining the beta designation. The get-version-code download compatibility fix is covered in the resolved inline thread. All five failing integration jobs had the same collection error: jsonschema was declared in the extension test requirements but never installed by the CI runner. The runner now installs each selected extension's test requirements before discovery; extensions without that file retain their existing command sequence. Three CI-runner regression tests cover both paths and fail-fast installation errors. No tests were skipped and no runtime dependency was added. Local validation: 227 offline extension tests and 3 CI-runner tests pass; style and index checks pass; the wheel builds. The earlier pipeline logs show all eight recorded scenarios passed on the original PR commit. The new commit still needs its CI rerun. |
|
/azp run |
|
Commenter does not have sufficient privileges for PR 10499 in repo Azure/azure-cli-extensions |
|
/azp run |
|
Azure Pipelines: Successfully started running 2 pipeline(s). |
Prevent generated-base argument loading from hiding customized flags in a fresh process. Preserve the original regression and cover both command load orders for download and execution-filter update schemas. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
The rerun confirms the dependency fix: all test modules now collect, and 234 of 235 tests passed, including all eight recorded scenarios. It exposed a cold-process AAZ cache issue that the earlier sequential local run masked: custom subclasses isolated _args_schema but inherited the generated class's separate _arguments_schema cache. Fixed in e8b3164 by isolating both caches for GetVersionCode and ExecutionFilterUpdate. The original failing assertion remains, with additional cold-cache tests covering both command load orders for both customizations. All five isolated schema tests and all 67 affected command tests pass locally. No assertions were removed or skipped. The completed breaking-change report for bf7cb17 also confirms the removed-parameter regression is gone; only the three intended optional execution-filter argument additions remain as warnings. The latest commit still needs its pipeline results. |
|
/azp run |
|
Azure Pipelines: Successfully started running 2 pipeline(s). |
X Engineering Agent ReportReview — Comments No confirmed actionable defects found at Reviewed stable API request/response mappings, preserved update fields and generic-update precedence, restored download options, deployment output, swap-default polling, generated/custom ownership boundaries, release metadata and help. Test validation
The coverage classification above is the deterministic report. Separately, the author-provided scenarios in The companion No tests or recording replays were executed during this review. Live service eligibility and sovereign-cloud availability remain unverified. The generation-source PR is valid and open; clean regeneration was not independently reproduced. Risk assessment — 73/100 · HighThe High rating is driven by public CLI behavior, dependency or supply chain, failure-handling behavior and 1 additional signal(s).
Posted by x-engineering-agent (Reviewer) |
|
aaz: Azure/aaz#1136 |
|
Jean Kim (@kestry) Please ensure that test changes are inline with guidelines set out in https://github.com/Azure/azure-cli/blob/dev/doc/authoring_tests.md. Scenario tests for the most part act as snapshot tests to ensure contracts are upheld. We shouldn't need to add additional steps and dependencies to CI for test facilitation. The changes in this PR look like a API version bump with the addition of some params added as customizations instead. We just need to ensure the existing scenario tests are re-recorded using |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
/azp run |
|
Azure Pipelines: Successfully started running 2 pipeline(s). |
|
JaysonTaiMicrosoft Addressed the test guidance in a7ca7b8. Removed the added Kept useful regression coverage while avoiding unrelated setup changes: GET/PUT field preservation, tag clearing, deployment/download content, and independent/combined/generic filter updates. All eight scenarios have fresh stable-API recordings. The three whose request flows changed were re-recorded again with The PR description now contains the exact validation commands/results and the durable source link to Azure/aaz#1136. Clean regeneration from that PR's source matched all 29 generated Python files. Fresh CI for this commit is running; the earlier head's green checks are not being used as evidence for this revision. |
Pin recorded upload fixture bytes and validate fractional timestamps consistently on Python 3.10. Retain strict request matching and spec validation without new dependencies. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Pushed 418a0a2 to fix the failures in build 364524:
The correction changes only tests, fixture metadata, and test documentation; no recordings, production/generated code, dependencies, or shared CI setup changed. The affected scenario passes playback; 188 offline tests and 77 subtests pass with For the still-visible older review findings: the added CI steps/dependencies were removed in a7ca7b8, and the PR description links Azure/aaz#1136 at 39a5b2f, with green metadata checks and the clean-regeneration result for all 29 generated files. The download-option thread remains resolved; standard unittest coverage is retained in Aditya Pujara (@a0x1ab) Could you rerun Azure Pipelines with |
There was a problem hiding this comment.
Jean Kim (@kestry) Ready for human review. See the X Engineering Agent Report.
|
/azp run |
|
Azure Pipelines: Successfully started running 2 pipeline(s). |
|
The rerun is green at 418a0a2: pipeline 364537 passed all five Python 3.10-3.14 integration/build jobs, and breaking-change pipeline 364538 passed with only the three intended optional execution-filter parameter additions. GitHub Actions checks also pass. The requested cross-platform playback is verified as well: the same upload cassette passes on Windows and Linux, and the complete Linux suite passed 196 tests and 77 subtests, including all eight scenarios, with network access disabled. No recordings or production behavior were changed to obtain these results. The nullable validationStatus and swapDefault final-response compatibility allowances remain covered. The latest review reports no actionable defects on this commit, and no inline threads remain unresolved. The PR description now includes the completed CI and Linux playback evidence. |
Keep the public README focused on installation and command behavior. Move generation, customization, and test guidance into a linked development guide and remove transient verification notes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
/azp run |
|
Azure Pipelines: Successfully started running 2 pipeline(s). |

🤖 PR Validation —⚠️ Review suggested
Upgrade the
edge-actionextension from the2025-09-01-previewAPI onmainto stable API2026-10-01, and advance the extension from1.0.0b4to1.0.0b5. The extension remains beta/preview; the stable service API does not change its release status.Changes from main
az edge-actioncommands for2026-10-01, align operation response contracts, deserialize the complete version resource returned by code deployment, and update command help/examples.--version-id,--execution-filter-identifier-header-name, and--execution-filter-identifier-header-valuearguments through a registered customization. Retain GET -> PUT, preserve omitted fields, and apply generic update operations after named arguments.--output-directory/-dargument and file-saving behavior out of generated code intocustom.py, registered throughcommands.py. The option is preserved, not removed. Retain directory creation, ZIP-byte saving, overwrite behavior, and{message, file}output; without the option, retain{name, content}. Report invalid content, unsafe filenames, and file-write errors.--no-waitbehavior and propagation of failed/canceled operations.README.mdand release notes inHISTORY.rst; add a linkedDEVELOPMENT.mdfor generation, customizations, testing, and recording maintenance.Compatibility and scope
--is-default-versionoption. Useversion swap-defaultto change the default version; no new version-update mutation is introduced.cdn edge-actioncommand group.src/index.jsonedits. Spec checks use the Python standard library; recording loading uses the existing PyYAML dependency.Generated source: Azure/aaz#1136, commit
39a5b2f0d3e6dc7fbc971b3c196dd88044f3ac8f, contains the command models and examples. A clean temporary CLI regeneration matched all 29 generated Python files after normalizing filesystem line endings. Historical preview models and attachment entries are retained in the companion AAZ changes.Spec-validation boundary: the offline snapshot is pinned to
Azure/azure-rest-api-specscommit9d29928794867148db0aed101144d14b2876e3a1. The validator implements the pinned Swagger's supported constraints and rejects unsupported constraints/formats explicitly; it is not a general JSON Schema implementation. Test-only compatibility allowances cover nullable version-responsevalidationStatusand swap-default final polling responses. Initial response contracts, other operations, and API-version checks remain strict. Polling and scenario tests separately assert successful completion and failure propagation.This checklist is used to make sure that common guidelines for a pull request are followed.
Related command
az edge-action,az edge-action version, andaz edge-action execution-filter, especiallyaz edge-action execution-filter update,az edge-action version get-version-code, andaz edge-action version swap-default.General Guidelines
azdev style <YOUR_EXT>locally? (pip install azdevrequired)python scripts/ci/test_index.py -qlocally? (pip install azdevrequired)Current-head CI: all executed checks pass at
d429b0ab1b2e9476861c0e16e94094e3ef4843e7; the conditionalskip-version-caljob is skipped. Integration/build pipeline 364634 passes, including Python 3.10-3.14 jobs. Breaking-change pipeline 364635 passes; its report identifies only the three intended optional execution-filter parameter additions.Local validation commands and results
Commands below were run from the repository root in the activated development environment. Full scenario/linter/index validation was performed at
a7ca7b8bc; the offline suite, affected upload playback, style, and full Linux suite were validated at418a0a2f9. Current headd429b0ab1changes only documentation relative to that tested runtime/test content. Local functional tests were not rerun for the documentation or PR-description edits; current-head CI results are linked above.The complete offline run also passed with
jsonschemaimports deliberately blocked, confirming no dependency on that package. The guard exists only in this test-launch command:Full Linux playback used the official Azure CLI image (CLI 2.91.0, Python 3.12.14; digest
sha256:933eb8dcb81aecb6f77e03c5b8660f0a1dfa9e1d16525763a27f86ff3b83a044), a Git export withcore.autocrlf=false, and existing test dependencies restored offline. The disposable container ran with--network noneandAZURE_TEST_RUN_LIVE=false:Coverage boundary: the 33 entries not counted by the scenario argument report comprise 26 CLI-wide
--change-reference/--acquire-policy-tokenoccurrences and seven local arguments covered by unit tests:--output-directoryand--max-items/--next-tokenon all three list commands. No exclusions inflate coverage, and 100% live argument coverage is not claimed.Generation check:
aaz-dev cli regenerate -a C:\wcodebase\repos\aaz -e "$scratch" --name edge-actionpassed against a temporary archived CLI export using AAZ commit39a5b2f0d3e6dc7fbc971b3c196dd88044f3ac8f; all 29 generated Python files matched. The working checkouts were not rewritten.The pre-push hook was bypassed because it can default to rebasing the separate Azure CLI checkout. Functional validation was run explicitly as documented above; no rebase was performed.
For new extensions:
Not applicable: this updates an existing extension.
About Extension Publish
There is a pipeline to automatically build, upload and publish extension wheels.
Once your pull request is merged into main branch, a new pull request will be created to update
src/index.jsonautomatically.You only need to update the version information in file setup.py and historical information in file HISTORY.rst in your PR but do not modify
src/index.json.