Skip to content

OCPBUGS-77056: Make external cert validation asynchronous (v3 — fix re-admission after secret deletion) - #828

Open
bentito wants to merge 32 commits into
openshift:masterfrom
bentito:OCPBUGS-77056-async-sar-resurrect-v3
Open

OCPBUGS-77056: Make external cert validation asynchronous (v3 — fix re-admission after secret deletion)#828
bentito wants to merge 32 commits into
openshift:masterfrom
bentito:OCPBUGS-77056-async-sar-resurrect-v3

Conversation

@bentito

@bentito bentito commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

> Draft — waiting on revert of #825 (v2) to land before rebase.

Background

This is the fourth attempt at landing asynchronous external certificate validation. PR #825 (v2) fixed the x509: ECDSA verification failure race conditions from #822 but introduced a new regression: 5 out of 10 payload-aggregate runs failed on RouteExternalCertificate tests.

v2 payload results (5/10 — not 10/10)

The /payload-aggregate run for #825 (results) showed 5 successes, 5 failures. The failing runs had two blocking RouteExternalCertificate test failures:

  1. "the secret is deleted then routes are not reachable" — timed out at 900s
  2. "the secret is updated but RBAC permissions are dropped then routes are not reachable" — timed out at 900s

Notably, zero x509 or ECDSA errors appeared anywhere in the logs — the v2 race condition fixes (DeepCopy, atomic PEM write) eliminated those. The new failure mode is a status transition timeout: the route never reaches Admitted=False and the test polls until the 15-minute timeout.

Root cause: SARCompleted re-admits a deleted-secret route

After DeleteFunc rejects a route (Admitted=False, ValidationFailed), the status update triggers a re-enqueue. The subsequent HandleRoute(Modified) call:

  1. DeepCopies the route (capturing Admitted=False in the local copy)
  2. Calls validate() — SAR check passes (RBAC is still valid, only the secret was deleted)
  3. Calls populateRouteTLSFromSecret()GetSecret succeeds because the informer cache hasn't propagated the deletion yet
  4. Plugin chain accepts the route
  5. The SARCompleted guard checks the DeepCopied route, sees Admitted=False (no ext-cert reason), and writes SARCompletedflipping the route back to Admitted=True

The route bounces between Admitted=False (from DeleteFunc) and Admitted=True (from SARCompleted), and the E2E test polls for Admitted=False until timeout.

What's new in this PR (net new vs #825)

