Skip to content

[WIP] NE-2789: Creating 5 origin tests to graduate featuregate#31392

Open
rhamini3 wants to merge 5 commits into
openshift:mainfrom
rhamini3:ne2789
Open

[WIP] NE-2789: Creating 5 origin tests to graduate featuregate#31392
rhamini3 wants to merge 5 commits into
openshift:mainfrom
rhamini3:ne2789

Conversation

@rhamini3

@rhamini3 rhamini3 commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Test Result

  Ran 1 of 1 Specs in 2.800 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-network-edge][Feature:Router][apigroup:route.openshift.io][OCPFeatureGate:IngressControllerMultipleHAProxyVersions] The HAProxy router with version selection should reject invalid HAProxy versions [Suite:openshift/conformance/parallel]",
    "lifecycle": "blocking",
    "duration": 2800,
    "startTime": "2026-07-17 19:52:35.580683 UTC",
    "endTime": "2026-07-17 19:52:38.380828 UTC",
    "result": "passed",
Ran 1 of 1 Specs in 81.840 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-network-edge][Feature:Router][apigroup:route.openshift.io][OCPFeatureGate:IngressControllerMultipleHAProxyVersions] The HAProxy router with version selection should revert to default HAProxy version when field is cleared [Suite:openshift/conformance/parallel]",
    "lifecycle": "blocking",
    "duration": 81839,
    "startTime": "2026-07-17 20:30:06.918623 UTC",
    "endTime": "2026-07-17 20:31:28.758294 UTC",
    "result": "passed",
 
Ran 1 of 1 Specs in 74.928 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-network-edge][Feature:Router][apigroup:route.openshift.io][OCPFeatureGate:IngressControllerMultipleHAProxyVersions] The HAProxy router with version selection should configure the same HAProxy version defined in the API [Suite:openshift/conformance/parallel]",
    "lifecycle": "blocking",
    "duration": 74895,
    "startTime": "2026-07-17 20:17:27.980543 UTC",
    "endTime": "2026-07-17 20:18:42.876098 UTC",
    "result": "passed",

  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-network-edge][Feature:Router][apigroup:route.openshift.io][OCPFeatureGate:IngressControllerMultipleHAProxyVersions] The HAProxy router with version selection should configure the default HAProxy if the version is unset [Suite:openshift/conformance/parallel]",
    "lifecycle": "blocking",
    "duration": 42149,
    "startTime": "2026-07-17 20:26:36.591719 UTC",
    "endTime": "2026-07-17 20:27:18.741557 UTC",
    "result": "passed",

  Ran 1 of 1 Specs in 76.537 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-network-edge][Feature:Router][apigroup:route.openshift.io][OCPFeatureGate:IngressControllerMultipleHAProxyVersions] The HAProxy router with version selection should maintain default router unchanged if updating the version on a custom IngressController [Suite:openshift/conformance/parallel]",
    "lifecycle": "blocking",
    "duration": 76536,
    "startTime": "2026-07-17 20:28:00.736688 UTC",
    "endTime": "2026-07-17 20:29:17.273522 UTC",
    "result": "passed",

Summary by CodeRabbit

  • Tests

    • Added gated end-to-end coverage for HAProxy version selection via haproxyVersion, including rejecting invalid values and restoring the default after clearing it.
    • Verified effectiveHAProxyVersion reporting and that custom IngressController settings don’t change the default router’s HAProxy version.
    • Added an e2e slow-backend pod manifest to exercise delayed responses.
  • Chores

    • Updated the Go dependency to a newer pseudo-version.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: automatic mode

@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jul 16, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Jul 16, 2026
@openshift-ci-robot

openshift-ci-robot commented Jul 16, 2026

Copy link
Copy Markdown

@rhamini3: This pull request references NE-2789 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:

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

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jul 16, 2026
@openshift-ci

openshift-ci Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

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

@openshift-ci openshift-ci Bot added the vendor-update Touching vendor dir or related files label Jul 16, 2026
@openshift-ci
openshift-ci Bot requested review from davidesalerno and sjenning July 16, 2026 01:15
@coderabbitai

coderabbitai Bot commented Jul 16, 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

Changes

Adds gated extended router tests covering HAProxy version validation, defaults, updates, and isolation. It also adds a delayed Python server Pod manifest with static OVN networking and updates the OpenShift API module revision.

HAProxy version selection tests

Layer / File(s) Summary
IngressController version scenarios and support
test/extended/router/multi-haproxy.go, go.mod
Creates and cleans up IngressControllers, validates configured and default HAProxy versions, checks isolation, polls router runtime versions, and updates the OpenShift API module revision.
Slow-server Pod definition
~
Defines a delayed Python HTTP server Pod with static OVN networking and a recorded CrashLoopBackOff status.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant TestSuite
  participant IngressController
  participant RouterDeployment
  participant HAProxy
  TestSuite->>IngressController: create or patch haproxyVersion
  IngressController->>RouterDeployment: reconcile router deployment
  RouterDeployment->>HAProxy: run configured version
  TestSuite->>HAProxy: exec show version
  HAProxy-->>TestSuite: report runtime version
Loading

Suggested reviewers: sjenning, davidesalerno

