Skip to content

[CNO] Setup OTE framework and migrate test cases from tests-private#3015

Open
anuragthehatter wants to merge 1 commit into
openshift:masterfrom
anuragthehatter:cno-ote-framework
Open

[CNO] Setup OTE framework and migrate test cases from tests-private#3015
anuragthehatter wants to merge 1 commit into
openshift:masterfrom
anuragthehatter:cno-ote-framework

Conversation

@anuragthehatter

@anuragthehatter anuragthehatter commented May 27, 2026

Copy link
Copy Markdown

Summary

  • Set up the OpenShift Tests Extension (OTE) framework for cluster-network-operator
  • Migrate three test cases from openshift-tests-private:
    • OCP-72817: Verify internalJoinSubnet and internalTransitSwitchSubnet are configurable post-install as a Day 2 operation
    • OCP-51727: Verify ovsdb-server and northd do not core dump on node restart
    • OCP-72028: Verify join switch IP and management port IP for newly added node are synced correctly into NBDB

Details

The first commit adds vendor dependencies for the OTE framework (openshift-tests-extension, OpenShift ginkgo fork, k8s.io/kubernetes e2e framework). The second commit implements the OTE framework infrastructure and the migrated test cases.

The test binary (cluster-network-operator-tests-ext) is built and shipped as a gzipped binary in the operator image.

Test plan

  • Verify make build-e2e-tests builds successfully
  • Run test 72817: test/bin/cluster-network-operator-tests-ext run-test --names "72817"
  • Run test 51727: test/bin/cluster-network-operator-tests-ext run-test --names "51727"
  • Run test 72028: test/bin/cluster-network-operator-tests-ext run-test --names "72028"

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a CLI entrypoint to build and run extended cluster-network operator tests.
    • Runtime image now includes a gzip-compressed E2E test artifact.
  • Tests

    • New disruptive E2E suite: Day‑2 subnet patching, node-restart stability, and node-join NBDB sync.
    • Comprehensive E2E helpers for namespaces, commands, connectivity, machine lifecycle, and new build targets for test binaries.
  • Bug Fixes

    • Improved default-route detection for IPv4/IPv6 environments.
  • Chores

    • Updated module and build metadata to support the new test tooling.

Depends-On: openshift/origin#31218

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 27, 2026
@openshift-ci-robot

openshift-ci-robot commented May 27, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: This pull request references CORENET-6512 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:

Summary

  • Set up the OpenShift Tests Extension (OTE) framework for cluster-network-operator
  • Migrate three test cases from openshift-tests-private:
  • OCP-72817: Verify internalJoinSubnet and internalTransitSwitchSubnet are configurable post-install as a Day 2 operation
  • OCP-51727: Verify ovsdb-server and northd do not core dump on node restart
  • OCP-72028: Verify join switch IP and management port IP for newly added node are synced correctly into NBDB

Details

The first commit adds vendor dependencies for the OTE framework (openshift-tests-extension, OpenShift ginkgo fork, k8s.io/kubernetes e2e framework). The second commit implements the OTE framework infrastructure and the migrated test cases.

The test binary (cluster-network-operator-tests-ext) is built and shipped as a gzipped binary in the operator image.

Test plan

  • Verify make build-e2e-tests builds successfully
  • Run test 72817: test/bin/cluster-network-operator-tests-ext run-test --names "72817"
  • Run test 51727: test/bin/cluster-network-operator-tests-ext run-test --names "51727"
  • Run test 72028: test/bin/cluster-network-operator-tests-ext run-test --names "72028"

🤖 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.

@coderabbitai

coderabbitai Bot commented May 27, 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

Adds an extensive E2E test harness (build targets, test binary, CLI helpers, utilities, and a disruptive CNO suite), updates module dependencies and Docker image build to include compressed E2E artifact, and fixes MTU default-route detection logic.

Changes

E2E Testing Implementation