One commit on top of the full v2 (#825) changeset:

Fix: check deletedSecrets before writing SARCompleted

Before emitting RecordRouteUpdate(SARCompleted), check p.deletedSecrets.Load(key). If the secret has been marked as deleted by the DeleteFunc, skip the write. This prevents re-admission during the informer cache propagation window.

Test: TestDeletedSecretDoesNotGetReadmitted

Reproduces the exact failure:

  1. Admits a route with an external cert (SARCompleted written)
  2. Fires DeleteFunc (route rejected with ValidationFailed)
  3. Calls HandleRoute(Modified) while GetSecret still succeeds (cache race)
  4. Asserts the route is NOT re-admitted

Fails on v2 code (2 SARCompleted writes = re-admission), passes after the fix.

Update: root cause found and fixed — synchronous certificate refresh

Post-review, payload-aggregate kept showing the RouteExternalCertificate "secret is updated but RBAC permissions are dropped" test failing on roughly half of the runs, despite passing PR-time tests every time. We iterated through several mitigations narrowing when SARCompleted fires and adding a delayed RBAC re-check after a secret update — these reduced but didn't eliminate the flake.

Root cause: UpdateFunc only wrote a status condition on secret change. The actual certificate refresh (populateRouteTLSFromSecret) only ran when the router's own route-watch happened to redeliver the route as Modified — an indirect round trip through its own status write. Found by locally injecting API-server latency and packet loss into the router's connection (emulating HyperShift's separated control plane), since this never reproduced under CI's PR-time tests or low-latency local runs. Under injected latency/loss, that round trip could be delayed or dropped, leaving a route serving a stale certificate indefinitely until an unrelated later event (e.g. the next secret rotation) happened to reprocess it. This is also the direct answer to @jcmoraisjr's review question about whether the 3s delayed re-check was "time enough" — that goroutine only ever re-ran the SAR check, never the cert refresh, so it provided no protection against this specific failure mode.

Fix: UpdateFunc now calls validate() and populateRouteTLSFromSecret() synchronously and pushes the result through the plugin chain directly, instead of depending on the router observing its own write. The delayed re-check goroutine is unchanged and now purely serves its original purpose: catching RBAC revocations that haven't propagated yet.

Simplification: also investigated increasing writerlease's worker count (1→N), reasoning a single worker could head-of-line-block status writes under high latency. Built a local repro harness (6 routes sharing one secret, matching CI's topology, with tc netem injecting 1s±300ms latency, 10% loss, 2% duplication into the router's API-server connection) and empirically disproved this — increasing workers made no measurable difference, and the failure signature (all 6 routes in a namespace failing or succeeding together) ruled out a per-worker queuing bottleneck. Kept writerlease at its original single worker rather than adding concurrency that wasn't fixing anything.

Validation — same local harness, before vs. after the synchronous-refresh fix, under identical injected latency/loss:

  • Before: 137/360 checks timed out (38%)
  • After: 3/360 timed out (0.8%) — residual failures show a distinct, much rarer race between this fix's synchronous path and the router's independent periodic re-validation running concurrently on a different goroutine; tracked separately as a follow-up, not blocking.

CI: /payload-aggregate periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 10 — 10/10 clean, zero RouteExternalCertificate failures (only pre-existing, unrelated non-blocking flakes elsewhere in the suite).

Test plan

  • go test -race ./pkg/router/controller/ — all pass, including TestDeletedSecretDoesNotGetReadmitted
  • make verify and make check — pass
  • /payload-aggregate periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 10 — 10/10, zero RouteExternalCertificate failures
  • Scale test: 2000 ext-cert routes admitted in ~120s (verified: 2000/2000 in 138s, 0 rejections, on a fresh 4.21 cluster with the synchronous-refresh fix)

🤖 Generated with Claude Code

@openshift-ci-robot openshift-ci-robot added jira/severity-critical Referenced Jira bug's severity is critical for the branch this PR is targeting. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. jira/invalid-bug Indicates that a referenced Jira bug is invalid for the branch this PR is targeting. labels Jul 29, 2026
@openshift-ci-robot

Copy link
Copy Markdown
Contributor

@bentito: This pull request references Jira Issue OCPBUGS-77056, which is invalid:

  • expected the bug to be in one of the following states: NEW, ASSIGNED, POST, but it is ON_QA instead

Comment /jira refresh to re-evaluate validity if changes to the Jira bug are made, or edit the title of this pull request to link to a different bug.

The bug has been updated to refer to the pull request using the external bug tracker.

Details

In response to this:

Draft — waiting on revert of #825 (v2) to land before rebase.

Background

This is the fourth attempt at landing asynchronous external certificate validation. PR #825 (v2) fixed the x509: ECDSA verification failure race conditions from #822 but introduced a new regression: 5 out of 10 payload-aggregate runs failed on RouteExternalCertificate tests.

v2 payload results (5/10 — not 10/10)

The /payload-aggregate run for #825 (results) showed 5 successes, 5 failures. The failing runs had two blocking RouteExternalCertificate test failures:

  1. "the secret is deleted then routes are not reachable" — timed out at 900s
  2. "the secret is updated but RBAC permissions are dropped then routes are not reachable" — timed out at 900s

Notably, zero x509 or ECDSA errors appeared anywhere in the logs — the v2 race condition fixes (DeepCopy, atomic PEM write) eliminated those. The new failure mode is a status transition timeout: the route never reaches Admitted=False and the test polls until the 15-minute timeout.

Root cause: SARCompleted re-admits a deleted-secret route

After DeleteFunc rejects a route (Admitted=False, ValidationFailed), the status update triggers a re-enqueue. The subsequent HandleRoute(Modified) call:

  1. DeepCopies the route (capturing Admitted=False in the local copy)
  2. Calls validate() — SAR check passes (RBAC is still valid, only the secret was deleted)
  3. Calls populateRouteTLSFromSecret()GetSecret succeeds because the informer cache hasn't propagated the deletion yet
  4. Plugin chain accepts the route
  5. The SARCompleted guard checks the DeepCopied route, sees Admitted=False (no ext-cert reason), and writes SARCompletedflipping the route back to Admitted=True

The route bounces between Admitted=False (from DeleteFunc) and Admitted=True (from SARCompleted), and the E2E test polls for Admitted=False until timeout.

What's new in this PR (net new vs #825)

One commit on top of the full v2 (#825) changeset:

Fix: check deletedSecrets before writing SARCompleted

Before emitting RecordRouteUpdate(SARCompleted), check p.deletedSecrets.Load(key). If the secret has been marked as deleted by the DeleteFunc, skip the write. This prevents re-admission during the informer cache propagation window.

Test: TestDeletedSecretDoesNotGetReadmitted

Reproduces the exact failure:

  1. Admits a route with an external cert (SARCompleted written)
  2. Fires DeleteFunc (route rejected with ValidationFailed)
  3. Calls HandleRoute(Modified) while GetSecret still succeeds (cache race)
  4. Asserts the route is NOT re-admitted

Fails on v2 code (2 SARCompleted writes = re-admission), passes after the fix.

Test plan

  • go test -race ./pkg/router/controller/ — all pass, including TestDeletedSecretDoesNotGetReadmitted
  • make verify and make check — pass
  • /payload-aggregate-with-prs periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 20 — target 20/20
  • Scale test: 2000 ext-cert routes admitted in ~120s

🤖 Generated with Claude Code

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jul 29, 2026
@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The pull request adds shared secret informer management and cache-aware external-certificate SAR validation. It updates route status handling, secret event processing, ingress condition comparison, and related tests. WriterLease gains configurable workers and non-blocking follower scheduling. Debug image builds accept GOARCH, Kubernetes client rate limits increase, certificate writes become atomic, and test setup is adjusted.

Possibly related PRs

  • openshift/router#822: Contains matching changes across external-certificate validation, secret management, status handling, writer leases, and build configuration.
  • openshift/router#824: Directly overlaps with changes in router validation, secret management, status handling, writer leases, and debug builds.
  • openshift/router#829: Directly overlaps with changes across external-certificate validation, secret management, status handling, writer leases, certificate writes, and debug image builds.

Suggested reviewers: melvinjoseph86, davidesalerno, thealisyed, redhat-chai-bot


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Ote Binary Stdout Contract ❌ Error TestMain still writes to stdout at router_test.go:107, :110, and :183 via fmt.Println/Printf, so the test binary can emit non-JSON process-level output. Redirect all TestMain diagnostics to os.Stderr, and verify process-level setup has no stdout writes.
Docstring Coverage ⚠️ Warning Docstring coverage is 52.63% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (13 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed The patch adds standard Go tests and static subtest names only; the repository has no Ginkgo dependency or It/Describe/Context/When titles, and no title contains run-dependent data.
Test Structure And Quality ✅ Passed Not applicable: all eight changed test files use standard testing.T/Test/t.Run; no Ginkgo or Gomega imports or spec declarations were found.
Microshift Test Compatibility ✅ Passed No new Ginkgo e2e tests were added. The changed tests are Go unit tests using testing.T, so the MicroShift API compatibility check is not applicable.
Single Node Openshift (Sno) Test Compatibility ✅ Passed The PR adds only standard Go unit tests in pkg/router/controller; no Ginkgo e2e tests or multi-node/SNO assumptions were added.
Topology-Aware Scheduling Compatibility ✅ Passed The PR changes controller, validation, client, and test code but adds no manifests or scheduling constructs: no affinity, topology spread, node selectors, tolerations, replicas, or PDB changes were...
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No new Ginkgo e2e tests were added; changed tests use standard Go Test functions and add no IPv4 literals or external connectivity.
No-Weak-Crypto ✅ Passed The complete PR diff adds no MD5, SHA1, DES/3DES, RC4, Blowfish, or ECB usage; crypto changes use standard TLS/X.509 APIs and do not compare secret values.
Container-Privileges ✅ Passed The PR changes no Kubernetes/container manifests and adds no privilege declarations; the only hostNetwork: true is pre-existing in deploy/router.yaml and unchanged.
No-Sensitive-Data-In-Logs ✅ Passed Added logs contain resource names, namespaces, file paths, statuses, and errors only; inspection found no secret bytes, passwords, tokens, API keys, PII, or session IDs logged.
Title check ✅ Passed The title clearly describes the main change: asynchronous external certificate validation and the secret-deletion re-admission fix.
Description check ✅ Passed The description directly explains the external certificate validation changes, regression fix, tests, and validation results.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@openshift-ci

openshift-ci Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jul 29, 2026
bentito and others added 19 commits July 30, 2026 08:53
This prevents the router from dropping its leader lease under high concurrency when updating route statuses, which was causing a 60-second stall in scale tests.
This commit modifies DeleteFunc inside route_secret_manager.go to transition the route's ingress condition to ExternalCertificateValidationFailed on secret deletion, rather than the transient ExternalCertificateSecretDeleted status.

Reasoning and Analysis:
- The RouteExternalCertificate e2e conformance tests in hypershift expect the route to transition to 'ExternalCertificateValidationFailed' (with ConditionFalse) when a referenced TLS secret is deleted.
- Previously, when DeleteFunc fired, it recorded the intermediate reason 'ExternalCertificateSecretDeleted'. It was expected that the subsequent standard route controller Modified reconciliation would trigger validate(), which would then transition to the final 'ExternalCertificateValidationFailed' reason.
- However, relying on this multi-step watch-triggered transition is race-prone and does not guarantee completion before the test polls.
- By immediately and directly recording 'ExternalCertificateValidationFailed' on secret deletion, we satisfy the E2E test assertion requirements instantly, unblocking hypershift conformance payload nightlies.

Related Changes:
- Updated pkg/router/controller/route_secret_manager_test.go unit tests (TestSecretDelete and TestSecretRecreation) to expect the updated rejection reason.
This commit adds 'system:serviceaccounts', 'system:serviceaccounts:openshift-ingress', and 'system:authenticated' standard service account groups to all SubjectAccessReviewSpecs.

Previously, only the routerServiceAccount name was passed, leading to false-negative denials if permissions are granted via standard service account group roles on the target cluster. Specifying the standard groups ensures complete and correct RBAC evaluation.
…ests

This commit improves testing hygiene in factory_endpointslices_test.go by replacing the global os.Setenv call with t.Setenv.

Using t.Setenv ensures that the KUBE_FEATURE_WatchListClient environment override is automatically scoped and cleanly torn down after each test execution, avoiding potential side effects or pollution on other test suites.
This commit refines the deletion message inside DeleteFunc to say 'external certificate validation failed: secret ... deleted for route ...'

This ensures complete semantic consistency with the ExternalCertificateValidationFailed rejection reason, providing clear and non-contradictory diagnostic information for operators inspecting the route condition.
…ence

This commit updates vendor/modules.txt to remove the reference to github.com/openshift/library-go/pkg/authorization/authorizationutil, which is no longer used by the router following our asynchronous external certificate validation refactoring.
This commit modifies StartFakeServerForTest in pkg/router/template/configmanager/haproxy/testing/haproxy.go to use the pattern 'fake-haproxy-*' instead of combining the long test name in the prefix.

This avoids reaching the hard 104-character limit on Darwin (macOS) Unix socket paths when running local tests, ensuring all tests compile and execute successfully on both macOS and Linux environments.
…ert validation

Three tests that prove the bugs causing the x509: ECDSA verification
failure after PR openshift#822 merged:

1. TestPopulateRouteTLSRace: fails with -race, proving
   populateRouteTLSFromSecret mutates the shared informer cache object
   while the informer goroutine concurrently reads it via DeepCopy.

2. TestWriteCertificateAtomicity: fails consistently, proving
   os.WriteFile truncates the PEM file before writing — concurrent
   readers (HAProxy during reload) observe empty files 3% of the time.

3. TestSARCompletedFeedbackLoop: passes, documenting that every
   HandleRoute unconditionally emits RecordRouteUpdate(SARCompleted),
   creating a re-enqueue loop that doubles cert writes and reloads.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ilure

Three fixes for the bugs that caused the second revert (PR openshift#824):

1. DeepCopy route before mutating TLS fields: HandleRoute now DeepCopies
   the route before populateRouteTLSFromSecret writes Certificate/Key
   in-place. Secret handlers (Add/Update/DeleteFunc) also DeepCopy
   after fetching from the lister. This eliminates the data race between
   the main controller goroutine and informer goroutines that share
   the same route pointer from the informer cache.

2. Atomic PEM file write: WriteCertificate now writes to a temp file
   and renames into place via os.Rename, which is atomic on Linux.
   Previously os.WriteFile truncated the file before writing, creating
   a window where HAProxy could read an empty PEM during reload.

3. Guard SARCompleted feedback loop: Only emit RecordRouteUpdate with
   SARCompleted when the route doesn't already have an ext-cert admitted
   reason. Previously every HandleRoute unconditionally wrote SARCompleted,
   causing a re-enqueue loop that doubled cert writes and HAProxy reloads.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Decouple writerlease worker count from the SAR semaphore. Status writes
to the API server don't need 50 concurrent workers — that level of
parallelism causes a storm of concurrent status writes, leading to
write conflicts and rapid-fire route re-enqueues that widen race
windows. Use a single worker, matching the pre-async behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Test doc comments were written for the "reproduce the bug" commit and
still described pre-fix behavior. Update them to describe the invariants
the tests now protect rather than the bugs they originally exposed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Address review feedback from jcmoraisjr and coderabbitai: check the
error return from HandleRoute and WriteCertificate in the concurrent
test goroutines instead of silently discarding them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…t route

After the DeleteFunc handler rejects a route (Admitted=False), the
status update triggers a re-enqueue. If the subsequent HandleRoute
succeeds (because GetSecret still returns the secret from the informer
cache during the deletion propagation window), the SARCompleted guard
would see no ext-cert admitted reason on the DeepCopied route and write
SARCompleted — flipping the route back to Admitted=True. This caused the
E2E test "the secret is deleted then routes are not reachable" to poll
for Admitted=False until the 15-minute timeout.

Fix: check the deletedSecrets map before writing SARCompleted. If the
secret has been marked as deleted by the DeleteFunc, skip the write.

Adds TestDeletedSecretDoesNotGetReadmitted which fails on unfixed code
(2 SARCompleted writes = re-admission) and passes after the fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bentito
bentito force-pushed the OCPBUGS-77056-async-sar-resurrect-v3 branch from 7092d0f to 8bb1e1e Compare July 30, 2026 12:53
@bentito
bentito marked this pull request as ready for review July 30, 2026 12:53
bentito and others added 2 commits August 6, 2026 14:12
…leness guard

Remove the synchronous validate() call from UpdateFunc to eliminate
the N×4 sequential API round-trip bottleneck that causes timeouts
under HyperShift CI load. Add an explicit Commit() call to trigger
HAProxy reload directly instead of relying on the indirect status-write
round trip. The delayed re-check goroutine still catches any RBAC
revocation.

As defense-in-depth, add a ResourceVersion-based staleness guard in
templateRouter.AddRoute: when both the incoming and existing
ServiceAliasConfig carry a CertResourceVersion (set from the secret's
ResourceVersion in populateRouteTLSFromSecret), the incoming update is
dropped if its version is not newer. This prevents any future code path
from overwriting fresh cert data with stale content.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the non-atomic reassignment of the package-level sarCache
sync.Map variable with Range+Delete, which clears the map contents
without racing against concurrent Store calls from delayed re-check
goroutines.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bentito

bentito commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

/payload-aggregate periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 10

@bentito

bentito commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

/payload-job periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4 periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

@openshift-ci

openshift-ci Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 1 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/6c2447c0-91d3-11f1-93bc-31e54a7a29cc-0

@bentito

bentito commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

/payload-aggregate periodic-ci-openshift-release-main-ci-5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-rt-upgrade 10

@openshift-ci

openshift-ci Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 2 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4
  • periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/6ef40990-91d3-11f1-88ac-418cf2f4d7a3-0

@openshift-ci

openshift-ci Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 1 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-release-main-ci-5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-rt-upgrade

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/710f2160-91d3-11f1-9a97-d62107d5c08b-0

@bentito

bentito commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

/payload-aggregate periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 10

@bentito

bentito commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

/payload-job periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4 periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

@openshift-ci

openshift-ci Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 1 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/f702f980-91ed-11f1-9cf2-d184658584a6-0

@openshift-ci

openshift-ci Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 2 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4
  • periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/f7ba89b0-91ed-11f1-935b-ceb91724b1fd-0

@bentito

bentito commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

/payload-aggregate periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 10

@bentito

bentito commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

/payload-job periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4 periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

@bentito

bentito commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

/payload-aggregate periodic-ci-openshift-release-main-ci-5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-rt-upgrade 10

@neisw

neisw commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

/payload-aggregate periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 10

@openshift-ci

openshift-ci Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

@neisw: trigger 1 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/62c688c0-9285-11f1-9d0b-16796c10e774-0

@bentito

bentito commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

/payload-job periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4 periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

@bentito

bentito commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

/payload-aggregate periodic-ci-openshift-release-main-ci-5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-rt-upgrade 10

@openshift-ci

openshift-ci Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 2 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4
  • periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/e67f5b70-9293-11f1-89d0-b10883231955-0

@openshift-ci

openshift-ci Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 1 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-release-main-ci-5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-rt-upgrade

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/e72bef20-9293-11f1-9946-51693c1235dd-0

bentito and others added 2 commits August 7, 2026 20:17
Temporary diagnostic commit — to be reverted before merge.

The secret informer handlers (Add/Update/Delete) log at V(4), which is
invisible in CI at default verbosity. This makes it impossible to determine
whether informer events are being delivered when investigating failures.

Raise the log level to V(2) and add a "Secret refresh completed" log after
the cert is pushed through the plugin chain and Commit() is called. This
gives us definitive evidence of whether the informer fires during the
"secret is updated then routes are reachable" E2E test.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two fixes for HyperShift CI failures where the "secret is updated then
routes are reachable" E2E test times out:

1. Register route with SharedSecretManager BEFORE SAR validation.

   Previously, validateAndRegister() called validate() first and
   RegisterRoute() second. If the initial SAR check failed (common in
   HyperShift due to RBAC propagation delays across API server replicas),
   the route was never registered with the secret informer. It would
   never receive UpdateFunc events and could never pick up secret changes
   — permanently orphaned from the informer.

   Now RegisterRoute() runs first. If SAR fails, the route is still
   rejected (not admitted), but it stays registered so future informer
   events can trigger re-evaluation when RBAC propagates.

2. Set per-secret informer resyncPeriod from 0 to 30 seconds.

   With resyncPeriod=0, the informer relies entirely on the watch
   connection for event delivery. If a watch event is lost (silent watch
   stall, proxy connection issue, API server load), there is no recovery
   mechanism. CI logs show the router reloading HAProxy 36+ times over 3
   minutes without ever picking up the new cert, strongly suggesting the
   watch event was never delivered.

   With resyncPeriod=30s, the informer periodically re-dispatches cached
   state to handlers, providing a recovery path after watch reconnection.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bentito

bentito commented Aug 8, 2026

Copy link
Copy Markdown
Contributor Author

/payload-aggregate periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance 10

@openshift-ci

openshift-ci Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

@bentito: trigger 1 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-hypershift-release-5.0-periodics-e2e-aws-ovn-conformance

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/aa8d8940-92be-11f1-9541-e50d2b6a527d-0

@openshift-ci

openshift-ci Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

@bentito: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@neisw

neisw commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

/payload-aggregate periodic-ci-openshift-release-main-ci-5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-rt-upgrade 10

@openshift-ci

openshift-ci Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

@neisw: trigger 1 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-release-main-ci-5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-rt-upgrade

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/5102c790-9341-11f1-9ea5-0dc88e6158bd-0

@neisw

neisw commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

/payload-job periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4 periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

@openshift-ci

openshift-ci Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

@neisw: trigger 2 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command

  • periodic-ci-openshift-release-main-nightly-5.0-e2e-metal-ipi-ovn-ipv4
  • periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-techpreview

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/60a9bcd0-9341-11f1-867b-bff27a687075-0

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

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. jira/severity-critical Referenced Jira bug's severity is critical for the branch this PR is targeting. jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants