Manage routes Gateway lifecycle in extension workflows - #672
Conversation
Signed-off-by: willdavsmith <willdavsmith@gmail.com> Copilot-Session: 90bbcc1b-c1e4-49f6-ac53-261516d66bda
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
|
Changeset check skipped: this pull request is labelled |
There was a problem hiding this comment.
Pull request overview
Ports and documents the managed Gateway API (Contour/GatewayClass/Gateway/CRDs) lifecycle needed by the default Radius.Compute/routes recipe into the canonical ai-extensions workflow templates, including validation-only BYO Gateway behavior and fail-closed, ownership-safe cleanup after application deletion.
Changes:
- Add a new
manage-routes-gatewaycomposite action + shell implementation + hermetic shell test suite to ensure/cleanup Gateway API prerequisites on the target cluster. - Wire the new lifecycle into Azure/AWS deploy and application-delete provider workflows, and serialize these operations with a shared repo-wide concurrency group.
- Update Radius plugin skill docs, workflow-tree docs, and retire the temporary extension-tree parity live test, including a minor
radiuschangeset.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| plugins/radius/skills/radius-environment/SKILL.md | Documents new environment variables for managed/BYO routes Gateway policy. |
| plugins/radius/skills/radius-deploy/SKILL.md | Documents pre-deploy Gateway lifecycle ensure/validation and exposure policy. |
| plugins/radius/skills/radius-delete/SKILL.md | Documents post-delete ownership-safe Gateway cleanup behavior. |
| plugins/radius/skills/radius-app-bicep/SKILL.md | Clarifies that ingress evidence doesn’t authorize public exposure; exposure is env policy. |
| packages/core/test/support/live-github.ts | Updates live-test helper header comment after parity-test retirement. |
| packages/core/src/workflows/extension-parity.live.test.ts | Removes the temporary migration parity live test. |
| docs/design/2026-08-port-extension-workflows-to-ai-extensions.md | Updates design doc to reflect parity-test retirement and updated validation narrative. |
| .github/workflows/live-tests.yml | Stops running the removed parity live test; updates checkout rationale comment. |
| .github/extension/run-rad-commands-azure.yml | Adds concurrency + routes Gateway ensure step; updates target-kubeconfig handling. |
| .github/extension/run-rad-commands-aws.yml | Adds concurrency + routes Gateway ensure step; updates routes recipe source/params and target-kubeconfig handling. |
| .github/extension/delete-azure.yml | Adds concurrency + routes Gateway cleanup step after application delete; updates target-kubeconfig handling. |
| .github/extension/delete-aws.yml | Adds concurrency + routes Gateway cleanup step after application delete; updates target-kubeconfig handling. |
| .github/extension/delete-environment-azure.yml | Adds shared routes Gateway concurrency group for environment-delete lifecycle serialization. |
| .github/extension/README.md | Documents the new manage/cleanup behavior, exposure policy, and concurrency contract. |
| .github/extension/actions/manage-routes-gateway/action.yml | New composite action wrapper exposing ensure/cleanup inputs. |
| .github/extension/actions/manage-routes-gateway/routes-gateway.sh | New lifecycle implementation: detect routes + default recipe, ensure/validate infra, cleanup unused owned infra. |
| .github/extension/actions/manage-routes-gateway/routes-gateway_test.sh | New hermetic shell test suite covering detection, validation, managed/BYO paths, and workflow wiring. |
| .changeset/manage-routes-gateway-lifecycle.md | Minor changeset announcing managed routes Gateway lifecycle behavior. |
Suppressed comments (4)
.github/extension/run-rad-commands-azure.yml:75
- The pinned actions/checkout SHA is annotated as v7.0.1 elsewhere in this repo, but this template still labels it as v4. Align the version comment with the pinned SHA to avoid confusion during audits and updates.
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v4
.github/extension/run-rad-commands-aws.yml:75
- The pinned actions/checkout SHA is annotated as v7.0.1 elsewhere in this repo, but this template still labels it as v4. Align the version comment with the pinned SHA to avoid confusion during audits and updates.
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v4
.github/extension/delete-azure.yml:62
- The pinned actions/checkout SHA is annotated as v7.0.1 elsewhere in this repo, but this template still labels it as v4. Align the version comment with the pinned SHA to avoid confusion during audits and updates.
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v4
.github/extension/delete-aws.yml:62
- The pinned actions/checkout SHA is annotated as v7.0.1 elsewhere in this repo, but this template still labels it as v4. Align the version comment with the pinned SHA to avoid confusion during audits and updates.
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v4
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
nicolejms
left a comment
There was a problem hiding this comment.
Blocking concern: cleanup must distinguish confirmed absence from failed ownership or resource discovery before continuing destructive operations.
Copilot-Session: 90bbcc1b-c1e4-49f6-ac53-261516d66bda Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Copilot-Session: 90bbcc1b-c1e4-49f6-ac53-261516d66bda Signed-off-by: willdavsmith <willdavsmith@gmail.com>
Review(Posted as a regular comment — inline diff/review comments aren't available to me here, so all six points are listed together with file/line references.) 1. When the Gateway is made public, this sets 2. This pins 3. This workflow joins the shared routes-Gateway concurrency group but, unlike the app-delete workflows, it doesn't run a Gateway cleanup step. I think that's intentional (environment deletion goes through the per-app delete path, which already handles cleanup), but it isn't obvious from the code. Could you confirm, and maybe add a short comment here explaining why no cleanup step is needed? That prevents someone later from assuming it was accidentally left out. 4. Ownership is decided by reading a single annotation ( 5. The other deletes re-check ownership right before deleting each object, but this Helm uninstall relies on the 6. This checks for other users of the Contour controller by looking at Ingresses and Contour's custom resources, which is good. Just to be safe, could you confirm those object types are the only way something else could depend on this shared Contour install? If another workload could reference it some other way, we'd want to detect that too before removing it. |
Copilot-Session: 90bbcc1b-c1e4-49f6-ac53-261516d66bda Signed-off-by: willdavsmith <willdavsmith@gmail.com>
|
Addressed all six points in
Focused Gateway shell tests, ShellCheck, actionlint/YAML parsing, checkout-label checks, and |
There was a problem hiding this comment.
🟡 Changes recommended
Workflow parameter defaulting can mutate the environment before failing on misconfigured BYO Gateway variables, and the new action’s diagnostics omit the provided application context.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 18/18 changed files
- Comments generated: 3
- Review effort level: Lite
| # Resolve every Recipe source from deploy/manifest/defaults.yaml. | ||
| CONTAINERIMAGES_SOURCE="$(radius_contrib_kube_recipe_source Radius.Compute/containerImages containerimages)" | ||
| CONTAINERS_SOURCE="$(radius_contrib_resource_git_source Radius.Compute/containers recipes/kubernetes/terraform)" | ||
| PERSISTENTVOLUMES_SOURCE="$(radius_contrib_resource_git_source Radius.Compute/persistentVolumes recipes/kubernetes/terraform)" | ||
| ROUTES_SOURCE="$(radius_contrib_resource_git_source Radius.Compute/routes recipes/kubernetes/terraform)" | ||
| ROUTES_SOURCE="$(radius_contrib_kube_recipe_source Radius.Compute/routes routes)" |
| # The default routes recipe always receives a concrete Gateway reference. | ||
| # A separately-passed boolean tells the lifecycle action whether this is a | ||
| # user-owned Gateway or the Radius-managed default. | ||
| ROUTES_GATEWAY_NAME="${{ vars.RADIUS_ROUTES_GATEWAY_NAME || 'radius' }}" | ||
| ROUTES_GATEWAY_NAMESPACE="${{ vars.RADIUS_ROUTES_GATEWAY_NAMESPACE || 'radius-system' }}" |
| fail() { | ||
| echo "::error::$*" >&2 | ||
| exit 1 | ||
| } |
Summary
Radius.Compute/routesGateway lifecycle from Add managed Gateway lifecycle for routes radius#12854 at3aa81af42ae9a0f7d8413c6b3f6dc88c4a326726into the canonicalradius-project/ai-extensionsworkflow tree.Migration decisions
ai-extensionstemplates instead of copying stale Radius workflows, preserving the workflow migration from feat: host Repo Radius extension workflows in ai-extensions #424 and later changes.radius-project/ai-extensionsat{{RADIUS_REF}}; Radius remains referenced only for its intentionally Radius-owned catalog data.BackendTLSPolicy), Contour chart 0.1.0 / app 1.32.0, managed defaultsradius-system/radius, privateClusterIPexposure with an emptyexternalTrafficPolicy, controller andProgrammedreadiness, strict BYO preservation, null CLI-list handling, and ownership-safe cleanup.extension-selftests.ymlautomatic*_test.shdiscovery rather than obsoletebuild/test.mkwiring.Validation
pnpm run typecheck,pnpm run lint,pnpm run format:check,pnpm run coverage, andpnpm run buildContext
Addresses #421. This supersedes the obsolete implementation location in radius-project/radius#12854 after the extension workflow move. It is a fresh branch based on current
mainand does not modify or close #570 or radius-project/radius#12854.