Layer / File(s) Summary
MTU default-route detection fix
pkg/network/mtu.go
Default-route classification now checks for zero-address destinations with /0-equivalent prefix lengths and imports net for IP comparisons.
Dependencies and module pins
go.mod
Bumps vishvananda libs, adds openshift tests extension, requires ginkgo v2 (replaced by OpenShift fork), adds several Kubernetes modules, and pins many k8s.io/* modules via a replace block.
Build infra and Docker image
Makefile, Dockerfile
Root Makefile adds build-e2e-tests; Dockerfile chains E2E build and gzip-compresses the extended test binary, copying it into the final image.
Test build targets
test/Makefile
New test Makefile injects VCS/timestamp LDFLAGS, provides all, build, build-linux, and clean targets producing bin/cluster-network-operator-tests-ext.
E2E CLI entrypoint
test/cmd/main.go
Adds a Cobra-based CLI entrypoint that registers an OpenShift extension and converts Ginkgo suites into executable specs.
E2E CLI helper
test/e2e/cli.go
Introduces CLI type with kubeconfig handling, namespace setup/teardown, fluent modifiers, and command execution/output capture.
E2E utility helpers
test/e2e/util.go
Adds utilities for shared test context, dualstack-aware connectivity checks, OVN/nbctl interactions, NBDB parsing, node reboot handling, and MachineSet orchestration.
Disruptive CNO tests
test/e2e/cno.go
Ginkgo suite with tests for OVN Day‑2 subnet patching and rollout, node restart/core-dump validation, and NBDB host-network sync with cross-node connectivity checks.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes


Important

Pre-merge checks failed

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

❌ Failed checks (1 error, 6 warnings)

Check name Status Explanation Resolution
No-Sensitive-Data-In-Logs ❌ Error Line 188 of test/e2e/cli.go logs the full command arguments including --kubeconfig=/path, exposing the kubeconfig file path which is sensitive. Redact the kubeconfig flag from logging, or log only non-sensitive arguments like verb and args without the --kubeconfig option.
Docstring Coverage ⚠️ Warning Docstring coverage is 2.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test Structure And Quality ⚠️ Warning Line 154 accesses Items[0] without guard (panic risk); 19 assertions lack meaningful failure messages for test diagnostics. Add guard check before Items[0] access; add failure messages to assertions per best practices.
Microshift Test Compatibility ⚠️ Warning Three e2e tests use unavailable MicroShift APIs without protection: Network.operator.openshift.io, machine.openshift.io/MachineSet, and multi-node assumptions. No guards present. Add [apigroup:config.openshift.io] and [apigroup:machine.openshift.io] tags, or wrap tests with IsMicroShiftCluster() checks and g.Skip().
Single Node Openshift (Sno) Test Compatibility ⚠️ Warning Test OCP-72028 makes multi-node assumptions (MachineSet creation for node scaling) without SNO protection. Platform check only skips baremetal/none/ovirt, missing SNO on AWS/GCP/Azure clouds. Add SNO topology check to test OCP-72028 using infrastructure.Status.ControlPlaneTopology == configv1.SingleReplicaTopologyMode, or add [Skipped:SingleReplicaTopology] label to test name.
Topology-Aware Scheduling Compatibility ⚠️ Warning Test OCP-72028 creates MachineSet to scale cluster, incompatible with SNO/TNF/TNA topologies; currentNodeList.Items[0] accessed without bounds-check. Test 3 should skip on SingleReplica/DualReplica topologies and add bounds-check before Items[0]. Also verify HyperShift handling in Test 1.
Ipv6 And Disconnected Network Test Compatibility ⚠️ Warning Tests use image from public registry quay.io, which fails in disconnected environments. IPv6 handling is correct with proper IP family detection and dual-stack support. Replace hardcoded quay.io image with a reference to the internal cluster registry or image stream available in disconnected environments (e.g., registry.access.redhat.com or use local image stream).
✅ Passed checks (8 passed)
Check name Status Explanation
Title check ✅ Passed The PR title clearly describes the main change: setting up the OTE framework and migrating test cases from tests-private, which aligns with all the file changes (new OTE framework code, test infrastructure, and build system updates).
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 All test titles use static strings with no dynamic content. The three It() blocks and one Describe() block contain only stable descriptive text, no node names, pod names, UUIDs, timestamps, or IPs.
Ote Binary Stdout Contract ✅ Passed No stdout contract violations detected. Test code properly isolates output in test blocks and delegates JSON output to OTE framework.
No-Weak-Crypto ✅ Passed No weak cryptographic algorithms (MD5, SHA1, DES, RC4, 3DES, Blowfish, ECB), custom crypto implementations, or non-constant-time secret comparisons found in any modified files.
Container-Privileges ✅ Passed No privileged settings (privileged mode, hostPID, hostNetwork, hostIPC, SYS_ADMIN, allowPrivilegeEscalation) found in any modified files or Kubernetes manifests.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci openshift-ci Bot requested review from bpickard22 and jcaamano May 27, 2026 00:48
@openshift-ci

openshift-ci Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: anuragthehatter
Once this PR has been reviewed and has the lgtm label, please assign kyrtapz 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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🧹 Nitpick comments (1)
go.mod (1)

23-23: ⚡ Quick win

Align required and replaced k8s.io/apimachinery versions.

Line 23 requires v0.36.0-alpha.2 while Line 183 force-replaces it to v0.35.2. This split version intent is brittle and hard to reason about. Prefer keeping require aligned with the effective replaced version.

Also applies to: 183-183

🤖 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 `@go.mod` at line 23, The go.mod currently requires k8s.io/apimachinery at
v0.36.0-alpha.2 but the replace directive forces it to v0.35.2, causing a
mismatch; update the require entry for k8s.io/apimachinery to match the
effective replaced version (v0.35.2) or change the replace to v0.36.0-alpha.2 so
both declarations align. Locate the require line mentioning k8s.io/apimachinery
and the replace clause that references k8s.io/apimachinery and make them
consistent (preferably set the require to v0.35.2 to reflect the current
replace), then run go mod tidy to verify module graph correctness.
🤖 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 `@test/e2e/cli.go`:
- Around line 118-123: The asAdminInternal() setter currently toggles nc.asAdmin
but nothing reads that flag; update the CLI command execution path to honor
asAdmin by appending the impersonation flag to kube commands (e.g., add
"--as=system:admin" or use a dedicated admin kubeconfig) wherever
CLI.buildCmd/CLI.run (or the methods that construct/execute kubectl invocations)
create subprocess args, checking the asAdmin boolean on the receiver and
injecting the flag; alternatively if impersonation support is not desired,
remove the AsAdmin()/asAdminInternal() API and tests that call it to avoid a
no-op. Ensure you update references to asAdminInternal, AsAdmin, and any
command-building functions so the flag is actually applied or the API is
removed.
- Around line 190-196: The current subprocess creation uses exec.Command
(variable cmd) without a timeout, which can hang the test suite; change it to
use exec.CommandContext with a context.WithTimeout (create ctx, cancel :=
context.WithTimeout(parentCtx, timeout) and defer cancel()) and pass ctx into
exec.CommandContext(c.execPath, cmdArgs...), keep stdout/stderr assignment and
cmd.Run(), and ensure you handle context.DeadlineExceeded/error to surface
timeout failures; make the timeout configurable (e.g., a constant or a field on
the test helper) rather than hardcoding.

In `@test/e2e/cno.go`:
- Around line 142-173: This test assumes Machine API and node-scaling support
but lacks guards; before calling
getInfrastructureName/createMachineSet/waitForMachineSetRunning/getNodeNameFromMachineSet
add explicit prechecks that the MachineSet (Machine API) is available and the
topology supports multi-node scaling (e.g., not SNO/MicroShift/SingleNode
platforms). Implement helper checks (e.g., hasMachineSetAPI(oc) and
isUnsupportedTopology(oc) or reuse checkPlatform/ checkIPStackType) and call
them at the start of the test to call g.Skip with a clear message when the API
is absent or topology unsupported, preventing createMachineSet and subsequent
steps from running in incompatible environments.

In `@test/e2e/util.go`:
- Line 318: Replace the hardcoded public quay.io image string in util.go with a
disconnected-compatible, configurable image source: change the literal "image"
value to use a helper or env var (e.g., call a new or existing
GetTestImage()/os.Getenv("E2E_TEST_IMAGE") with a sensible local/mirror default)
so tests can run in restricted clusters; update the pod-creation logic that sets
the "image" field accordingly and add a short comment documenting the env var
fallback so tests are flagged/configurable for disconnected environments.
- Around line 138-143: The current rollout check requires both substrings in
status which is too strict; update the condition that checks the status variable
in test/e2e/util.go to use OR (||) instead of AND (&&) so the block returns
success when either "rollout to finish" or "successfully rolled out" appears,
keeping the existing e2e.Logf calls and return values (i.e., change the if that
references strings.Contains(status, "rollout to finish") &&
strings.Contains(status, "successfully rolled out") to use ||).

---

Nitpick comments:
In `@go.mod`:
- Line 23: The go.mod currently requires k8s.io/apimachinery at v0.36.0-alpha.2
but the replace directive forces it to v0.35.2, causing a mismatch; update the
require entry for k8s.io/apimachinery to match the effective replaced version
(v0.35.2) or change the replace to v0.36.0-alpha.2 so both declarations align.
Locate the require line mentioning k8s.io/apimachinery and the replace clause
that references k8s.io/apimachinery and make them consistent (preferably set the
require to v0.35.2 to reflect the current replace), then run go mod tidy to
verify module graph correctness.
🪄 Autofix (Beta)

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: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4294a189-973e-4ec0-85de-fe565946f696

📥 Commits

Reviewing files that changed from the base of the PR and between bea98c0 and 88d04b6.

⛔ Files ignored due to path filters (291)
  • go.sum is excluded by !**/*.sum
  • vendor/github.com/distribution/reference/.gitattributes is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/CODE-OF-CONDUCT.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/GOVERNANCE.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/MAINTAINERS is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/distribution-logo.svg is excluded by !**/*.svg, !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/helpers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/normalize.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/reference.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/regexp.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/distribution/reference/sort.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/.editorconfig is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/.gitattributes is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/Taskfile.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/crypto.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/date.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/defaults.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/dict.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/functions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/list.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/network.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/numeric.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/reflect.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/regex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/strings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/url.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/AUTHORS is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/client.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/compression.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/conn.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/join.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/mask.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/mask_safe.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/prepared.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/proxy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/gorilla/websocket/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/MAINTAINERS is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/NOTICE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/connection.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/handlers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/priority.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/spdy/dictionary.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/spdy/read.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/spdy/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/spdy/write.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/stream.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/moby/spdystream/utils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mxk/go-flowrate/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mxk/go-flowrate/flowrate/flowrate.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mxk/go-flowrate/flowrate/io.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mxk/go-flowrate/flowrate/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/OWNERS is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/RELEASING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/config/deprecated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/core_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/core_dsl_patch.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/decorator_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/deprecated_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/formatter/colorable_others.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/formatter/colorable_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/formatter/formatter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/automaxprocs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cgroup.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cgroups.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cgroups2.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cpu_quota_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cpu_quota_unsupported.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/mountpoint.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/runtime.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/subsys.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/build/build_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/command/abort.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/command/command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/command/program.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/boostrap_templates.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/bootstrap_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/compile.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/gocovmerge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/utils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/verify_version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/labels/labels_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/unfocus/unfocus_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta_tracker.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hashes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/suite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo_cli_dependencies.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo_t_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/around_node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/counter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/failer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/focus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/global/init.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/group.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/interrupt_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/sigquit_swallower_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/sigquit_swallower_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/ordering.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_wasm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_win.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/client_server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/http_client.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/http_server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/rpc_client.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/rpc_server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/server_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_bsd.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_wasm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_win.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_reporter_manager.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/report_entry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/spec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/spec_context.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/spec_patch.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/suite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/suite_patch.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/testingtproxy/testing_t_proxy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/tree.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/deprecated_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporting_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/table_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/around_node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/code_location.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/config.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/deprecated_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/deprecation_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/enum_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/file_filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/flags.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/label_filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/report_entry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/semver_filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/types_patch.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/gcustom/make_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/.mailmap is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/.pullapprove.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/LICENSE.docs is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/MAINTAINERS is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/algorithm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/digest.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/digester.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/opencontainers/go-digest/verifiers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/cmd/cmd.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/cmd/cmdimages/cmdimages.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/cmd/cmdinfo/info.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/cmd/cmdlist/list.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/cmd/cmdrun/runsuite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/cmd/cmdrun/runtest.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/cmd/cmdupdate/update.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/dbtime/time.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extension.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests/environment.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests/result.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests/result_writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests/spec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests/task.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests/viewer.html is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/registry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/flags/component.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/flags/concurrency.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/flags/environment.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/flags/names.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/flags/output.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/flags/suite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/ginkgo/logging.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/ginkgo/parallel.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/ginkgo/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/junit/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/byte.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/empty.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/int.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/int32.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/int64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/set.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/util/sets/string.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift-eng/openshift-tests-extension/pkg/version/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/chain.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/constantdelay.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/cron.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/logger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/option.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/parser.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/robfig/cron/v3/spec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/.travis.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/addr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/addr_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/bpf_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/bridge_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/chain.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/chain_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/class.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/class_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/conntrack_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/conntrack_unspecified.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/devlink_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/filter_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/fou.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/fou_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/fou_unspecified.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/genetlink_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/gtp_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/handle_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/handle_unspecified.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/inet_diag.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/ioctl_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/ipset_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/link.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/link_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/vishvananda/netlink/link_tuntap_linux.go is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (9)
  • Dockerfile
  • Makefile
  • go.mod
  • pkg/network/mtu.go
  • test/Makefile
  • test/cmd/main.go
  • test/e2e/cli.go
  • test/e2e/cno.go
  • test/e2e/util.go

Comment thread test/otp/cli.go
Comment thread test/e2e/cli.go Outdated
Comment thread test/e2e/cno.go Outdated
Comment thread test/e2e/util.go Outdated
Comment thread test/otp/util.go
@openshift-ci-robot

Copy link
Copy Markdown
Contributor

@anuragthehatter: An error was encountered searching for bug CORENET-6512 on the Jira server at https://redhat.atlassian.net. No known errors were detected, please see the full error message for details.

Full error message. No response returned: Get "https://redhat.atlassian.net/rest/api/2/issue/CORENET-6512": GET https://redhat.atlassian.net/rest/api/2/issue/CORENET-6512 giving up after 5 attempt(s)

Please contact an administrator to resolve this issue, then request a bug refresh with /jira refresh.

Details

In response to this:

Summary

  • Set up the OpenShift Tests Extension (OTE) framework for cluster-network-operator
  • Migrate three test cases from openshift-tests-private:
  • OCP-72817: Verify internalJoinSubnet and internalTransitSwitchSubnet are configurable post-install as a Day 2 operation
  • OCP-51727: Verify ovsdb-server and northd do not core dump on node restart
  • OCP-72028: Verify join switch IP and management port IP for newly added node are synced correctly into NBDB

Details

The first commit adds vendor dependencies for the OTE framework (openshift-tests-extension, OpenShift ginkgo fork, k8s.io/kubernetes e2e framework). The second commit implements the OTE framework infrastructure and the migrated test cases.

The test binary (cluster-network-operator-tests-ext) is built and shipped as a gzipped binary in the operator image.

Test plan

  • Verify make build-e2e-tests builds successfully
  • Run test 72817: test/bin/cluster-network-operator-tests-ext run-test --names "72817"
  • Run test 51727: test/bin/cluster-network-operator-tests-ext run-test --names "51727"
  • Run test 72028: test/bin/cluster-network-operator-tests-ext run-test --names "72028"

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

  • Added comprehensive end-to-end test suite for cluster network operator scenarios (Day‑2 subnet validation, node restart stability, node synchronization).

  • Tests

  • New test build and packaging workflow produces a compressed E2E test artifact and adds convenient make targets to build and run tests.

  • New test helpers and CLI utilities to simplify test setup, namespace management, command execution, and cluster interactions.

  • Bug Fixes

  • Improved default-route detection to better handle IPv4 and IPv6 environments.

  • Chores

  • Updated module and build metadata to support the new test tooling.

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-robot openshift-ci-robot removed the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 27, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

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 `@test/e2e/util.go`:
- Around line 618-699: Tests using MachineSet/Machine helpers fail on MicroShift
because those APIs are absent; add a guard to skip or no-op when running on
MicroShift. Update callers of createMachineSet, deleteMachineSet,
waitForMachineSetRunning, getNodeNameFromMachineSet, and
waitForMachinesDisappear to check a cluster-capability helper (e.g.,
isMicroShift(oc) or hasMachineAPI(oc)) and either call g.Skip or return early
when the Machine API is unavailable; alternatively, add a small wrapper function
(e.g., ensureMachineAPIOrSkip(oc)) that performs the check and use it at the
start of each of the above helper functions so tests are skipped instead of
failing on MicroShift.
🪄 Autofix (Beta)

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: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: db43650d-74c3-48a9-85ff-1ba73446ccb7

📥 Commits

Reviewing files that changed from the base of the PR and between 88d04b6 and 0cc7cad.

📒 Files selected for processing (7)
  • Dockerfile
  • Makefile
  • test/Makefile
  • test/cmd/main.go
  • test/e2e/cli.go
  • test/e2e/cno.go
  • test/e2e/util.go
🚧 Files skipped from review as they are similar to previous changes (4)
  • Dockerfile
  • test/cmd/main.go
  • test/e2e/cli.go
  • test/e2e/cno.go

Comment thread test/otp/util.go
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 27, 2026
@openshift-ci-robot

openshift-ci-robot commented May 27, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: This pull request references CORENET-6512 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:

Summary

  • Set up the OpenShift Tests Extension (OTE) framework for cluster-network-operator
  • Migrate three test cases from openshift-tests-private:
  • OCP-72817: Verify internalJoinSubnet and internalTransitSwitchSubnet are configurable post-install as a Day 2 operation
  • OCP-51727: Verify ovsdb-server and northd do not core dump on node restart
  • OCP-72028: Verify join switch IP and management port IP for newly added node are synced correctly into NBDB

Details

The first commit adds vendor dependencies for the OTE framework (openshift-tests-extension, OpenShift ginkgo fork, k8s.io/kubernetes e2e framework). The second commit implements the OTE framework infrastructure and the migrated test cases.

The test binary (cluster-network-operator-tests-ext) is built and shipped as a gzipped binary in the operator image.

Test plan

  • Verify make build-e2e-tests builds successfully
  • Run test 72817: test/bin/cluster-network-operator-tests-ext run-test --names "72817"
  • Run test 51727: test/bin/cluster-network-operator-tests-ext run-test --names "51727"
  • Run test 72028: test/bin/cluster-network-operator-tests-ext run-test --names "72028"

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

  • Added a CLI entrypoint and disruptive E2E suite for cluster network operator scenarios.

  • Tests

  • New end-to-end test framework, helpers for namespace/command management, and build targets producing a gzipped E2E test artifact.

  • Test cases include Day‑2 subnet validation, node-restart stability, and node join synchronization checks.

  • Bug Fixes

  • Improved default-route detection for IPv4/IPv6 environments.

  • Chores

  • Updated module and build metadata to support the new test tooling.

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
test/e2e/util.go (1)

61-65: 💤 Low value

"Ready" is not a valid pod phase.

Pod phases are Pending, Running, Succeeded, Failed, and Unknown. The value "Ready" is a condition type, not a phase, so checkPodReady will never match it. This shouldn't cause immediate failures since "Running" is also in the list, but the dead entry is confusing.

Proposed fix
 func checkPodReady(oc *CLI, namespace string, podName string) (bool, error) {
 	podOutPut, err := getPodStatus(oc, namespace, podName)
-	status := []string{"Running", "Ready", "Complete", "Succeeded"}
+	status := []string{"Running", "Succeeded"}
 	return contains(status, podOutPut), err
 }
🤖 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 `@test/e2e/util.go` around lines 61 - 65, The status slice in checkPodReady
contains the invalid phase "Ready"; update the slice in checkPodReady (which
calls getPodStatus and uses contains) to use only valid Kubernetes pod phases —
e.g., ["Pending","Running","Succeeded","Failed","Unknown"] — or remove "Ready"
entirely; if the intent was to test the Ready condition instead of phase, adjust
getPodStatus/checkPodReady to inspect pod.conditions for Type==\"Ready\" rather
than matching phases.
🤖 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 `@test/e2e/util.go`:
- Around line 479-480: The code currently assumes re.FindAllString(output,
-1)[0] always returns a match which will panic if no IPv4 is present; update the
logic around regexp variable re and the assignment to nodeOVNK8sMgmtIP so you
first capture the slice (e.g., matches := re.FindAllString(output, -1)), check
len(matches) > 0, and handle the no-match case gracefully (return an error, nil,
or a clear sentinel value and log a helpful message) instead of indexing [0]
directly; ensure the calling function receives/propagates the error or handles
the sentinel so tests don’t panic when output contains no IPv4.
- Around line 429-431: The JSONPath used in the node status query assumes the
Ready condition is last; update the
oc.AsAdmin().WithoutNamespace().Run("get").Args(...) call inside the
wait.PollUntilContextTimeout lambda to select the condition by type instead of
index. Replace "-ojsonpath={.status.conditions[-1].status}" with a filter that
finds the Ready condition, e.g.
"-ojsonpath={.status.conditions[?(@.type==\"Ready\")].status}", so the code
reads the Ready condition for nodeName reliably.

---

Nitpick comments:
In `@test/e2e/util.go`:
- Around line 61-65: The status slice in checkPodReady contains the invalid
phase "Ready"; update the slice in checkPodReady (which calls getPodStatus and
uses contains) to use only valid Kubernetes pod phases — e.g.,
["Pending","Running","Succeeded","Failed","Unknown"] — or remove "Ready"
entirely; if the intent was to test the Ready condition instead of phase, adjust
getPodStatus/checkPodReady to inspect pod.conditions for Type==\"Ready\" rather
than matching phases.
🪄 Autofix (Beta)

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: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: fbbca07c-b2ab-4b52-a6d3-fcc2196bab48

📥 Commits

Reviewing files that changed from the base of the PR and between 0cc7cad and 8fd2ea4.

📒 Files selected for processing (7)
  • Dockerfile
  • Makefile
  • test/Makefile
  • test/cmd/main.go
  • test/e2e/cli.go
  • test/e2e/cno.go
  • test/e2e/util.go
🚧 Files skipped from review as they are similar to previous changes (4)
  • Dockerfile
  • test/cmd/main.go
  • test/e2e/cno.go
  • test/e2e/cli.go

Comment thread test/otp/util.go
Comment thread test/otp/util.go

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (6)
test/e2e/cli.go (2)

188-195: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Bound oc executions with a timeout.

exec.Command can hang the whole suite on stuck oc debug, must-gather, or rollout calls. Use exec.CommandContext with a shared timeout and surface deadline expiry distinctly.

Suggested direction
+const defaultCommandTimeout = 2 * time.Minute
+
- cmd := exec.Command(c.execPath, cmdArgs...)
+ ctx, cancel := context.WithTimeout(context.Background(), defaultCommandTimeout)
+ defer cancel()
+ cmd := exec.CommandContext(ctx, c.execPath, cmdArgs...)
🤖 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 `@test/e2e/cli.go` around lines 188 - 195, Replace the blocking exec.Command
call with exec.CommandContext using a context with the shared timeout: create
ctx, cancel := context.WithTimeout(context.Background(), sharedTimeout) and
defer cancel(), then use exec.CommandContext(ctx, c.execPath, cmdArgs...). Run
the command the same way but after cmd.Run() check for ctx.Err() or
errors.Is(err, context.DeadlineExceeded) to detect deadline expiry and surface
that distinctly (include stdout/stderr in the error logging). Ensure you still
assign cmd.Stdout/Stderr to the bytes.Buffers (stdout, stderr) and propagate or
log non-timeout errors as before.

118-123: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

AsAdmin() is still a no-op.

asAdmin is copied onto the cloned CLI, but output() never reads it, so every admin-only path here runs exactly like the non-admin path. Either honor the flag when building the oc invocation or remove the API to avoid false confidence in cluster-scoped 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 `@test/e2e/cli.go` around lines 118 - 123, The cloned CLI's asAdmin flag set in
asAdminInternal() is never used by CLI.output(), so admin-only behavior is a
no-op; update CLI.output() (or the function that composes the oc invocation,
e.g., buildOCArgs/composeOCCommand) to check c.asAdmin and, when true, add the
appropriate admin elevation flag (for example add "--as=system:admin" or switch
to "oc adm" invocation) into the command args before executing, or alternatively
remove the asAdmin/asAdminInternal API if you prefer not to support admin
elevation.
test/e2e/util.go (3)

316-319: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Replace the hardcoded public test image.

This helper always pulls from quay.io, so every test that uses createPingPodOnNode() breaks in disconnected environments. Make the image configurable or resolve it from the mirrored test-image source used by the suite.
As per coding guidelines, "Flag tests requiring connections to public internet hosts, pulling images from public registries without mirror/internal registry".

🤖 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 `@test/e2e/util.go` around lines 316 - 319, The helper createPingPodOnNode()
embeds a hardcoded public quay.io image which breaks in disconnected
environments; make the image source configurable or resolved from the suite's
mirrored test-image source instead. Modify createPingPodOnNode() to accept an
image parameter (or read from an existing test config/env var such as TEST_IMAGE
or a suite mirror resolver function) and replace the hardcoded quay.io reference
with that configurable value, and update callers to pass the configured/mirrored
image so tests do not pull directly from the public registry.

420-441: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Ready-condition polling is brittle for reboot transitions.

conditions[-1] is not guaranteed to be the Ready condition, and a rebooted node can legitimately report Ready=False before it reports Unknown. This can make the reboot test wait for the wrong value even when the node is transitioning normally.

Suggested fix
 func checkNodeStatus(oc *CLI, nodeName string, expectedStatus string) {
-	var expectedValue string
+	var expectedValues []string
 	if expectedStatus == "Ready" {
-		expectedValue = "True"
+		expectedValues = []string{"True"}
 	} else if expectedStatus == "NotReady" {
-		expectedValue = "Unknown"
+		expectedValues = []string{"False", "Unknown"}
 	} else {
 		o.Expect(fmt.Errorf("unsupported node status: %s", expectedStatus)).NotTo(o.HaveOccurred())
 	}
 	err := wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 15*time.Minute, true, func(ctx context.Context) (bool, error) {
-		statusOutput, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("nodes", nodeName, "-ojsonpath={.status.conditions[-1].status}").Output()
+		statusOutput, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("nodes", nodeName, `-ojsonpath={.status.conditions[?(@.type=="Ready")].status}`).Output()
 		if err != nil {
 			e2e.Logf("Get node status with error : %v", err)
 			return false, nil
 		}
 		e2e.Logf("Expect Node %s in state %v, kubelet status is %s", nodeName, expectedStatus, statusOutput)
-		if statusOutput != expectedValue {
+		if !contains(expectedValues, statusOutput) {
 			return false, nil
 		}
 		return true, nil
 	})
🤖 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 `@test/e2e/util.go` around lines 420 - 441, The checkNodeStatus function
currently reads the last condition via jsonpath {.status.conditions[-1].status},
which is brittle; change the kubectl/jsonpath call inside checkNodeStatus (the
oc.AsAdmin().WithoutNamespace().Run("get").Args("nodes", nodeName,
"-ojsonpath=...").Output() call) to explicitly select the Ready condition (e.g.
jsonpath that filters where .type=="Ready" such as
.status.conditions[?(@.type=="Ready")].status) or fetch the node JSON and parse
.status.conditions to locate the condition with Type=="Ready" before comparing
its status to the expectedValue so the code checks the Ready condition reliably
during reboots.

135-143: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

The rollout poll never matches the normal success output.

oc rollout status returns a waiting message or a success message, not both in the same response. Requiring both substrings makes this poll time out after a successful rollout.

Suggested fix
-		if strings.Contains(status, "rollout to finish") && strings.Contains(status, "successfully rolled out") {
+		if strings.Contains(status, "successfully rolled out") {
 			e2e.Logf("ovnkube rollout was triggerred and rolled out successfully")
 			return true, nil
 		}
🤖 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 `@test/e2e/util.go` around lines 135 - 143, The poll incorrectly requires both
"rollout to finish" and "successfully rolled out" in the `status` output so it
never matches a normal success response; update the predicate inside the
wait.PollUntilContextTimeout callback (the code that calls
oc.AsAdmin().WithoutNamespace().Run("rollout").Args(...).Output() and inspects
the status variable) to treat a successful rollout as when the status contains
"successfully rolled out" (i.e., check for that substring alone), and optionally
handle the waiting message ("rollout to finish" or "waiting") only for logging
rather than as part of the success condition.
test/e2e/cno.go (1)

146-173: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add explicit Machine API/topology prechecks before scaling.

Checking platform alone is not enough. This path still assumes MachineSet/Machine APIs and supported node scaling; on MicroShift or other unsupported topologies it will fail before it ever validates NBDB sync. Skip when those APIs are absent or the topology does not support adding nodes.
As per coding guidelines, "Flag tests referencing unavailable APIs ... MachineSet/Machine/MachineHealthCheck" and "Flag tests making unsupported assumptions about multi-node/HA ... node scaling".

🤖 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 `@test/e2e/cno.go` around lines 146 - 173, Add explicit Machine API and
topology prechecks before attempting to create or scale MachineSets: before
calling
createMachineSet/getInfrastructureName/waitForMachineSetRunning/getNodeNameFromMachineSet,
detect whether the Machine/MachineSet APIs exist and the cluster topology
supports node scaling (e.g., check for the Machine API resource presence and
that checkPlatform(oc) indicates a topology that allows Machine objects); if the
APIs are absent or topology is unsupported, call g.Skip(...) with a clear
message. Place these checks immediately after determining platform (after
platform := checkPlatform(oc)) and before createMachineSet(oc, machineSetName)
so the test exits early rather than failing later when MachineSet/Machine APIs
or topology are not available.
🤖 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 `@test/e2e/cno.go`:
- Around line 114-125: This test reboots a node but doesn't guard against
single-node (SNO) clusters; before selecting worker from workerList returned by
e2enode.GetReadySchedulableNodes in the "ovsdb-server and northd should not core
dump on node restart" g.It block, add a guard that checks len(workerList.Items)
== 1 and calls g.Skip (or o.Skip) with a message explaining SNO incompatibility;
keep the existing check for <1 nodes but change the logic to explicitly skip
when exactly one schedulable node is present to avoid rebooting the entire
cluster.

In `@test/e2e/util.go`:
- Around line 54-64: The checkPodReady function is using getPodStatus (which
reads .status.phase) and treating "Running" as ready; change checkPodReady to
instead poll the pod's Ready condition
(status.conditions[?(@.type=="Ready")].status == "True") or call the existing
framework/helper that asserts pod readiness so waitPodReady and curlPod2PodPass
don't proceed prematurely; specifically update checkPodReady(oc, namespace,
podName) to query the Ready condition via
oc.AsAdmin().WithoutNamespace().Run("get").Args("pod", "-n", namespace",
podName, "-o=jsonpath=...") or delegate to the helper that checks Ready and
return a boolean based on the Ready condition (and preserve returning an error
for failures).

---

Duplicate comments:
In `@test/e2e/cli.go`:
- Around line 188-195: Replace the blocking exec.Command call with
exec.CommandContext using a context with the shared timeout: create ctx, cancel
:= context.WithTimeout(context.Background(), sharedTimeout) and defer cancel(),
then use exec.CommandContext(ctx, c.execPath, cmdArgs...). Run the command the
same way but after cmd.Run() check for ctx.Err() or errors.Is(err,
context.DeadlineExceeded) to detect deadline expiry and surface that distinctly
(include stdout/stderr in the error logging). Ensure you still assign
cmd.Stdout/Stderr to the bytes.Buffers (stdout, stderr) and propagate or log
non-timeout errors as before.
- Around line 118-123: The cloned CLI's asAdmin flag set in asAdminInternal() is
never used by CLI.output(), so admin-only behavior is a no-op; update
CLI.output() (or the function that composes the oc invocation, e.g.,
buildOCArgs/composeOCCommand) to check c.asAdmin and, when true, add the
appropriate admin elevation flag (for example add "--as=system:admin" or switch
to "oc adm" invocation) into the command args before executing, or alternatively
remove the asAdmin/asAdminInternal API if you prefer not to support admin
elevation.

In `@test/e2e/cno.go`:
- Around line 146-173: Add explicit Machine API and topology prechecks before
attempting to create or scale MachineSets: before calling
createMachineSet/getInfrastructureName/waitForMachineSetRunning/getNodeNameFromMachineSet,
detect whether the Machine/MachineSet APIs exist and the cluster topology
supports node scaling (e.g., check for the Machine API resource presence and
that checkPlatform(oc) indicates a topology that allows Machine objects); if the
APIs are absent or topology is unsupported, call g.Skip(...) with a clear
message. Place these checks immediately after determining platform (after
platform := checkPlatform(oc)) and before createMachineSet(oc, machineSetName)
so the test exits early rather than failing later when MachineSet/Machine APIs
or topology are not available.

In `@test/e2e/util.go`:
- Around line 316-319: The helper createPingPodOnNode() embeds a hardcoded
public quay.io image which breaks in disconnected environments; make the image
source configurable or resolved from the suite's mirrored test-image source
instead. Modify createPingPodOnNode() to accept an image parameter (or read from
an existing test config/env var such as TEST_IMAGE or a suite mirror resolver
function) and replace the hardcoded quay.io reference with that configurable
value, and update callers to pass the configured/mirrored image so tests do not
pull directly from the public registry.
- Around line 420-441: The checkNodeStatus function currently reads the last
condition via jsonpath {.status.conditions[-1].status}, which is brittle; change
the kubectl/jsonpath call inside checkNodeStatus (the
oc.AsAdmin().WithoutNamespace().Run("get").Args("nodes", nodeName,
"-ojsonpath=...").Output() call) to explicitly select the Ready condition (e.g.
jsonpath that filters where .type=="Ready" such as
.status.conditions[?(@.type=="Ready")].status) or fetch the node JSON and parse
.status.conditions to locate the condition with Type=="Ready" before comparing
its status to the expectedValue so the code checks the Ready condition reliably
during reboots.
- Around line 135-143: The poll incorrectly requires both "rollout to finish"
and "successfully rolled out" in the `status` output so it never matches a
normal success response; update the predicate inside the
wait.PollUntilContextTimeout callback (the code that calls
oc.AsAdmin().WithoutNamespace().Run("rollout").Args(...).Output() and inspects
the status variable) to treat a successful rollout as when the status contains
"successfully rolled out" (i.e., check for that substring alone), and optionally
handle the waiting message ("rollout to finish" or "waiting") only for logging
rather than as part of the success condition.
🪄 Autofix (Beta)

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: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: d579fbee-c1b0-40fc-9d8d-6c2279fe55d8

📥 Commits

Reviewing files that changed from the base of the PR and between 8fd2ea4 and 6759e76.

📒 Files selected for processing (7)
  • Dockerfile
  • Makefile
  • test/Makefile
  • test/cmd/main.go
  • test/e2e/cli.go
  • test/e2e/cno.go
  • test/e2e/util.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • Dockerfile
  • test/cmd/main.go

Comment thread test/e2e/cno.go Outdated
Comment thread test/otp/util.go
@anuragthehatter anuragthehatter changed the title CORENET-6512: Setup OTE framework and migrate test cases from tests-private [CNO] Setup OTE framework and migrate test cases from tests-private May 27, 2026
@openshift-ci-robot

Copy link
Copy Markdown
Contributor

@anuragthehatter: No Jira issue is referenced in the title of this pull request.
To reference a jira issue, add 'XYZ-NNN:' to the title of this pull request and request another refresh with /jira refresh.

Details

In response to this:

Summary

  • Set up the OpenShift Tests Extension (OTE) framework for cluster-network-operator
  • Migrate three test cases from openshift-tests-private:
  • OCP-72817: Verify internalJoinSubnet and internalTransitSwitchSubnet are configurable post-install as a Day 2 operation
  • OCP-51727: Verify ovsdb-server and northd do not core dump on node restart
  • OCP-72028: Verify join switch IP and management port IP for newly added node are synced correctly into NBDB

Details

The first commit adds vendor dependencies for the OTE framework (openshift-tests-extension, OpenShift ginkgo fork, k8s.io/kubernetes e2e framework). The second commit implements the OTE framework infrastructure and the migrated test cases.

The test binary (cluster-network-operator-tests-ext) is built and shipped as a gzipped binary in the operator image.

Test plan

  • Verify make build-e2e-tests builds successfully
  • Run test 72817: test/bin/cluster-network-operator-tests-ext run-test --names "72817"
  • Run test 51727: test/bin/cluster-network-operator-tests-ext run-test --names "51727"
  • Run test 72028: test/bin/cluster-network-operator-tests-ext run-test --names "72028"

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

  • Added a CLI entrypoint for running extended cluster-network operator tests.

  • Runtime image now includes a compressed E2E test artifact.

  • Tests

  • New disruptive E2E suite covering Day‑2 subnet changes, node-restart stability, and node-join synchronization.

  • Added comprehensive E2E helpers for namespace/command management, connectivity, and machine lifecycle; new build targets for producing test binaries.

  • Bug Fixes

  • Improved default-route detection for IPv4/IPv6 environments.

  • Chores

  • Updated module and build metadata to support the new test tooling.

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-robot openshift-ci-robot removed the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 27, 2026

@pperiyasamy pperiyasamy left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@anuragthehatter can you avoid pushing vendor directory ? because this PR is too big for review. Please refer to ovnk how this can be ignored.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 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 `@go.mod`:
- Line 150: The go.mod currently pins the vulnerable dependency
"github.com/moby/spdystream v0.5.0"; update it to a patched release (or add a
replace directive) and re-resolve the module graph: pick a non-vulnerable tag
for github.com/moby/spdystream, run go get
github.com/moby/spdystream@<patched-version> (or add replace
github.com/moby/spdystream => github.com/moby/spdystream <patched-version>),
then run go mod tidy (and go mod vendor if you vendor) and verify with go mod
graph to ensure v0.5.0 is no longer present.

In `@test/e2e/cno.go`:
- Around line 151-154: The test assumes GetReadySchedulableNodes returned at
least one node and directly accesses currentNodeList.Items[0], which can panic;
update the test around GetReadySchedulableNodes, currentNodeList and oldNode to
check that currentNodeList.Items is non-empty (e.g., len(currentNodeList.Items)
> 0) and fail the test with a clear error message or skip/return if it's empty
before assigning oldNode, so you safely handle the no-ready-node case instead of
indexing into an empty slice.
🪄 Autofix (Beta)

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: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 970bdb43-8418-4dfb-9031-eedb64e3e747

📥 Commits

Reviewing files that changed from the base of the PR and between 6759e76 and 3a5cf1b.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (9)
  • Dockerfile
  • Makefile
  • go.mod
  • pkg/network/mtu.go
  • test/Makefile
  • test/cmd/main.go
  • test/e2e/cli.go
  • test/e2e/cno.go
  • test/e2e/util.go
🚧 Files skipped from review as they are similar to previous changes (5)
  • pkg/network/mtu.go
  • Dockerfile
  • test/cmd/main.go
  • test/e2e/cli.go
  • test/e2e/util.go

Comment thread go.mod
Comment thread test/otp/cno.go
@anuragthehatter anuragthehatter force-pushed the cno-ote-framework branch 5 times, most recently from b545a1a to 9391dd3 Compare June 3, 2026 20:59
@anuragthehatter

Copy link
Copy Markdown
Author

/testwith openshift/origin#31218

@anuragthehatter

Copy link
Copy Markdown
Author

/testwith openshift/ovn-kubernetes/master/e2e-aws-ovn-serial openshift/origin#31218

@openshift-ci

openshift-ci Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter, testwith: could not generate prow job. ERROR:

could not determine ci op config from metadata: got unexpected http 404 status code from configresolver: failed to get config: could not find any config for branch master on repo openshift/ovn-kubernetes

@anuragthehatter

Copy link
Copy Markdown
Author

/payload-job-with-prs periodic-ci-openshift-release-main-ci-5.0-e2e-aws-ovn-serial openshift/origin#31218

@openshift-ci

openshift-ci Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: 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-e2e-aws-ovn-serial

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/8b7cea40-6047-11f1-8641-ad5566a4bfd8-0

@openshift-ci

openshift-ci Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/4.22-upgrade-from-stable-4.21-e2e-azure-ovn-upgrade 97ba419 link false /test 4.22-upgrade-from-stable-4.21-e2e-azure-ovn-upgrade
ci/prow/e2e-azure-ovn-upgrade 75584e2 link true /test e2e-azure-ovn-upgrade
ci/prow/e2e-aws-ovn-upgrade 75584e2 link true /test e2e-aws-ovn-upgrade
ci/prow/e2e-aws-ovn-rhcos10-techpreview 75584e2 link false /test e2e-aws-ovn-rhcos10-techpreview
ci/prow/security 75584e2 link false /test security
ci/prow/5.0-upgrade-from-stable-4.22-e2e-azure-ovn-upgrade 75584e2 link false /test 5.0-upgrade-from-stable-4.22-e2e-azure-ovn-upgrade
ci/prow/lint 75584e2 link true /test lint
ci/prow/e2e-metal-ipi-ovn-dualstack-bgp-local-gw 75584e2 link true /test e2e-metal-ipi-ovn-dualstack-bgp-local-gw
ci/prow/verify 75584e2 link true /test verify
ci/prow/5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-upgrade 75584e2 link false /test 5.0-upgrade-from-stable-4.22-e2e-gcp-ovn-upgrade
ci/prow/unit 75584e2 link true /test unit
ci/prow/e2e-aws-ovn-fdp-qe 75584e2 link true /test e2e-aws-ovn-fdp-qe
ci/prow/verify-deps 75584e2 link true /test verify-deps
ci/prow/5.0-upgrade-from-stable-4.22-e2e-aws-ovn-upgrade 75584e2 link false /test 5.0-upgrade-from-stable-4.22-e2e-aws-ovn-upgrade

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.

@openshift-ci

openshift-ci Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

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

@openshift-ci

openshift-ci Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: 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/origin/pull#31218: string: openshift/origin/pull#31218 doesn't match expected format: org/repo#number

Please contact an administrator to resolve this issue.

@openshift-ci

openshift-ci Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: 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-e2e-aws-ovn-serial

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/60210ff0-606c-11f1-9efc-61492c5af2a5-0

@anuragthehatter

Copy link
Copy Markdown
Author

/payload-job-with-prs periodic-ci-openshift-release-main-nightly-4.22-e2e-aws-ovn-serial openshift/origin#31218

@openshift-ci

openshift-ci Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

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

  • periodic-ci-openshift-release-main-nightly-4.22-e2e-aws-ovn-serial-1of2
  • periodic-ci-openshift-release-main-nightly-4.22-e2e-aws-ovn-serial-2of2

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/cf346f40-607b-11f1-860f-f0487da5a3e9-0

@anuragthehatter

Copy link
Copy Markdown
Author

/payload-job-with-prs periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial openshift/origin#31218 openshift/origin#31264

@openshift-ci

openshift-ci Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: 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-aws-ovn-serial-1of2
  • periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial-2of2

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/30323330-6145-11f1-8085-18a113a858ae-0

@anuragthehatter

Copy link
Copy Markdown
Author

/payload-job-with-prs periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial openshift/origin#31218 openshift/origin#31264

@openshift-ci

openshift-ci Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: 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-aws-ovn-serial-1of2
  • periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial-2of2

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/a0e017d0-6345-11f1-9c80-ac8ee1ba40aa-0

Set up the OTE framework and migrate three e2e test cases from
openshift-tests-private:
- OCP-72817: internalJoinSubnet/internalTransitSwitchSubnet Day 2 config
- OCP-51727: ovsdb-server/northd core dump check after node restart
- OCP-72028: NBDB sync of join switch/mgmt port IPs for new nodes

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

Copy link
Copy Markdown
Author

/payload-job-with-prs periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial openshift/origin#31218

@openshift-ci

openshift-ci Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: 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-aws-ovn-serial-1of2
  • periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial-2of2

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/c28462b0-6377-11f1-805f-664899d5708f-0

@anuragthehatter

Copy link
Copy Markdown
Author

/payload-job-with-prs periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial openshift/origin#31218

@openshift-ci

openshift-ci Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@anuragthehatter: 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-aws-ovn-serial-1of2
  • periodic-ci-openshift-release-main-nightly-5.0-e2e-aws-ovn-serial-2of2

See details on https://pr-payload-tests.ci.openshift.org/runs/ci/6a411290-63a1-11f1-8717-3fccd4afa0ed-0

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants