Migrating Ipfailover test cases to images repo#243
Conversation
|
Skipping CI for Draft Pull Request. |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: melvinjoseph86 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
/payload-job-with-prs pull-ci-openshift-images-master-e2e-metal-ipi-tests-ext openshift/release/pull/81103 |
|
@melvinjoseph86: An error was encountered. No known errors were detected, please see the full error message for details. Full error message.
unable to get additional pr info from string: openshift/release/pull/81103: string: openshift/release/pull/81103 doesn't match expected format: org/repo#number
Please contact an administrator to resolve this issue. |
|
/payload-job-with-prs pull-ci-openshift-images-master-e2e-metal-ipi-tests-ext openshift/release#81103 |
|
@melvinjoseph86: trigger 0 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command |
|
/payload-job-with-prs periodic-ci-openshift-images-master-e2e-metal-ipi-tests-ext openshift/release#81103 |
|
@melvinjoseph86: trigger 0 job(s) for the /payload-(with-prs|job|aggregate|job-with-prs|aggregate-with-prs) command |
Investigation: Deserialization Error Root CauseI investigated the Root Cause:
|
36578d9 to
791cb2c
Compare
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: openshift/coderabbit/.coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
WalkthroughAdds an ipfailover keepalived test extension with build packaging, a Go entrypoint, shared test helpers, deployment testdata, six e2e scenarios, and usage documentation. Changesipfailover OTE extension
Estimated code review effort: 4 (Complex) | ~60 minutes Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (3 errors, 3 warnings)
✅ Passed checks (9 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 14
🧹 Nitpick comments (1)
ipfailover/keepalived/Dockerfile (1)
5-5: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winCopy only the inputs this builder stage actually needs.
COPY . .pulls the whole repository into the build context even though this stage only buildsipfailover/keepalived/tests. That widens the accidental secret/file exposure surface and invalidates the cache on unrelated changes.♻️ Proposed fix
WORKDIR /go/src/github.com/openshift/ipfailover -COPY . . +COPY ipfailover/keepalived/tests ./ipfailover/keepalived/tests RUN cd ipfailover/keepalived/tests && \ make build && \As per path instructions,
COPY specific files, not entire context.🤖 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 `@ipfailover/keepalived/Dockerfile` at line 5, The builder stage in the keepalived Dockerfile is over-copying the entire repository with COPY . ., even though it only needs the inputs required to build ipfailover/keepalived/tests. Replace the broad copy with explicit copies of the minimal needed files and directories so the stage stays narrowly scoped, avoids exposing unrelated files, and preserves cache reuse; use the Dockerfile stage and the tests build target as the main references when locating the change.Source: Path instructions
🤖 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 `@ipfailover/keepalived/tests/cmd/main.go`:
- Around line 25-26: Move the framework.AfterReadingAllFlags call so it runs
after root.Execute() has parsed flags, because invoking it before parsing leaves
framework.TestContext at default values and ignores kube/e2e overrides. Update
the startup flow in main so util.InitStandardFlags still happens first, then
flags are parsed via root.Execute, and only then
framework.AfterReadingAllFlags(&framework.TestContext) is called.
In `@ipfailover/keepalived/tests/e2e/ipfailover.go`:
- Around line 168-171: After deleting the current primary, do not immediately
recompute MASTER/BACKUP from the pod list; in the ipfailover e2e flow around
getPodListByLabel, ensureIpfailoverMasterBackup, waitForPrimaryPod, and
futurePrimaryPod[0], add a replica-aware wait until the replacement pod set is
fully available and stable before reading pod names again. Apply the same fix in
both affected flows so the recalculation happens only after the rollout
completes and the pod list reflects the final state.
- Around line 75-84: The IPv6 single-stack check in ipfailover e2e is too narrow
because it only inspects the first clusterNetwork CIDR and can misclassify
IPv6-first dual-stack clusters. Update the logic in the test around the current
oc-based network lookup to reuse checkIPStackType(oc) or otherwise evaluate the
full status.clusterNetwork CIDR list before calling g.Skip, so only true IPv6
single-stack clusters are skipped.
- Around line 69-73: The remote-worker skip check in the ipfailover e2e test is
using the wrong node selector, so it can miss remote-worker clusters. Update the
logic in the test block around the remote-worker gate to query
`node.openshift.io/remote-worker` directly, matching the approach used by
`exactNodeDetails()`, and then keep the skip decision based on that targeted
result instead of searching generic `nodes -l kubernetes.io/hostname` output.
In `@ipfailover/keepalived/tests/e2e/testdata/router/ipfailover.yaml`:
- Around line 28-75: The openshift-ipfailover container definition in the
ipfailover manifest is missing an explicit resource envelope. Add cpu and memory
requests and limits to the openshift-ipfailover container alongside its existing
ports, securityContext, and env settings so it conforms to the resource policy
for every container.
- Around line 14-27: The ipfailover test template hard-codes a 2-replica
deployment with a worker-only node selector, which assumes a standard
multi-worker topology. Update the ipfailover.yaml template to derive replicas
from the number of schedulable nodes and make the e2e test setup topology-aware
before rendering it, so it can handle SingleReplica, DualReplica, and
arbiter-style clusters. Use the existing ipfailover template fields and related
test setup logic to cap replica count to available schedulable nodes and avoid
assuming node-role.kubernetes.io/worker is always present.
- Around line 23-44: The ipfailover test pod spec is effectively fully
host-privileged and needs to be tightened in the openshift-ipfailover workload
definition. Update the container and pod security settings to follow the
security guidance by adding non-root and no-escalation constraints, making the
root filesystem read-only, dropping all capabilities unless explicitly required,
and disabling service account token automount unless the test truly needs it.
Keep host access only if required for the test, but scope it to the minimum
necessary privileges and document any exception in the ipfailover template
rather than leaving the default manifest overly permissive.
- Around line 69-75: The keepalived test pod spec currently defines only
livenessProbe, which lets the pod report Ready too early and makes the e2e flow
race-prone. Add a readinessProbe alongside the existing livenessProbe in the
ipfailover manifest so readiness only flips after keepalived is actually
prepared to serve, keeping ensurePodWithLabelReady in sync with the downstream
assertions in ipfailover.go.
- Around line 22-25: Remove the invalid top-level privileged field from the pod
spec in the ipfailover test manifest. The fix is to delete
spec.template.spec.privileged from the ipfailover.yaml fixture and keep the
existing containers[].securityContext.privileged setting as the only privileged
declaration. Use the ipfailover pod template structure under spec.template.spec
to locate the change.
In `@ipfailover/keepalived/tests/e2e/util.go`:
- Around line 319-331: The helper waitForPodWithLabelReady currently only checks
Ready status, so it can succeed with a single surviving pod during rollout.
Update waitForPodWithLabelReady to also verify the number of pods returned by
the label selector in addition to readiness, and keep polling until both the
expected replica count and Ready condition are met. Use the existing wait.Poll
logic and the kubectl get call in waitForPodWithLabelReady to enforce the count
before returning success.
- Around line 29-31: The worker-counting logic in the e2e helper is parsing `oc
get nodes` table text with `strings.Count`, which double-counts `Ready` inside
`NotReady` and can underreport healthy nodes. Update the node readiness check in
the helper that builds `linuxWorkerDetails` and `nodeCount` to use structured
node data from the API or JSON output, inspecting node conditions and
unschedulable state instead of matching substrings in human-readable output.
- Around line 240-249: The unicast peer list in the Nutanix/none branch is built
from the first node address, but .status.addresses[0] is not guaranteed to be an
InternalIP. Update the logic in the keepalived e2e util path that calls
oc.AsAdmin().WithoutNamespace().Run("get").Args("nodes", ...) to filter node
addresses by type == "InternalIP" before assembling OPENSHIFT_HA_UNICAST_PEERS,
and keep the existing validation that enough worker IPs were found.
- Around line 160-176: The getVipOwnerPod helper is treating the literal
“command terminated with exit code 1” as a VIP miss, which can mask real oc exec
failures and return the wrong master or an empty result. Update the logic around
oc.AsAdmin().WithoutNamespace().Run("exec").Args(...).Output() to inspect err
first, only consider exit code 1 from the command as “VIP not present,” and
explicitly retry or fail for any other error conditions; keep the selection
logic in getVipOwnerPod and its primaryNode assignment tied to successful
command results.
In `@ipfailover/keepalived/tests/go.mod`:
- Line 3: The module version in ipfailover/keepalived/tests/go.mod is newer than
the Go toolchain used by the ipfailover/keepalived/Dockerfile builder stage, so
the build may auto-download a different compiler. Update the builder image in
Dockerfile to a Go 1.25-based image, or reduce the go directive in go.mod to
match the supported compiler version. Make sure the versions stay aligned across
go.mod and the Dockerfile so the tests build with the image’s local toolchain.
---
Nitpick comments:
In `@ipfailover/keepalived/Dockerfile`:
- Line 5: The builder stage in the keepalived Dockerfile is over-copying the
entire repository with COPY . ., even though it only needs the inputs required
to build ipfailover/keepalived/tests. Replace the broad copy with explicit
copies of the minimal needed files and directories so the stage stays narrowly
scoped, avoids exposing unrelated files, and preserves cache reuse; use the
Dockerfile stage and the tests build target as the main references when locating
the change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
| g.By("7. Verify the virtual IP is floated onto the new MASTER node") | ||
| newPodName1 := getPodListByLabel(oc, ns, "ipfailover=hello-openshift") | ||
| newMasterNode, _ := ensureIpfailoverMasterBackup(oc, ns, newPodName1) | ||
| waitForPrimaryPod(oc, ns, newMasterNode, virtualIP) |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
Wait for the replacement pod set before recalculating MASTER/BACKUP.
Both flows delete the current primary and then immediately read pod names again. There is a normal window where only the surviving replica exists, so ensureIpfailoverMasterBackup() / futurePrimaryPod[0] can race the rollout and fail nondeterministically. Add a replica-aware wait between the delete and the next pod-list read.
Also applies to: 346-353
🤖 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 `@ipfailover/keepalived/tests/e2e/ipfailover.go` around lines 168 - 171, After
deleting the current primary, do not immediately recompute MASTER/BACKUP from
the pod list; in the ipfailover e2e flow around getPodListByLabel,
ensureIpfailoverMasterBackup, waitForPrimaryPod, and futurePrimaryPod[0], add a
replica-aware wait until the replacement pod set is fully available and stable
before reading pod names again. Apply the same fix in both affected flows so the
recalculation happens only after the rollout completes and the pod list reflects
the final state.
| replicas: 2 | ||
| selector: | ||
| matchLabels: | ||
| ipfailover: hello-openshift | ||
| template: | ||
| metadata: | ||
| labels: | ||
| ipfailover: hello-openshift | ||
| spec: | ||
| serviceAccountName: ipfailover | ||
| privileged: true | ||
| hostNetwork: true | ||
| nodeSelector: | ||
| node-role.kubernetes.io/worker: "" |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift
Avoid hard-coding a 2-replica, worker-only topology.
replicas: 2 plus node-role.kubernetes.io/worker assumes at least two schedulable workers exist. This template will stall on SingleReplica/DualReplica/arbiter-style topologies instead of adapting or being explicitly gated. Cap replicas to the schedulable node count and make the surrounding test logic topology-aware before rendering this template. As per coding guidelines, "check whether they introduce scheduling constraints assuming standard HA topology with 3+ control-plane nodes and dedicated workers" and "Cap replica counts to schedulable nodes."
🤖 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 `@ipfailover/keepalived/tests/e2e/testdata/router/ipfailover.yaml` around lines
14 - 27, The ipfailover test template hard-codes a 2-replica deployment with a
worker-only node selector, which assumes a standard multi-worker topology.
Update the ipfailover.yaml template to derive replicas from the number of
schedulable nodes and make the e2e test setup topology-aware before rendering
it, so it can handle SingleReplica, DualReplica, and arbiter-style clusters. Use
the existing ipfailover template fields and related test setup logic to cap
replica count to available schedulable nodes and avoid assuming
node-role.kubernetes.io/worker is always present.
Source: Coding guidelines
| if platformtype == "nutanix" || platformtype == "none" { | ||
| getPodListByLabel(oc, oc.Namespace(), "ipfailover=hello-openshift") | ||
| workerIPAddress, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("nodes", "--selector=node-role.kubernetes.io/worker=", "-ojsonpath={.items[*].status.addresses[0].address}").Output() | ||
| o.Expect(err).NotTo(o.HaveOccurred()) | ||
| modifiedIPList := strings.Split(workerIPAddress, " ") | ||
| if len(modifiedIPList) < 2 { | ||
| e2e.Failf("There is not enough IP addresses to add as unicast peer") | ||
| } | ||
| ipList := strings.Join(modifiedIPList, ",") | ||
| cmd := fmt.Sprintf("OPENSHIFT_HA_UNICAST_PEERS=%v", ipList) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Don’t assume .status.addresses[0] is the worker IP.
Kubernetes does not guarantee address order. On many clusters index 0 is Hostname or ExternalIP, so OPENSHIFT_HA_UNICAST_PEERS can be populated with unusable values and the Nutanix/none path never converges. Filter node addresses by type=="InternalIP" before building the peer list.
🤖 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 `@ipfailover/keepalived/tests/e2e/util.go` around lines 240 - 249, The unicast
peer list in the Nutanix/none branch is built from the first node address, but
.status.addresses[0] is not guaranteed to be an InternalIP. Update the logic in
the keepalived e2e util path that calls
oc.AsAdmin().WithoutNamespace().Run("get").Args("nodes", ...) to filter node
addresses by type == "InternalIP" before assembling OPENSHIFT_HA_UNICAST_PEERS,
and keep the existing validation that enough worker IPs were found.
| func waitForPodWithLabelReady(oc *exutil.CLI, ns, label string) error { | ||
| return wait.Poll(5*time.Second, 3*time.Minute, func() (bool, error) { | ||
| status, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("pod", "-n", ns, "-l", label, `-ojsonpath={.items[*].status.conditions[?(@.type=="Ready")].status}`).Output() | ||
| e2e.Logf("the Ready status of pod is %v", status) | ||
| if err != nil || status == "" { | ||
| e2e.Logf("failed to get pod status: %v, retrying...", err) | ||
| return false, nil | ||
| } | ||
| if strings.Contains(status, "False") { | ||
| e2e.Logf("the pod Ready status not met; wanted True but got %v, retrying...", status) | ||
| return false, nil | ||
| } | ||
| return true, nil |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
This readiness gate can pass before the replacement replica exists.
It only checks the Ready condition of the pods that already exist; it never verifies how many labeled pods are present. During a rollout, one surviving Ready pod is enough for this to return success, and callers then immediately assume a two-pod MASTER/BACKUP set. Make the helper validate the expected replica count too.
🤖 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 `@ipfailover/keepalived/tests/e2e/util.go` around lines 319 - 331, The helper
waitForPodWithLabelReady currently only checks Ready status, so it can succeed
with a single surviving pod during rollout. Update waitForPodWithLabelReady to
also verify the number of pods returned by the label selector in addition to
readiness, and keep polling until both the expected replica count and Ready
condition are met. Use the existing wait.Poll logic and the kubectl get call in
waitForPodWithLabelReady to enforce the count before returning success.
|
/payload-with-prs openshift/release#81231 |
|
/test-with-release openshift/release#81231 |
|
/payload-job-with-prs openshift/release#81231 e2e-openstack-ipi-tests-ext |
|
@melvinjoseph86: it appears that you have attempted to use some version of the payload command, but your comment was incorrectly formatted and cannot be acted upon. See the docs for usage info. |
791cb2c to
4d59ec2
Compare
|
/payload-with-prs openshift/release#81231 |
|
/test-with-release openshift/release#81231 |
|
/payload-job-with-prs openshift/release#81231 e2e-openstack-ipi-tests-ext |
|
@melvinjoseph86: it appears that you have attempted to use some version of the payload command, but your comment was incorrectly formatted and cannot be acted upon. See the docs for usage info. |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
ipfailover/keepalived/tests/README.md (1)
49-49: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueSpecify a language for the fenced code block.
📝 Proposed fix
-``` +```text tests/🤖 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 `@ipfailover/keepalived/tests/README.md` at line 49, The fenced code block in the README is missing a language tag, so update the example in the tests/ section to use an explicit fence language. Make the change in the README markdown where the code block appears, and use the fenced block syntax consistently so the snippet is clearly marked as text.Source: Linters/SAST tools
ipfailover/keepalived/Dockerfile (2)
5-5: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueAvoid copying the entire build context.
COPY . .pulls in the wholeopenshift/imagesrepository context into the builder stage, which is unnecessary for building the keepalived test extension and increases build context size/cache invalidation. Scope the copy to only the required subtree.As per path instructions, "COPY specific files, not entire context."
🤖 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 `@ipfailover/keepalived/Dockerfile` at line 5, The builder stage is copying the entire repository context with COPY . ., which bloats the image build and invalidates cache unnecessarily. Update the keepalived Dockerfile to copy only the minimal required subtree or specific build inputs needed for the keepalived test extension, replacing the broad copy in the build step.Source: Path instructions
32-34: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valuePlacement in
/usr/bin/looks unconventional for a.tar.gz.Copying an archive (not an executable) into
/usr/bin/is atypical; consider extracting to a dedicated directory (e.g./usr/local/ipfailover-tests/) if the archive is meant to be unpacked by consumers, to avoid confusion with executables inPATH.🤖 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 `@ipfailover/keepalived/Dockerfile` around lines 32 - 34, The Dockerfile copy step for the test extension archive is placing a .tar.gz into /usr/bin/, which is misleading for a non-executable artifact. Update the COPY in the keepalived Dockerfile so the archive is stored in a dedicated non-PATH location such as a tests or artifacts directory, and keep the placement aligned with how the ipfailover-test-extension.tar.gz is intended to be consumed or unpacked.
🤖 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 `@ipfailover/keepalived/Dockerfile`:
- Around line 6-11: The Dockerfile build step packages ipfailover-tests-ext into
ipfailover-test-extension.tar.gz, but the image never unpacks it and the tests
expect the binary itself. Update the keepalived Dockerfile build flow so the
artifact copied into /usr/bin/ is the executable ipfailover-tests-ext, or add an
explicit extraction step after the tarball is created; use the existing build
sequence around make build and the ipfailover-tests-ext output to keep the final
image runnable.
---
Nitpick comments:
In `@ipfailover/keepalived/Dockerfile`:
- Line 5: The builder stage is copying the entire repository context with COPY .
., which bloats the image build and invalidates cache unnecessarily. Update the
keepalived Dockerfile to copy only the minimal required subtree or specific
build inputs needed for the keepalived test extension, replacing the broad copy
in the build step.
- Around line 32-34: The Dockerfile copy step for the test extension archive is
placing a .tar.gz into /usr/bin/, which is misleading for a non-executable
artifact. Update the COPY in the keepalived Dockerfile so the archive is stored
in a dedicated non-PATH location such as a tests or artifacts directory, and
keep the placement aligned with how the ipfailover-test-extension.tar.gz is
intended to be consumed or unpacked.
In `@ipfailover/keepalived/tests/README.md`:
- Line 49: The fenced code block in the README is missing a language tag, so
update the example in the tests/ section to use an explicit fence language. Make
the change in the README markdown where the code block appears, and use the
fenced block syntax consistently so the snippet is clearly marked as text.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
| RUN cd ipfailover/keepalived/tests && \ | ||
| make build && \ | ||
| cd bin && \ | ||
| tar -czvf ipfailover-test-extension.tar.gz ipfailover-tests-ext && \ | ||
| rm -f ipfailover-tests-ext | ||
|
|
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Look for anything that extracts ipfailover-test-extension.tar.gz (e.g. CI scripts, entrypoint, Makefile targets)
rg -n "ipfailover-test-extension" --hidden -g '!*.git*'Repository: openshift/images
Length of output: 154
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the Dockerfile and related files for extraction/use of the tarball
git ls-files 'ipfailover/keepalived/*' 'ipfailover/**' | sed -n '1,200p'
echo
echo '--- Dockerfile ---'
cat -n ipfailover/keepalived/Dockerfile | sed -n '1,120p'
echo
echo '--- Search for tar extraction or the archive name ---'
rg -n "ipfailover-test-extension|tar -x|tarball|\.tar\.gz|ipfailover-tests-ext" ipfailover --hidden -g '!*.git*'Repository: openshift/images
Length of output: 34534
Unpack the test extension before shipping it. The image copies ipfailover-test-extension.tar.gz into /usr/bin/, but nothing in this repo extracts it, and the tests reference ipfailover-tests-ext directly. Copy the binary itself or add an unpack step so it’s executable from the expected path.
🤖 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 `@ipfailover/keepalived/Dockerfile` around lines 6 - 11, The Dockerfile build
step packages ipfailover-tests-ext into ipfailover-test-extension.tar.gz, but
the image never unpacks it and the tests expect the binary itself. Update the
keepalived Dockerfile build flow so the artifact copied into /usr/bin/ is the
executable ipfailover-tests-ext, or add an explicit extraction step after the
tarball is created; use the existing build sequence around make build and the
ipfailover-tests-ext output to keep the final image runnable.
Creates tests-extension/ directory at repository root to match OpenShift CI job expectations from openshift/release#81231. The CI jobs run: cd tests-extension && make build && ./bin/ipfailover-tests-ext This structure provides that interface while delegating to the actual test implementation in ipfailover/keepalived/tests/. Files created: - tests-extension/Makefile: Delegates build to ipfailover/keepalived/tests/ - tests-extension/README.md: Documents structure and CI integration - tests-extension/.gitignore: Excludes bin/ directory from git The bin/ directory is created by make build (254MB binary) and should not be committed. CI will build it fresh using the Makefile. This fixes all 5 CI job failures (e2e-aws, images, e2e-metal-ipi-ovn-ipv6, okd-scos-images, e2e-aws-upgrade) which were failing because the directory structure didn't exist. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Change from rhel-9-golang-1.25-openshift-4.19 (not available) to rhel-9-golang-1.23-openshift-4.18 (standard CI builder image). The 1.25 image doesn't exist in the CI registry, causing build failures: dockerimage.image.openshift.io "quay.io/openshift/ci:ocp_builder_rhel-9-golang-1.25-openshift-4.19" not found This fixes the CI build stage failure in e2e-aws and other jobs. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
/payload-with-prs openshift/release#81231 |
|
@melvinjoseph86: it appears that you have attempted to use some version of the payload command, but your comment was incorrectly formatted and cannot be acted upon. See the docs for usage info. |
|
/test-with-release openshift/release#81231 |
|
@coderabbitai can you check the required changes are made |
|
/payload-job-with-prs openshift/release#81231 e2e-openstack-ipi-tests-ext |
|
@melvinjoseph86: it appears that you have attempted to use some version of the payload command, but your comment was incorrectly formatted and cannot be acted upon. See the docs for usage info. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
fd ipfailover.go -p ipfailover/keepalived/tests
echo "---init---"
rg -n "func init" -A 20 ipfailover/keepalived/tests/e2e/ipfailover.go
echo "---output-interceptor---"
rg -n "output-interceptor|GinkgoWriter|klog.SetOutput|SetDefaultWarningHandler|os.Stderr" ipfailover/keepalived/tests/e2e/ipfailover.goLength of output: 1672
func init() {
flag.Set("ginkgo.output-interceptor-mode", "none")
klog.SetOutput(g.GinkgoWriter)
rest.SetDefaultWarningHandler(
rest.NewWarningWriter(g.GinkgoWriter, rest.WarningWriterOptions{}),
)
exutil.WithCleanup(func() {})
}This still uses To apply the suggested fix, update func init() {
// Write directly to stderr — no timing dependency on GinkgoWriter
klog.SetOutput(os.Stderr)
// Redirect REST client warnings directly to stderr
rest.SetDefaultWarningHandler(
rest.NewWarningWriter(os.Stderr, rest.WarningWriterOptions{}),
)
exutil.WithCleanup(func() {})
}Note you'll also need to ensure |
|
@melvinjoseph86: The following tests failed, say
Full PR test history. Your PR dashboard. DetailsInstructions 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. |
Summary by CodeRabbit