🚥 Pre-merge checks | ✅ 12 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Test Structure And Quality ⚠️ Warning FAIL: the HAProxy tests still ignore the field-clear poll result and don’t guard against an empty default EffectiveHAProxyVersion, so they can pass falsely. Check wait.PollUntilContextTimeout before pollHAProxy, assert the default ingress effective version is non-empty, and add failure messages to bare cluster-interaction expects.
Microshift Test Compatibility ⚠️ Warning The new Ginkgo suite uses the IngressController API and openshift-ingress-operator/openshift-ingress, which MicroShift does not support, and it lacks any MicroShift skip guard. Add a MicroShift skip or apigroup label for the unsupported OpenShift API group, or avoid this test on MicroShift entirely.
Ipv6 And Disconnected Network Test Compatibility ⚠️ Warning The added ~ pod manifest hardcodes IPv4 pod data and uses registry.access.redhat.com/ubi9/python-311, which can fail in IPv6-only disconnected jobs. If this manifest is used by the test, replace the external image with an internal/mirrored source and avoid fixed IPv4/status snapshots; make it family-agnostic or skip disconnected runs.
✅ Passed checks (12 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed All Ginkgo titles are static literals; generated names/IPs appear only in test bodies or manifests, not in It/Describe/Context/When strings.
Single Node Openshift (Sno) Test Compatibility ✅ Passed Tests use single-replica ingress controllers and pod exec only; no multi-node, topology, or HA failover assumptions found.
Topology-Aware Scheduling Compatibility ✅ Passed Only test code was added; it creates IngressControllers without node selectors, affinity, spread constraints, or topology assumptions.
Ote Binary Stdout Contract ✅ Passed No stdout writes were added in process-level setup; output/log calls are confined to It/AfterEach or helper methods called there.
No-Weak-Crypto ✅ Passed PR changes add HAProxy tests and api vendor updates; no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or secret/token compares found.
Container-Privileges ✅ Passed The only changed file is a Go E2E test; it adds no Pod/container manifests and contains no privileged, hostNetwork, hostPID, hostIPC, SYS_ADMIN, or allowPrivilegeEscalation settings.
No-Sensitive-Data-In-Logs ✅ Passed No direct secrets/PII are logged; new messages print only generated ingress names and HAProxy show-version output, with pod-log dumps only on failure.
Title check ✅ Passed The title matches the main change: adding Origin E2E tests to help graduate a feature gate, even if it is a bit broad.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jul 16, 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: 10

🧹 Nitpick comments (2)
~ (2)

50-51: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Pin the backend image for repeatable e2e runs.

The image resolves to mutable :latest, while Always pulls it on every start. Registry changes can alter or break the test independently of this PR. Use an approved immutable digest and matching pull policy.

🤖 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 @~ around lines 50 - 51, Update the backend container image configuration to
use an approved immutable image digest instead of the mutable latest tag, and
set imagePullPolicy to match the immutable reference so e2e runs remain
repeatable.

52-58: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add a readiness probe for port 8080.

Without a probe, Kubernetes can mark the container ready before HTTPServer has bound the port, allowing initial Route/Service requests to fail. Prefer a TCP probe because the handler intentionally delays HTTP responses.

🤖 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 @~ around lines 52 - 58, Add a TCP readiness probe to the slow-server
container targeting port 8080, using the existing Kubernetes probe configuration
location near ports and resources. Ensure readiness is reported only after the
HTTPServer has bound the port, without using an HTTP probe.
🤖 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 @~:
- Around line 8-30: Replace the live-cluster Pod snapshot with a minimal
desired-state fixture, removing OVN/network annotations, generated metadata,
nodeName, namespace-specific pull secrets and service-account volumes, plus the
full status block. Retain only fields required to define the slow-server Pod,
and let the test framework/API server assign name, namespace, metadata, and
runtime state across the affected fixture sections.
- Around line 33-49: Fix the embedded Python command in the fixture’s args
definition by representing the script as a valid YAML block scalar rather than
an unstructured quoted value. Remove leading indentation from Python top-level
statements while preserving the SlowHandler behavior and HTTP server startup,
and apply the same correction to the corresponding second fixture block.
- Around line 59-62: Disable service-account token mounting in the fixture
workloads by setting automountServiceAccountToken to false and removing the
explicit kube-api-access token volumeMounts and corresponding volume definitions
from all referenced sections. Preserve the existing HTTP server configuration
and other volume mounts.

In `@go.mod`:
- Around line 96-101: Update the go.mod dependency entries for
golang.org/x/crypto and golang.org/x/net to patched releases that address the
referenced OSV advisories, while leaving the surrounding module versions
unchanged.

In `@test/extended/router/multi-haproxy.go`:
- Around line 100-116: The HAProxy version test currently validates the
IngressController Spec rather than the custom router’s runtime version. In
test/extended/router/multi-haproxy.go:100-116, query the custom controller’s
effective status and HAProxy admin socket to verify the running version; in
test/extended/router/multi-haproxy.go:120-135, run the checks against
deploy/router-<custom-controller-name> instead of deploy/router-default.
- Around line 329-374: Update the resource setup flow around the Pod and Route
creation in the helper to wait for the Pod Ready condition before proceeding,
then poll the created Route until its status contains an admitted ingress with a
non-empty host. Refresh the Route from the API during polling and return that
refreshed object instead of the initial create response, while preserving
existing error propagation.
- Around line 139-145: Update the cleanup for this spec around the default
IngressController setup to capture its original HAProxyVersion and restore it in
bounded cleanup after the test, since existing AfterEach only removes custom
controllers. Also use the object returned by Patch or refetch the default
controller before asserting HAProxyVersion is empty, rather than checking the
stale ingressDefault object.
- Around line 42-57: Update the teardown context setup around ctx and the
g.AfterEach cleanup to derive the operational context from the spec context
rather than context.Background(). For deletion, use context.WithoutCancel(ctx)
followed by context.WithTimeout with an explicit deadline, and ensure the
resulting cancel function is invoked. Pass the bounded cleanup context to the
IngressControllers Delete calls while preserving spec cancellation for normal
operations.
- Around line 84-97: Update the test case around createSlowBackend to start the
delayed curl asynchronously, retain its process handle, trigger a router rolling
update by changing the relevant IngressController configuration, and await
rollout completion before waiting for the curl. Replace the exact "200" output
assertion with a success assertion that matches the curl response body and
verbose diagnostics, ensuring the original active request completes successfully
after the update.
- Around line 273-284: Remove the leading indentation from every line in the
serverScript raw string used by the slow-backend setup, including the top-level
import, class definition, handler body, and HTTPServer invocation, so the Python
script executes without an IndentationError.

---

Nitpick comments:
In @~:
- Around line 50-51: Update the backend container image configuration to use an
approved immutable image digest instead of the mutable latest tag, and set
imagePullPolicy to match the immutable reference so e2e runs remain repeatable.
- Around line 52-58: Add a TCP readiness probe to the slow-server container
targeting port 8080, using the existing Kubernetes probe configuration location
near ports and resources. Ensure readiness is reported only after the HTTPServer
has bound the port, without using an HTTP probe.
🪄 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 YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 3975e131-f049-4638-bdb1-9c573933597b

📥 Commits

Reviewing files that changed from the base of the PR and between 73c3bbe and ef5fa95.

⛔ Files ignored due to path filters (466)
  • go.sum is excluded by !**/*.sum
  • vendor/github.com/go-openapi/swag/.codecov.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/.mockery.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/cmdutils/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/cmdutils/cmd_utils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/cmdutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/cmdutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/convert.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/convert_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/format.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/sizeof.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv/type_constraints.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/conv_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/convert.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/convert_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils/file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils/path.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/fileutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/go.work is excluded by !**/*.work, !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/go.work.sum is excluded by !**/*.sum, !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/initialism_index.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonname/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonname/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonname/name_provider.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonname_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/ifaces.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/registry_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/registry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/adapter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/lexer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/ordered_map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/pool.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/concat.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils/ordered_map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/jsonutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/json.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/loading.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading/yaml.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/loading_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/BENCHMARK.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/initialism_index.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/name_lexem.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/name_mangler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/pools.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/split.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/string_bytes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/mangling_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/name_lexem.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/net.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/netutils/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/netutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/netutils/net.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/netutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/split.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils/collection_formats.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils/strings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/stringutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/typeutils/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/typeutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/typeutils/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/typeutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yaml.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/ordered_map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils/yaml.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-openapi/swag/yamlutils_iface.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/josharian/intern/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/josharian/intern/intern.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/josharian/intern/license.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/buffer/pool.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/bytestostr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jlexer/lexer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/mailru/easyjson/jwriter/writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/.ci-operator.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/.golangci.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/Dockerfile.ocp is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/apiserver/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiserver/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/apps/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apps/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apps/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/authorization/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/authorization/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/authorization/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/build/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/build/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/build/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/cloudnetwork/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/cloudnetwork/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/cloudnetwork/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_cluster_version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_crio_credential_provider_config.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_infrastructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_ingress.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_network.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/types_cluster_monitoring.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha2/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha2/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/console/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/console/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/etcd/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/etcd/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/features.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/features/features.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/helm/v1beta1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/helm/v1beta1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/image/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/image/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/image/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/imageregistry/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/imageregistry/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/kubecontrolplane/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/kubecontrolplane/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/legacyconfig/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/legacyconfig/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machine/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machine/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machine/v1beta1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1beta1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1/types_internalreleaseimage.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/monitoring/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/monitoring/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/network/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/network/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/network/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/network/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/network/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/networkoperator/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/networkoperator/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/networkoperator/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/oauth/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/oauth/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/oauth/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/openshiftcontrolplane/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/openshiftcontrolplane/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_authentication.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_csi_cluster_driver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_etcd.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_ingresscontroller.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_kmsencryption.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_kubeapiserver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_openshiftapiserver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operatorcontrolplane/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operatorcontrolplane/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operatoringress/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operatoringress/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/osin/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/osin/v1/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/osin/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/osin/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/project/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/project/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/project/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/quota/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/quota/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/quota/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/route/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/route/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/route/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/samples/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/samples/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/samples/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/security/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/security/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/security/v1/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/security/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/servicecertsigner/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/servicecertsigner/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/sharedresource/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/sharedresource/v1alpha1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/template/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/template/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/template/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/user/.codegen.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/user/v1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/user/v1/zz_generated.model_name.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/spf13/pflag/flag.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/crypto/chacha20poly1305/fips140only_compat.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/crypto/chacha20poly1305/fips140only_go1.26.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/modfile/print.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/modfile/read.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/modfile/rule.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/module/module.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/semver/semver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/nodetype_string.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/client_priority_go126.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/client_priority_go127.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/frame.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/http2.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/transport.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/http2/writesched_priority_rfc9218.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/internal/httpsfv/httpsfv.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/trace/events.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/websocket/hybi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sync/errgroup/errgroup.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_arm64.s is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_other_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_windows_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/cpu/cpu_x86.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ioctl_signed.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ioctl_unsigned.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/mkerrors.sh is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/syscall_solaris.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/syscall_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_386.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_arm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mips.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/windows/syscall_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/windows/types_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/windows/zsyscall_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/term/terminal.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/cases/tables10.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/cases/tables11.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/cases/tables12.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/cases/tables15.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/cases/tables17.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/cases/tables9.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/japanese/eucjp.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/japanese/iso2022jp.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/japanese/shiftjis.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/korean/euckr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/traditionalchinese/big5.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/unicode/unicode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/message/catalog/catalog.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/message/catalog/dict.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/message/catalog/go19.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/message/catalog/gopre19.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/secure/bidirule/bidirule.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/bidi/tables17.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/norm/forminfo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/norm/tables10.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/norm/tables11.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/norm/tables12.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/norm/tables15.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/norm/tables17.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/unicode/norm/tables9.0.0.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/ast/inspector/cursor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/ast/inspector/inspector.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/ast/inspector/iter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/packages/packages.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/packages/visit.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/types/objectpath/objectpath.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/types/typeutil/callee.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/types/typeutil/map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/aliases/aliases.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/aliases/aliases_go122.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/event/core/event.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/event/core/export.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/event/keys/keys.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/event/label/label.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gcimporter/bimport.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gcimporter/iexport.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gcimporter/iimport.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/stdlib/deps.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/stdlib/import.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/stdlib/manifest.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/stdlib/stdlib.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typeparams/free.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typeparams/normalize.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/classify_call.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/element.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/fx.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/isnamed.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/qualifier.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/varkind.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/varkind_go124.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/versions/features.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues_no_slog.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues_slog.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/klog.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/klogr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/klogr_slog.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/ktesting/testinglogger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/textlogger/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/klog/v2/textlogger/textlogger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/builder/openapi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/builder3/openapi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/serialization.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/alias.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_any.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_default.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_funcs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_inlined.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_methods.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_time.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/fields.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/fold.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/intern.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/internal.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonflags/flags.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonopts/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonwire/decode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonwire/encode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/internal/jsonwire/wire.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/alias.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/decode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/encode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/export.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/pools.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/quote.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/state.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/token.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/jsontext/value.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/migrate.sh is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/options.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/schemaconv/openapi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/schemaconv/proto_models.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/encoding.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/example.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/external_documentation.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/header.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/media_type.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/operation.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/parameter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/path.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/request_body.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/response.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/security_scheme.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/spec3/spec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/header.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/info.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/schema.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/swagger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/validate/result.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/validate/schema.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/validate/validator.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/utils/buffer/ring_fixed.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/utils/clock/testing/fake_clock.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/utils/exec/exec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/utils/exec/fixup_go118.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/utils/exec/fixup_go119.go is excluded by !**/vendor/**, !vendor/**
  • vendor/k8s.io/utils/strings/slices/slices.go is excluded by !**/vendor/**, !vendor/**
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/sigs.k8s.io/structured-merge-diff/v6/schema/elements.go is excluded by !**/vendor/**, !vendor/**
  • vendor/sigs.k8s.io/structured-merge-diff/v6/typed/remove.go is excluded by !**/vendor/**, !vendor/**
  • vendor/sigs.k8s.io/structured-merge-diff/v6/value/reflectcache.go is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (3)
  • go.mod
  • test/extended/router/multi-haproxy.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.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

🛑 Comments failed to post (10)
~ (3)

8-30: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Do not commit this live-cluster Pod snapshot as the test fixture.

The OVN annotations, generated metadata/status, captured nodeName, namespace-specific pull secret, service-account volume, and full status block make this non-portable and likely to collide with default/slow-server. Keep only desired fields; let the test framework choose the namespace/name and the API server populate runtime state.

Also applies to: 65-108, 109-180

🤖 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 @~ around lines 8 - 30, Replace the live-cluster Pod snapshot with a minimal
desired-state fixture, removing OVN/network annotations, generated metadata,
nodeName, namespace-specific pull secrets and service-account volumes, plus the
full status block. Retain only fields required to define the slow-server Pod,
and let the test framework/API server assign name, namespace, metadata, and
runtime state across the affected fixture sections.

33-49: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Fix the embedded command before using this fixture.

args is not valid YAML here: python3 -c " is neither a list item nor a block scalar. Even after fixing that, the Python source has leading top-level indentation, causing the observed exit code 1 and CrashLoopBackOff. Encode the script as a block scalar and remove indentation from top-level statements.

Proposed shape
   - args:
     - bash
     - -c
-    python3 -c "
-      import http.server, time
+    - |
+      exec python3 -c '
+      import http.server
+      import time

-      class SlowHandler(http.server.BaseHTTPRequestHandler):
-          ...
+      class SlowHandler(http.server.BaseHTTPRequestHandler):
+          ...

-      "
+      '

Also applies to: 147-159

🤖 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 @~ around lines 33 - 49, Fix the embedded Python command in the fixture’s
args definition by representing the script as a valid YAML block scalar rather
than an unstructured quoted value. Remove leading indentation from Python
top-level statements while preserving the SlowHandler behavior and HTTP server
startup, and apply the same correction to the corresponding second fixture
block.

59-62: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Disable the service-account token for this HTTP-only server.

The fixture mounts the default service-account token even though the backend never uses the Kubernetes API. If the server is compromised, the token unnecessarily exposes API credentials. Set automountServiceAccountToken: false and remove the explicit token mount/volume.

Also applies to: 73-74, 85-108

🤖 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 @~ around lines 59 - 62, Disable service-account token mounting in the
fixture workloads by setting automountServiceAccountToken to false and removing
the explicit kube-api-access token volumeMounts and corresponding volume
definitions from all referenced sections. Preserve the existing HTTP server
configuration and other volume mounts.
go.mod (1)

96-101: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

govulncheck ./...
make verify
make check

Repository: openshift/origin

Length of output: 279


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Show the relevant go.mod section with line numbers.
sed -n '88,108p' go.mod | cat -n

# Search for the exact module pins in the repo.
rg -n 'golang\.org/x/(crypto|net)\s+v' go.mod

Repository: openshift/origin

Length of output: 1036


🌐 Web query:

OSV golang.org/x/crypto v0.48.0 golang.org/x/net v0.50.0 advisories fixed versions

💡 Result:

As of July 16, 2026, both golang.org/x/crypto version 0.48.0 and golang.org/x/net version 0.50.0 are affected by numerous security advisories, as they were released before several critical patches [1][2]. Users are advised to upgrade to the latest available versions to mitigate these vulnerabilities [3][4]. For golang.org/x/crypto, version 0.48.0 contains multiple documented security advisories [1]. Many of the vulnerabilities reported in this version, such as those related to SSH key parsing, authentication bypass, and resource exhaustion (e.g., GHSA-5cgq-3rg8-m6cv, GHSA-vgwf-h737-ff37, and GO-2026-5018), were addressed in version 0.52.0 [5][6][7][4]. For golang.org/x/net, version 0.50.0 is also affected by multiple security advisories [2]. Notable issues include HTTP/2 frame handling vulnerabilities (e.g., GO-2026-4559, GO-2026-4918) and HTML parsing issues (e.g., GO-2026-5028) [8][9][10]. These have been addressed in subsequent releases, with various fixes implemented in versions 0.51.0, 0.53.0, and 0.55.0 depending on the specific vulnerability [8][9][10]. To identify the precise fixed versions for specific vulnerabilities, you should consult the Open Source Vulnerabilities (OSV) database or the Go vulnerability database (vuln.go.dev) using the advisory IDs listed on the respective package pages [1][5][2]. It is strongly recommended to update to the most recent stable release of these packages to ensure all security patches are applied [3].

Citations:


Bump golang.org/x/crypto and golang.org/x/net. v0.48.0 and v0.50.0 are still covered by OSV advisories; move both to patched releases before merging.

🤖 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` around lines 96 - 101, Update the go.mod dependency entries for
golang.org/x/crypto and golang.org/x/net to patched releases that address the
referenced OSV advisories, while leaving the surrounding module versions
unchanged.

Sources: Path instructions, MCP tools

test/extended/router/multi-haproxy.go (6)

42-57: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Bound teardown and preserve the spec context.

context.Background() disconnects API operations from spec cancellation, while the AfterEach deletes have no deadline and can block teardown indefinitely. Derive operations from the spec context; for cleanup, detach cancellation and apply an explicit timeout.

As per path instructions, contexts must provide cancellation and timeouts. Based on learnings, deferred cleanup should use context.WithoutCancel(ctx) followed by context.WithTimeout(...), rather than an uncanceled root 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 `@test/extended/router/multi-haproxy.go` around lines 42 - 57, Update the
teardown context setup around ctx and the g.AfterEach cleanup to derive the
operational context from the spec context rather than context.Background(). For
deletion, use context.WithoutCancel(ctx) followed by context.WithTimeout with an
explicit deadline, and ensure the resulting cancel function is invoked. Pass the
bounded cleanup context to the IngressControllers Delete calls while preserving
spec cancellation for normal operations.

Sources: Path instructions, Learnings


84-97: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Implement the rolling update this scenario claims to test.

The test only runs a synchronous curl; it never changes an IngressController while that request is active. Additionally, curl -v returns the OK body plus diagnostic output, not exactly "200". Start the delayed request asynchronously, trigger and await the router rollout, then assert that the original request completes successfully.

🤖 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/extended/router/multi-haproxy.go` around lines 84 - 97, Update the test
case around createSlowBackend to start the delayed curl asynchronously, retain
its process handle, trigger a router rolling update by changing the relevant
IngressController configuration, and await rollout completion before waiting for
the curl. Replace the exact "200" output assertion with a success assertion that
matches the curl response body and verbose diagnostics, ensuring the original
active request completes successfully after the update.

100-116: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Runtime-version checks do not inspect the custom router under test.

  • test/extended/router/multi-haproxy.go#L100-L116: query the custom router’s effective status and HAProxy admin socket instead of reading back its Spec.
  • test/extended/router/multi-haproxy.go#L120-L135: execute against deploy/router-<custom-controller-name>, not deploy/router-default.
📍 Affects 1 file
  • test/extended/router/multi-haproxy.go#L100-L116 (this comment)
  • test/extended/router/multi-haproxy.go#L120-L135
🤖 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/extended/router/multi-haproxy.go` around lines 100 - 116, The HAProxy
version test currently validates the IngressController Spec rather than the
custom router’s runtime version. In
test/extended/router/multi-haproxy.go:100-116, query the custom controller’s
effective status and HAProxy admin socket to verify the running version; in
test/extended/router/multi-haproxy.go:120-135, run the checks against
deploy/router-<custom-controller-name> instead of deploy/router-default.

139-145: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Restore the default IngressController after this spec.

Clearing the shared default controller is not undone by AfterEach, which only deletes custom controllers. This can contaminate subsequent tests. Capture and restore the original value in bounded cleanup; also assert against the object returned by Patch or refetch it, since Line 145 checks the stale pre-patch object.

🤖 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/extended/router/multi-haproxy.go` around lines 139 - 145, Update the
cleanup for this spec around the default IngressController setup to capture its
original HAProxyVersion and restore it in bounded cleanup after the test, since
existing AfterEach only removes custom controllers. Also use the object returned
by Patch or refetch the default controller before asserting HAProxyVersion is
empty, rather than checking the stale ingressDefault object.

Source: Coding guidelines


273-284: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

Remove the leading indentation from the python3 -c script.

The raw literal preserves the Go indentation, so Python encounters an indented top-level import and exits with IndentationError. The slow-backend Pod will never become ready.

Proposed fix
 	const serverScript = `
-	import http.server, time
+import http.server, time
 
-	class SlowHandler(http.server.BaseHTTPRequestHandler):
-		def do_GET(self):
-			time.sleep(20)
-			self.send_response(200)
-			self.end_headers()
-			self.wfile.write(b'OK')
+class SlowHandler(http.server.BaseHTTPRequestHandler):
+	def do_GET(self):
+		time.sleep(20)
+		self.send_response(200)
+		self.end_headers()
+		self.wfile.write(b'OK')
 
-	http.server.HTTPServer(('', 8080), SlowHandler).serve_forever()
+http.server.HTTPServer(('', 8080), SlowHandler).serve_forever()
 	`
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

	const serverScript = `
import http.server, time

class SlowHandler(http.server.BaseHTTPRequestHandler):
	def do_GET(self):
		time.sleep(20)
		self.send_response(200)
		self.end_headers()
		self.wfile.write(b'OK')

http.server.HTTPServer(('', 8080), SlowHandler).serve_forever()
	`
🤖 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/extended/router/multi-haproxy.go` around lines 273 - 284, Remove the
leading indentation from every line in the serverScript raw string used by the
slow-backend setup, including the top-level import, class definition, handler
body, and HTTPServer invocation, so the Python script executes without an
IndentationError.

329-374: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

Wait for backend readiness and Route admission before returning.

Resource creation does not mean the Pod is ready or the Route status is populated. The caller immediately indexes route.Status.Ingress[0], so this can panic or curl an unavailable backend. Wait for the Pod’s Ready condition and poll the Route until it has an admitted ingress with a non-empty host, then return the refreshed Route.

🤖 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/extended/router/multi-haproxy.go` around lines 329 - 374, Update the
resource setup flow around the Pod and Route creation in the helper to wait for
the Pod Ready condition before proceeding, then poll the created Route until its
status contains an admitted ingress with a non-empty host. Refresh the Route
from the API during polling and return that refreshed object instead of the
initial create response, while preserving existing error propagation.

Source: Coding guidelines

@openshift-ci openshift-ci Bot added the ready-for-human-review Indicates a PR has been reviewed by automated tools and is ready for human review label Jul 16, 2026
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-aws-csi
/test e2e-aws-ovn-fips
/test e2e-aws-ovn-microshift
/test e2e-aws-ovn-microshift-serial
/test e2e-aws-ovn-serial-1of2
/test e2e-aws-ovn-serial-2of2
/test e2e-gcp-csi
/test e2e-gcp-ovn
/test e2e-gcp-ovn-upgrade
/test e2e-metal-ipi-ovn-ipv6
/test e2e-vsphere-ovn
/test e2e-vsphere-ovn-upi

@rhamini3

Copy link
Copy Markdown
Contributor Author

/testwith openshift/origin/main/e2e-gcp-ovn-techpreview openshift/cluster-ingress-operator#1498

@jcmoraisjr

Copy link
Copy Markdown
Member

/assign

@rhamini3

Copy link
Copy Markdown
Contributor Author

/testwith openshift/origin/main/e2e-gcp-ovn-techpreview openshift/cluster-ingress-operator#1498

@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: 3

🧹 Nitpick comments (1)
test/extended/router/multi-haproxy.go (1)

343-360: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Readiness check relies on container name coincidentally matching Pod name; timeout duplicates testsTimeout.

p.Name == pod.Name compares a ContainerStatus.Name ("slow-backend" container) against the Pod's ObjectMeta.Name ("slow-backend"). It only works because both happen to share the same literal string — if either is renamed independently, this silently times out instead of failing fast. Also, the poll timeout 2*time.Minute duplicates the already-declared testsTimeout constant (Line 35); consider threading it through as a parameter for consistency.

-		for _, p := range pods.Status.ContainerStatuses {
-			if p.Name == pod.Name && p.Ready {
+		for _, p := range pods.Status.ContainerStatuses {
+			if p.Name == "slow-backend" && p.Ready {
 				e2e.Logf("The pod is ready!")
 				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/extended/router/multi-haproxy.go` around lines 343 - 360, Update the
readiness check in the wait.PollUntilContextTimeout callback to identify the
intended container using its explicit container-name symbol or value, rather
than comparing ContainerStatus.Name with pod.Name. Replace the duplicated
2*time.Minute polling timeout with the existing testsTimeout constant, passing
it through any enclosing helper parameters if needed.
🤖 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/extended/router/multi-haproxy.go`:
- Line 19: Replace the pointer.Bool usage in the SecurityContext struct literal
with the existing ptr.To helper, remove the now-unused k8s.io/utils/pointer
import, and keep the neighboring ptr.To(false) style consistent.
- Line 95: Update the wait.PollUntilContextTimeout call to use the existing
enclosing ctx instead of context.Background(), and rename the closure parameter
from context to a non-shadowing name such as ctx. Preserve the callback’s
context.Context type and existing polling behavior.
- Around line 87-116: The slow-backend request currently completes before the
router rollout begins. Update the curl execution in the test around oc.Run and
the subsequent rollout restart to run asynchronously, trigger the
deployment/router-default restart while curl remains in flight, then wait for
and validate the curl result and its 200 OK response.

---

Nitpick comments:
In `@test/extended/router/multi-haproxy.go`:
- Around line 343-360: Update the readiness check in the
wait.PollUntilContextTimeout callback to identify the intended container using
its explicit container-name symbol or value, rather than comparing
ContainerStatus.Name with pod.Name. Replace the duplicated 2*time.Minute polling
timeout with the existing testsTimeout constant, passing it through any
enclosing helper parameters if needed.
🪄 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 YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 6f5b19c0-2043-48ad-b922-50260f246d78

📥 Commits

Reviewing files that changed from the base of the PR and between 4b77f80 and 7f6ad69.

📒 Files selected for processing (1)
  • test/extended/router/multi-haproxy.go

Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-aws-csi
/test e2e-aws-ovn-fips
/test e2e-aws-ovn-microshift
/test e2e-aws-ovn-microshift-serial
/test e2e-aws-ovn-serial-1of2
/test e2e-aws-ovn-serial-2of2
/test e2e-gcp-csi
/test e2e-gcp-ovn
/test e2e-gcp-ovn-upgrade
/test e2e-metal-ipi-ovn-ipv6
/test e2e-vsphere-ovn
/test e2e-vsphere-ovn-upi

@rhamini3

Copy link
Copy Markdown
Contributor Author

/testwith openshift/origin/main/e2e-gcp-ovn-techpreview openshift/cluster-ingress-operator#1498

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-aws-csi
/test e2e-aws-ovn-fips
/test e2e-aws-ovn-microshift
/test e2e-aws-ovn-microshift-serial
/test e2e-aws-ovn-serial-1of2
/test e2e-aws-ovn-serial-2of2
/test e2e-gcp-csi
/test e2e-gcp-ovn
/test e2e-gcp-ovn-upgrade
/test e2e-metal-ipi-ovn-ipv6
/test e2e-vsphere-ovn
/test e2e-vsphere-ovn-upi

@gcs278 gcs278 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sorry - I know it's WIP, but i wanted to have an early review to hopefully help with direction. It's looking pretty close to being ready!

My suggestion summary:

  • should fail if selecting an unknown HAProxy version
  • should preserve active connections during router rolling update → should revert to default HAProxy when the version field is cleared
  • should configure the same HAProxy version defined in the API
  • should configure the default HAProxy if the version is unset
  • should maintain default router unchanged if updating the version on a custom IngressController (record default's version, loop through all available versions on custom IC, verify default never changes)

const testsTimeout = 2 * time.Minute

// defaultHAProxyVersion is the default HAProxy version for the current release.
const defaultHAProxyVersion = operatorv1.HAProxyVersion32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

More of a minor point, but it'd be better if we didn't hardcode this - that means that after each bump, we'd break this origin test, and wouldn't have a way to atomically update it.

Consider just using the status on the default IngressController to get the default:

Suggested change
const defaultHAProxyVersion = operatorv1.HAProxyVersion32
// Discover the default version from the running cluster
defaultIC, err := operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Get(ctx, "default", metav1.GetOptions{})
defaultVersion := defaultIC.Status.EffectiveHAProxyVersion

@gcs278 gcs278 Jul 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actually, it's fine to leave this as a follow up. We also want to extract the available versions from the CRD too, and I think we can figure that out later. Eventually we need either to:

  1. Not hardcode the versions so our origin tests break when we bump
  2. Move to openshift/cluster-ingress-operator as OTE (so they can be changed in the same PR)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

yeah +1 on leaving it as a followup also I guess we would have to figure out how to get the previous version also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

sorry I realized that this actually needs to be resolved now, otherwise our haproxy28 jobs will fail. The default can dynamically change, so we should really discover it via the way I suggested, rather than hardcoding.

Additionally, you will also need to set the alternative dynamically based on the default. Something like this works for now:

var defaultHAProxyVersion operatorv1.HAProxyVersion
var alternateHAProxyVersion operatorv1.HAProxyVersion

g.BeforeEach(func() {
    defaultIC, err := operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Get(ctx, "default", metav1.GetOptions{})
    o.Expect(err).NotTo(o.HaveOccurred())
    o.Expect(defaultIC.Status.EffectiveHAProxyVersion).NotTo(o.BeEmpty())
    defaultHAProxyVersion = defaultIC.Status.EffectiveHAProxyVersion

    if defaultHAProxyVersion == operatorv1.HAProxyVersion28 {
        alternateHAProxyVersion = operatorv1.HAProxyVersion32
    } else {
        alternateHAProxyVersion = operatorv1.HAProxyVersion28
    }
})

Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
o.Expect(err).NotTo(o.HaveOccurred())
o.Expect(ingressController.Spec.HAProxyVersion).To(o.BeEmpty())

o.Expect(string(ingressController.Status.EffectiveHAProxyVersion)).To(o.ContainSubstring(string(operatorv1.HAProxyVersion32)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
o.Expect(string(ingressController.Status.EffectiveHAProxyVersion)).To(o.ContainSubstring(string(operatorv1.HAProxyVersion32)))
o.Expect(string(ingressController.Status.EffectiveHAProxyVersion)).To(o.ContainSubstring(string(defaultHAProxyVersion)))

Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go
Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
Comment thread test/extended/router/multi-haproxy.go Outdated
@rhamini3

Copy link
Copy Markdown
Contributor Author

/testwith openshift/origin/main/e2e-gcp-ovn-techpreview openshift/cluster-ingress-operator#1498

@rhamini3

Copy link
Copy Markdown
Contributor Author

@jcmoraisjr @gcs278 PR is ready for another round of review :)

@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 `@test/extended/router/multi-haproxy.go`:
- Around line 97-111: Preserve and assert the result of the
HAProxyVersion-clearing poll before invoking the subsequent default-version
check. Update the flow around wait.PollUntilContextTimeout so a timeout or other
error fails the test immediately, rather than being overwritten by the later
pollHAProxy assignment; keep pollHAProxy responsible only for validating the
default version after the field is confirmed unset.
- Around line 165-180: Validate that
ingressDefault.Status.EffectiveHAProxyVersion is non-empty before using it as
the baseline in the default-router verification flow. Add the assertion
immediately after assigning ingressVersion, while preserving the existing
pollHAProxy checks for valid versions.
🪄 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 YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: e989e04b-111c-4ead-a426-7ea21100d1fc

📥 Commits

Reviewing files that changed from the base of the PR and between 119c6b1 and 0613e90.

📒 Files selected for processing (1)
  • test/extended/router/multi-haproxy.go

Comment on lines +97 to +111
err = wait.PollUntilContextTimeout(ctx, 2*time.Second, testsTimeout, false, func(ctx context.Context) (bool, error) {
ic, err := operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Get(ctx, ingress.Name, metav1.GetOptions{})
if err != nil {
return false, nil
}
if ic.Spec.HAProxyVersion != "" {
e2e.Logf("The Ingress spec has not cleared the HAProxyVersion field yet, retrying...")
return false, nil
}
e2e.Logf("IngressController: %s HAProxyVersion is unset", ingress.Name)
return true, nil
})

g.By("Confirm that the HAProxy version shows default version")
err = pollHAProxy(ctx, oc, ingress.Name, string(defaultHAProxyVersion))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Assert the field-clear poll result before overwriting err.

A timeout is currently discarded by the subsequent pollHAProxy assignment, allowing the test to pass without proving that spec.haproxyVersion was cleared.

Proposed fix
 			err = wait.PollUntilContextTimeout(ctx, 2*time.Second, testsTimeout, false, func(ctx context.Context) (bool, error) {
 				...
 			})
+			o.Expect(err).NotTo(o.HaveOccurred(), "Timed out waiting for HAProxyVersion to be cleared")
 
 			g.By("Confirm that the HAProxy version shows default version")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
err = wait.PollUntilContextTimeout(ctx, 2*time.Second, testsTimeout, false, func(ctx context.Context) (bool, error) {
ic, err := operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Get(ctx, ingress.Name, metav1.GetOptions{})
if err != nil {
return false, nil
}
if ic.Spec.HAProxyVersion != "" {
e2e.Logf("The Ingress spec has not cleared the HAProxyVersion field yet, retrying...")
return false, nil
}
e2e.Logf("IngressController: %s HAProxyVersion is unset", ingress.Name)
return true, nil
})
g.By("Confirm that the HAProxy version shows default version")
err = pollHAProxy(ctx, oc, ingress.Name, string(defaultHAProxyVersion))
err = wait.PollUntilContextTimeout(ctx, 2*time.Second, testsTimeout, false, func(ctx context.Context) (bool, error) {
ic, err := operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Get(ctx, ingress.Name, metav1.GetOptions{})
if err != nil {
return false, nil
}
if ic.Spec.HAProxyVersion != "" {
e2e.Logf("The Ingress spec has not cleared the HAProxyVersion field yet, retrying...")
return false, nil
}
e2e.Logf("IngressController: %s HAProxyVersion is unset", ingress.Name)
return true, nil
})
o.Expect(err).NotTo(o.HaveOccurred(), "Timed out waiting for HAProxyVersion to be cleared")
g.By("Confirm that the HAProxy version shows default version")
err = pollHAProxy(ctx, oc, ingress.Name, string(defaultHAProxyVersion))
🤖 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/extended/router/multi-haproxy.go` around lines 97 - 111, Preserve and
assert the result of the HAProxyVersion-clearing poll before invoking the
subsequent default-version check. Update the flow around
wait.PollUntilContextTimeout so a timeout or other error fails the test
immediately, rather than being overwritten by the later pollHAProxy assignment;
keep pollHAProxy responsible only for validating the default version after the
field is confirmed unset.

Source: Path instructions

Comment on lines +165 to +180
ingressVersion := ingressDefault.Status.EffectiveHAProxyVersion

g.By("Create a custom controller and pin it to older version")
ingress, err := controllers.createIngressController(ctx, oc, testsTimeout, nil)
o.Expect(err).To(o.Succeed())

patch := []byte(fmt.Sprintf(`{"spec":{"haproxyVersion":"%s"}}`, operatorv1.HAProxyVersion28))
_, err = operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Patch(ctx, ingress.Name, types.MergePatchType, patch, metav1.PatchOptions{})
o.Expect(err).NotTo(o.HaveOccurred())

g.By("Confirm the HaProxy version matches")
err = pollHAProxy(ctx, oc, ingress.Name, string(operatorv1.HAProxyVersion28))
o.Expect(err).NotTo(o.HaveOccurred())

g.By("Confirm the default router is still running the default HAProxy version")
err = pollHAProxy(ctx, oc, ingressDefault.Name, string(ingressVersion))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Reject an empty default-version baseline.

If EffectiveHAProxyVersion is empty, pollHAProxy(..., "") immediately succeeds because every string contains "", so this isolation test becomes a false positive.

Proposed fix
 			ingressVersion := ingressDefault.Status.EffectiveHAProxyVersion
+			o.Expect(ingressVersion).NotTo(o.BeEmpty(),
+				"default IngressController has no effective HAProxy version")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
ingressVersion := ingressDefault.Status.EffectiveHAProxyVersion
g.By("Create a custom controller and pin it to older version")
ingress, err := controllers.createIngressController(ctx, oc, testsTimeout, nil)
o.Expect(err).To(o.Succeed())
patch := []byte(fmt.Sprintf(`{"spec":{"haproxyVersion":"%s"}}`, operatorv1.HAProxyVersion28))
_, err = operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Patch(ctx, ingress.Name, types.MergePatchType, patch, metav1.PatchOptions{})
o.Expect(err).NotTo(o.HaveOccurred())
g.By("Confirm the HaProxy version matches")
err = pollHAProxy(ctx, oc, ingress.Name, string(operatorv1.HAProxyVersion28))
o.Expect(err).NotTo(o.HaveOccurred())
g.By("Confirm the default router is still running the default HAProxy version")
err = pollHAProxy(ctx, oc, ingressDefault.Name, string(ingressVersion))
ingressVersion := ingressDefault.Status.EffectiveHAProxyVersion
o.Expect(ingressVersion).NotTo(o.BeEmpty(),
"default IngressController has no effective HAProxy version")
g.By("Create a custom controller and pin it to older version")
ingress, err := controllers.createIngressController(ctx, oc, testsTimeout, nil)
o.Expect(err).To(o.Succeed())
patch := []byte(fmt.Sprintf(`{"spec":{"haproxyVersion":"%s"}}`, operatorv1.HAProxyVersion28))
_, err = operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Patch(ctx, ingress.Name, types.MergePatchType, patch, metav1.PatchOptions{})
o.Expect(err).NotTo(o.HaveOccurred())
g.By("Confirm the HaProxy version matches")
err = pollHAProxy(ctx, oc, ingress.Name, string(operatorv1.HAProxyVersion28))
o.Expect(err).NotTo(o.HaveOccurred())
g.By("Confirm the default router is still running the default HAProxy version")
err = pollHAProxy(ctx, oc, ingressDefault.Name, string(ingressVersion))
🤖 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/extended/router/multi-haproxy.go` around lines 165 - 180, Validate that
ingressDefault.Status.EffectiveHAProxyVersion is non-empty before using it as
the baseline in the default-router verification flow. Add the assertion
immediately after assigning ingressVersion, while preserving the existing
pollHAProxy checks for valid versions.

Comment thread ~

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should we delete this file?

defer g.GinkgoRecover()

// testsTimeout defines the maximum amount of time to wait for test operations to complete.
const testsTimeout = 2 * time.Minute

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit 2 minutes is probably 99.9% fine, but it doesn't hurt to extend it a little longer just in case there is a really busy CI cluster.

Suggested change
const testsTimeout = 2 * time.Minute
const testsTimeout = 5 * time.Minute

Comment on lines +256 to +270
// take the router pod, we need it to send requests to the router
svc, err := kubeClient.CoreV1().Services(nsRouter).Get(ctx, svcName, metav1.GetOptions{})
if err != nil {
return nil, err
}

listOpts := metav1.ListOptions{LabelSelector: labels.FormatLabels(svc.Spec.Selector)}
pods, err := kubeClient.CoreV1().Pods(nsRouter).List(ctx, listOpts)
if err != nil {
return nil, err
}
replicas := ptr.Deref(ic.Spec.Replicas, 0)
if len(pods.Items) != int(replicas) {
return nil, fmt.Errorf("expected number of router pods to be %d, but found %d", replicas, len(pods.Items))
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this is not needed anymore. err = shard.WaitForIngressControllerCondition(oc, readyTimeout, controller, ingressControllerReady...) covers the deployment rolling out via the Available=True condition. Reducing the number of redundant check also remove changes of flaking.

const testsTimeout = 2 * time.Minute

// defaultHAProxyVersion is the default HAProxy version for the current release.
const defaultHAProxyVersion = operatorv1.HAProxyVersion32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit creating an alternate variable so you never need to reference haproxy28 or haproxy32 directly, it makes the tests more readable (aka describe the intent in the variable name), and updates only need to happen in 1 place vs. spread out in the tests.

Suggested change
const defaultHAProxyVersion = operatorv1.HAProxyVersion32
const defaultHAProxyVersion = operatorv1.HAProxyVersion32
const alternateHAProxyVersion = operatorv1.HAProxyVersion28

You'd then only reference 28 and 32 by these variables. Up to you.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

See other comment about dynamically discovering - we need to do that now or tests will fail.

return ingress, nil
}

func pollHAProxy(ctx context.Context, oc *exutil.CLI, ingressName string, desiredVersion string) error {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit this function name doesn't really describe what it's doing

Suggested change
func pollHAProxy(ctx context.Context, oc *exutil.CLI, ingressName string, desiredVersion string) error {
func waitForHAProxyVersion(ctx context.Context, oc *exutil.CLI, ingressName string, desiredVersion string) error {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit also probably worth just taking the API type so you don't have to cast everywhere.

Suggested change
func pollHAProxy(ctx context.Context, oc *exutil.CLI, ingressName string, desiredVersion string) error {
func pollHAProxy(ctx context.Context, oc *exutil.CLI, ingressName string, desiredVersion operatorv1.HAProxyVersion) error {

if err != nil {
return false, nil
}
if !strings.Contains(haproxy, desiredVersion) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think you missed @jcmoraisjr's comment about using hasPrefix here.

}

func pollHAProxy(ctx context.Context, oc *exutil.CLI, ingressName string, desiredVersion string) error {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think @CodeRabbit mentioned this somewhere, but some defensive code is probably worth adding

Suggested change
if desiredVersion == "" {
return fmt.Errorf("desiredVersion must not be empty")
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@gcs278 Agreed — rejecting an empty expected version up front will make failures clearer and avoid a needless poll timeout. This is a good defensive check for pollHAProxy.

return false, nil
}
if !strings.Contains(haproxy, desiredVersion) {
e2e.Logf("The HAProxy version has not updated yet, retrying...")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In case of a failure, much better to have some more info:

Suggested change
e2e.Logf("The HAProxy version has not updated yet, retrying...")
e2e.Logf("HAProxy version mismatch: got %q, waiting for %q", haproxy, desiredVersion)

Comment on lines +97 to +108
err = wait.PollUntilContextTimeout(ctx, 2*time.Second, testsTimeout, false, func(ctx context.Context) (bool, error) {
ic, err := operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Get(ctx, ingress.Name, metav1.GetOptions{})
if err != nil {
return false, nil
}
if ic.Spec.HAProxyVersion != "" {
e2e.Logf("The Ingress spec has not cleared the HAProxyVersion field yet, retrying...")
return false, nil
}
e2e.Logf("IngressController: %s HAProxyVersion is unset", ingress.Name)
return true, nil
})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

patches are synchronous, if it passes, we can trust that it cleared the field. This can be removed.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-aws-csi
/test e2e-aws-ovn-fips
/test e2e-aws-ovn-microshift
/test e2e-aws-ovn-microshift-serial
/test e2e-aws-ovn-serial-1of2
/test e2e-aws-ovn-serial-2of2
/test e2e-gcp-csi
/test e2e-gcp-ovn
/test e2e-gcp-ovn-upgrade
/test e2e-metal-ipi-ovn-ipv6
/test e2e-vsphere-ovn
/test e2e-vsphere-ovn-upi

ic.Spec.HAProxyVersion = version
})
o.Expect(err).To(o.Succeed())
o.Expect(string(ingress.Spec.HAProxyVersion)).To(o.Equal(string(version)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

checking the spec that we just set is not really providing much value. I would either check status (make sure you poll) and/or use the pollHAproxy function to actually confirm the value.

//confirm that the ingresscontroller is unset
o.Expect(ingress.Spec.HAProxyVersion).To(o.BeEmpty())

var effectiveVersion string

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Remove unnecessary casting back and forth.

Suggested change
var effectiveVersion string
var effectiveVersion operatorv1.HAProxyVersion

Comment on lines +167 to +172
g.By("Create a custom controller and pin it to older version")
ingress, err := controllers.createIngressController(ctx, oc, testsTimeout, nil)
o.Expect(err).To(o.Succeed())

patch := []byte(fmt.Sprintf(`{"spec":{"haproxyVersion":"%s"}}`, operatorv1.HAProxyVersion28))
_, err = operatorClient.OperatorV1().IngressControllers("openshift-ingress-operator").Patch(ctx, ingress.Name, types.MergePatchType, patch, metav1.PatchOptions{})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there a reason why we create a vanilla IC and patch it, vs. just creating it from the start with the haproxyVersion?

Comment on lines +58 to +59
g.BeforeEach(func() {
})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit

Suggested change
g.BeforeEach(func() {
})

err := operatorClient.OperatorV1().IngressControllers(ic.controller.Namespace).Delete(ctx, ic.controller.Name, *metav1.NewDeleteOptions(1))
errs = append(errs, client.IgnoreNotFound(err))
}
o.Expect(errors.Join(errs...)).NotTo(o.HaveOccurred())

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Any reason to accumulate ICs from other tests, and attempt to delete them after they are deleted? Probably best to clear it.

Suggested change
o.Expect(errors.Join(errs...)).NotTo(o.HaveOccurred())
o.Expect(errors.Join(errs...)).NotTo(o.HaveOccurred())
controllers.items = nil

return false, nil
}
if ic.Spec.HAProxyVersion != "" {
e2e.Logf("The Ingress spec has not cleared the HAProxyVersion field yet, retrying...")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit logging improvement.

Suggested change
e2e.Logf("The Ingress spec has not cleared the HAProxyVersion field yet, retrying...")
e2e.Logf("IngressController %s: HAProxyVersion field not yet cleared, retrying...", ingress.Name)

return false, nil
}
if ic.Status.EffectiveHAProxyVersion == "" {
e2e.Logf("EffectiveHAProxyVersion not yet set, waiting...")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit logging improvement

Suggested change
e2e.Logf("EffectiveHAProxyVersion not yet set, waiting...")
e2e.Logf("IngressController %s: EffectiveHAProxyVersion not yet set, waiting...", ingress.Name)

@gcs278 gcs278 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks for the updates! looking good, just dropped a few comments, I should be good now. Hope it helps.

@gcs278

gcs278 commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

/assign @gcs278

@openshift-ci

openshift-ci Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@rhamini3: 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/e2e-aws-ovn-serial-2of2 0613e90 link true /test e2e-aws-ovn-serial-2of2
ci/prow/e2e-aws-ovn-microshift 0613e90 link true /test e2e-aws-ovn-microshift
ci/prow/e2e-metal-ipi-ovn-ipv6 0613e90 link true /test e2e-metal-ipi-ovn-ipv6
ci/prow/e2e-vsphere-ovn-upi 0613e90 link true /test e2e-vsphere-ovn-upi

Full PR test history. Your PR dashboard.

Details

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

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

Labels

do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. ready-for-human-review Indicates a PR has been reviewed by automated tools and is ready for human review vendor-update Touching vendor dir or related files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants