Skip to content

OPNET-803: installer: add BGP VIP coexistence lanes (OVN-K route advertisements, day-2 MetalLB) - #82912

Open
mkowalski wants to merge 10 commits into
openshift:mainfrom
mkowalski:bgp-vip-ovn-bgp-lane
Open

OPNET-803: installer: add BGP VIP coexistence lanes (OVN-K route advertisements, day-2 MetalLB)#82912
mkowalski wants to merge 10 commits into
openshift:mainfrom
mkowalski:bgp-vip-ovn-bgp-lane

Conversation

@mkowalski

@mkowalski mkowalski commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Coexistence lanes for BGP-based VIP management (enhancement openshift/enhancements#1982, OPNET-595) — the scenarios the enhancement claims but nothing tests today: other BGP consumers sharing the cluster's frr-k8s with the VIP feature.

Job 1: e2e-metal-ipi-bgp-vip-ovn-bgp — OVN-K route advertisements

New baremetalds-e2e-bgp-vip-ovn-bgp workflow, composed from the two existing lanes:

  • dev-scripts baremetal IPI install with BGP_VIP_MANAGEMENT=true + ENABLE_BGP_TOR=true (DevPreviewNoUpgrade, v4, 2 workers) — same as baremetalds-e2e-bgp-vip (OPNET-621: Add e2e-metal-ipi-bgp-vip lane for BGP-based VIP management #82698)
  • the existing baremetalds-e2e-ovn-bgp-pre step: external FRR route reflector, routeAdvertisements: Enabled, FRRConfiguration/RouteAdvertisements CRs
  • tests: the existing VIP acceptance step, a new coexistence verify step, then the conformance suite

The verify step asserts what makes the lane interesting: on control plane nodes the frr-k8s DaemonSet does not run (frr-k8s runs as static pods there), so the RouteAdvertisements-generated FRRConfigurations must be merged by the static pods. It checks both consumers' CRs exist, every node is Established at the route reflector, per-node pod subnets arrive at the reflector, and a pod reaches an external endpoint over a BGP-imported route.

Tweaks to the shared baremetalds-e2e-ovn-bgp-pre step (no behavior change for existing lanes): idempotent namespace creation, and a bounded wait for the RouteAdvertisements CRD placed before the FRR_IMAGE managementState transition.

Job 2: e2e-metal-ipi-bgp-vip-metallb — day-2 MetalLB in BGP mode

New baremetalds-e2e-bgp-vip-metallb workflow: same install, then a customer-like day-2 MetalLB operator install — OLM subscription when the catalog carries metallb-operator, falling back to SHA-pinned upstream metallb-operator manifests otherwise (pre-release OCP has no catalog entry; on the OLM path a CSV timeout fails loudly by design) — configured in frr-k8s-external mode against the cluster's openshift-frr-k8s, with an IPAddressPool/BGPPeer/BGPAdvertisement peering with the same ToR speaker that serves the VIPs, plus a LoadBalancer workload.

The verify step asserts the hardest merge case: MetalLB's generated FRRConfigurations must merge into the ToR neighbor already declared by the VIP configuration — exactly one Established session per node (no duplication, no flap), the LoadBalancer IP advertised from every node, reachable over the BGP path, with the VIP acceptance step re-run first.

Job 3: e2e-metal-ipi-bgp-vip-ovn-bgp-metallb — all three producers

Composition of the two lanes above on one cluster: VIP management + OVN-K route advertisements + day-2 MetalLB, three FRRConfiguration producers sharing the same frr-k8s instances and external speakers. Runs all three verify steps in order, then the conformance suite. Pure composition — no new steps; it reuses the refs from jobs 1 and 2.

Validation

Both lanes' logic was executed end to end against a live dev-scripts cluster (BGP-VIP-managed, 3 masters + 2 workers) before submission — including the full day-2 MetalLB install. All verify steps pass with three FRRConfiguration producers coexisting (VIP + OVN-K RA + MetalLB): ToR sessions stable at one per node, LB /32 and pod subnets advertised, datapaths green. The dry runs also surfaced the fixes carried here (RouteAdvertisements CRD race, namespace idempotency, MetalLB SCC grant + DEPLOY_SERVICEMONITORS requirement on the manifest path).

Both jobs are optional/on-demand presubmits on openshift/installer, red by design until the feature PRs merge (openshift/installer#10718, openshift/machine-config-operator#6326, openshift/cluster-network-operator#3047); combined-stack runs are possible today via multi-PR testing (/testwith).


This PR description was generated using AI. Please verify before acting on it.

Summary by CodeRabbit

Adds optional bare-metal workflows for openshift/installer:

  • baremetalds-e2e-bgp-vip-ovn-bgp tests BGP VIP management with OVN-Kubernetes BGP route advertisements.
  • baremetalds-e2e-bgp-vip-metallb tests BGP VIP management with day-two MetalLB.
  • A combined workflow tests BGP VIP management, OVN-Kubernetes, and MetalLB on one cluster.

The workflows use the equnix-ocp-metal profile and verify FRR resource merging, established BGP sessions, route advertisements, VIP and LoadBalancer paths, external connectivity, and conformance.

The shared OVN-BGP preparation step creates the openshift-frr-k8s namespace idempotently and waits for the RouteAdvertisements CRD before applying resources. The MetalLB setup supports OLM and fallback installation paths and configures the required SCC, monitoring, and FRR-K8s resources.

@openshift-ci
openshift-ci Bot requested review from bfournie and cybertron August 4, 2026 17:05
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 15be30d5-12bb-42f8-bdb0-0d4e2f14d614

📥 Commits

Reviewing files that changed from the base of the PR and between c47cd55 and a8b7143.

⛔ Files ignored due to path filters (1)
  • ci-operator/jobs/openshift/installer/openshift-installer-main-presubmits.yaml is excluded by !ci-operator/jobs/**
📒 Files selected for processing (23)
  • ci-operator/config/openshift/installer/openshift-installer-main.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/baremetalds-e2e-bgp-vip-metallb-workflow.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/baremetalds-e2e-bgp-vip-metallb-workflow.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-ref.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-ref.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/metallb/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/metallb/baremetalds-e2e-bgp-vip-ovn-bgp-metallb-workflow.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/metallb/baremetalds-e2e-bgp-vip-ovn-bgp-metallb-workflow.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.yaml
  • ci-operator/step-registry/baremetalds/e2e/ovn/bgp/pre/baremetalds-e2e-ovn-bgp-pre-commands.sh

Walkthrough

Adds three optional Equinix metal CI jobs for OVN-BGP VIP, MetalLB BGP VIP, and combined validation. The workflows configure BGP components, run bare-metal IPI tests, and verify sessions, routes, VIPs, and network connectivity.

Changes

BGP VIP validation

Layer / File(s) Summary
OVN-BGP preparation and validation
ci-operator/step-registry/baremetalds/e2e/ovn/bgp/pre/..., ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/...
The preparation step applies the FRR-K8s namespace idempotently and waits for the RouteAdvertisements CRD. The workflow and verification step check FRRConfiguration resources, BGP sessions, pod-subnet advertisements, and external connectivity.
MetalLB installation and validation
ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/...
The pre-step installs MetalLB, configures external FRR-K8s peering, and exposes a LoadBalancer workload. The verification step checks BGP sessions, route paths, and service reachability.
Combined workflow and CI jobs
ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/metallb/..., ci-operator/config/openshift/installer/openshift-installer-main.yaml
The combined workflow runs OVN-BGP and MetalLB preparation and verification. Three optional Equinix metal jobs invoke the workflows.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CIJob
  participant Workflow
  participant Preparation
  participant Cluster
  participant RouteReflector
  participant Verification
  CIJob->>Workflow: Start bare-metal BGP VIP workflow
  Workflow->>Preparation: Configure OVN-BGP and MetalLB
  Preparation->>Cluster: Apply resources and wait for readiness
  Workflow->>Verification: Run route and connectivity checks
  Verification->>Cluster: Read resources and service state
  Verification->>RouteReflector: Check sessions and advertised routes
  RouteReflector-->>Verification: Return BGP state
  Verification-->>CIJob: Return aggregate status
Loading

Suggested reviewers: cybertron, bfournie

🚥 Pre-merge checks | ✅ 15
✅ Passed checks (15 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly references OPNET-803 and accurately describes the main changes: adding BGP VIP coexistence test workflows for OVN-K route advertisements and MetalLB.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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 PR adds CI/CD workflow configurations and shell verification scripts only, not Ginkgo tests. The check does not apply to non-test code.
Test Structure And Quality ✅ Passed The full PR diff from main contains only YAML, JSON, OWNERS, and shell files; it adds no Ginkgo test code or It blocks to review.
Microshift Test Compatibility ✅ Passed This PR does not introduce new Ginkgo e2e tests. It adds CI/operator configuration, workflow definitions, verification shell scripts, and OWNERS files only. No Go test files or Ginkgo test code (It...
Single Node Openshift (Sno) Test Compatibility ✅ Passed No new Ginkgo e2e tests are added in this PR. The PR adds CI workflow configurations, bash verification scripts, and OWNERS files only—not new test definitions requiring SNO compatibility review.
Topology-Aware Scheduling Compatibility ✅ Passed No topology-sensitive scheduling constraints were added. The test Deployment only sets replicas=2; workflows use equinix-ocp-metal, and no affinity, spread, node selector, toleration, or PDB fields...
Ote Binary Stdout Contract ✅ Passed PR contains only CI configuration (YAML, JSON, shell scripts, OWNERS). OTE Binary Stdout Contract applies to Go test binaries only. No Go source files or test binaries present.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No new Ginkgo e2e test files added. The PR adds shell scripts and CI configuration for IPv4-only workflows; the check applies only to Ginkgo tests (It(), Describe(), Context(), When()).
No-Weak-Crypto ✅ Passed No weak cryptographic algorithms, custom crypto implementations, or non-constant-time secret comparisons detected. PR contains only CI/CD configuration and BGP networking test scripts.
Container-Privileges ✅ Passed Privileged containers (FRR, agnhost) documented as running on ephemeral CI hypervisor only, not the cluster; necessary for external router emulation with justification provided. No privilege escala...
No-Sensitive-Data-In-Logs ✅ Passed All curl commands use -o /dev/null to suppress response bodies; no passwords, tokens, or API keys are logged; KUBECONFIG is not echoed; environment variables contain only non-sensitive references l...
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci

openshift-ci Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: mkowalski
Once this PR has been reviewed and has the lgtm label, please assign andfasano for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@mkowalski mkowalski changed the title installer: add e2e-metal-ipi-bgp-vip-ovn-bgp coexistence lane OPNET-803: installer: add e2e-metal-ipi-bgp-vip-ovn-bgp coexistence lane Aug 4, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Aug 4, 2026
@openshift-ci-robot

openshift-ci-robot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@mkowalski: This pull request references OPNET-803 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Combined lane for BGP-based VIP management (enhancement openshift/enhancements#1982, OPNET-595) and OVN-Kubernetes BGP route advertisements — the coexistence scenario the enhancement claims but nothing tests today.

New baremetalds-e2e-bgp-vip-ovn-bgp workflow, composed from the two existing lanes:

  • dev-scripts baremetal IPI install with BGP_VIP_MANAGEMENT=true + ENABLE_BGP_TOR=true (DevPreviewNoUpgrade, v4, 2 workers) — same as baremetalds-e2e-bgp-vip (OPNET-621: Add e2e-metal-ipi-bgp-vip lane for BGP-based VIP management #82698)
  • the existing baremetalds-e2e-ovn-bgp-pre step: external FRR route reflector on the baremetal bridge, routeAdvertisements: Enabled, FRRConfiguration/RouteAdvertisements CRs — same as the baremetalds-e2e-ovn-bgp-* lanes
  • tests: the existing VIP acceptance step, a new coexistence verify step, then the conformance suite

The new verify step asserts what makes this lane interesting: on control plane nodes the frr-k8s DaemonSet does not run (anti-affinity; frr-k8s runs as static pods there), so the RouteAdvertisements-generated FRRConfiguration must be merged by the static pods. It checks both consumers' CRs exist, every node (masters included) is Established at the route reflector, per-node pod subnets arrive at the reflector, and a pod reaches an external endpoint over a BGP-imported route.

One tweak to a shared step: baremetalds-e2e-ovn-bgp-pre namespace creation made idempotent (oc create namespace fails under errexit when openshift-frr-k8s already exists, as it does on BGP-VIP-managed clusters). No behavior change for the existing lanes.

Wired as an optional, on-demand presubmit on openshift/installer. Like the base e2e-metal-ipi-bgp-vip lane, it is red by design until the feature PRs merge (openshift/installer#10718, openshift/machine-config-operator#6326, openshift/cluster-network-operator#3047); combined-stack runs are possible today via multi-PR testing (/testwith).


This PR description was generated using AI. Please verify before acting on it.

Summary by CodeRabbit

Adds an optional baremetalds-e2e-bgp-vip-ovn-bgp presubmit workflow for openshift/installer.

The workflow:

  • Installs a bare-metal IPI cluster with BGP VIP management and BGP ToR enabled.
  • Prepares OVN-Kubernetes BGP advertisements with an external FRR route reflector.
  • Runs VIP acceptance tests and the conformance suite.
  • Verifies FRR resources, BGP sessions for all nodes, pod-subnet advertisements, and external pod connectivity.

The shared OVN-BGP preparation step now creates the openshift-frr-k8s namespace idempotently.

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.

1 similar comment
@openshift-ci-robot

openshift-ci-robot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@mkowalski: This pull request references OPNET-803 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Combined lane for BGP-based VIP management (enhancement openshift/enhancements#1982, OPNET-595) and OVN-Kubernetes BGP route advertisements — the coexistence scenario the enhancement claims but nothing tests today.

New baremetalds-e2e-bgp-vip-ovn-bgp workflow, composed from the two existing lanes:

  • dev-scripts baremetal IPI install with BGP_VIP_MANAGEMENT=true + ENABLE_BGP_TOR=true (DevPreviewNoUpgrade, v4, 2 workers) — same as baremetalds-e2e-bgp-vip (OPNET-621: Add e2e-metal-ipi-bgp-vip lane for BGP-based VIP management #82698)
  • the existing baremetalds-e2e-ovn-bgp-pre step: external FRR route reflector on the baremetal bridge, routeAdvertisements: Enabled, FRRConfiguration/RouteAdvertisements CRs — same as the baremetalds-e2e-ovn-bgp-* lanes
  • tests: the existing VIP acceptance step, a new coexistence verify step, then the conformance suite

The new verify step asserts what makes this lane interesting: on control plane nodes the frr-k8s DaemonSet does not run (anti-affinity; frr-k8s runs as static pods there), so the RouteAdvertisements-generated FRRConfiguration must be merged by the static pods. It checks both consumers' CRs exist, every node (masters included) is Established at the route reflector, per-node pod subnets arrive at the reflector, and a pod reaches an external endpoint over a BGP-imported route.

One tweak to a shared step: baremetalds-e2e-ovn-bgp-pre namespace creation made idempotent (oc create namespace fails under errexit when openshift-frr-k8s already exists, as it does on BGP-VIP-managed clusters). No behavior change for the existing lanes.

Wired as an optional, on-demand presubmit on openshift/installer. Like the base e2e-metal-ipi-bgp-vip lane, it is red by design until the feature PRs merge (openshift/installer#10718, openshift/machine-config-operator#6326, openshift/cluster-network-operator#3047); combined-stack runs are possible today via multi-PR testing (/testwith).


This PR description was generated using AI. Please verify before acting on it.

Summary by CodeRabbit

Adds an optional baremetalds-e2e-bgp-vip-ovn-bgp presubmit workflow for openshift/installer.

The workflow:

  • Installs a bare-metal IPI cluster with BGP VIP management and BGP ToR enabled.
  • Prepares OVN-Kubernetes BGP advertisements with an external FRR route reflector.
  • Runs VIP acceptance tests and the conformance suite.
  • Verifies FRR resources, BGP sessions for all nodes, pod-subnet advertisements, and external pod connectivity.

The shared OVN-BGP preparation step now creates the openshift-frr-k8s namespace idempotently.

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.

Combined lane for BGP-based VIP management (enhancement 1982) and OVN-K
BGP route advertisements. New baremetalds-e2e-bgp-vip-ovn-bgp workflow:
dev-scripts install with BGP_VIP_MANAGEMENT=true + ENABLE_BGP_TOR=true,
then the existing baremetalds-e2e-ovn-bgp-pre step (external FRR route
reflector, routeAdvertisements enabled, FRRConfiguration and
RouteAdvertisements CRs). Tests run the existing VIP acceptance step, a
new coexistence verify step (both consumers' CRs present, every node -
including control plane nodes served by frr-k8s static pods, not the
DaemonSet - Established at the route reflector, per-node pod subnets
advertised, pod-to-external datapath over a BGP-imported route) and the
conformance suite.

baremetalds-e2e-ovn-bgp-pre namespace creation made idempotent (oc create
namespace fails under errexit when openshift-frr-k8s already exists, as
it does on BGP-VIP-managed clusters).

Wired as an optional, on-demand presubmit on openshift/installer, red by
design until the feature PRs merge (installer#10718, MCO#6326, CNO#3047),
like the base e2e-metal-ipi-bgp-vip lane.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
@mkowalski
mkowalski force-pushed the bgp-vip-ovn-bgp-lane branch from cb5c2cf to 9532220 Compare August 4, 2026 17:07
Found by a dry run of the coexistence lane on a live dev-scripts cluster
with BGP VIP management: when frr-k8s is already deployed, the daemonset
rollout waits return immediately and the RouteAdvertisements apply races
CNO's CRD creation ('no matches for kind RouteAdvertisements'). On the
existing ovn-bgp lanes the race is masked by the daemonset creation wait.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh`:
- Around line 29-57: Add bounded polling to the verifier checks around the
FRRConfiguration existence, Established BGP session count, and pod-route count
so each condition is re-evaluated until ready or the timeout expires. Preserve
the existing validation and diagnostic output, but only call fail after the
polling timeout, allowing normal CR and BGP reconciliation to converge before
asserting state.
- Around line 42-55: Replace the hard-coded podman exec invocations in the BGP
verification flow with the selected container runtime used by the pre-step.
Detect or reuse the remote runtime before the calls in the established-session
and pod-route checks, then apply it consistently to all four frr vtysh
executions, including diagnostic output, so Docker-only hosts work correctly.
- Around line 49-57: The verification block around pod_routes must validate the
exact expected pod CIDRs rather than counting all BGP routes. Build the expected
prefix set from each node’s assigned pod CIDR, then assert every expected prefix
exists in the route-reflector output; retain the existing diagnostic route dump
and failure behavior when any expected CIDR is missing.
- Around line 64-70: Update the curl invocation in the bgp-ra-datapath-check
command to include --fail and --show-error, ensuring HTTP 4xx/5xx responses
cause the existing reachability check to enter the fail branch.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: a8b09d00-7de6-47ac-90f2-189be81b58cf

📥 Commits

Reviewing files that changed from the base of the PR and between c47cd55 and cb5c2cf.

⛔ Files ignored due to path filters (1)
  • ci-operator/jobs/openshift/installer/openshift-installer-main-presubmits.yaml is excluded by !ci-operator/jobs/**
📒 Files selected for processing (9)
  • ci-operator/config/openshift/installer/openshift-installer-main.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.yaml
  • ci-operator/step-registry/baremetalds/e2e/ovn/bgp/pre/baremetalds-e2e-ovn-bgp-pre-commands.sh

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@ci-operator/step-registry/baremetalds/e2e/ovn/bgp/pre/baremetalds-e2e-ovn-bgp-pre-commands.sh`:
- Around line 316-324: Update the RouteAdvertisements CRD wait in the
pre-command script to occur before the FRR_IMAGE-driven CNO managementState
transition, keeping CNO reconciliation active while the CRD is created. Replace
the unbounded until loop with a finite overall deadline, and on timeout print
the CRD state before exiting non-zero; retain successful continuation once the
CRD reaches Established.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 10aff8d8-cb96-4a92-b531-a274e2293348

📥 Commits

Reviewing files that changed from the base of the PR and between cb5c2cf and 0edc822.

⛔ Files ignored due to path filters (1)
  • ci-operator/jobs/openshift/installer/openshift-installer-main-presubmits.yaml is excluded by !ci-operator/jobs/**
📒 Files selected for processing (9)
  • ci-operator/config/openshift/installer/openshift-installer-main.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.yaml
  • ci-operator/step-registry/baremetalds/e2e/ovn/bgp/pre/baremetalds-e2e-ovn-bgp-pre-commands.sh
🚧 Files skipped from review as they are similar to previous changes (8)
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-ref.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/baremetalds-e2e-bgp-vip-ovn-bgp-workflow.metadata.json
  • ci-operator/config/openshift/installer/openshift-installer-main.yaml

@mkowalski

Copy link
Copy Markdown
Contributor Author

Dry run of this lane's logic against a live dev-scripts cluster (BGP-VIP-managed, 3 masters + 2 workers) — coexistence verified end to end.

Executed the baremetalds-e2e-ovn-bgp-pre step (adapted for local execution) on a cluster installed with BGP_VIP_MANAGEMENT=true, then ran both verify steps exactly as this PR wires them:

  • baremetalds-e2e-bgp-vip-verify: passed with route advertisements active — API VIP advertised ×3 (masters), ingress VIP ×2, console 200 over the BGP-routed path
  • baremetalds-e2e-bgp-vip-ovn-bgp-verify: passed — the lane's key assertion held: the ovnk-generated-* FRRConfigurations were merged by the frr-k8s static pods on the control plane (where the frr-k8s DaemonSet does not run), 5/5 nodes Established at the route reflector each advertising its pod subnet, and a pod reached the external agnhost over the BGP-imported route
  • no conflict between the two external speakers: host-network ToR (192.168.111.1:179) and bridge-attached route reflector (192.168.111.3:179) coexist cleanly

The dry run also caught a real bug, fixed in 0edc822: the RouteAdvertisements apply races CNO's CRD creation. On clusters where frr-k8s is already deployed (as with BGP VIP management) the pre-script's daemonset rollout waits return immediately, so nothing delays the apply until CNO has created the CRD (no matches for kind "RouteAdvertisements"). The existing ovn-bgp lanes are masked by the daemonset-creation wait; the explicit CRD wait makes it deterministic for both. The namespace-idempotency fix in this PR was likewise confirmed necessary (the stock oc create namespace dies under errexit when openshift-frr-k8s pre-exists).

Remaining untested vs CI: the conformance suite against the combined configuration, and the install itself through this workflow (pending the feature PRs, as described above).


This comment was generated using AI. Please verify before acting on it.

Verify step: bounded polling before asserting CR presence, session count
and route state (BGP/CR reconciliation may still be converging when the
step starts); container runtime detection matching the pre-step's docker
fallback instead of hard-coded podman; assert each node's exact OVN pod
subnet (from the k8s.ovn.org/node-subnets annotation) at the route
reflector instead of a route count that unrelated prefixes (agnhost
network) could satisfy; curl --fail --show-error so HTTP errors fail the
datapath check.

Pre step: make the RouteAdvertisements CRD wait finite (10 min deadline,
dump CRD state on timeout) and move it before the FRR_IMAGE
managementState=Unmanaged transition, which would stop CNO from ever
creating the CRD.

Re-validated against a live BGP-VIP dev-scripts cluster with route
advertisements active: all four verify checks pass.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh (1)

12-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Disable global command tracing.

bash -x and set -x enable tracing for the full remote verifier. The verifier accesses the cluster through KUBECONFIG. Remove global tracing. Use the existing timeout diagnostics, or enable tracing only for a short non-sensitive diagnostic block.

As per coding guidelines, "**/*-commands.sh: ... default to set -euo pipefail without -x; only enable tracing when needed; and disable tracing around sensitive operations."

Proposed fix
-ssh "${SSHOPTS[@]}" "root@${IP}" bash -x - << 'EOF'
+ssh "${SSHOPTS[@]}" "root@${IP}" bash - << 'EOF'
@@
-set -x
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh`
around lines 12 - 17, Disable global command tracing in the remote verifier by
removing `-x` from the `bash` invocation and removing `set -x` from the heredoc
script, while preserving the existing `nounset`, `errexit`, and `pipefail`
behavior and relying on timeout diagnostics or narrowly scoped tracing only
where necessary.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh`:
- Around line 76-85: Update check_pod_subnets around the rr_routes and subnet
loop to count the expected IPv4 pod subnets from node metadata and compare that
count with the number of nodes. Fail when any node lacks an IPv4 pod subnet,
including when no subnets are returned, before accepting the route-reflector
result; preserve the existing per-subnet route validation.

---

Nitpick comments:
In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh`:
- Around line 12-17: Disable global command tracing in the remote verifier by
removing `-x` from the `bash` invocation and removing `set -x` from the heredoc
script, while preserving the existing `nounset`, `errexit`, and `pipefail`
behavior and relying on timeout diagnostics or narrowly scoped tracing only
where necessary.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: d7bf4db9-d05c-4eb5-a73b-ea5f6af233de

📥 Commits

Reviewing files that changed from the base of the PR and between 0edc822 and 51d03a9.

📒 Files selected for processing (2)
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/ovn-bgp/verify/baremetalds-e2e-bgp-vip-ovn-bgp-verify-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/ovn/bgp/pre/baremetalds-e2e-ovn-bgp-pre-commands.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • ci-operator/step-registry/baremetalds/e2e/ovn/bgp/pre/baremetalds-e2e-ovn-bgp-pre-commands.sh

Container-Privileges pre-merge check: EXTRA_MG_ARGS=--host-network scopes
to the post-run must-gather pod only (diagnostics must survive a broken
BGP-advertised pod-network path); the privileged FRR/agnhost containers
are in the pre-existing shared ovn-bgp-pre step and run on the ephemeral
CI hypervisor, not the cluster. Both mirror the existing
baremetalds-e2e-ovn-bgp-* lanes unchanged.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
@mkowalski

Copy link
Copy Markdown
Contributor Author

Re the Container-Privileges pre-merge check (EXTRA_MG_ARGS: --host-network + privileged containers): addressed in cb89779 with an explicit, narrowly scoped justification in the workflow documentation rather than removal, because neither item is a workload security posture change and both mirror the existing baremetalds-e2e-ovn-bgp-* lanes this workflow composes:

  • EXTRA_MG_ARGS: --host-network only applies to the post-run oc adm must-gather diagnostics pod. In BGP lanes the pod-network path is itself the thing under test — if it breaks, a pod-network must-gather cannot collect the evidence needed to debug the failure. Host networking for the gather pod is the exception that keeps diagnostics functional, scoped to that single short-lived pod.
  • The --privileged FRR and agnhost containers are in the pre-existing shared baremetalds-e2e-ovn-bgp-pre step (not introduced by this PR) and run on the ephemeral CI hypervisor (the equinix packet host, discarded after the job) — not on the cluster under test. FRR needs to create VRFs, attach macvlan/bridge interfaces and set net sysctls there to emulate the external router/route-reflector. Narrowing to individual capabilities on that throwaway host would diverge this PR from the shared step other lanes depend on, for no security benefit to the tested product.

Re the IPv6/disconnected warning: intentionally v4-only for now — the BGP VIP feature side of this lane is v4-proven only (dualstack is listed as follow-up work), and the lane is optional/on-demand, not part of disconnected or IPv6 job suites. The agnhost image reference matches the one already used by the shared pre step.


This comment was generated using AI. Please verify before acting on it.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
Third bgp-vip lane: day-2 MetalLB operator install (OLM with upstream
manifest fallback) in frr-k8s-external mode on a BGP-VIP-managed cluster,
peering with the existing ToR. Verifies the same-neighbor
FRRConfiguration merge (no session duplication), LoadBalancer IP
advertisement from every node, datapath over the BGP route, and that the
VIP acceptance criteria still hold. Validated end to end against a live
dev-scripts cluster before submission.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
@mkowalski mkowalski changed the title OPNET-803: installer: add e2e-metal-ipi-bgp-vip-ovn-bgp coexistence lane OPNET-803: installer: add BGP VIP coexistence lanes (OVN-K route advertisements, day-2 MetalLB) Aug 5, 2026
@mkowalski

Copy link
Copy Markdown
Contributor Author

Pushed the second coexistence job: e2e-metal-ipi-bgp-vip-metallb (day-2 MetalLB operator in frr-k8s-external mode, peering with the same ToR that serves the VIPs). PR title/description updated to cover both lanes.

Dry-run evidence from a live BGP-VIP dev-scripts cluster (3 masters + 2 workers), full day-2 flow executed exactly as the pre step scripts it:

  • operator installed via the SHA-pinned upstream-manifest fallback (no metallb-operator packagemanifest exists on pre-release OCP catalogs) — the two reproducible fixes this required are encoded in the step: nonroot-v2 SCC grant for the webhook-server SA, and DEPLOY_SERVICEMONITORS=true to unblock the operator's cert-secret mounts (upstream bug candidate, to be filed)
  • MetalLB CR bgpBackend: frr-k8s-externalopenshift-frr-k8s: controller 1/1, speaker 5/5, no second frr-k8s deployed
  • same-neighbor merge: ToR Established sessions 5 → 5 (delta 0) after MetalLB's FRRConfigurations landed — merged into the neighbor the VIP configuration already declares, no duplication or flap
  • lb-echo LoadBalancer got 192.168.111.30 from the pool; ToR shows the /32 with 5 paths (~15–20 s convergence, hence the bounded polls); curl over the BGP-installed kernel route returns 200
  • with MetalLB active, the VIP acceptance verify and the OVN-K RA coexistence verify both still pass — three FRRConfiguration producers coexisting on one cluster (bgp-vip + ovnk-generated-* + metallb-*)

One implementation note for reviewers: MetalLB's generated FRRConfigurations carry no labels, so the verify step matches them by the metallb- name prefix.


This comment was generated using AI. Please verify before acting on it.

Full coexistence lane composing the two previous ones: BGP-based VIP
management + OVN-K route advertisements + day-2 MetalLB in
frr-k8s-external mode on a single cluster - three FRRConfiguration
producers sharing the same frr-k8s instances (static pods on masters,
DaemonSet on workers) and the same external speakers. Runs all three
verify steps in order, then the conformance suite. This exact producer
combination was validated end to end on a live dev-scripts cluster
(all three verifies green) before the lane was added.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
@mkowalski

Copy link
Copy Markdown
Contributor Author

Added the third lane: e2e-metal-ipi-bgp-vip-ovn-bgp-metallb — all three FRRConfiguration producers (VIP + OVN-K RA + day-2 MetalLB) on one cluster. It is a pure composition of the two existing lanes' refs (no new steps), and this exact producer combination is what the dry-run cluster ran when all three verify steps passed together.


This comment was generated using AI. Please verify before acting on it.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh (2)

53-61: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Select the CSV by installedCSV instead of displayName.

The wait loop matches the CSV whose .spec.displayName equals the literal MetalLB Operator. That display name is not an API contract and it changes between operator releases. If it changes, the loop cannot match, the step waits the full 900s, and it fails on a healthy install.

Read the CSV name from the Subscription status instead. That value is set by OLM and is stable.

♻️ Proposed fix to resolve the CSV by name
   deadline=$((SECONDS + 900))
-  until [ "$(oc get csv -n metallb-system -o jsonpath='{.items[?(@.spec.displayName=="MetalLB Operator")].status.phase}' 2>/dev/null)" = "Succeeded" ]; do
+  csv_succeeded() {
+    local csv
+    csv="$(oc get subscription metallb-operator -n metallb-system -o jsonpath='{.status.installedCSV}' 2>/dev/null)"
+    [ -n "${csv}" ] || return 1
+    [ "$(oc get csv "${csv}" -n metallb-system -o jsonpath='{.status.phase}' 2>/dev/null)" = "Succeeded" ]
+  }
+  until csv_succeeded; do
     if (( SECONDS >= deadline )); then
       oc get csv,subscription,installplan -n metallb-system || true
       echo "Timed out waiting for the MetalLB operator CSV" >&2
       exit 1
     fi
     sleep 15
   done
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh`
around lines 53 - 61, Update the MetalLB operator wait loop to resolve the CSV
name from the Subscription status.installedCSV in metallb-system, then query
that CSV’s status.phase for Succeeded. Remove the displayName-based selector
while preserving the existing timeout, diagnostics, and polling behavior.

155-159: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Wait for the lb-echo pods to become Ready.

The step creates the Deployment and the Service, then exits. The verify step polls for the LoadBalancer IP and for the BGP paths, but MetalLB advertises the IP based on the Service, not on pod readiness. The single curl in the verify step can therefore run before either replica is Ready.

Add a rollout wait here, consistent with the other rollout waits in this script.

♻️ Proposed fix to gate on workload readiness
 oc expose deployment lb-echo -n default --type=LoadBalancer --port=8080 --name=lb-echo \
   --dry-run=client -o yaml | oc apply -f -
+oc rollout status -n default deploy/lb-echo --timeout=5m
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh`
around lines 155 - 159, After applying the lb-echo Deployment and Service, add a
rollout wait for the lb-echo Deployment, using the same rollout-wait pattern
already used elsewhere in this script. Ensure the command waits for both
replicas to become Ready before this step exits, while leaving the existing
creation commands unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh`:
- Around line 125-153: Update the IPAddressPool in the MetalLB manifest applied
by the pre-commands to use an address range outside dev-scripts’ DHCP range of
192.168.111.20-192.168.111.60, while leaving the BGPPeer peerAddress and ASN
values unchanged.

In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-commands.sh`:
- Around line 100-111: The datapath check must wait for a serving backend before
asserting reachability. In
ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-commands.sh
lines 100-111, wrap the curl in the existing poll helper while preserving the ip
route get diagnostic on failure; in
ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh
lines 155-159, add oc rollout status -n default deploy/lb-echo --timeout=5m
after oc expose.
- Around line 66-71: Update check_sessions to read peers from the FRR
.ipv4Unicast.peers object, with an explicit fallback to the top-level .peers for
flat output, before filtering Established sessions and comparing the count with
nodes.

---

Nitpick comments:
In
`@ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh`:
- Around line 53-61: Update the MetalLB operator wait loop to resolve the CSV
name from the Subscription status.installedCSV in metallb-system, then query
that CSV’s status.phase for Succeeded. Remove the displayName-based selector
while preserving the existing timeout, diagnostics, and polling behavior.
- Around line 155-159: After applying the lb-echo Deployment and Service, add a
rollout wait for the lb-echo Deployment, using the same rollout-wait pattern
already used elsewhere in this script. Ensure the command waits for both
replicas to become Ready before this step exits, while leaving the existing
creation commands unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 71362e55-4276-4787-a6e9-3d4df4a6bc0c

📥 Commits

Reviewing files that changed from the base of the PR and between cb89779 and 0a73976.

⛔ Files ignored due to path filters (1)
  • ci-operator/jobs/openshift/installer/openshift-installer-main-presubmits.yaml is excluded by !ci-operator/jobs/**
📒 Files selected for processing (12)
  • ci-operator/config/openshift/installer/openshift-installer-main.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/baremetalds-e2e-bgp-vip-metallb-workflow.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/baremetalds-e2e-bgp-vip-metallb-workflow.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/pre/baremetalds-e2e-bgp-vip-metallb-pre-ref.yaml
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/OWNERS
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-commands.sh
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-ref.metadata.json
  • ci-operator/step-registry/baremetalds/e2e/bgp-vip/metallb/verify/baremetalds-e2e-bgp-vip-metallb-verify-ref.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • ci-operator/config/openshift/installer/openshift-installer-main.yaml

…-operator

Switch the no-catalog fallback from a pinned upstream main SHA to the
openshift/metallb-operator release branch (default release-5.0): the
fork's branches track OCP releases and carry the downstream API shape
(frr-k8s-external backend), so the lane does not rot the way an upstream
main pin would. The SCC grant stays: the fork's bin manifest ships the
same uid-65534 webhook-server deployment (the productized operator only
avoids it via the CSV's --external-metallb-webhook-server mode, which is
OLM-only). Validated live: fork manifest applied over the dry-run
cluster, operator + MetalLB rolled out, all three coexistence verifies
still pass.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
@mkowalski

Copy link
Copy Markdown
Contributor Author

Fallback source switched to openshift/metallb-operator (98a7aa6, default ref release-5.0): the fork's release branches track OCP and carry the downstream API shape, replacing the upstream main SHA pin that would rot.

Investigated dropping the nonroot-v2 SCC grant as part of this: not possible with manifest-based installs — the fork's bin/metallb-operator.yaml ships the same uid-65534 webhook-server deployment as upstream. The productized operator avoids the separate webhook pod entirely via the CSV's --external-metallb-webhook-server mode (webhook served inside the manager), which only exists on the OLM path — i.e. exactly the path that is unavailable when the fallback triggers. The grant stays as an explicit, commented one-liner scoped to one SA in one namespace.

Re-validated live: fork manifest applied over the dry-run cluster, operator + MetalLB re-rolled, all three coexistence verifies still exit 0.


This comment was generated using AI. Please verify before acting on it.

mkowalski added a commit to mkowalski/bgp-vip-demo that referenced this pull request Aug 5, 2026
Add metallb/frr-k8s#470 (redistribute design, open) and
openshift/release#82912 (coexistence lanes, open); kube-vip#1636 already
shown merged. Today-line moved to Aug 5; final phase band widened to
'CI + coexistence lanes'. 23 PRs across 12 repositories.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
- both datapath curls discard the response body (-o /dev/null): the pod
  hostname must not land in CI logs (No-Sensitive-Data-In-Logs)
- vtysh summary parsing accepts both JSON schemas
  (.ipv4Unicast.peers on FRR 8.x, flat .peers on 10.x)
- ovn-bgp verify: require exactly one IPv4 pod subnet per node from the
  node-subnets annotations before trusting the route-reflector result
  (an absent annotation previously shrank the loop instead of failing)
- metallb pool moved to 192.168.111.70-90, off the dev-scripts DHCP
  range (.20-.60) that the previous .30-.50 overlapped
- datapath gated on backend readiness: lb-echo rollout wait in the pre
  step, poll-wrapped curl in the verify step

Re-validated live: pool reapplied, service recycled (got .70), all
three coexistence verifies exit 0.

Assisted-By: Claude Fable 5
Signed-off-by: Mat Kowalski <mko@redhat.com>
@mkowalski

Copy link
Copy Markdown
Contributor Author

Re the No-Sensitive-Data-In-Logs pre-merge check: fixed in a8b7143 — both datapath curls (ovn-bgp and metallb verify steps) now discard the response body with -o /dev/null; success is judged purely by the curl exit code, so the test pod's hostname no longer reaches CI logs.

Same commit also addresses the round's inline findings (jq schema fallback for FRR 8.x/10.x summaries, per-node pod-subnet count guard, MetalLB pool moved off the dev-scripts DHCP range to .70-.90, and the datapath gated on lb-echo backend readiness at both the pre and verify sites). All re-validated against the live three-producer cluster: pool reapplied, service recycled (received 192.168.111.70), all three coexistence verifies exit 0.

Re the IPv6/disconnected warning: unchanged position — the lanes are deliberately v4-only (matching the feature's proven scope) and optional/on-demand; not part of IPv6 or disconnected suites.


This comment was generated using AI. Please verify before acting on it.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

[REHEARSALNOTIFIER]
@mkowalski: the pj-rehearse plugin accommodates running rehearsal tests for the changes in this PR. Expand 'Interacting with pj-rehearse' for usage details. The following rehearsable tests have been affected by this change:

Test name Repo Type Reason
pull-ci-openshift-ovn-kubernetes-main-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-5.1-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-5.0-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.23-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.22-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.21-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.20-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.19-e2e-metal-ipi-ovn-dualstack-bgp openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.18-e2e-metal-ipi-ovn-dualstack-bgp-techpreview openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-main-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-main-e2e-metal-ipi-ovn-dualstack-bgp-local-gw-techpreview openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-5.1-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-5.1-e2e-metal-ipi-ovn-dualstack-bgp-local-gw-techpreview openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-5.0-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-5.0-e2e-metal-ipi-ovn-dualstack-bgp-local-gw-techpreview openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.23-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.23-e2e-metal-ipi-ovn-dualstack-bgp-local-gw-techpreview openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.22-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.22-e2e-metal-ipi-ovn-dualstack-bgp-local-gw-techpreview openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.21-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.20-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.19-e2e-metal-ipi-ovn-dualstack-bgp-local-gw openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-release-4.18-e2e-metal-ipi-ovn-dualstack-bgp-local-gw-techpreview openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-main-e2e-metal-ipi-ovn-bgp-virt-dualstack openshift/ovn-kubernetes presubmit Registry content changed
pull-ci-openshift-ovn-kubernetes-main-e2e-metal-ipi-ovn-bgp-virt-dualstack-techpreview openshift/ovn-kubernetes presubmit Registry content changed

A total of 125 jobs have been affected by this change. The above listing is non-exhaustive and limited to 25 jobs.

A full list of affected jobs can be found here

Interacting with pj-rehearse

Comment: /pj-rehearse to run up to 5 rehearsals
Comment: /pj-rehearse skip to opt-out of rehearsals
Comment: /pj-rehearse {test-name}, with each test separated by a space, to run one or more specific rehearsals
Comment: /pj-rehearse more to run up to 10 rehearsals
Comment: /pj-rehearse max to run up to 25 rehearsals
Comment: /pj-rehearse auto-ack to run up to 5 rehearsals, and add the rehearsals-ack label on success
Comment: /pj-rehearse list to get an up-to-date list of affected jobs
Comment: /pj-rehearse abort to abort all active rehearsals
Comment: /pj-rehearse network-access-allowed to allow rehearsals of tests that have the restrict_network_access field set to false. This must be executed by an openshift org member who is not the PR author

Once you are satisfied with the results of the rehearsals, comment: /pj-rehearse ack to unblock merge. When the rehearsals-ack label is present on your PR, merge will no longer be blocked by rehearsals.
If you would like the rehearsals-ack label removed, comment: /pj-rehearse reject to re-block merging.

@mkowalski

Copy link
Copy Markdown
Contributor Author

/label approved

@mkowalski

Copy link
Copy Markdown
Contributor Author

/pj-rehearse ack

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Aug 5, 2026
@mkowalski

Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

@mkowalski: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@openshift-merge-bot openshift-merge-bot Bot added the rehearsals-ack Signifies that rehearsal jobs have been acknowledged label Aug 5, 2026
@openshift-ci

openshift-ci Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

@mkowalski: 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.

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. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. rehearsals-ack Signifies that rehearsal jobs have been acknowledged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants