You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Flaky test: Run upgrade-noncloud functional tests: An unknown error was returned while testing Radius API status 503 #11841
A project maintainer will review this issue and get back to you soon.
We also welcome community contributions! If you would like to pick this item up sooner and submit a pull request, please visit our contribution guidelines and assign this to yourself by commenting "/assign" on this issue.
For more information on our triage process please visit our triage overview
changed the title [-]Flaky test: Run upgrade-noncloud functional tests[/-][+]Flaky test: Run upgrade-noncloud functional tests: An unknown error was returned while testing Radius API status 503[/+]on May 29, 2026
👍 We've reviewed this issue and have agreed to add it to our backlog. Please subscribe to this issue for notifications, we'll provide updates when we pick it up.
We also welcome community contributions! If you would like to pick this item up sooner and submit a pull request, please visit our contribution guidelines and assign this to yourself by commenting "/assign" on this issue.
For more information on our triage process please visit our triage overview
Recurring data + proposed fixes — Test_PreflightContainer timing/readiness flake
Adding fresh evidence and concrete fix proposals to this existing flake. Same test and same failure family as the original report (control-plane readiness / helm --wait timeout).
Recent evidence (June 2026)
functional-test-noncloud.yaml on main: 4 of the last 8 runs failed; at least 2 on the upgrade-noncloud leg (runs 28102985422, 28062964410).
Both subtests flake depending on which one loses the timing race:
main run 28102985422: Test_PreflightContainer/**Enabled** failed (143.4s)
PR run 28137799045: Test_PreflightContainer/**Disabled** failed (189.5s)
The /Disabled failure at ~189s ≈ just over the 3m helm --wait timeout, which points at install/upgrade readiness rather than assertion logic — consistent with the originally-reported 503 "Control plane did not become available within timeout".
Root-cause factors
In test/functional-portable/upgrade/upgrade_test.go:
helmTimeout = "3m" is too tight. A cold kind cluster installing the full chart (ucp, applications-rp, dynamic-rp, controller, DE, contour) under --wait regularly approaches or exceeds 3m on shared CI runners.
Aggregated API 503 race. After helm upgrade, the UCP aggregated APIService briefly returns 503 while pods roll; waitForControlPlane can construct the management client during that window.
Fixed time.Sleep(5 * time.Second) negative check in testPreflightDisabled is a race — it asserts "no preflight Job" after an arbitrary 5s rather than synchronizing on helm upgrade --wait completion.
apiServiceDeregistrationWait = 3s fixed sleep in cleanupAndWait is likewise arbitrary versus polling actual APIService deregistration.
Proposed fixes
Bump helmTimeout to 5–6m (largest single lever).
In waitForControlPlane, poll the UCP APIServiceAvailable=True condition (and treat 503 as retryable) before building the management client.
Replace the 5s sleep in /Disabled with a deterministic wait on helm upgrade --wait completion, then a single Job Get (the upgrade completing is the correct synchronization point).
Replace cleanupAndWait's fixed 3s deregistration sleep with polling the APIService list until the Radius-owned entry is gone.
This flake is still active on main after the June mitigations in #12245 were merged.
Fresh evidence
main run 32407484384, SHA 2ba622f8dc8f55b86f7bd9fdf53fdacfa5e4045e: Test_PreflightContainer/Disabled failed after about 5 minutes with HTTP 503 service unavailable and Control plane did not become available within timeout.
This is unrelated to #12746: that PR changes only workflow templates, their structural shell test, build wiring for that test, and documentation. More importantly, main itself fails at the PR's exact merge base with the same signature.
Recent scheduled history also remains meaningfully flaky: 4 of the latest 10 main runs of Functional Tests (with Non-Cloud Resources) failed as of this check.
What this tells us about the merged mitigation
#12245 is present in the failing revision (98f5623de9f660301880ea95c775210a92afcb2b is an ancestor). The current test already has:
helmTimeout = "5m"
controlPlaneTimeout = 4 * time.Minute
retry handling in waitForControlPlane
polling for APIService deregistration
The failure therefore survives the previously proposed timeout increases and fixed-sleep replacements. It is not just the old 3-minute Helm timeout.
The next investigation should capture why the aggregated UCP APIService remains unavailable for the full readiness window: APIService conditions, backing Service/EndpointSlices, and UCP pod status/events/logs at timeout. Without those diagnostics, another timeout increase would only mask the underlying unavailable backend and make the flaky leg slower.
I searched open issues and PRs before adding this update. There is no open PR referencing this issue or changing helmTimeout, waitForControlPlane, or apiServiceDeregistrationWait. #12163 remains open as a broader proposal to reclassify this as serial integration/E2E coverage, but it does not currently provide a fix for the 503.
Closing following an issue audit against Radius main at ec97901 and the current referenced implementations.
The August comment correctly rules out closing on #12245's timeout/sleep mitigations alone. Later merged #12785 addresses the actual boundary: UCP must be listening before entering Service endpoints, and a mandatory Helm hook verifies the aggregated API through kube-apiserver before installation/upgrade succeeds. Its live validation reproduced the original 503 without the hook and passed the unchanged upgrade test with it. Merged #12790 then removes the fragile parallel readiness check and installs once before sequential enabled/disabled scenarios. Both fixes are present in the baseline, providing stronger exact evidence than the earlier partial mitigation.
Activity
radius-triage commentedon May 8, 2026
👋 @sk593 Thanks for filing this issue.
A project maintainer will review this issue and get back to you soon.
We also welcome community contributions! If you would like to pick this item up sooner and submit a pull request, please visit our contribution guidelines and assign this to yourself by commenting "/assign" on this issue.
For more information on our triage process please visit our triage overview
[-]Flaky test: Run upgrade-noncloud functional tests[/-][+]Flaky test: Run upgrade-noncloud functional tests: An unknown error was returned while testing Radius API status 503[/+]willdavsmith commentedon May 29, 2026
A 503 error is usually a platform issue or transient issue, but in this case, it happens too frequently to be so. We should take a closer look.
radius-triage commentedon Jun 15, 2026
👍 We've reviewed this issue and have agreed to add it to our backlog. Please subscribe to this issue for notifications, we'll provide updates when we pick it up.
We also welcome community contributions! If you would like to pick this item up sooner and submit a pull request, please visit our contribution guidelines and assign this to yourself by commenting "/assign" on this issue.
For more information on our triage process please visit our triage overview
sylvainsf commentedon Jun 25, 2026
Recurring data + proposed fixes —
Test_PreflightContainertiming/readiness flakeAdding fresh evidence and concrete fix proposals to this existing flake. Same test and same failure family as the original report (control-plane readiness /
helm --waittimeout).Recent evidence (June 2026)
functional-test-noncloud.yamlonmain: 4 of the last 8 runs failed; at least 2 on theupgrade-noncloudleg (runs28102985422,28062964410).28102985422:Test_PreflightContainer/**Enabled**failed (143.4s)28137799045:Test_PreflightContainer/**Disabled**failed (189.5s)/Disabledfailure at ~189s ≈ just over the 3mhelm --waittimeout, which points at install/upgrade readiness rather than assertion logic — consistent with the originally-reported503"Control plane did not become available within timeout".Root-cause factors
In
test/functional-portable/upgrade/upgrade_test.go:helmTimeout = "3m"is too tight. A cold kind cluster installing the full chart (ucp, applications-rp, dynamic-rp, controller, DE, contour) under--waitregularly approaches or exceeds 3m on shared CI runners.503race. Afterhelm upgrade, the UCP aggregatedAPIServicebriefly returns503while pods roll;waitForControlPlanecan construct the management client during that window.time.Sleep(5 * time.Second)negative check intestPreflightDisabledis a race — it asserts "no preflight Job" after an arbitrary 5s rather than synchronizing onhelm upgrade --waitcompletion.apiServiceDeregistrationWait = 3sfixed sleep incleanupAndWaitis likewise arbitrary versus polling actualAPIServicederegistration.Proposed fixes
helmTimeoutto 5–6m (largest single lever).waitForControlPlane, poll the UCPAPIServiceAvailable=Truecondition (and treat503as retryable) before building the management client.5ssleep in/Disabledwith a deterministic wait onhelm upgrade --waitcompletion, then a single JobGet(the upgrade completing is the correct synchronization point).cleanupAndWait's fixed3sderegistration sleep with polling theAPIServicelist until the Radius-owned entry is gone.Fix flaky upgrade test: increase timeouts and replace fixed sleeps wi…
nellshamrell commentedon Aug 20, 2026
Still reproducible after #12245 (August 20, 2026)
This flake is still active on
mainafter the June mitigations in #12245 were merged.Fresh evidence
mainrun 32407484384, SHA2ba622f8dc8f55b86f7bd9fdf53fdacfa5e4045e:Test_PreflightContainer/Disabledfailed after about 5 minutes with HTTP 503service unavailableandControl plane did not become available within timeout.mainSHA: same test, HTTP 503, and readiness timeout.This is unrelated to #12746: that PR changes only workflow templates, their structural shell test, build wiring for that test, and documentation. More importantly,
mainitself fails at the PR's exact merge base with the same signature.Recent scheduled history also remains meaningfully flaky: 4 of the latest 10
mainruns ofFunctional Tests (with Non-Cloud Resources)failed as of this check.What this tells us about the merged mitigation
#12245 is present in the failing revision (
98f5623de9f660301880ea95c775210a92afcb2bis an ancestor). The current test already has:helmTimeout = "5m"controlPlaneTimeout = 4 * time.MinutewaitForControlPlaneThe failure therefore survives the previously proposed timeout increases and fixed-sleep replacements. It is not just the old 3-minute Helm timeout.
The next investigation should capture why the aggregated UCP APIService remains unavailable for the full readiness window: APIService conditions, backing Service/EndpointSlices, and UCP pod status/events/logs at timeout. Without those diagnostics, another timeout increase would only mask the underlying unavailable backend and make the flaky leg slower.
I searched open issues and PRs before adding this update. There is no open PR referencing this issue or changing
helmTimeout,waitForControlPlane, orapiServiceDeregistrationWait. #12163 remains open as a broader proposal to reclassify this as serial integration/E2E coverage, but it does not currently provide a fix for the 503.12 remaining items
fix(chart): make the readiness hook upgrade-compatible
test(upgrade): rely on Helm readiness and install once
fix(chart): derive readiness image from UCP
test(upgrade): rely on Helm readiness and install once
fix(chart): honor readiness image override precedence
test(upgrade): rely on Helm readiness and install once
test(upgrade): rely on Helm readiness and install once
test(upgrade): rely on Helm readiness and install once
fix(chart): wait for Radius aggregated API readiness (radius-project#…
test(upgrade): trust Helm readiness and install once (radius-project#…
fix(chart): wait for Radius aggregated API readiness (#12785)
fix(chart): wait for Radius aggregated API readiness (#12785)
nicolejms commentedon Sep 11, 2026
Closing following an issue audit against Radius main at ec97901 and the current referenced implementations.
The August comment correctly rules out closing on #12245's timeout/sleep mitigations alone. Later merged #12785 addresses the actual boundary: UCP must be listening before entering Service endpoints, and a mandatory Helm hook verifies the aggregated API through kube-apiserver before installation/upgrade succeeds. Its live validation reproduced the original 503 without the hook and passed the unchanged upgrade test with it. Merged #12790 then removes the fragile parallel readiness check and installs once before sequential enabled/disabled scenarios. Both fixes are present in the baseline, providing stronger exact evidence than the earlier partial mitigation.
Evidence:
radius/deploy/Chart/templates/ucp/deployment.yaml
Lines 84 to 104 in ec97901
radius/deploy/Chart/templates/control-plane-readiness/job.yaml
Lines 28 to 67 in ec97901
radius/test/functional-portable/upgrade/upgrade_test.go
Lines 88 to 124 in ec97901